Replace XFA_HDOC with IXFA_Doc*
[pdfium.git] / fpdfsdk / src / fpdfxfa / fpdfxfa_page.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 "../../include/fsdk_define.h"\r
8 #include "../../include/fsdk_mgr.h"\r
9 #include "../../include/fpdfxfa/fpdfxfa_util.h"\r
10 #include "../../include/fpdfxfa/fpdfxfa_doc.h"\r
11 #include "../../include/fpdfxfa/fpdfxfa_page.h"\r
12 \r
13 CPDFXFA_Page::CPDFXFA_Page(CPDFXFA_Document* pDoc, int page_index) :\r
14         m_pPDFPage(NULL),\r
15         m_pXFAPageView(NULL),\r
16         m_iPageIndex(page_index),\r
17         m_pDocument(pDoc),\r
18         m_iRef(1)\r
19 {\r
20 \r
21 }\r
22 \r
23 CPDFXFA_Page::~CPDFXFA_Page()\r
24 {\r
25         if (m_pPDFPage)\r
26                 delete m_pPDFPage;\r
27         m_pPDFPage = NULL;\r
28         m_pXFAPageView = NULL;\r
29 }\r
30 \r
31 void CPDFXFA_Page::Release()\r
32 {\r
33         m_iRef--;\r
34         if (m_iRef > 0)\r
35                 return;\r
36         \r
37         if (m_pDocument)\r
38                 m_pDocument->RemovePage(this);\r
39 \r
40         delete this;\r
41 }\r
42 \r
43 FX_BOOL CPDFXFA_Page::LoadPDFPage()\r
44 {\r
45         if (!m_pDocument) return FALSE;\r
46         CPDF_Document* pPDFDoc = m_pDocument->GetPDFDoc();\r
47         if (pPDFDoc)\r
48         {\r
49                 CPDF_Dictionary* pDict = pPDFDoc->GetPage(m_iPageIndex);\r
50                 if (pDict == NULL) return FALSE;\r
51                 if (m_pPDFPage) {\r
52                         if (m_pPDFPage->m_pFormDict == pDict)\r
53                                 return TRUE;\r
54 \r
55                         delete m_pPDFPage;\r
56                         m_pPDFPage = NULL;\r
57                 }\r
58 \r
59                 m_pPDFPage = FX_NEW CPDF_Page;\r
60                 m_pPDFPage->Load(pPDFDoc, pDict);\r
61                 m_pPDFPage->ParseContent();\r
62                 return TRUE;\r
63         }\r
64 \r
65         return FALSE;\r
66 }\r
67 \r
68 FX_BOOL CPDFXFA_Page::LoadXFAPageView()\r
69 {\r
70         if (!m_pDocument)\r
71                 return FALSE;\r
72         IXFA_Doc* pXFADoc = m_pDocument->GetXFADoc();\r
73         if (pXFADoc)\r
74         {\r
75                 IXFA_DocView* pXFADocView = m_pDocument->GetXFADocView();\r
76                 if (!pXFADocView) \r
77                         return FALSE;\r
78 \r
79                 IXFA_PageView* pPageView = pXFADocView->GetPageView(m_iPageIndex);\r
80                 if (!pPageView)\r
81                         return FALSE;\r
82 \r
83                 if (m_pXFAPageView)\r
84                         if (m_pXFAPageView == pPageView)\r
85                                 return TRUE;\r
86 \r
87                 m_pXFAPageView = pPageView;\r
88                 int iStatus = m_pXFAPageView->LoadPageView(NULL);\r
89 \r
90                 return TRUE;\r
91         }\r
92 \r
93         return FALSE;\r
94 }\r
95 \r
96 FX_BOOL CPDFXFA_Page::LoadPage()\r
97 {\r
98         if (!m_pDocument || m_iPageIndex < 0)\r
99                 return FALSE;\r
100 \r
101         int iDocType = m_pDocument->GetDocType();\r
102         switch (iDocType)\r
103         {\r
104         case DOCTYPE_PDF:\r
105         case DOCTYPE_STATIC_XFA:\r
106                 {\r
107                         return LoadPDFPage();\r
108                 }\r
109         case DOCTYPE_DYNIMIC_XFA:\r
110                 {\r
111                         return LoadXFAPageView();\r
112                 }\r
113         default:\r
114                 return FALSE;\r
115         }\r
116 \r
117         return FALSE;\r
118 }\r
119 \r
120 FX_BOOL CPDFXFA_Page::LoadPDFPage(CPDF_Dictionary* pageDict)\r
121 {\r
122         if (!m_pDocument || m_iPageIndex < 0 || !pageDict)\r
123                 return FALSE;\r
124 \r
125         if (m_pPDFPage)\r
126                 delete m_pPDFPage;\r
127 \r
128         m_pPDFPage = FX_NEW CPDF_Page();\r
129         m_pPDFPage->Load(m_pDocument->GetPDFDoc(), pageDict);\r
130         m_pPDFPage->ParseContent();\r
131 \r
132         return TRUE;\r
133 }\r
134 \r
135 FX_FLOAT CPDFXFA_Page::GetPageWidth()\r
136 {\r
137         ASSERT(m_pDocument != NULL);\r
138 \r
139         if (!m_pPDFPage && !m_pXFAPageView)\r
140                 return 0.0f;\r
141 \r
142         int nDocType = m_pDocument->GetDocType();\r
143         switch (nDocType)\r
144         {\r
145         case DOCTYPE_DYNIMIC_XFA:\r
146                 {\r
147                         if (m_pXFAPageView)\r
148                         {\r
149                                 CFX_RectF rect;\r
150                                 m_pXFAPageView->GetPageViewRect(rect);\r
151                                 return rect.width;\r
152                         }\r
153                 }\r
154                 break;\r
155         case DOCTYPE_STATIC_XFA:\r
156         case DOCTYPE_PDF:\r
157                 {\r
158                         if (m_pPDFPage)\r
159                                 return m_pPDFPage->GetPageWidth();\r
160                 }\r
161                 break;\r
162         default:\r
163                 return 0.0f;\r
164         }\r
165 \r
166         return 0.0f;\r
167 }\r
168 \r
169 FX_FLOAT CPDFXFA_Page::GetPageHeight()\r
170 {\r
171         ASSERT(m_pDocument != NULL);\r
172 \r
173         if (!m_pPDFPage && !m_pXFAPageView)\r
174                 return 0.0f;\r
175 \r
176         int nDocType = m_pDocument->GetDocType();\r
177         switch (nDocType)\r
178         {\r
179         case DOCTYPE_PDF:\r
180         case DOCTYPE_STATIC_XFA:\r
181                 {\r
182                         if (m_pPDFPage)\r
183                                 return m_pPDFPage->GetPageHeight();\r
184                 }\r
185                 break;\r
186         case DOCTYPE_DYNIMIC_XFA:\r
187                 {\r
188                         if (m_pXFAPageView)\r
189                         {\r
190                                 CFX_RectF rect;\r
191                                 m_pXFAPageView->GetPageViewRect(rect);\r
192                                 return rect.height;\r
193                         }\r
194                 }\r
195                 break;\r
196         default:\r
197                 return 0.0f;\r
198         }\r
199 \r
200         return 0.0f;\r
201 }\r
202 \r
203 void CPDFXFA_Page::DeviceToPage(int start_x, int start_y, int size_x, int size_y, int rotate, int device_x, int device_y, double* page_x, double* page_y)\r
204 {\r
205         ASSERT(m_pDocument != NULL);\r
206 \r
207         if (!m_pPDFPage && !m_pXFAPageView)\r
208                 return;\r
209 \r
210         CPDF_Matrix page2device;\r
211         CPDF_Matrix device2page;\r
212         FX_FLOAT page_x_f, page_y_f;\r
213 \r
214         GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);\r
215 \r
216         device2page.SetReverse(page2device);\r
217         device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, page_y_f);\r
218 \r
219         *page_x = (page_x_f);\r
220         *page_y = (page_y_f);\r
221 }\r
222 \r
223 void CPDFXFA_Page::PageToDevice(int start_x, int start_y, int size_x, int size_y, int rotate, double page_x, double page_y, int* device_x, int* device_y)\r
224 {\r
225         if (!m_pPDFPage && !m_pXFAPageView)\r
226                 return;\r
227 \r
228         CPDF_Matrix page2device;\r
229         FX_FLOAT device_x_f, device_y_f;\r
230 \r
231         GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate);\r
232 \r
233         page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, device_y_f);\r
234 \r
235         *device_x = FXSYS_round(device_x_f);\r
236         *device_y = FXSYS_round(device_y_f);\r
237 }\r
238 \r
239 void CPDFXFA_Page::GetDisplayMatrix(CFX_AffineMatrix& matrix, int xPos, int yPos, \r
240         int xSize, int ySize, int iRotate) const\r
241 {\r
242         ASSERT(m_pDocument != NULL);\r
243 \r
244         if (!m_pPDFPage && !m_pXFAPageView)\r
245                 return;\r
246 \r
247         int nDocType = m_pDocument->GetDocType();\r
248         switch (nDocType)\r
249         {\r
250         case DOCTYPE_DYNIMIC_XFA:\r
251                 {\r
252                         if (m_pXFAPageView)\r
253                         {\r
254                                 CFX_Rect rect;\r
255                                 rect.Set(xPos, yPos, xSize, ySize);\r
256                                 m_pXFAPageView->GetDisplayMatrix(matrix, rect, iRotate);\r
257                         }\r
258                 }\r
259                 break;\r
260         case DOCTYPE_PDF:\r
261         case DOCTYPE_STATIC_XFA:\r
262                 {\r
263                         if (m_pPDFPage) \r
264                         {\r
265                                 m_pPDFPage->GetDisplayMatrix(matrix, xPos, yPos, xSize, ySize, iRotate);\r
266                         }\r
267                 }\r
268                 break;\r
269         default:\r
270                 return;\r
271         }\r
272 \r
273 }\r