Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(446)

Unified Diff: core/src/fpdfapi/fpdf_render/fpdf_render.cpp

Issue 1699443002: Rework progressive render loop. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « core/include/fpdfapi/fpdf_render.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « core/include/fpdfapi/fpdf_render.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698