| OLD | NEW | 
 | (Empty) | 
|    1 // Copyright 2014 PDFium Authors. All rights reserved. |  | 
|    2 // Use of this source code is governed by a BSD-style license that can be |  | 
|    3 // found in the LICENSE file. |  | 
|    4  |  | 
|    5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |  | 
|    6  |  | 
|    7 #include "core/include/fpdfapi/cpdf_document.h" |  | 
|    8 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_doc.h" |  | 
|    9 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_page.h" |  | 
|   10 #include "fpdfsdk/include/fpdfxfa/fpdfxfa_util.h" |  | 
|   11 #include "fpdfsdk/include/fsdk_define.h" |  | 
|   12 #include "fpdfsdk/include/fsdk_mgr.h" |  | 
|   13  |  | 
|   14 CPDFXFA_Page::CPDFXFA_Page(CPDFXFA_Document* pDoc, int page_index) |  | 
|   15     : m_pPDFPage(NULL), |  | 
|   16       m_pXFAPageView(NULL), |  | 
|   17       m_iPageIndex(page_index), |  | 
|   18       m_pDocument(pDoc), |  | 
|   19       m_iRef(1) {} |  | 
|   20  |  | 
|   21 CPDFXFA_Page::~CPDFXFA_Page() { |  | 
|   22   if (m_pPDFPage) |  | 
|   23     delete m_pPDFPage; |  | 
|   24   m_pPDFPage = NULL; |  | 
|   25   m_pXFAPageView = NULL; |  | 
|   26 } |  | 
|   27  |  | 
|   28 void CPDFXFA_Page::Release() { |  | 
|   29   m_iRef--; |  | 
|   30   if (m_iRef > 0) |  | 
|   31     return; |  | 
|   32  |  | 
|   33   if (m_pDocument) |  | 
|   34     m_pDocument->RemovePage(this); |  | 
|   35  |  | 
|   36   delete this; |  | 
|   37 } |  | 
|   38  |  | 
|   39 FX_BOOL CPDFXFA_Page::LoadPDFPage() { |  | 
|   40   if (!m_pDocument) |  | 
|   41     return FALSE; |  | 
|   42   CPDF_Document* pPDFDoc = m_pDocument->GetPDFDoc(); |  | 
|   43   if (pPDFDoc) { |  | 
|   44     CPDF_Dictionary* pDict = pPDFDoc->GetPage(m_iPageIndex); |  | 
|   45     if (pDict == NULL) |  | 
|   46       return FALSE; |  | 
|   47     if (m_pPDFPage) { |  | 
|   48       if (m_pPDFPage->m_pFormDict == pDict) |  | 
|   49         return TRUE; |  | 
|   50  |  | 
|   51       delete m_pPDFPage; |  | 
|   52       m_pPDFPage = NULL; |  | 
|   53     } |  | 
|   54  |  | 
|   55     m_pPDFPage = new CPDF_Page; |  | 
|   56     m_pPDFPage->Load(pPDFDoc, pDict); |  | 
|   57     m_pPDFPage->ParseContent(nullptr); |  | 
|   58     return TRUE; |  | 
|   59   } |  | 
|   60  |  | 
|   61   return FALSE; |  | 
|   62 } |  | 
|   63  |  | 
|   64 FX_BOOL CPDFXFA_Page::LoadXFAPageView() { |  | 
|   65   if (!m_pDocument) |  | 
|   66     return FALSE; |  | 
|   67   IXFA_Doc* pXFADoc = m_pDocument->GetXFADoc(); |  | 
|   68   if (!pXFADoc) |  | 
|   69     return FALSE; |  | 
|   70  |  | 
|   71   IXFA_DocView* pXFADocView = m_pDocument->GetXFADocView(); |  | 
|   72   if (!pXFADocView) |  | 
|   73     return FALSE; |  | 
|   74  |  | 
|   75   IXFA_PageView* pPageView = pXFADocView->GetPageView(m_iPageIndex); |  | 
|   76   if (!pPageView) |  | 
|   77     return FALSE; |  | 
|   78  |  | 
|   79   if (m_pXFAPageView == pPageView) |  | 
|   80     return TRUE; |  | 
|   81  |  | 
|   82   m_pXFAPageView = pPageView; |  | 
|   83   (void)m_pXFAPageView->LoadPageView(nullptr); |  | 
|   84   return TRUE; |  | 
|   85 } |  | 
|   86  |  | 
|   87 FX_BOOL CPDFXFA_Page::LoadPage() { |  | 
|   88   if (!m_pDocument || m_iPageIndex < 0) |  | 
|   89     return FALSE; |  | 
|   90  |  | 
|   91   int iDocType = m_pDocument->GetDocType(); |  | 
|   92   switch (iDocType) { |  | 
|   93     case DOCTYPE_PDF: |  | 
|   94     case DOCTYPE_STATIC_XFA: { |  | 
|   95       return LoadPDFPage(); |  | 
|   96     } |  | 
|   97     case DOCTYPE_DYNAMIC_XFA: { |  | 
|   98       return LoadXFAPageView(); |  | 
|   99     } |  | 
|  100     default: |  | 
|  101       return FALSE; |  | 
|  102   } |  | 
|  103  |  | 
|  104   return FALSE; |  | 
|  105 } |  | 
|  106  |  | 
|  107 FX_BOOL CPDFXFA_Page::LoadPDFPage(CPDF_Dictionary* pageDict) { |  | 
|  108   if (!m_pDocument || m_iPageIndex < 0 || !pageDict) |  | 
|  109     return FALSE; |  | 
|  110  |  | 
|  111   if (m_pPDFPage) |  | 
|  112     delete m_pPDFPage; |  | 
|  113  |  | 
|  114   m_pPDFPage = new CPDF_Page(); |  | 
|  115   m_pPDFPage->Load(m_pDocument->GetPDFDoc(), pageDict); |  | 
|  116   m_pPDFPage->ParseContent(nullptr); |  | 
|  117  |  | 
|  118   return TRUE; |  | 
|  119 } |  | 
|  120  |  | 
|  121 FX_FLOAT CPDFXFA_Page::GetPageWidth() { |  | 
|  122   if (!m_pPDFPage && !m_pXFAPageView) |  | 
|  123     return 0.0f; |  | 
|  124  |  | 
|  125   int nDocType = m_pDocument->GetDocType(); |  | 
|  126   switch (nDocType) { |  | 
|  127     case DOCTYPE_DYNAMIC_XFA: { |  | 
|  128       if (m_pXFAPageView) { |  | 
|  129         CFX_RectF rect; |  | 
|  130         m_pXFAPageView->GetPageViewRect(rect); |  | 
|  131         return rect.width; |  | 
|  132       } |  | 
|  133     } break; |  | 
|  134     case DOCTYPE_STATIC_XFA: |  | 
|  135     case DOCTYPE_PDF: { |  | 
|  136       if (m_pPDFPage) |  | 
|  137         return m_pPDFPage->GetPageWidth(); |  | 
|  138     } break; |  | 
|  139     default: |  | 
|  140       return 0.0f; |  | 
|  141   } |  | 
|  142  |  | 
|  143   return 0.0f; |  | 
|  144 } |  | 
|  145  |  | 
|  146 FX_FLOAT CPDFXFA_Page::GetPageHeight() { |  | 
|  147   if (!m_pPDFPage && !m_pXFAPageView) |  | 
|  148     return 0.0f; |  | 
|  149  |  | 
|  150   int nDocType = m_pDocument->GetDocType(); |  | 
|  151   switch (nDocType) { |  | 
|  152     case DOCTYPE_PDF: |  | 
|  153     case DOCTYPE_STATIC_XFA: { |  | 
|  154       if (m_pPDFPage) |  | 
|  155         return m_pPDFPage->GetPageHeight(); |  | 
|  156     } break; |  | 
|  157     case DOCTYPE_DYNAMIC_XFA: { |  | 
|  158       if (m_pXFAPageView) { |  | 
|  159         CFX_RectF rect; |  | 
|  160         m_pXFAPageView->GetPageViewRect(rect); |  | 
|  161         return rect.height; |  | 
|  162       } |  | 
|  163     } break; |  | 
|  164     default: |  | 
|  165       return 0.0f; |  | 
|  166   } |  | 
|  167  |  | 
|  168   return 0.0f; |  | 
|  169 } |  | 
|  170  |  | 
|  171 void CPDFXFA_Page::DeviceToPage(int start_x, |  | 
|  172                                 int start_y, |  | 
|  173                                 int size_x, |  | 
|  174                                 int size_y, |  | 
|  175                                 int rotate, |  | 
|  176                                 int device_x, |  | 
|  177                                 int device_y, |  | 
|  178                                 double* page_x, |  | 
|  179                                 double* page_y) { |  | 
|  180   if (!m_pPDFPage && !m_pXFAPageView) |  | 
|  181     return; |  | 
|  182  |  | 
|  183   CFX_Matrix page2device; |  | 
|  184   CFX_Matrix device2page; |  | 
|  185   FX_FLOAT page_x_f, page_y_f; |  | 
|  186  |  | 
|  187   GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate); |  | 
|  188  |  | 
|  189   device2page.SetReverse(page2device); |  | 
|  190   device2page.Transform((FX_FLOAT)(device_x), (FX_FLOAT)(device_y), page_x_f, |  | 
|  191                         page_y_f); |  | 
|  192  |  | 
|  193   *page_x = (page_x_f); |  | 
|  194   *page_y = (page_y_f); |  | 
|  195 } |  | 
|  196  |  | 
|  197 void CPDFXFA_Page::PageToDevice(int start_x, |  | 
|  198                                 int start_y, |  | 
|  199                                 int size_x, |  | 
|  200                                 int size_y, |  | 
|  201                                 int rotate, |  | 
|  202                                 double page_x, |  | 
|  203                                 double page_y, |  | 
|  204                                 int* device_x, |  | 
|  205                                 int* device_y) { |  | 
|  206   if (!m_pPDFPage && !m_pXFAPageView) |  | 
|  207     return; |  | 
|  208  |  | 
|  209   CFX_Matrix page2device; |  | 
|  210   FX_FLOAT device_x_f, device_y_f; |  | 
|  211  |  | 
|  212   GetDisplayMatrix(page2device, start_x, start_y, size_x, size_y, rotate); |  | 
|  213  |  | 
|  214   page2device.Transform(((FX_FLOAT)page_x), ((FX_FLOAT)page_y), device_x_f, |  | 
|  215                         device_y_f); |  | 
|  216  |  | 
|  217   *device_x = FXSYS_round(device_x_f); |  | 
|  218   *device_y = FXSYS_round(device_y_f); |  | 
|  219 } |  | 
|  220  |  | 
|  221 void CPDFXFA_Page::GetDisplayMatrix(CFX_Matrix& matrix, |  | 
|  222                                     int xPos, |  | 
|  223                                     int yPos, |  | 
|  224                                     int xSize, |  | 
|  225                                     int ySize, |  | 
|  226                                     int iRotate) const { |  | 
|  227   if (!m_pPDFPage && !m_pXFAPageView) |  | 
|  228     return; |  | 
|  229  |  | 
|  230   int nDocType = m_pDocument->GetDocType(); |  | 
|  231   switch (nDocType) { |  | 
|  232     case DOCTYPE_DYNAMIC_XFA: { |  | 
|  233       if (m_pXFAPageView) { |  | 
|  234         CFX_Rect rect; |  | 
|  235         rect.Set(xPos, yPos, xSize, ySize); |  | 
|  236         m_pXFAPageView->GetDisplayMatrix(matrix, rect, iRotate); |  | 
|  237       } |  | 
|  238     } break; |  | 
|  239     case DOCTYPE_PDF: |  | 
|  240     case DOCTYPE_STATIC_XFA: { |  | 
|  241       if (m_pPDFPage) { |  | 
|  242         m_pPDFPage->GetDisplayMatrix(matrix, xPos, yPos, xSize, ySize, iRotate); |  | 
|  243       } |  | 
|  244     } break; |  | 
|  245     default: |  | 
|  246       return; |  | 
|  247   } |  | 
|  248 } |  | 
| OLD | NEW |