Chromium Code Reviews| Index: core/src/fpdfapi/fpdf_render/fpdf_render.cpp |
| diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp |
| index 35d62ce0b3d6eebba3d396d47972a20c3e41e133..9412fe38dd81c2a454e6697b89d1b05be0477e1b 100644 |
| --- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp |
| +++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp |
| @@ -4,7 +4,7 @@ |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| -#include "render_int.h" |
| +#include "core/src/fpdfapi/fpdf_render/render_int.h" |
| #include "core/include/fpdfapi/fpdf_module.h" |
| #include "core/include/fpdfapi/fpdf_render.h" |
| @@ -1039,9 +1039,8 @@ CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer( |
| m_pOptions(pOptions), |
| m_LayerIndex(0), |
| m_ObjectIndex(0), |
| - m_ObjectPos(nullptr), |
| - m_PrevLastPos(nullptr) { |
| -} |
| + m_pCurrentLayer(nullptr), |
| + m_ObjectPos(nullptr) {} |
| CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer() { |
| if (m_pRenderStatus) |
| @@ -1058,41 +1057,22 @@ void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause) { |
| } |
| void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) { |
| - if (m_Status != ToBeContinued) { |
| - return; |
| - } |
| - FX_DWORD nLayers = m_pContext->CountLayers(); |
| - for (; m_LayerIndex < nLayers; m_LayerIndex++) { |
| - CPDF_RenderContext::Layer* pLayer = m_pContext->GetLayer(m_LayerIndex); |
| - FX_POSITION LastPos = pLayer->m_pObjectList->GetLastObjectPosition(); |
| - if (!m_ObjectPos) { |
| - if (LastPos == m_PrevLastPos) { |
|
Tom Sepez
2016/02/12 20:19:20
We now use the notion of a "current layer" rather
|
| - if (!pLayer->m_pObjectList->IsParsed()) { |
| - pLayer->m_pObjectList->ContinueParse(pPause); |
| - if (!pLayer->m_pObjectList->IsParsed()) { |
| - return; |
| - } |
| - LastPos = pLayer->m_pObjectList->GetLastObjectPosition(); |
| - } |
| - } |
| - if (LastPos == m_PrevLastPos) { |
|
Tom Sepez
2016/02/12 20:19:20
This cleanup falls down to below and merges with b
|
| - if (m_pRenderStatus) { |
| - m_pRenderStatus.reset(); |
| - m_pDevice->RestoreState(); |
| - m_ObjectPos = NULL; |
| - m_PrevLastPos = NULL; |
| - } |
| - continue; |
| + int step_limit = |
| + CPDF_ModuleMgr::Get()->GetRenderModule()->GetConfig()->m_RenderStepLimit; |
| + int objs_to_go = step_limit; |
|
Tom Sepez
2016/02/12 20:19:20
Change in behaviour here, we check for limit every
|
| + while (m_Status == ToBeContinued) { |
| + if (!m_pCurrentLayer) { |
| + if (m_LayerIndex >= m_pContext->CountLayers()) { |
| + m_Status = Done; |
| + return; |
| } |
| - if (m_PrevLastPos) { |
| - m_ObjectPos = m_PrevLastPos; |
| - pLayer->m_pObjectList->GetNextObject(m_ObjectPos); |
| - } else { |
| - m_ObjectPos = pLayer->m_pObjectList->GetFirstObjectPosition(); |
| + CPDF_RenderContext::Layer* pLayer = m_pContext->GetLayer(m_LayerIndex); |
| + if (!pLayer->m_pObjectList->IsParsed()) { |
| + pLayer->m_pObjectList->ContinueParse(pPause); |
| + if (!pLayer->m_pObjectList->IsParsed()) |
| + return; |
| } |
| - m_PrevLastPos = LastPos; |
| - } |
| - if (!m_pRenderStatus) { |
| + m_pCurrentLayer = pLayer; |
| m_ObjectPos = pLayer->m_pObjectList->GetFirstObjectPosition(); |
| m_ObjectIndex = 0; |
| m_pRenderStatus.reset(new CPDF_RenderStatus()); |
| @@ -1105,19 +1085,15 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) { |
| device2object.SetReverse(pLayer->m_Matrix); |
| device2object.TransformRect(m_ClipRect); |
| } |
| - int objs_to_go = CPDF_ModuleMgr::Get() |
| - ->GetRenderModule() |
| - ->GetConfig() |
| - ->m_RenderStepLimit; |
| while (m_ObjectPos) { |
| CPDF_PageObject* pCurObj = |
| - pLayer->m_pObjectList->GetObjectAt(m_ObjectPos); |
| + m_pCurrentLayer->m_pObjectList->GetObjectAt(m_ObjectPos); |
| if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && |
| pCurObj->m_Right >= m_ClipRect.left && |
| pCurObj->m_Bottom <= m_ClipRect.top && |
| pCurObj->m_Top >= m_ClipRect.bottom) { |
| - if (m_pRenderStatus->ContinueSingleObject(pCurObj, &pLayer->m_Matrix, |
| - pPause)) { |
| + if (m_pRenderStatus->ContinueSingleObject( |
| + pCurObj, &m_pCurrentLayer->m_Matrix, pPause)) { |
| return; |
| } |
| if (pCurObj->m_Type == CPDF_PageObject::IMAGE && |
| @@ -1125,39 +1101,25 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) { |
| m_pContext->GetPageCache()->CacheOptimization( |
| m_pRenderStatus->m_Options.m_dwLimitCacheSize); |
| } |
| + m_ObjectIndex++; |
| + m_pCurrentLayer->m_pObjectList->GetNextObject(m_ObjectPos); |
| if (pCurObj->m_Type == CPDF_PageObject::FORM || |
| - pCurObj->m_Type == CPDF_PageObject::SHADING) { |
| - objs_to_go = 0; |
| - } else { |
| - objs_to_go--; |
| - } |
| - } |
| - m_ObjectIndex++; |
| - pLayer->m_pObjectList->GetNextObject(m_ObjectPos); |
| - if (objs_to_go == 0) { |
| - if (pPause && pPause->NeedToPauseNow()) { |
| - return; |
| + pCurObj->m_Type == CPDF_PageObject::SHADING || --objs_to_go == 0) { |
| + if (pPause && pPause->NeedToPauseNow()) { |
| + return; |
| + } |
| + objs_to_go = step_limit; |
| } |
| - objs_to_go = CPDF_ModuleMgr::Get() |
| - ->GetRenderModule() |
| - ->GetConfig() |
| - ->m_RenderStepLimit; |
| } |
| } |
| - if (!pLayer->m_pObjectList->IsParsed()) { |
| - return; |
| - } |
| m_pRenderStatus.reset(); |
| m_pDevice->RestoreState(); |
| m_ObjectPos = NULL; |
| - m_PrevLastPos = NULL; |
| - if (pPause && pPause->NeedToPauseNow()) { |
| - m_LayerIndex++; |
| - return; |
| - } |
| + m_pCurrentLayer = nullptr; |
| + m_LayerIndex++; |
| } |
| - m_Status = Done; |
| } |
| + |
| int CPDF_ProgressiveRenderer::EstimateProgress() { |
| if (!m_pContext) { |
| return 0; |