1 // Copyright 2017 PDFium Authors. All rights reserved.
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
12 CFX_CSSComputedStyle::CFX_CSSComputedStyle() = default;
13
14 CFX_CSSComputedStyle::~CFX_CSSComputedStyle() = default;
15
GetCustomStyle(const WideString & wsName,WideString * pValue) const16 bool CFX_CSSComputedStyle::GetCustomStyle(const WideString& wsName,
17 WideString* pValue) const {
18 for (auto iter = m_CustomProperties.rbegin();
19 iter != m_CustomProperties.rend(); ++iter) {
20 if (wsName == iter->name()) {
21 *pValue = iter->value();
22 return true;
23 }
24 }
25 return false;
26 }
27
CountFontFamilies() const28 int32_t CFX_CSSComputedStyle::CountFontFamilies() const {
29 return m_InheritedData.m_pFontFamily
30 ? m_InheritedData.m_pFontFamily->CountValues()
31 : 0;
32 }
33
GetFontFamily(int32_t index) const34 const WideString CFX_CSSComputedStyle::GetFontFamily(int32_t index) const {
35 return m_InheritedData.m_pFontFamily->GetValue(index)
36 .As<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_eVerticalAlign;
123 }
124
GetNumberVerticalAlign() const125 float CFX_CSSComputedStyle::GetNumberVerticalAlign() const {
126 return m_NonInheritedData.m_fVerticalAlign;
127 }
128
GetTextDecoration() const129 uint32_t 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_eVerticalAlign = CFX_CSSVerticalAlign::Number,
151 m_NonInheritedData.m_fVerticalAlign = fAlign;
152 }
153
SetTextDecoration(uint32_t dwTextDecoration)154 void CFX_CSSComputedStyle::SetTextDecoration(uint32_t dwTextDecoration) {
155 m_NonInheritedData.m_dwTextDecoration = dwTextDecoration;
156 }
157
SetLetterSpacing(const CFX_CSSLength & letterSpacing)158 void CFX_CSSComputedStyle::SetLetterSpacing(
159 const CFX_CSSLength& letterSpacing) {
160 m_InheritedData.m_LetterSpacing = letterSpacing;
161 }
162
AddCustomStyle(const CFX_CSSCustomProperty & prop)163 void CFX_CSSComputedStyle::AddCustomStyle(const CFX_CSSCustomProperty& prop) {
164 // Force the property to be copied so we aren't dependent on the lifetime
165 // of whatever currently owns it.
166 m_CustomProperties.push_back(prop);
167 }
168
InheritedData()169 CFX_CSSComputedStyle::InheritedData::InheritedData()
170 : m_LetterSpacing(CFX_CSSLengthUnit::Normal, 0),
171 m_WordSpacing(CFX_CSSLengthUnit::Normal, 0),
172 m_TextIndent(CFX_CSSLengthUnit::Point, 0),
173 m_pFontFamily(nullptr),
174 m_fFontSize(12.0f),
175 m_fLineHeight(14.0f),
176 m_dwFontColor(0xFF000000),
177 m_wFontWeight(400),
178 m_eFontVariant(CFX_CSSFontVariant::Normal),
179 m_eFontStyle(CFX_CSSFontStyle::Normal),
180 m_eTextAlign(CFX_CSSTextAlign::Left) {}
181
~InheritedData()182 CFX_CSSComputedStyle::InheritedData::~InheritedData() {}
183
NonInheritedData()184 CFX_CSSComputedStyle::NonInheritedData::NonInheritedData()
185 : m_MarginWidth(CFX_CSSLengthUnit::Point, 0),
186 m_BorderWidth(CFX_CSSLengthUnit::Point, 0),
187 m_PaddingWidth(CFX_CSSLengthUnit::Point, 0),
188 m_fVerticalAlign(0.0f),
189 m_eDisplay(CFX_CSSDisplay::Inline),
190 m_eVerticalAlign(CFX_CSSVerticalAlign::Baseline),
191 m_dwTextDecoration(0),
192 m_bHasMargin(false),
193 m_bHasBorder(false),
194 m_bHasPadding(false) {}
195