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