1 // Copyright 2014 The PDFium Authors
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/fwl/theme/cfwl_widgettp.h"
8
9 #include <algorithm>
10 #include <utility>
11
12 #include "xfa/fde/cfde_textout.h"
13 #include "xfa/fgas/font/cfgas_gefont.h"
14 #include "xfa/fgas/graphics/cfgas_gecolor.h"
15 #include "xfa/fgas/graphics/cfgas_gegraphics.h"
16 #include "xfa/fgas/graphics/cfgas_gepath.h"
17 #include "xfa/fwl/cfwl_themebackground.h"
18 #include "xfa/fwl/cfwl_themepart.h"
19 #include "xfa/fwl/cfwl_themetext.h"
20 #include "xfa/fwl/cfwl_widget.h"
21 #include "xfa/fwl/cfwl_widgetmgr.h"
22 #include "xfa/fwl/ifwl_themeprovider.h"
23
24 namespace pdfium {
25
26 CFWL_WidgetTP::CFWL_WidgetTP() = default;
27
28 CFWL_WidgetTP::~CFWL_WidgetTP() = default;
29
Trace(cppgc::Visitor * visitor) const30 void CFWL_WidgetTP::Trace(cppgc::Visitor* visitor) const {}
31
DrawBackground(const CFWL_ThemeBackground & pParams)32 void CFWL_WidgetTP::DrawBackground(const CFWL_ThemeBackground& pParams) {}
33
DrawText(const CFWL_ThemeText & pParams)34 void CFWL_WidgetTP::DrawText(const CFWL_ThemeText& pParams) {
35 EnsureTTOInitialized(pParams.GetWidget()->GetThemeProvider());
36 if (pParams.m_wsText.IsEmpty())
37 return;
38
39 CFGAS_GEGraphics* pGraphics = pParams.GetGraphics();
40 m_pTextOut->SetStyles(pParams.m_dwTTOStyles);
41 m_pTextOut->SetAlignment(pParams.m_iTTOAlign);
42
43 CFX_Matrix matrix = pParams.m_matrix;
44 matrix.Concat(*pGraphics->GetMatrix());
45 m_pTextOut->SetMatrix(matrix);
46 m_pTextOut->DrawLogicText(pGraphics->GetRenderDevice(), pParams.m_wsText,
47 pParams.m_PartRect);
48 }
49
InitializeArrowColorData()50 void CFWL_WidgetTP::InitializeArrowColorData() {
51 if (m_pColorData)
52 return;
53
54 m_pColorData = std::make_unique<CColorData>();
55 m_pColorData->clrBorder[0] = ArgbEncode(255, 202, 216, 249);
56 m_pColorData->clrBorder[1] = ArgbEncode(255, 171, 190, 233);
57 m_pColorData->clrBorder[2] = ArgbEncode(255, 135, 147, 219);
58 m_pColorData->clrBorder[3] = ArgbEncode(255, 172, 168, 153);
59 m_pColorData->clrStart[0] = ArgbEncode(255, 225, 234, 254);
60 m_pColorData->clrStart[1] = ArgbEncode(255, 253, 255, 255);
61 m_pColorData->clrStart[2] = ArgbEncode(255, 110, 142, 241);
62 m_pColorData->clrStart[3] = ArgbEncode(255, 254, 254, 251);
63 m_pColorData->clrEnd[0] = ArgbEncode(255, 175, 204, 251);
64 m_pColorData->clrEnd[1] = ArgbEncode(255, 185, 218, 251);
65 m_pColorData->clrEnd[2] = ArgbEncode(255, 210, 222, 235);
66 m_pColorData->clrEnd[3] = ArgbEncode(255, 243, 241, 236);
67 m_pColorData->clrSign[0] = ArgbEncode(255, 77, 97, 133);
68 m_pColorData->clrSign[1] = ArgbEncode(255, 77, 97, 133);
69 m_pColorData->clrSign[2] = ArgbEncode(255, 77, 97, 133);
70 m_pColorData->clrSign[3] = ArgbEncode(255, 128, 128, 128);
71 }
72
EnsureTTOInitialized(IFWL_ThemeProvider * pProvider)73 void CFWL_WidgetTP::EnsureTTOInitialized(IFWL_ThemeProvider* pProvider) {
74 if (m_pTextOut)
75 return;
76
77 m_pTextOut = std::make_unique<CFDE_TextOut>();
78 m_pTextOut->SetFont(pProvider->GetFWLFont());
79 m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
80 m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
81 }
82
DrawBorder(CFGAS_GEGraphics * pGraphics,const CFX_RectF & rect,const CFX_Matrix & matrix)83 void CFWL_WidgetTP::DrawBorder(CFGAS_GEGraphics* pGraphics,
84 const CFX_RectF& rect,
85 const CFX_Matrix& matrix) {
86 if (!pGraphics)
87 return;
88
89 CFGAS_GEPath path;
90 path.AddRectangle(rect.left, rect.top, rect.width, rect.height);
91 path.AddRectangle(rect.left + 1, rect.top + 1, rect.width - 2,
92 rect.height - 2);
93
94 CFGAS_GEGraphics::StateRestorer restorer(pGraphics);
95 pGraphics->SetFillColor(CFGAS_GEColor(ArgbEncode(255, 0, 0, 0)));
96 pGraphics->FillPath(path, CFX_FillRenderOptions::FillType::kEvenOdd, matrix);
97 }
98
FillBackground(CFGAS_GEGraphics * pGraphics,const CFX_RectF & rect,const CFX_Matrix & matrix)99 void CFWL_WidgetTP::FillBackground(CFGAS_GEGraphics* pGraphics,
100 const CFX_RectF& rect,
101 const CFX_Matrix& matrix) {
102 FillSolidRect(pGraphics, FWLTHEME_COLOR_Background, rect, matrix);
103 }
104
FillSolidRect(CFGAS_GEGraphics * pGraphics,FX_ARGB fillColor,const CFX_RectF & rect,const CFX_Matrix & matrix)105 void CFWL_WidgetTP::FillSolidRect(CFGAS_GEGraphics* pGraphics,
106 FX_ARGB fillColor,
107 const CFX_RectF& rect,
108 const CFX_Matrix& matrix) {
109 if (!pGraphics)
110 return;
111
112 CFGAS_GEPath path;
113 path.AddRectangle(rect.left, rect.top, rect.width, rect.height);
114
115 CFGAS_GEGraphics::StateRestorer restorer(pGraphics);
116 pGraphics->SetFillColor(CFGAS_GEColor(fillColor));
117 pGraphics->FillPath(path, CFX_FillRenderOptions::FillType::kWinding, matrix);
118 }
119
DrawFocus(CFGAS_GEGraphics * pGraphics,const CFX_RectF & rect,const CFX_Matrix & matrix)120 void CFWL_WidgetTP::DrawFocus(CFGAS_GEGraphics* pGraphics,
121 const CFX_RectF& rect,
122 const CFX_Matrix& matrix) {
123 if (!pGraphics)
124 return;
125
126 CFGAS_GEPath path;
127 path.AddRectangle(rect.left, rect.top, rect.width, rect.height);
128
129 CFGAS_GEGraphics::StateRestorer restorer(pGraphics);
130 pGraphics->SetStrokeColor(CFGAS_GEColor(0xFF000000));
131 pGraphics->SetLineDash({1, 1});
132 pGraphics->StrokePath(path, matrix);
133 }
134
DrawArrow(CFGAS_GEGraphics * pGraphics,const CFX_RectF & rect,FWLTHEME_DIRECTION eDict,FX_ARGB argSign,const CFX_Matrix & matrix)135 void CFWL_WidgetTP::DrawArrow(CFGAS_GEGraphics* pGraphics,
136 const CFX_RectF& rect,
137 FWLTHEME_DIRECTION eDict,
138 FX_ARGB argSign,
139 const CFX_Matrix& matrix) {
140 bool bVert =
141 (eDict == FWLTHEME_DIRECTION::kUp || eDict == FWLTHEME_DIRECTION::kDown);
142 float fLeft = ((rect.width - (bVert ? 9 : 6)) / 2 + rect.left) + 0.5f;
143 float fTop = ((rect.height - (bVert ? 6 : 9)) / 2 + rect.top) + 0.5f;
144 CFGAS_GEPath path;
145 switch (eDict) {
146 case FWLTHEME_DIRECTION::kDown:
147 path.MoveTo(CFX_PointF(fLeft, fTop + 1));
148 path.LineTo(CFX_PointF(fLeft + 4, fTop + 5));
149 path.LineTo(CFX_PointF(fLeft + 8, fTop + 1));
150 path.LineTo(CFX_PointF(fLeft + 7, fTop));
151 path.LineTo(CFX_PointF(fLeft + 4, fTop + 3));
152 path.LineTo(CFX_PointF(fLeft + 1, fTop));
153 break;
154 case FWLTHEME_DIRECTION::kUp:
155 path.MoveTo(CFX_PointF(fLeft, fTop + 4));
156 path.LineTo(CFX_PointF(fLeft + 4, fTop));
157 path.LineTo(CFX_PointF(fLeft + 8, fTop + 4));
158 path.LineTo(CFX_PointF(fLeft + 7, fTop + 5));
159 path.LineTo(CFX_PointF(fLeft + 4, fTop + 2));
160 path.LineTo(CFX_PointF(fLeft + 1, fTop + 5));
161 break;
162 case FWLTHEME_DIRECTION::kRight:
163 path.MoveTo(CFX_PointF(fLeft + 1, fTop));
164 path.LineTo(CFX_PointF(fLeft + 5, fTop + 4));
165 path.LineTo(CFX_PointF(fLeft + 1, fTop + 8));
166 path.LineTo(CFX_PointF(fLeft, fTop + 7));
167 path.LineTo(CFX_PointF(fLeft + 3, fTop + 4));
168 path.LineTo(CFX_PointF(fLeft, fTop + 1));
169 break;
170 case FWLTHEME_DIRECTION::kLeft:
171 path.MoveTo(CFX_PointF(fLeft, fTop + 4));
172 path.LineTo(CFX_PointF(fLeft + 4, fTop));
173 path.LineTo(CFX_PointF(fLeft + 5, fTop + 1));
174 path.LineTo(CFX_PointF(fLeft + 2, fTop + 4));
175 path.LineTo(CFX_PointF(fLeft + 5, fTop + 7));
176 path.LineTo(CFX_PointF(fLeft + 4, fTop + 8));
177 break;
178 }
179 pGraphics->SetFillColor(CFGAS_GEColor(argSign));
180 pGraphics->FillPath(path, CFX_FillRenderOptions::FillType::kWinding, matrix);
181 }
182
DrawBtn(CFGAS_GEGraphics * pGraphics,const CFX_RectF & rect,FWLTHEME_STATE eState,const CFX_Matrix & matrix)183 void CFWL_WidgetTP::DrawBtn(CFGAS_GEGraphics* pGraphics,
184 const CFX_RectF& rect,
185 FWLTHEME_STATE eState,
186 const CFX_Matrix& matrix) {
187 InitializeArrowColorData();
188 FillSolidRect(pGraphics,
189 m_pColorData->clrEnd[static_cast<size_t>(eState) - 1], rect,
190 matrix);
191
192 CFGAS_GEPath path;
193 path.AddRectangle(rect.left, rect.top, rect.width, rect.height);
194 pGraphics->SetStrokeColor(
195 CFGAS_GEColor(m_pColorData->clrBorder[static_cast<size_t>(eState) - 1]));
196 pGraphics->StrokePath(path, matrix);
197 }
198
DrawArrowBtn(CFGAS_GEGraphics * pGraphics,const CFX_RectF & rect,FWLTHEME_DIRECTION eDict,FWLTHEME_STATE eState,const CFX_Matrix & matrix)199 void CFWL_WidgetTP::DrawArrowBtn(CFGAS_GEGraphics* pGraphics,
200 const CFX_RectF& rect,
201 FWLTHEME_DIRECTION eDict,
202 FWLTHEME_STATE eState,
203 const CFX_Matrix& matrix) {
204 DrawBtn(pGraphics, rect, eState, matrix);
205 InitializeArrowColorData();
206 DrawArrow(pGraphics, rect, eDict,
207 m_pColorData->clrSign[static_cast<size_t>(eState) - 1], matrix);
208 }
209
210 } // namespace pdfium
211