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..3780082a747b4597f7a4990ec8a093e4b8b216be 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" |
@@ -87,10 +87,7 @@ class CPDF_RenderModule : public IPDF_RenderModule { |
void DestroyPageCache(CPDF_PageRenderCache* pCache) override; |
- CPDF_RenderConfig* GetConfig() override { return &m_RenderConfig; } |
- |
CPDF_DocRenderData m_RenderData; |
- CPDF_RenderConfig m_RenderConfig; |
}; |
CPDF_DocRenderData* CPDF_RenderModule::CreateDocData(CPDF_Document* pDoc) { |
@@ -1038,10 +1035,8 @@ CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer( |
m_pDevice(pDevice), |
m_pOptions(pOptions), |
m_LayerIndex(0), |
- m_ObjectIndex(0), |
- m_ObjectPos(nullptr), |
- m_PrevLastPos(nullptr) { |
-} |
+ m_pCurrentLayer(nullptr), |
+ m_LastObjectRendered(nullptr) {} |
CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer() { |
if (m_pRenderStatus) |
@@ -1058,66 +1053,41 @@ 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) { |
- 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) { |
- if (m_pRenderStatus) { |
- m_pRenderStatus.reset(); |
- m_pDevice->RestoreState(); |
- m_ObjectPos = NULL; |
- m_PrevLastPos = NULL; |
- } |
- continue; |
+ 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(); |
- } |
- m_PrevLastPos = LastPos; |
- } |
- if (!m_pRenderStatus) { |
- m_ObjectPos = pLayer->m_pObjectList->GetFirstObjectPosition(); |
- m_ObjectIndex = 0; |
+ m_pCurrentLayer = m_pContext->GetLayer(m_LayerIndex); |
+ m_LastObjectRendered = nullptr; |
m_pRenderStatus.reset(new CPDF_RenderStatus()); |
m_pRenderStatus->Initialize( |
m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions, |
- pLayer->m_pObjectList->m_Transparency, FALSE, NULL); |
+ m_pCurrentLayer->m_pObjectList->m_Transparency, FALSE, NULL); |
m_pDevice->SaveState(); |
m_ClipRect = m_pDevice->GetClipBox(); |
CFX_Matrix device2object; |
- device2object.SetReverse(pLayer->m_Matrix); |
+ device2object.SetReverse(m_pCurrentLayer->m_Matrix); |
device2object.TransformRect(m_ClipRect); |
} |
- int objs_to_go = CPDF_ModuleMgr::Get() |
- ->GetRenderModule() |
- ->GetConfig() |
- ->m_RenderStepLimit; |
- while (m_ObjectPos) { |
+ FX_POSITION pos; |
+ if (m_LastObjectRendered) { |
+ pos = m_LastObjectRendered; |
+ m_pCurrentLayer->m_pObjectList->GetNextObject(pos); |
+ } else { |
+ pos = m_pCurrentLayer->m_pObjectList->GetFirstObjectPosition(); |
+ } |
+ int nObjsToGo = kStepLimit; |
+ while (pos) { |
CPDF_PageObject* pCurObj = |
- pLayer->m_pObjectList->GetObjectAt(m_ObjectPos); |
+ m_pCurrentLayer->m_pObjectList->GetObjectAt(pos); |
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 && |
@@ -1127,59 +1097,36 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) { |
} |
if (pCurObj->m_Type == CPDF_PageObject::FORM || |
pCurObj->m_Type == CPDF_PageObject::SHADING) { |
- objs_to_go = 0; |
+ nObjsToGo = 0; |
} else { |
- objs_to_go--; |
+ --nObjsToGo; |
} |
} |
- m_ObjectIndex++; |
- pLayer->m_pObjectList->GetNextObject(m_ObjectPos); |
- if (objs_to_go == 0) { |
- if (pPause && pPause->NeedToPauseNow()) { |
+ m_LastObjectRendered = pos; |
+ if (nObjsToGo == 0) { |
+ if (pPause && pPause->NeedToPauseNow()) |
return; |
- } |
- objs_to_go = CPDF_ModuleMgr::Get() |
- ->GetRenderModule() |
- ->GetConfig() |
- ->m_RenderStepLimit; |
+ nObjsToGo = kStepLimit; |
} |
+ m_pCurrentLayer->m_pObjectList->GetNextObject(pos); |
} |
- if (!pLayer->m_pObjectList->IsParsed()) { |
- return; |
- } |
- m_pRenderStatus.reset(); |
- m_pDevice->RestoreState(); |
- m_ObjectPos = NULL; |
- m_PrevLastPos = NULL; |
- if (pPause && pPause->NeedToPauseNow()) { |
+ if (m_pCurrentLayer->m_pObjectList->IsParsed()) { |
+ m_pRenderStatus.reset(); |
+ m_pDevice->RestoreState(); |
+ m_pCurrentLayer = nullptr; |
+ m_LastObjectRendered = nullptr; |
m_LayerIndex++; |
- return; |
- } |
- } |
- m_Status = Done; |
-} |
-int CPDF_ProgressiveRenderer::EstimateProgress() { |
- if (!m_pContext) { |
- return 0; |
- } |
- FX_DWORD nLayers = m_pContext->CountLayers(); |
- int nTotal = 0; |
- int nRendered = 0; |
- for (FX_DWORD layer = 0; layer < nLayers; layer++) { |
- CPDF_RenderContext::Layer* pLayer = m_pContext->GetLayer(layer); |
- int nObjs = pLayer->m_pObjectList->CountObjects(); |
- if (layer == m_LayerIndex) { |
- nRendered += m_ObjectIndex; |
- } else if (layer < m_LayerIndex) { |
- nRendered += nObjs; |
+ if (pPause && pPause->NeedToPauseNow()) { |
+ return; |
+ } |
+ } else { |
+ m_pCurrentLayer->m_pObjectList->ContinueParse(pPause); |
+ if (!m_pCurrentLayer->m_pObjectList->IsParsed()) |
+ return; |
} |
- nTotal += nObjs; |
- } |
- if (nTotal == 0) { |
- return 0; |
} |
- return 100 * nRendered / nTotal; |
} |
+ |
CPDF_TransferFunc* CPDF_DocRenderData::GetTransferFunc(CPDF_Object* pObj) { |
if (!pObj) |
return nullptr; |
@@ -1252,11 +1199,6 @@ void CPDF_DocRenderData::ReleaseTransferFunc(CPDF_Object* pObj) { |
if (it != m_TransferFuncMap.end()) |
it->second->RemoveRef(); |
} |
-CPDF_RenderConfig::CPDF_RenderConfig() { |
- m_HalftoneLimit = 0; |
- m_RenderStepLimit = 100; |
-} |
-CPDF_RenderConfig::~CPDF_RenderConfig() {} |
CPDF_DeviceBuffer::CPDF_DeviceBuffer() |
: m_pDevice(nullptr), m_pContext(nullptr), m_pObject(nullptr) {} |