• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/fxfa/cxfa_fwltheme.h"
8 
9 #include "core/fxcrt/fx_codepage.h"
10 #include "xfa/fde/cfde_textout.h"
11 #include "xfa/fgas/font/cfgas_fontmgr.h"
12 #include "xfa/fgas/font/cfgas_gefont.h"
13 #include "xfa/fgas/font/cfgas_gemodule.h"
14 #include "xfa/fgas/graphics/cfgas_gecolor.h"
15 #include "xfa/fwl/cfwl_barcode.h"
16 #include "xfa/fwl/cfwl_caret.h"
17 #include "xfa/fwl/cfwl_checkbox.h"
18 #include "xfa/fwl/cfwl_combobox.h"
19 #include "xfa/fwl/cfwl_datetimepicker.h"
20 #include "xfa/fwl/cfwl_edit.h"
21 #include "xfa/fwl/cfwl_listbox.h"
22 #include "xfa/fwl/cfwl_monthcalendar.h"
23 #include "xfa/fwl/cfwl_picturebox.h"
24 #include "xfa/fwl/cfwl_pushbutton.h"
25 #include "xfa/fwl/cfwl_scrollbar.h"
26 #include "xfa/fwl/cfwl_themebackground.h"
27 #include "xfa/fwl/cfwl_themetext.h"
28 #include "xfa/fwl/theme/cfwl_widgettp.h"
29 #include "xfa/fxfa/cxfa_ffapp.h"
30 #include "xfa/fxfa/cxfa_ffwidget.h"
31 #include "xfa/fxfa/cxfa_fontmgr.h"
32 #include "xfa/fxfa/parser/cxfa_para.h"
33 
34 namespace pdfium {
35 
36 namespace {
37 
38 constexpr const wchar_t* kFWLThemeCalFonts[] = {
39     L"Arial",
40     L"Courier New",
41     L"DejaVu Sans",
42 };
43 
44 const float kLineHeight = 12.0f;
45 
GetOutmostFFWidget(CFWL_Widget * pWidget)46 CXFA_FFWidget* GetOutmostFFWidget(CFWL_Widget* pWidget) {
47   CFWL_Widget* pOuter = pWidget ? pWidget->GetOutmost() : nullptr;
48   return pOuter ? static_cast<CXFA_FFWidget*>(pOuter->GetAdapterIface())
49                 : nullptr;
50 }
51 
52 }  // namespace
53 
CXFA_FWLTheme(cppgc::Heap * pHeap,CXFA_FFApp * pApp)54 CXFA_FWLTheme::CXFA_FWLTheme(cppgc::Heap* pHeap, CXFA_FFApp* pApp)
55     : IFWL_ThemeProvider(pHeap),
56       m_pTextOut(std::make_unique<CFDE_TextOut>()),
57       m_pApp(pApp) {}
58 
59 CXFA_FWLTheme::~CXFA_FWLTheme() = default;
60 
PreFinalize()61 void CXFA_FWLTheme::PreFinalize() {
62   m_pTextOut.reset();
63 }
64 
Trace(cppgc::Visitor * visitor) const65 void CXFA_FWLTheme::Trace(cppgc::Visitor* visitor) const {
66   IFWL_ThemeProvider::Trace(visitor);
67   visitor->Trace(m_pApp);
68 }
69 
LoadCalendarFont(CXFA_FFDoc * doc)70 bool CXFA_FWLTheme::LoadCalendarFont(CXFA_FFDoc* doc) {
71   if (m_pCalendarFont)
72     return true;
73 
74   for (const wchar_t* font : kFWLThemeCalFonts) {
75     m_pCalendarFont = m_pApp->GetXFAFontMgr()->GetFont(doc, font, 0);
76     if (m_pCalendarFont)
77       return true;
78   }
79 
80   m_pCalendarFont = CFGAS_GEModule::Get()->GetFontMgr()->GetFontByCodePage(
81       FX_CodePage::kMSWin_WesternEuropean, 0, nullptr);
82   return !!m_pCalendarFont;
83 }
84 
DrawBackground(const CFWL_ThemeBackground & pParams)85 void CXFA_FWLTheme::DrawBackground(const CFWL_ThemeBackground& pParams) {
86   GetTheme(pParams.GetWidget())->DrawBackground(pParams);
87 }
88 
DrawText(const CFWL_ThemeText & pParams)89 void CXFA_FWLTheme::DrawText(const CFWL_ThemeText& pParams) {
90   if (pParams.m_wsText.IsEmpty())
91     return;
92 
93   if (pParams.GetWidget()->GetClassID() == FWL_Type::MonthCalendar) {
94     CXFA_FFWidget* pWidget = GetOutmostFFWidget(pParams.GetWidget());
95     if (!pWidget)
96       return;
97 
98     m_pTextOut->SetStyles(pParams.m_dwTTOStyles);
99     m_pTextOut->SetAlignment(pParams.m_iTTOAlign);
100     m_pTextOut->SetFont(m_pCalendarFont);
101     m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
102     m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
103     if ((pParams.GetPart() == CFWL_ThemePart::Part::kDatesIn) &&
104         !(pParams.m_dwStates & CFWL_PartState::kFlagged) &&
105         (pParams.m_dwStates &
106          Mask<CFWL_PartState>{CFWL_PartState::kHovered,
107                               CFWL_PartState::kSelected})) {
108       m_pTextOut->SetTextColor(0xFF888888);
109     }
110     if (pParams.GetPart() == CFWL_ThemePart::Part::kCaption)
111       m_pTextOut->SetTextColor(ArgbEncode(0xff, 0, 153, 255));
112 
113     CFGAS_GEGraphics* pGraphics = pParams.GetGraphics();
114     CFX_RenderDevice* pRenderDevice = pGraphics->GetRenderDevice();
115     CFX_Matrix mtPart = pParams.m_matrix;
116     const CFX_Matrix* pMatrix = pGraphics->GetMatrix();
117     if (pMatrix)
118       mtPart.Concat(*pMatrix);
119 
120     m_pTextOut->SetMatrix(mtPart);
121     m_pTextOut->DrawLogicText(pRenderDevice, pParams.m_wsText,
122                               pParams.m_PartRect);
123     return;
124   }
125   CXFA_FFWidget* pWidget = GetOutmostFFWidget(pParams.GetWidget());
126   if (!pWidget)
127     return;
128 
129   CXFA_Node* pNode = pWidget->GetNode();
130   CFGAS_GEGraphics* pGraphics = pParams.GetGraphics();
131   CFX_RenderDevice* pRenderDevice = pGraphics->GetRenderDevice();
132   m_pTextOut->SetStyles(pParams.m_dwTTOStyles);
133   m_pTextOut->SetAlignment(pParams.m_iTTOAlign);
134   m_pTextOut->SetFont(pNode->GetFGASFont(pWidget->GetDoc()));
135   m_pTextOut->SetFontSize(pNode->GetFontSize());
136   m_pTextOut->SetTextColor(pNode->GetTextColor());
137   CFX_Matrix mtPart = pParams.m_matrix;
138   const CFX_Matrix* pMatrix = pGraphics->GetMatrix();
139   if (pMatrix)
140     mtPart.Concat(*pMatrix);
141 
142   m_pTextOut->SetMatrix(mtPart);
143   m_pTextOut->DrawLogicText(pRenderDevice, pParams.m_wsText,
144                             pParams.m_PartRect);
145 }
146 
GetUIMargin(const CFWL_ThemePart & pThemePart) const147 CFX_RectF CXFA_FWLTheme::GetUIMargin(const CFWL_ThemePart& pThemePart) const {
148   CXFA_FFWidget* pWidget = GetOutmostFFWidget(pThemePart.GetWidget());
149   if (!pWidget)
150     return CFX_RectF();
151 
152   CXFA_ContentLayoutItem* pItem = pWidget->GetLayoutItem();
153   CXFA_Node* pNode = pWidget->GetNode();
154   CFX_RectF rect = pNode->GetUIMargin();
155   CXFA_Para* para = pNode->GetParaIfExists();
156   if (para) {
157     rect.left += para->GetMarginLeft();
158     if (pNode->IsMultiLine())
159       rect.width += para->GetMarginRight();
160   }
161   if (!pItem->GetPrev()) {
162     if (pItem->GetNext())
163       rect.height = 0;
164   } else if (!pItem->GetNext()) {
165     rect.top = 0;
166   } else {
167     rect.top = 0;
168     rect.height = 0;
169   }
170   return rect;
171 }
172 
GetCXBorderSize() const173 float CXFA_FWLTheme::GetCXBorderSize() const {
174   return 1.0f;
175 }
176 
GetCYBorderSize() const177 float CXFA_FWLTheme::GetCYBorderSize() const {
178   return 1.0f;
179 }
180 
GetFontSize(const CFWL_ThemePart & pThemePart) const181 float CXFA_FWLTheme::GetFontSize(const CFWL_ThemePart& pThemePart) const {
182   if (CXFA_FFWidget* pWidget = GetOutmostFFWidget(pThemePart.GetWidget()))
183     return pWidget->GetNode()->GetFontSize();
184   return FWLTHEME_CAPACITY_FontSize;
185 }
186 
GetFont(const CFWL_ThemePart & pThemePart)187 RetainPtr<CFGAS_GEFont> CXFA_FWLTheme::GetFont(
188     const CFWL_ThemePart& pThemePart) {
189   if (CXFA_FFWidget* pWidget = GetOutmostFFWidget(pThemePart.GetWidget()))
190     return pWidget->GetNode()->GetFGASFont(pWidget->GetDoc());
191 
192   return GetFWLFont();
193 }
194 
GetFWLFont()195 RetainPtr<CFGAS_GEFont> CXFA_FWLTheme::GetFWLFont() {
196   if (!m_pFWLFont)
197     m_pFWLFont = CFGAS_GEFont::LoadFont(L"Helvetica", 0, FX_CodePage::kDefANSI);
198 
199   return m_pFWLFont;
200 }
201 
GetLineHeight(const CFWL_ThemePart & pThemePart) const202 float CXFA_FWLTheme::GetLineHeight(const CFWL_ThemePart& pThemePart) const {
203   if (CXFA_FFWidget* pWidget = GetOutmostFFWidget(pThemePart.GetWidget()))
204     return pWidget->GetNode()->GetLineHeight();
205   return kLineHeight;
206 }
207 
GetScrollBarWidth() const208 float CXFA_FWLTheme::GetScrollBarWidth() const {
209   return 9.0f;
210 }
211 
GetTextColor(const CFWL_ThemePart & pThemePart) const212 FX_COLORREF CXFA_FWLTheme::GetTextColor(
213     const CFWL_ThemePart& pThemePart) const {
214   if (CXFA_FFWidget* pWidget = GetOutmostFFWidget(pThemePart.GetWidget()))
215     return pWidget->GetNode()->GetTextColor();
216   return FWLTHEME_CAPACITY_TextColor;
217 }
218 
GetSpaceAboveBelow(const CFWL_ThemePart & pThemePart) const219 CFX_SizeF CXFA_FWLTheme::GetSpaceAboveBelow(
220     const CFWL_ThemePart& pThemePart) const {
221   CFX_SizeF sizeAboveBelow;
222   if (CXFA_FFWidget* pWidget = GetOutmostFFWidget(pThemePart.GetWidget())) {
223     CXFA_Para* para = pWidget->GetNode()->GetParaIfExists();
224     if (para) {
225       sizeAboveBelow.width = para->GetSpaceAbove();
226       sizeAboveBelow.height = para->GetSpaceBelow();
227     }
228   }
229   return sizeAboveBelow;
230 }
231 
CalcTextRect(const CFWL_ThemeText & pParams,CFX_RectF * pRect)232 void CXFA_FWLTheme::CalcTextRect(const CFWL_ThemeText& pParams,
233                                  CFX_RectF* pRect) {
234   CXFA_FFWidget* pWidget = GetOutmostFFWidget(pParams.GetWidget());
235   if (!pWidget)
236     return;
237 
238   if (pParams.GetWidget()->GetClassID() == FWL_Type::MonthCalendar) {
239     m_pTextOut->SetFont(m_pCalendarFont);
240     m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize);
241     m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor);
242     m_pTextOut->SetAlignment(pParams.m_iTTOAlign);
243     m_pTextOut->SetStyles(pParams.m_dwTTOStyles);
244     m_pTextOut->CalcLogicSize(pParams.m_wsText.AsStringView(), pRect);
245     return;
246   }
247 
248   CXFA_Node* pNode = pWidget->GetNode();
249   m_pTextOut->SetFont(pNode->GetFGASFont(pWidget->GetDoc()));
250   m_pTextOut->SetFontSize(pNode->GetFontSize());
251   m_pTextOut->SetTextColor(pNode->GetTextColor());
252   m_pTextOut->SetAlignment(pParams.m_iTTOAlign);
253   m_pTextOut->SetStyles(pParams.m_dwTTOStyles);
254   m_pTextOut->CalcLogicSize(pParams.m_wsText.AsStringView(), pRect);
255 }
256 
257 }  // namespace pdfium
258