diff options
-rw-r--r-- | core/include/fpdfapi/fpdf_module.h | 2 | ||||
-rw-r--r-- | core/include/fpdfapi/fpdf_render.h | 16 | ||||
-rw-r--r-- | core/src/fpdfapi/fpdf_render/fpdf_render.cpp | 146 |
3 files changed, 49 insertions, 115 deletions
diff --git a/core/include/fpdfapi/fpdf_module.h b/core/include/fpdfapi/fpdf_module.h index 6a17a489c2..6888e81000 100644 --- a/core/include/fpdfapi/fpdf_module.h +++ b/core/include/fpdfapi/fpdf_module.h @@ -26,7 +26,6 @@ class CPDF_Image; class CPDF_Page; class CPDF_PageObjectList; class CPDF_PageRenderCache; -class CPDF_RenderConfig; class CPDF_RenderOptions; class CPDF_Stream; class ICodec_FaxModule; @@ -107,7 +106,6 @@ class IPDF_RenderModule { virtual CPDF_DocRenderData* GetRenderData() = 0; virtual CPDF_PageRenderCache* CreatePageCache(CPDF_Page* pPage) = 0; virtual void DestroyPageCache(CPDF_PageRenderCache*) = 0; - virtual CPDF_RenderConfig* GetConfig() = 0; }; #endif // CORE_INCLUDE_FPDFAPI_FPDF_MODULE_H_ diff --git a/core/include/fpdfapi/fpdf_render.h b/core/include/fpdfapi/fpdf_render.h index 2637dd3252..ec5d151914 100644 --- a/core/include/fpdfapi/fpdf_render.h +++ b/core/include/fpdfapi/fpdf_render.h @@ -136,11 +136,13 @@ class CPDF_ProgressiveRenderer { Status GetStatus() const { return m_Status; } void Start(IFX_Pause* pPause); void Continue(IFX_Pause* pPause); - int EstimateProgress(); private: void RenderStep(); + // Maximum page objects to render before checking for pause. + static const int kStepLimit = 100; + Status m_Status; CPDF_RenderContext* const m_pContext; CFX_RenderDevice* const m_pDevice; @@ -148,9 +150,8 @@ class CPDF_ProgressiveRenderer { std::unique_ptr<CPDF_RenderStatus> m_pRenderStatus; CFX_FloatRect m_ClipRect; FX_DWORD m_LayerIndex; - FX_DWORD m_ObjectIndex; - FX_POSITION m_ObjectPos; - FX_POSITION m_PrevLastPos; + CPDF_RenderContext::Layer* m_pCurrentLayer; + FX_POSITION m_LastObjectRendered; }; class CPDF_TextRenderer { @@ -261,13 +262,6 @@ class CPDF_PageRenderCache { FX_DWORD m_nCacheSize; FX_BOOL m_bCurFindCache; }; -class CPDF_RenderConfig { - public: - CPDF_RenderConfig(); - ~CPDF_RenderConfig(); - int m_HalftoneLimit; - int m_RenderStepLimit; -}; FX_BOOL IsAvailableMatrix(const CFX_Matrix& matrix); diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp index eeee03485a..0ea941a1e6 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) {} |