| // Copyright 2018 The PDFium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
| #include "xfa/fxfa/cxfa_imagerenderer.h" | |
| #include <utility> | |
| #include "core/fxcrt/check.h" | |
| #include "core/fxcrt/check_op.h" | |
| #include "core/fxge/agg/cfx_agg_imagerenderer.h" | |
| #include "core/fxge/cfx_renderdevice.h" | |
| #include "core/fxge/dib/cfx_dibitmap.h" | |
| CXFA_ImageRenderer::CXFA_ImageRenderer(CFX_RenderDevice* device, | |
| RetainPtr<CFX_DIBitmap> bitmap, | |
| const CFX_Matrix& image_to_device) | |
| : m_ImageMatrix(image_to_device), | |
| m_pDevice(device), | |
| m_pBitmap(std::move(bitmap)) { | |
| // Assume this always draws into CFX_DefaultRenderDevice. | |
| CHECK(m_pDevice); | |
| CHECK(m_pDevice->GetRenderCaps() & FXRC_GET_BITS); | |
| CHECK(m_pBitmap); | |
| } | |
| CXFA_ImageRenderer::~CXFA_ImageRenderer() = default; | |
| bool CXFA_ImageRenderer::Start() { | |
| FXDIB_ResampleOptions options; | |
| options.bInterpolateBilinear = true; | |
| RenderDeviceDriverIface::StartResult result = m_pDevice->StartDIBits( | |
| m_pBitmap, /*alpha=*/1.0f, /*argb=*/0, m_ImageMatrix, options); | |
| if (result.result == RenderDeviceDriverIface::Result::kFailure) { | |
| return false; | |
| } | |
| CHECK_EQ(result.result, RenderDeviceDriverIface::Result::kSuccess); | |
| m_DeviceHandle = std::move(result.agg_image_renderer); | |
| if (!m_DeviceHandle) { | |
| return false; | |
| } | |
| m_State = State::kStarted; | |
| return true; | |
| } | |
| bool CXFA_ImageRenderer::Continue() { | |
| CHECK_EQ(m_State, State::kStarted); | |
| return m_pDevice->ContinueDIBits(m_DeviceHandle.get(), nullptr); | |
| } |