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