14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/render/cpdf_rendercontext.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_page.h"
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_pageobject.h"
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_pageobjectholder.h"
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_dictionary.h"
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/parser/cpdf_document.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/render/cpdf_pagerendercache.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/render/cpdf_progressiverenderer.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/render/cpdf_renderoptions.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/render/cpdf_renderstatus.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/render/cpdf_textrenderer.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_renderdevice.h"
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxge/dib/cfx_dibitmap.h"
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/fx_dib.h"
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_RenderContext::CPDF_RenderContext(CPDF_Page* pPage)
24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    : m_pDocument(pPage->m_pDocument.Get()),
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pPageResources(pPage->m_pPageResources.Get()),
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pPageCache(pPage->GetRenderCache()) {}
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_RenderContext::CPDF_RenderContext(CPDF_Document* pDoc,
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       CPDF_PageRenderCache* pPageCache)
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_pDocument(pDoc), m_pPageResources(nullptr), m_pPageCache(pPageCache) {}
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_RenderContext::~CPDF_RenderContext() {}
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CPDF_RenderContext::GetBackground(const RetainPtr<CFX_DIBitmap>& pBuffer,
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       const CPDF_PageObject* pObj,
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       const CPDF_RenderOptions* pOptions,
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       CFX_Matrix* pFinalMatrix) {
38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFX_DefaultRenderDevice device;
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  device.Attach(pBuffer, false, nullptr, false);
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  FX_RECT rect(0, 0, device.GetWidth(), device.GetHeight());
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  device.FillRect(&rect, 0xffffffff);
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Render(&device, pObj, pOptions, pFinalMatrix);
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_RenderContext::AppendLayer(CPDF_PageObjectHolder* pObjectHolder,
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     const CFX_Matrix* pObject2Device) {
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Layers.emplace_back();
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_Layers.back().m_pObjectHolder = pObjectHolder;
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pObject2Device)
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Layers.back().m_Matrix = *pObject2Device;
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  else
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_Layers.back().m_Matrix.SetIdentity();
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_RenderContext::Render(CFX_RenderDevice* pDevice,
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                const CPDF_RenderOptions* pOptions,
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                const CFX_Matrix* pLastMatrix) {
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Render(pDevice, nullptr, pOptions, pLastMatrix);
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_RenderContext::Render(CFX_RenderDevice* pDevice,
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                const CPDF_PageObject* pStopObj,
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                const CPDF_RenderOptions* pOptions,
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                const CFX_Matrix* pLastMatrix) {
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (auto& layer : m_Layers) {
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CFX_RenderDevice::StateRestorer restorer(pDevice);
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CPDF_RenderStatus status;
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pLastMatrix) {
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CFX_Matrix FinalMatrix = layer.m_Matrix;
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      FinalMatrix.Concat(*pLastMatrix);
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      status.Initialize(this, pDevice, pLastMatrix, pStopObj, nullptr, nullptr,
73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        pOptions, layer.m_pObjectHolder->m_iTransparency, false,
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        nullptr);
75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      status.RenderObjectList(layer.m_pObjectHolder.Get(), &FinalMatrix);
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      status.Initialize(this, pDevice, nullptr, pStopObj, nullptr, nullptr,
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        pOptions, layer.m_pObjectHolder->m_iTransparency, false,
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        nullptr);
80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      status.RenderObjectList(layer.m_pObjectHolder.Get(), &layer.m_Matrix);
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (status.GetRenderOptions()->HasFlag(RENDER_LIMITEDIMAGECACHE)) {
83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pPageCache->CacheOptimization(
84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          status.GetRenderOptions()->GetCacheSizeLimit());
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (status.IsStopped())
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPDF_RenderContext::Layer::Layer() {}
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPDF_RenderContext::Layer::Layer(const Layer& that) = default;
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCPDF_RenderContext::Layer::~Layer() {}
96