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_progressiverenderer.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_pageobject.h" 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/page/cpdf_pageobjectholder.h" 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/render/cpdf_pagerendercache.h" 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/render/cpdf_renderoptions.h" 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfapi/render/cpdf_renderstatus.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_renderdevice.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer( 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_RenderContext* pContext, 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_RenderDevice* pDevice, 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const CPDF_RenderOptions* pOptions) 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_Status(Ready), 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pContext(pContext), 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDevice(pDevice), 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pOptions(pOptions), 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_LayerIndex(0), 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurrentLayer(nullptr) {} 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer() { 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pRenderStatus) 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDevice->RestoreState(false); 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause) { 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pContext || !m_pDevice || m_Status != Ready) { 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Status = Failed; 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Status = ToBeContinued; 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann Continue(pPause); 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) { 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (m_Status == ToBeContinued) { 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pCurrentLayer) { 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_LayerIndex >= m_pContext->CountLayers()) { 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_Status = Done; 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurrentLayer = m_pContext->GetLayer(m_LayerIndex); 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_LastObjectRendered = 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end(); 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pRenderStatus = pdfium::MakeUnique<CPDF_RenderStatus>(); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pRenderStatus->Initialize( 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pContext, m_pDevice, nullptr, nullptr, nullptr, nullptr, m_pOptions, 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurrentLayer->m_pObjectHolder->m_Transparency, false, nullptr); 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDevice->SaveState(); 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_ClipRect = CFX_FloatRect(m_pDevice->GetClipBox()); 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_Matrix device2object; 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann device2object.SetReverse(m_pCurrentLayer->m_Matrix); 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann device2object.TransformRect(m_ClipRect); 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_PageObjectList::iterator iter; 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_PageObjectList::iterator iterEnd = 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end(); 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_LastObjectRendered != iterEnd) { 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iter = m_LastObjectRendered; 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iter; 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iter = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->begin(); 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int nObjsToGo = kStepLimit; 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iter != iterEnd) { 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_PageObject* pCurObj = iter->get(); 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurObj->m_Right >= m_ClipRect.left && 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurObj->m_Bottom <= m_ClipRect.top && 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurObj->m_Top >= m_ClipRect.bottom) { 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pRenderStatus->ContinueSingleObject( 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pCurObj, &m_pCurrentLayer->m_Matrix, pPause)) { 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pCurObj->IsImage() && 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) { 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pContext->GetPageCache()->CacheOptimization( 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pRenderStatus->m_Options.m_dwLimitCacheSize); 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pCurObj->IsForm() || pCurObj->IsShading()) 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nObjsToGo = 0; 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann --nObjsToGo; 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_LastObjectRendered = iter; 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nObjsToGo == 0) { 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pPause && pPause->NeedToPauseNow()) 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nObjsToGo = kStepLimit; 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ++iter; 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_pCurrentLayer->m_pObjectHolder->IsParsed()) { 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pRenderStatus.reset(); 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pDevice->RestoreState(false); 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurrentLayer = nullptr; 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_LayerIndex++; 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pPause && pPause->NeedToPauseNow()) { 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_pCurrentLayer->m_pObjectHolder->ContinueParse(pPause); 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pCurrentLayer->m_pObjectHolder->IsParsed()) 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 115