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/app/xfa_ffpath.h"
      8 
      9 #include "xfa/fxfa/app/xfa_ffdraw.h"
     10 #include "xfa/fxfa/xfa_ffapp.h"
     11 #include "xfa/fxfa/xfa_ffdoc.h"
     12 #include "xfa/fxfa/xfa_ffpageview.h"
     13 #include "xfa/fxfa/xfa_ffwidget.h"
     14 #include "xfa/fxgraphics/cfx_color.h"
     15 #include "xfa/fxgraphics/cfx_path.h"
     16 
     17 CXFA_FFLine::CXFA_FFLine(CXFA_WidgetAcc* pDataAcc) : CXFA_FFDraw(pDataAcc) {}
     18 
     19 CXFA_FFLine::~CXFA_FFLine() {}
     20 
     21 void CXFA_FFLine::GetRectFromHand(CFX_RectF& rect,
     22                                   int32_t iHand,
     23                                   FX_FLOAT fLineWidth) {
     24   FX_FLOAT fHalfWidth = fLineWidth / 2.0f;
     25   if (rect.height < 1.0f) {
     26     switch (iHand) {
     27       case XFA_ATTRIBUTEENUM_Left:
     28         rect.top -= fHalfWidth;
     29         break;
     30       case XFA_ATTRIBUTEENUM_Right:
     31         rect.top += fHalfWidth;
     32     }
     33   } else if (rect.width < 1.0f) {
     34     switch (iHand) {
     35       case XFA_ATTRIBUTEENUM_Left:
     36         rect.left += fHalfWidth;
     37         break;
     38       case XFA_ATTRIBUTEENUM_Right:
     39         rect.left += fHalfWidth;
     40         break;
     41     }
     42   } else {
     43     switch (iHand) {
     44       case XFA_ATTRIBUTEENUM_Left:
     45         rect.Inflate(fHalfWidth, fHalfWidth);
     46         break;
     47       case XFA_ATTRIBUTEENUM_Right:
     48         rect.Deflate(fHalfWidth, fHalfWidth);
     49         break;
     50     }
     51   }
     52 }
     53 
     54 void CXFA_FFLine::RenderWidget(CFX_Graphics* pGS,
     55                                CFX_Matrix* pMatrix,
     56                                uint32_t dwStatus) {
     57   if (!IsMatchVisibleStatus(dwStatus))
     58     return;
     59 
     60   CXFA_Value value = m_pDataAcc->GetFormValue();
     61   if (!value)
     62     return;
     63 
     64   CXFA_Line lineObj = value.GetLine();
     65   FX_ARGB lineColor = 0xFF000000;
     66   int32_t iStrokeType = 0;
     67   FX_FLOAT fLineWidth = 1.0f;
     68   int32_t iCap = 0;
     69   CXFA_Edge edge = lineObj.GetEdge();
     70   if (edge) {
     71     if (edge.GetPresence() != XFA_ATTRIBUTEENUM_Visible)
     72       return;
     73 
     74     lineColor = edge.GetColor();
     75     iStrokeType = edge.GetStrokeType();
     76     fLineWidth = edge.GetThickness();
     77     iCap = edge.GetCapType();
     78   }
     79 
     80   CFX_Matrix mtRotate = GetRotateMatrix();
     81   if (pMatrix)
     82     mtRotate.Concat(*pMatrix);
     83 
     84   CFX_RectF rtLine = GetRectWithoutRotate();
     85   if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin())
     86     XFA_RectWidthoutMargin(rtLine, mgWidget);
     87 
     88   GetRectFromHand(rtLine, lineObj.GetHand(), fLineWidth);
     89   CFX_Path linePath;
     90   if (lineObj.GetSlope() && rtLine.right() > 0.0f && rtLine.bottom() > 0.0f)
     91     linePath.AddLine(rtLine.TopRight(), rtLine.BottomLeft());
     92   else
     93     linePath.AddLine(rtLine.TopLeft(), rtLine.BottomRight());
     94 
     95   CFX_Color color(lineColor);
     96   pGS->SaveGraphState();
     97   pGS->SetLineWidth(fLineWidth, true);
     98   XFA_StrokeTypeSetLineDash(pGS, iStrokeType, iCap);
     99   pGS->SetStrokeColor(&color);
    100   pGS->SetLineCap(XFA_LineCapToFXGE(iCap));
    101   pGS->StrokePath(&linePath, &mtRotate);
    102   pGS->RestoreGraphState();
    103 }
    104 
    105 CXFA_FFArc::CXFA_FFArc(CXFA_WidgetAcc* pDataAcc) : CXFA_FFDraw(pDataAcc) {}
    106 
    107 CXFA_FFArc::~CXFA_FFArc() {}
    108 
    109 void CXFA_FFArc::RenderWidget(CFX_Graphics* pGS,
    110                               CFX_Matrix* pMatrix,
    111                               uint32_t dwStatus) {
    112   if (!IsMatchVisibleStatus(dwStatus))
    113     return;
    114 
    115   CXFA_Value value = m_pDataAcc->GetFormValue();
    116   if (!value)
    117     return;
    118 
    119   CXFA_Arc arcObj = value.GetArc();
    120   CFX_Matrix mtRotate = GetRotateMatrix();
    121   if (pMatrix)
    122     mtRotate.Concat(*pMatrix);
    123 
    124   CFX_RectF rtArc = GetRectWithoutRotate();
    125   if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin())
    126     XFA_RectWidthoutMargin(rtArc, mgWidget);
    127 
    128   DrawBorder(pGS, arcObj, rtArc, &mtRotate);
    129 }
    130 
    131 CXFA_FFRectangle::CXFA_FFRectangle(CXFA_WidgetAcc* pDataAcc)
    132     : CXFA_FFDraw(pDataAcc) {}
    133 
    134 CXFA_FFRectangle::~CXFA_FFRectangle() {}
    135 
    136 void CXFA_FFRectangle::RenderWidget(CFX_Graphics* pGS,
    137                                     CFX_Matrix* pMatrix,
    138                                     uint32_t dwStatus) {
    139   if (!IsMatchVisibleStatus(dwStatus))
    140     return;
    141 
    142   CXFA_Value value = m_pDataAcc->GetFormValue();
    143   if (!value)
    144     return;
    145 
    146   CXFA_Rectangle rtObj = value.GetRectangle();
    147   CFX_RectF rect = GetRectWithoutRotate();
    148   if (CXFA_Margin mgWidget = m_pDataAcc->GetMargin())
    149     XFA_RectWidthoutMargin(rect, mgWidget);
    150 
    151   CFX_Matrix mtRotate = GetRotateMatrix();
    152   if (pMatrix)
    153     mtRotate.Concat(*pMatrix);
    154 
    155   DrawBorder(pGS, rtObj, rect, &mtRotate);
    156 }
    157