summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/include/fpdfapi/fpdf_render.h105
-rw-r--r--core/src/fpdfapi/fpdf_render/fpdf_render.cpp71
2 files changed, 75 insertions, 101 deletions
diff --git a/core/include/fpdfapi/fpdf_render.h b/core/include/fpdfapi/fpdf_render.h
index c0792cfc35..f3590095ad 100644
--- a/core/include/fpdfapi/fpdf_render.h
+++ b/core/include/fpdfapi/fpdf_render.h
@@ -7,22 +7,26 @@
#ifndef CORE_INCLUDE_FPDFAPI_FPDF_RENDER_H_
#define CORE_INCLUDE_FPDFAPI_FPDF_RENDER_H_
+#include "../../../third_party/base/nonstd_unique_ptr.h"
+#include "../../../public/fpdf_progressive.h"
#include "../fxge/fx_ge.h"
#include "fpdf_page.h"
-class CPDF_RenderContext;
-class CPDF_RenderOptions;
-class CPDF_ImageCache;
-class IPDF_OCContext;
-class CPDF_QuickStretcher;
-class CFX_PathData;
class CFX_GraphStateData;
+class CFX_PathData;
class CFX_RenderDevice;
-class CPDF_TextObject;
-class CPDF_PathObject;
+class CPDF_FormObject;
+class CPDF_ImageCache;
class CPDF_ImageObject;
+class CPDF_PathObject;
+class CPDF_QuickStretcher;
+class CPDF_RenderContext;
+class CPDF_RenderOptions;
+class CPDF_RenderStatus;
class CPDF_ShadingObject;
-class CPDF_FormObject;
+class CPDF_TextObject;
+class IFX_Pause;
+
class IPDF_OCContext
{
public:
@@ -129,63 +133,44 @@ protected:
friend class CPDF_RenderStatus;
friend class CPDF_ProgressiveRenderer;
};
+
class CPDF_ProgressiveRenderer
{
public:
-
- CPDF_ProgressiveRenderer();
-
+ // Must match FDF_RENDER_* definitions in fpdf_progressive.h.
+ enum Status {
+ Ready = FPDF_RENDER_READER,
+ ToBeContinued = FPDF_RENDER_TOBECOUNTINUED,
+ Done = FPDF_RENDER_DONE,
+ Failed = FPDF_RENDER_FAILED
+ };
+ static int ToFPDFStatus(Status status) { return static_cast<int>(status); }
+
+ CPDF_ProgressiveRenderer(CPDF_RenderContext* pContext,
+ CFX_RenderDevice* pDevice,
+ const CPDF_RenderOptions* pOptions);
~CPDF_ProgressiveRenderer();
- typedef enum {
- Ready,
- ToBeContinued,
- Done,
- Failed
- } RenderStatus;
-
- RenderStatus GetStatus()
- {
- return m_Status;
- }
-
-
-
- void Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
- const CPDF_RenderOptions* pOptions, class IFX_Pause* pPause, FX_BOOL bDropObjects = FALSE);
-
- void Continue(class IFX_Pause* pPause);
-
-
- int EstimateProgress();
-
- void Clear();
-protected:
-
- RenderStatus m_Status;
-
- CPDF_RenderContext* m_pContext;
-
- CFX_RenderDevice* m_pDevice;
-
- const CPDF_RenderOptions* m_pOptions;
-
- FX_BOOL m_bDropObjects;
-
- class CPDF_RenderStatus* m_pRenderer;
-
- CFX_FloatRect m_ClipRect;
-
- FX_DWORD m_LayerIndex;
-
- FX_DWORD m_ObjectIndex;
-
- FX_POSITION m_ObjectPos;
-
- FX_POSITION m_PrevLastPos;
-
- void RenderStep();
+ Status GetStatus() const { return m_Status; }
+ void Start(IFX_Pause* pPause);
+ void Continue(IFX_Pause* pPause);
+ int EstimateProgress();
+
+private:
+ void RenderStep();
+
+ Status m_Status;
+ CPDF_RenderContext* const m_pContext;
+ CFX_RenderDevice* const m_pDevice;
+ const CPDF_RenderOptions* const m_pOptions;
+ nonstd::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;
};
+
class CPDF_TextRenderer
{
public:
diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
index a894e846ee..12f60632fc 100644
--- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
+++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
@@ -1013,48 +1013,38 @@ void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, CPDF_PageObje
AppendObjectList(pObjs, pObject2Device);
Render(pDevice, pOptions);
}
-CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer()
+
+CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer(
+ CPDF_RenderContext* pContext,
+ CFX_RenderDevice* pDevice,
+ const CPDF_RenderOptions* pOptions) :
+ m_Status(Ready),
+ m_pContext(pContext),
+ m_pDevice(pDevice),
+ m_pOptions(pOptions),
+ m_LayerIndex(0),
+ m_ObjectIndex(0),
+ m_ObjectPos(nullptr),
+ m_PrevLastPos(nullptr)
{
- m_pRenderer = NULL;
- m_pContext = NULL;
- m_pDevice = NULL;
- m_Status = Ready;
}
+
CPDF_ProgressiveRenderer::~CPDF_ProgressiveRenderer()
{
- Clear();
-}
-void CPDF_ProgressiveRenderer::Clear()
-{
- if (m_pRenderer) {
- delete m_pRenderer;
+ if (m_pRenderStatus)
m_pDevice->RestoreState();
- m_pRenderer = NULL;
- }
- m_Status = Ready;
}
-void CPDF_ProgressiveRenderer::Start(CPDF_RenderContext* pContext, CFX_RenderDevice* pDevice,
- const CPDF_RenderOptions* pOptions, IFX_Pause* pPause, FX_BOOL bDropObjects)
+
+void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause)
{
- if (m_Status != Ready) {
- m_Status = Failed;
- return;
- }
- m_pContext = pContext;
- m_pDevice = pDevice;
- m_pOptions = pOptions;
- m_bDropObjects = bDropObjects;
- if (pContext == NULL || pDevice == NULL) {
+ if (!m_pContext || !m_pDevice || m_Status != Ready) {
m_Status = Failed;
return;
}
m_Status = ToBeContinued;
- m_ObjectPos = NULL;
- m_LayerIndex = 0;
- m_ObjectIndex = 0;
- m_PrevLastPos = NULL;
Continue(pPause);
}
+
#define RENDER_STEP_LIMIT 100
void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
{
@@ -1076,9 +1066,8 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
}
}
if (LastPos == m_PrevLastPos) {
- if (m_pRenderer) {
- delete m_pRenderer;
- m_pRenderer = NULL;
+ if (m_pRenderStatus) {
+ m_pRenderStatus.reset();
m_pDevice->RestoreState();
m_ObjectPos = NULL;
m_PrevLastPos = NULL;
@@ -1093,12 +1082,13 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
}
m_PrevLastPos = LastPos;
}
- if (m_pRenderer == NULL) {
+ if (!m_pRenderStatus) {
m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition();
m_ObjectIndex = 0;
- m_pRenderer = new CPDF_RenderStatus();
- m_pRenderer->Initialize(m_pContext, m_pDevice, NULL, NULL, NULL, NULL,
- m_pOptions, pItem->m_pObjectList->m_Transparency, m_bDropObjects, NULL);
+ m_pRenderStatus.reset(new CPDF_RenderStatus());
+ m_pRenderStatus->Initialize(
+ m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions,
+ pItem->m_pObjectList->m_Transparency, FALSE, NULL);
m_pDevice->SaveState();
m_ClipRect = m_pDevice->GetClipBox();
CFX_AffineMatrix device2object;
@@ -1110,11 +1100,11 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
CPDF_PageObject* pCurObj = pItem->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_pRenderer->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) {
+ if (m_pRenderStatus->ContinueSingleObject(pCurObj, &pItem->m_Matrix, pPause)) {
return;
}
- if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderer->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
- m_pContext->GetPageCache()->CacheOptimization(m_pRenderer->m_Options.m_dwLimitCacheSize);
+ if (pCurObj->m_Type == PDFPAGE_IMAGE && m_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
+ m_pContext->GetPageCache()->CacheOptimization(m_pRenderStatus->m_Options.m_dwLimitCacheSize);
}
if (pCurObj->m_Type == PDFPAGE_FORM || pCurObj->m_Type == PDFPAGE_SHADING) {
objs_to_go = 0;
@@ -1134,8 +1124,7 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause)
if (!pItem->m_pObjectList->IsParsed()) {
return;
}
- delete m_pRenderer;
- m_pRenderer = NULL;
+ m_pRenderStatus.reset();
m_pDevice->RestoreState();
m_ObjectPos = NULL;
m_PrevLastPos = NULL;