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