summaryrefslogtreecommitdiff
path: root/xfa/fxfa/cxfa_rendercontext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fxfa/cxfa_rendercontext.cpp')
-rw-r--r--xfa/fxfa/cxfa_rendercontext.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/xfa/fxfa/cxfa_rendercontext.cpp b/xfa/fxfa/cxfa_rendercontext.cpp
new file mode 100644
index 0000000000..ecb42918cb
--- /dev/null
+++ b/xfa/fxfa/cxfa_rendercontext.cpp
@@ -0,0 +1,70 @@
+// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fxfa/cxfa_rendercontext.h"
+
+#include "xfa/fxfa/cxfa_ffpageview.h"
+#include "xfa/fxfa/cxfa_ffwidget.h"
+#include "xfa/fxgraphics/cfx_graphics.h"
+
+namespace {
+
+const int32_t kMaxCount = 30;
+
+} // namsepace
+
+CXFA_RenderContext::CXFA_RenderContext()
+ : m_pWidget(nullptr), m_pPageView(nullptr), m_pGS(nullptr), m_dwStatus(0) {
+ m_matrix.SetIdentity();
+ m_rtClipRect.Reset();
+}
+
+CXFA_RenderContext::~CXFA_RenderContext() {}
+
+int32_t CXFA_RenderContext::StartRender(CXFA_FFPageView* pPageView,
+ CFX_Graphics* pGS,
+ const CFX_Matrix& matrix,
+ const CXFA_RenderOptions& options) {
+ m_pPageView = pPageView;
+ m_pGS = pGS;
+ m_matrix = matrix;
+ m_options = options;
+
+ CFX_Matrix mtRes;
+ mtRes.SetReverse(matrix);
+ m_rtClipRect = pGS->GetClipRect();
+ mtRes.TransformRect(m_rtClipRect);
+ m_dwStatus = m_options.m_bHighlight ? XFA_WidgetStatus_Highlight : 0;
+ uint32_t dwFilterType = XFA_WidgetStatus_Visible |
+ (m_options.m_bPrint ? XFA_WidgetStatus_Printable
+ : XFA_WidgetStatus_Viewable);
+ m_pWidgetIterator.reset(
+ m_pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form, dwFilterType));
+ m_pWidget = m_pWidgetIterator->MoveToNext();
+ return XFA_RENDERSTATUS_Ready;
+}
+
+int32_t CXFA_RenderContext::DoRender(IFX_Pause* pPause) {
+ int32_t iCount = 0;
+ while (m_pWidget) {
+ CXFA_FFWidget* pWidget = m_pWidget;
+ CFX_RectF rtWidgetBox = pWidget->GetBBox(XFA_WidgetStatus_Visible);
+ rtWidgetBox.width += 1;
+ rtWidgetBox.height += 1;
+ if (rtWidgetBox.IntersectWith(m_rtClipRect))
+ pWidget->RenderWidget(m_pGS, &m_matrix, m_dwStatus);
+
+ m_pWidget = m_pWidgetIterator->MoveToNext();
+ iCount++;
+ if (iCount > kMaxCount && pPause && pPause->NeedToPauseNow())
+ return XFA_RENDERSTATUS_ToBeContinued;
+ }
+ return XFA_RENDERSTATUS_Done;
+}
+
+void CXFA_RenderContext::StopRender() {
+ m_pWidgetIterator.reset();
+}