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) const17bool 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() const28absl::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() const40uint16_t CFX_CSSComputedStyle::GetFontWeight() const { 41 return m_InheritedData.m_wFontWeight; 42 } 43 GetFontVariant() const44CFX_CSSFontVariant CFX_CSSComputedStyle::GetFontVariant() const { 45 return m_InheritedData.m_eFontVariant; 46 } 47 GetFontStyle() const48CFX_CSSFontStyle CFX_CSSComputedStyle::GetFontStyle() const { 49 return m_InheritedData.m_eFontStyle; 50 } 51 GetFontSize() const52float CFX_CSSComputedStyle::GetFontSize() const { 53 return m_InheritedData.m_fFontSize; 54 } 55 GetColor() const56FX_ARGB CFX_CSSComputedStyle::GetColor() const { 57 return m_InheritedData.m_dwFontColor; 58 } 59 SetFontWeight(uint16_t wFontWeight)60void CFX_CSSComputedStyle::SetFontWeight(uint16_t wFontWeight) { 61 m_InheritedData.m_wFontWeight = wFontWeight; 62 } 63 SetFontVariant(CFX_CSSFontVariant eFontVariant)64void CFX_CSSComputedStyle::SetFontVariant(CFX_CSSFontVariant eFontVariant) { 65 m_InheritedData.m_eFontVariant = eFontVariant; 66 } 67 SetFontStyle(CFX_CSSFontStyle eFontStyle)68void CFX_CSSComputedStyle::SetFontStyle(CFX_CSSFontStyle eFontStyle) { 69 m_InheritedData.m_eFontStyle = eFontStyle; 70 } 71 SetFontSize(float fFontSize)72void CFX_CSSComputedStyle::SetFontSize(float fFontSize) { 73 m_InheritedData.m_fFontSize = fFontSize; 74 } 75 SetColor(FX_ARGB dwFontColor)76void CFX_CSSComputedStyle::SetColor(FX_ARGB dwFontColor) { 77 m_InheritedData.m_dwFontColor = dwFontColor; 78 } 79 GetBorderWidth() const80const CFX_CSSRect* CFX_CSSComputedStyle::GetBorderWidth() const { 81 return m_NonInheritedData.m_bHasBorder ? &(m_NonInheritedData.m_BorderWidth) 82 : nullptr; 83 } 84 GetMarginWidth() const85const CFX_CSSRect* CFX_CSSComputedStyle::GetMarginWidth() const { 86 return m_NonInheritedData.m_bHasMargin ? &(m_NonInheritedData.m_MarginWidth) 87 : nullptr; 88 } 89 GetPaddingWidth() const90const 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)95void 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)100void CFX_CSSComputedStyle::SetPaddingWidth(const CFX_CSSRect& rect) { 101 m_NonInheritedData.m_PaddingWidth = rect; 102 m_NonInheritedData.m_bHasPadding = true; 103 } 104 GetDisplay() const105CFX_CSSDisplay CFX_CSSComputedStyle::GetDisplay() const { 106 return m_NonInheritedData.m_eDisplay; 107 } 108 GetLineHeight() const109float CFX_CSSComputedStyle::GetLineHeight() const { 110 return m_InheritedData.m_fLineHeight; 111 } 112 GetTextIndent() const113const CFX_CSSLength& CFX_CSSComputedStyle::GetTextIndent() const { 114 return m_InheritedData.m_TextIndent; 115 } 116 GetTextAlign() const117CFX_CSSTextAlign CFX_CSSComputedStyle::GetTextAlign() const { 118 return m_InheritedData.m_eTextAlign; 119 } 120 GetVerticalAlign() const121CFX_CSSVerticalAlign CFX_CSSComputedStyle::GetVerticalAlign() const { 122 return m_NonInheritedData.m_eVerticalAlignType; 123 } 124 GetNumberVerticalAlign() const125float CFX_CSSComputedStyle::GetNumberVerticalAlign() const { 126 return m_NonInheritedData.m_fVerticalAlign; 127 } 128 GetTextDecoration() const129Mask<CFX_CSSTEXTDECORATION> CFX_CSSComputedStyle::GetTextDecoration() const { 130 return m_NonInheritedData.m_dwTextDecoration; 131 } 132 GetLetterSpacing() const133const CFX_CSSLength& CFX_CSSComputedStyle::GetLetterSpacing() const { 134 return m_InheritedData.m_LetterSpacing; 135 } 136 SetLineHeight(float fLineHeight)137void CFX_CSSComputedStyle::SetLineHeight(float fLineHeight) { 138 m_InheritedData.m_fLineHeight = fLineHeight; 139 } 140 SetTextIndent(const CFX_CSSLength & textIndent)141void CFX_CSSComputedStyle::SetTextIndent(const CFX_CSSLength& textIndent) { 142 m_InheritedData.m_TextIndent = textIndent; 143 } 144 SetTextAlign(CFX_CSSTextAlign eTextAlign)145void CFX_CSSComputedStyle::SetTextAlign(CFX_CSSTextAlign eTextAlign) { 146 m_InheritedData.m_eTextAlign = eTextAlign; 147 } 148 SetNumberVerticalAlign(float fAlign)149void 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)154void CFX_CSSComputedStyle::SetTextDecoration( 155 Mask<CFX_CSSTEXTDECORATION> dwTextDecoration) { 156 m_NonInheritedData.m_dwTextDecoration = dwTextDecoration; 157 } 158 SetLetterSpacing(const CFX_CSSLength & letterSpacing)159void CFX_CSSComputedStyle::SetLetterSpacing( 160 const CFX_CSSLength& letterSpacing) { 161 m_InheritedData.m_LetterSpacing = letterSpacing; 162 } 163 AddCustomStyle(const CFX_CSSCustomProperty & prop)164void 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