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