Merge to XFA: Refactor progressive renderer.
authorTom Sepez <tsepez@chromium.org>
Mon, 19 Oct 2015 23:20:03 +0000 (16:20 -0700)
committerTom Sepez <tsepez@chromium.org>
Mon, 19 Oct 2015 23:20:03 +0000 (16:20 -0700)
Hand-application of diffs from https://codereview.chromium.org/1233453014/.
This was an oversight, and was too old (pre-reformat) to apply cleanly.
Checked against origin/master, only diffs are xfa related.

R=thestig@chromium.org

Review URL: https://codereview.chromium.org/1416793002 .

core/include/fpdfapi/fpdf_render.h
core/src/fpdfapi/fpdf_render/fpdf_render.cpp
fpdfsdk/src/fpdf_progressive.cpp
fpdfsdk/src/fpdfview.cpp

index 58883a0..3c1d95a 100644 (file)
@@ -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:
   virtual ~IPDF_OCContext() {}
@@ -127,53 +131,43 @@ class CPDF_RenderContext {
   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);
-
+  Status GetStatus() const { return m_Status; }
+  void Start(IFX_Pause* pPause);
+  void Continue(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;
+ 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;
-
-  void RenderStep();
 };
+
 class CPDF_TextRenderer {
  public:
   static void DrawTextString(CFX_RenderDevice* pDevice,
index be6483f..9db3506 100644 (file)
@@ -1061,47 +1061,35 @@ void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice,
   AppendObjectList(pObjs, pObject2Device);
   Render(pDevice, pOptions);
 }
-CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer() {
-  m_pRenderer = NULL;
-  m_pContext = NULL;
-  m_pDevice = NULL;
-  m_Status = Ready;
+
+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) {
 }
+
 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) {
-  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) {
+
+void CPDF_ProgressiveRenderer::Start(IFX_Pause* pPause) {
+  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) {
   if (m_Status != ToBeContinued) {
@@ -1122,9 +1110,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;
@@ -1139,13 +1126,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;
@@ -1162,14 +1149,14 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) {
           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_pRenderStatus->m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) {
           m_pContext->GetPageCache()->CacheOptimization(
-              m_pRenderer->m_Options.m_dwLimitCacheSize);
+              m_pRenderStatus->m_Options.m_dwLimitCacheSize);
         }
         if (pCurObj->m_Type == PDFPAGE_FORM ||
             pCurObj->m_Type == PDFPAGE_SHADING) {
@@ -1193,8 +1180,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;
index 4412648..754974e 100644 (file)
@@ -50,10 +50,8 @@ DLLEXPORT int STDCALL FPDF_RenderPageBitmap_Start(FPDF_BITMAP bitmap,
                          rotate, flags, FALSE, &IPauseAdapter);
 
   if (pContext->m_pRenderer) {
-    CPDF_ProgressiveRenderer::RenderStatus status =
-        CPDF_ProgressiveRenderer::Failed;
-    status = pContext->m_pRenderer->GetStatus();
-    return status;
+    return CPDF_ProgressiveRenderer::ToFPDFStatus(
+        pContext->m_pRenderer->GetStatus());
   }
   return FPDF_RENDER_FAILED;
 }
@@ -71,11 +69,8 @@ DLLEXPORT int STDCALL FPDF_RenderPage_Continue(FPDF_PAGE page,
   if (pContext && pContext->m_pRenderer) {
     IFSDK_PAUSE_Adapter IPauseAdapter(pause);
     pContext->m_pRenderer->Continue(&IPauseAdapter);
-
-    CPDF_ProgressiveRenderer::RenderStatus status =
-        CPDF_ProgressiveRenderer::Failed;
-    status = pContext->m_pRenderer->GetStatus();
-    return status;
+    return CPDF_ProgressiveRenderer::ToFPDFStatus(
+        pContext->m_pRenderer->GetStatus());
   }
   return FPDF_RENDER_FAILED;
 }
index 8e794e1..48c8de4 100644 (file)
@@ -856,14 +856,12 @@ void FPDF_RenderPage_Retail(CRenderContext* pContext,
                                        &matrix, TRUE, NULL);
   }
 
-  pContext->m_pRenderer = new CPDF_ProgressiveRenderer;
-  pContext->m_pRenderer->Start(pContext->m_pContext, pContext->m_pDevice,
-                               pContext->m_pOptions, pause);
+  pContext->m_pRenderer = new CPDF_ProgressiveRenderer(
+      pContext->m_pContext, pContext->m_pDevice, pContext->m_pOptions);
+  pContext->m_pRenderer->Start(pause);
   if (bNeedToRestore) {
     pContext->m_pDevice->RestoreState();
   }
-
-  //#endif
 }
 
 DLLEXPORT int STDCALL FPDF_GetPageSizeByIndex(FPDF_DOCUMENT document,