Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxfa / src / app / xfa_rendercontext.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "../../../foxitlib.h"\r
8 #include "../common/xfa_common.h"\r
9 #include "xfa_rendercontext.h"\r
10 #include "xfa_ffwidget.h"\r
11 #define XFA_RENDERCONTEXT_MaxCount              30\r
12 IXFA_RenderContext*     XFA_RenderContext_Create()\r
13 {\r
14     return FX_NEW CXFA_RenderContext;\r
15 }\r
16 CXFA_RenderContext::CXFA_RenderContext()\r
17 {\r
18     m_pWidgetIterator = NULL;\r
19     m_pWidget = NULL;\r
20     m_pPageView = NULL;\r
21     m_pGS = NULL;\r
22     m_dwStatus = 0;\r
23     m_matrix.Reset();\r
24     m_rtClipRect.Reset();\r
25 }\r
26 CXFA_RenderContext::~CXFA_RenderContext()\r
27 {\r
28     StopRender();\r
29 }\r
30 FX_INT32 CXFA_RenderContext::StartRender(IXFA_PageView* pPageView, CFX_Graphics* pGS, const CFX_Matrix& matrix, const CXFA_RenderOptions& options)\r
31 {\r
32     m_pPageView = pPageView;\r
33     m_pGS = pGS;\r
34     m_matrix = matrix;\r
35     m_options = options;\r
36     CFX_RectF rtPage;\r
37     pGS->GetClipRect(rtPage);\r
38     CFX_Matrix mtRes;\r
39     mtRes.SetReverse(matrix);\r
40     m_rtClipRect.Set(rtPage.left, rtPage.top, rtPage.width, rtPage.height);\r
41     mtRes.TransformRect(m_rtClipRect);\r
42     m_dwStatus = m_options.m_bHighlight ? XFA_WIDGETSTATUS_Highlight : 0;\r
43     FX_DWORD dwFilterType = XFA_WIDGETFILTER_Visible | XFA_WIDGETFILTER_AllType | (m_options.m_bPrint ? XFA_WIDGETSTATUS_Printable : XFA_WIDGETSTATUS_Viewable);\r
44     m_pWidgetIterator = m_pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form, dwFilterType);\r
45     m_pWidget = m_pWidgetIterator->MoveToNext();\r
46     return XFA_RENDERSTATUS_Ready;\r
47 }\r
48 FX_INT32 CXFA_RenderContext::DoRender(IFX_Pause* pPause)\r
49 {\r
50     FX_INT32 iCount = 0;\r
51     while(m_pWidget) {\r
52         CXFA_FFWidget* pWidget = (CXFA_FFWidget*)m_pWidget;\r
53         CFX_RectF rtWidgetBox;\r
54         pWidget->GetBBox(rtWidgetBox, XFA_WIDGETSTATUS_Visible);\r
55         rtWidgetBox.width += 1;\r
56         rtWidgetBox.height += 1;\r
57         if (rtWidgetBox.IntersectWith(m_rtClipRect)) {\r
58             pWidget->RenderWidget(m_pGS, &m_matrix, m_dwStatus);\r
59         }\r
60         m_pWidget = m_pWidgetIterator->MoveToNext();\r
61         iCount++;\r
62         if (iCount > XFA_RENDERCONTEXT_MaxCount && pPause && pPause->NeedToPauseNow()) {\r
63             return XFA_RENDERSTATUS_ToBeContinued;\r
64         }\r
65     }\r
66     return XFA_RENDERSTATUS_Done;\r
67 }\r
68 void CXFA_RenderContext::StopRender()\r
69 {\r
70     if (m_pWidgetIterator) {\r
71         m_pWidgetIterator->Release();\r
72         m_pWidgetIterator = NULL;\r
73     }\r
74 }\r