// 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 #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 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); }