xref: /aosp_15_r20/external/pdfium/core/fxcrt/css/cfx_csscomputedstyle.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2017 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 "core/fxcrt/css/cfx_csscomputedstyle.h"
8 
9 #include "core/fxcrt/css/cfx_cssstringvalue.h"
10 #include "core/fxcrt/css/cfx_cssvaluelist.h"
11 #include "third_party/base/containers/adapters.h"
12 
13 CFX_CSSComputedStyle::CFX_CSSComputedStyle() = default;
14 
15 CFX_CSSComputedStyle::~CFX_CSSComputedStyle() = default;
16 
GetCustomStyle(const WideString & wsName,WideString * pValue) const17 bool CFX_CSSComputedStyle::GetCustomStyle(const WideString& wsName,
18                                           WideString* pValue) const {
19   for (const auto& prop : pdfium::base::Reversed(m_CustomProperties)) {
20     if (wsName == prop.name()) {
21       *pValue = prop.value();
22       return true;
23     }
24   }
25   return false;
26 }
27 
GetLastFontFamily() const28 absl::optional<WideString> CFX_CSSComputedStyle::GetLastFontFamily() const {
29   if (!m_InheritedData.m_pFontFamily ||
30       m_InheritedData.m_pFontFamily->values().empty()) {
31     return absl::nullopt;
32   }
33 
34   return m_InheritedData.m_pFontFamily->values()
35       .back()
36       .AsRaw<CFX_CSSStringValue>()
37       ->Value();
38 }
39 
GetFontWeight() const40 uint16_t CFX_CSSComputedStyle::GetFontWeight() const {
41   return m_InheritedData.m_wFontWeight;
42 }
43 
GetFontVariant() const44 CFX_CSSFontVariant CFX_CSSComputedStyle::GetFontVariant() const {
45   return m_InheritedData.m_eFontVariant;
46 }
47 
GetFontStyle() const48 CFX_CSSFontStyle CFX_CSSComputedStyle::GetFontStyle() const {
49   return m_InheritedData.m_eFontStyle;
50 }
51 
GetFontSize() const52 float CFX_CSSComputedStyle::GetFontSize() const {
53   return m_InheritedData.m_fFontSize;
54 }
55 
GetColor() const56 FX_ARGB CFX_CSSComputedStyle::GetColor() const {
57   return m_InheritedData.m_dwFontColor;
58 }
59 
SetFontWeight(uint16_t wFontWeight)60 void CFX_CSSComputedStyle::SetFontWeight(uint16_t wFontWeight) {
61   m_InheritedData.m_wFontWeight = wFontWeight;
62 }
63 
SetFontVariant(CFX_CSSFontVariant eFontVariant)64 void CFX_CSSComputedStyle::SetFontVariant(CFX_CSSFontVariant eFontVariant) {
65   m_InheritedData.m_eFontVariant = eFontVariant;
66 }
67 
SetFontStyle(CFX_CSSFontStyle eFontStyle)68 void CFX_CSSComputedStyle::SetFontStyle(CFX_CSSFontStyle eFontStyle) {
69   m_InheritedData.m_eFontStyle = eFontStyle;
70 }
71 
SetFontSize(float fFontSize)72 void CFX_CSSComputedStyle::SetFontSize(float fFontSize) {
73   m_InheritedData.m_fFontSize = fFontSize;
74 }
75 
SetColor(FX_ARGB dwFontColor)76 void CFX_CSSComputedStyle::SetColor(FX_ARGB dwFontColor) {
77   m_InheritedData.m_dwFontColor = dwFontColor;
78 }
79 
GetBorderWidth() const80 const CFX_CSSRect* CFX_CSSComputedStyle::GetBorderWidth() const {
81   return m_NonInheritedData.m_bHasBorder ? &(m_NonInheritedData.m_BorderWidth)
82                                          : nullptr;
83 }
84 
GetMarginWidth() const85 const CFX_CSSRect* CFX_CSSComputedStyle::GetMarginWidth() const {
86   return m_NonInheritedData.m_bHasMargin ? &(m_NonInheritedData.m_MarginWidth)
87                                          : nullptr;
88 }
89 
GetPaddingWidth() const90 const CFX_CSSRect* CFX_CSSComputedStyle::GetPaddingWidth() const {
91   return m_NonInheritedData.m_bHasPadding ? &(m_NonInheritedData.m_PaddingWidth)
92                                           : nullptr;
93 }
94 
SetMarginWidth(const CFX_CSSRect & rect)95 void CFX_CSSComputedStyle::SetMarginWidth(const CFX_CSSRect& rect) {
96   m_NonInheritedData.m_MarginWidth = rect;
97   m_NonInheritedData.m_bHasMargin = true;
98 }
99 
SetPaddingWidth(const CFX_CSSRect & rect)100 void CFX_CSSComputedStyle::SetPaddingWidth(const CFX_CSSRect& rect) {
101   m_NonInheritedData.m_PaddingWidth = rect;
102   m_NonInheritedData.m_bHasPadding = true;
103 }
104 
GetDisplay() const105 CFX_CSSDisplay CFX_CSSComputedStyle::GetDisplay() const {
106   return m_NonInheritedData.m_eDisplay;
107 }
108 
GetLineHeight() const109 float CFX_CSSComputedStyle::GetLineHeight() const {
110   return m_InheritedData.m_fLineHeight;
111 }
112 
GetTextIndent() const113 const CFX_CSSLength& CFX_CSSComputedStyle::GetTextIndent() const {
114   return m_InheritedData.m_TextIndent;
115 }
116 
GetTextAlign() const117 CFX_CSSTextAlign CFX_CSSComputedStyle::GetTextAlign() const {
118   return m_InheritedData.m_eTextAlign;
119 }
120 
GetVerticalAlign() const121 CFX_CSSVerticalAlign CFX_CSSComputedStyle::GetVerticalAlign() const {
122   return m_NonInheritedData.m_eVerticalAlignType;
123 }
124 
GetNumberVerticalAlign() const125 float CFX_CSSComputedStyle::GetNumberVerticalAlign() const {
126   return m_NonInheritedData.m_fVerticalAlign;
127 }
128 
GetTextDecoration() const129 Mask<CFX_CSSTEXTDECORATION> CFX_CSSComputedStyle::GetTextDecoration() const {
130   return m_NonInheritedData.m_dwTextDecoration;
131 }
132 
GetLetterSpacing() const133 const CFX_CSSLength& CFX_CSSComputedStyle::GetLetterSpacing() const {
134   return m_InheritedData.m_LetterSpacing;
135 }
136 
SetLineHeight(float fLineHeight)137 void CFX_CSSComputedStyle::SetLineHeight(float fLineHeight) {
138   m_InheritedData.m_fLineHeight = fLineHeight;
139 }
140 
SetTextIndent(const CFX_CSSLength & textIndent)141 void CFX_CSSComputedStyle::SetTextIndent(const CFX_CSSLength& textIndent) {
142   m_InheritedData.m_TextIndent = textIndent;
143 }
144 
SetTextAlign(CFX_CSSTextAlign eTextAlign)145 void CFX_CSSComputedStyle::SetTextAlign(CFX_CSSTextAlign eTextAlign) {
146   m_InheritedData.m_eTextAlign = eTextAlign;
147 }
148 
SetNumberVerticalAlign(float fAlign)149 void CFX_CSSComputedStyle::SetNumberVerticalAlign(float fAlign) {
150   m_NonInheritedData.m_eVerticalAlignType = CFX_CSSVerticalAlign::Number,
151   m_NonInheritedData.m_fVerticalAlign = fAlign;
152 }
153 
SetTextDecoration(Mask<CFX_CSSTEXTDECORATION> dwTextDecoration)154 void CFX_CSSComputedStyle::SetTextDecoration(
155     Mask<CFX_CSSTEXTDECORATION> dwTextDecoration) {
156   m_NonInheritedData.m_dwTextDecoration = dwTextDecoration;
157 }
158 
SetLetterSpacing(const CFX_CSSLength & letterSpacing)159 void CFX_CSSComputedStyle::SetLetterSpacing(
160     const CFX_CSSLength& letterSpacing) {
161   m_InheritedData.m_LetterSpacing = letterSpacing;
162 }
163 
AddCustomStyle(const CFX_CSSCustomProperty & prop)164 void CFX_CSSComputedStyle::AddCustomStyle(const CFX_CSSCustomProperty& prop) {
165   // Force the property to be copied so we aren't dependent on the lifetime
166   // of whatever currently owns it.
167   m_CustomProperties.push_back(prop);
168 }
169 
170 CFX_CSSComputedStyle::InheritedData::InheritedData() = default;
171 
172 CFX_CSSComputedStyle::InheritedData::~InheritedData() = default;
173 
174 CFX_CSSComputedStyle::NonInheritedData::NonInheritedData() = default;
175