Home | History | Annotate | Download | only in app
      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 "xfa/fxfa/xfa_rendercontext.h"
      8 
      9 #include "xfa/fxfa/xfa_ffpageview.h"
     10 #include "xfa/fxfa/xfa_ffwidget.h"
     11 #include "xfa/fxgraphics/cfx_graphics.h"
     12 
     13 namespace {
     14 
     15 const int32_t kMaxCount = 30;
     16 
     17 }  // namsepace
     18 
     19 CXFA_RenderContext::CXFA_RenderContext()
     20     : m_pWidget(nullptr), m_pPageView(nullptr), m_pGS(nullptr), m_dwStatus(0) {
     21   m_matrix.SetIdentity();
     22   m_rtClipRect.Reset();
     23 }
     24 
     25 CXFA_RenderContext::~CXFA_RenderContext() {}
     26 
     27 int32_t CXFA_RenderContext::StartRender(CXFA_FFPageView* pPageView,
     28                                         CFX_Graphics* pGS,
     29                                         const CFX_Matrix& matrix,
     30                                         const CXFA_RenderOptions& options) {
     31   m_pPageView = pPageView;
     32   m_pGS = pGS;
     33   m_matrix = matrix;
     34   m_options = options;
     35 
     36   CFX_Matrix mtRes;
     37   mtRes.SetReverse(matrix);
     38   m_rtClipRect = pGS->GetClipRect();
     39   mtRes.TransformRect(m_rtClipRect);
     40   m_dwStatus = m_options.m_bHighlight ? XFA_WidgetStatus_Highlight : 0;
     41   uint32_t dwFilterType = XFA_WidgetStatus_Visible |
     42                           (m_options.m_bPrint ? XFA_WidgetStatus_Printable
     43                                               : XFA_WidgetStatus_Viewable);
     44   m_pWidgetIterator.reset(
     45       m_pPageView->CreateWidgetIterator(XFA_TRAVERSEWAY_Form, dwFilterType));
     46   m_pWidget = m_pWidgetIterator->MoveToNext();
     47   return XFA_RENDERSTATUS_Ready;
     48 }
     49 
     50 int32_t CXFA_RenderContext::DoRender(IFX_Pause* pPause) {
     51   int32_t iCount = 0;
     52   while (m_pWidget) {
     53     CXFA_FFWidget* pWidget = m_pWidget;
     54     CFX_RectF rtWidgetBox = pWidget->GetBBox(XFA_WidgetStatus_Visible);
     55     rtWidgetBox.width += 1;
     56     rtWidgetBox.height += 1;
     57     if (rtWidgetBox.IntersectWith(m_rtClipRect))
     58       pWidget->RenderWidget(m_pGS, &m_matrix, m_dwStatus);
     59 
     60     m_pWidget = m_pWidgetIterator->MoveToNext();
     61     iCount++;
     62     if (iCount > kMaxCount && pPause && pPause->NeedToPauseNow())
     63       return XFA_RENDERSTATUS_ToBeContinued;
     64   }
     65   return XFA_RENDERSTATUS_Done;
     66 }
     67 
     68 void CXFA_RenderContext::StopRender() {
     69   m_pWidgetIterator.reset();
     70 }
     71