xref: /aosp_15_r20/external/pdfium/xfa/fwl/theme/cfwl_widgettp.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
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