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