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 "xfa/fde/css/cfde_csscomputedstyle.h" 8 9 #include "third_party/base/stl_util.h" 10 #include "xfa/fde/css/cfde_cssstringvalue.h" 11 #include "xfa/fde/css/cfde_cssvaluelist.h" 12 13 CFDE_CSSComputedStyle::CFDE_CSSComputedStyle() {} 14 15 CFDE_CSSComputedStyle::~CFDE_CSSComputedStyle() {} 16 17 bool CFDE_CSSComputedStyle::GetCustomStyle(const CFX_WideString& wsName, 18 CFX_WideString& wsValue) const { 19 for (auto iter = m_CustomProperties.rbegin(); 20 iter != m_CustomProperties.rend(); iter++) { 21 if (wsName == iter->name()) { 22 wsValue = iter->value(); 23 return true; 24 } 25 } 26 return false; 27 } 28 29 int32_t CFDE_CSSComputedStyle::CountFontFamilies() const { 30 return m_InheritedData.m_pFontFamily 31 ? m_InheritedData.m_pFontFamily->CountValues() 32 : 0; 33 } 34 35 const CFX_WideString CFDE_CSSComputedStyle::GetFontFamily(int32_t index) const { 36 return m_InheritedData.m_pFontFamily->GetValue(index) 37 .As<CFDE_CSSStringValue>() 38 ->Value(); 39 } 40 41 uint16_t CFDE_CSSComputedStyle::GetFontWeight() const { 42 return m_InheritedData.m_wFontWeight; 43 } 44 45 FDE_CSSFontVariant CFDE_CSSComputedStyle::GetFontVariant() const { 46 return m_InheritedData.m_eFontVariant; 47 } 48 49 FDE_CSSFontStyle CFDE_CSSComputedStyle::GetFontStyle() const { 50 return m_InheritedData.m_eFontStyle; 51 } 52 53 FX_FLOAT CFDE_CSSComputedStyle::GetFontSize() const { 54 return m_InheritedData.m_fFontSize; 55 } 56 57 FX_ARGB CFDE_CSSComputedStyle::GetColor() const { 58 return m_InheritedData.m_dwFontColor; 59 } 60 61 void CFDE_CSSComputedStyle::SetFontWeight(uint16_t wFontWeight) { 62 m_InheritedData.m_wFontWeight = wFontWeight; 63 } 64 65 void CFDE_CSSComputedStyle::SetFontVariant(FDE_CSSFontVariant eFontVariant) { 66 m_InheritedData.m_eFontVariant = eFontVariant; 67 } 68 69 void CFDE_CSSComputedStyle::SetFontStyle(FDE_CSSFontStyle eFontStyle) { 70 m_InheritedData.m_eFontStyle = eFontStyle; 71 } 72 73 void CFDE_CSSComputedStyle::SetFontSize(FX_FLOAT fFontSize) { 74 m_InheritedData.m_fFontSize = fFontSize; 75 } 76 77 void CFDE_CSSComputedStyle::SetColor(FX_ARGB dwFontColor) { 78 m_InheritedData.m_dwFontColor = dwFontColor; 79 } 80 81 const FDE_CSSRect* CFDE_CSSComputedStyle::GetBorderWidth() const { 82 return m_NonInheritedData.m_bHasBorder ? &(m_NonInheritedData.m_BorderWidth) 83 : nullptr; 84 } 85 86 const FDE_CSSRect* CFDE_CSSComputedStyle::GetMarginWidth() const { 87 return m_NonInheritedData.m_bHasMargin ? &(m_NonInheritedData.m_MarginWidth) 88 : nullptr; 89 } 90 91 const FDE_CSSRect* CFDE_CSSComputedStyle::GetPaddingWidth() const { 92 return m_NonInheritedData.m_bHasPadding ? &(m_NonInheritedData.m_PaddingWidth) 93 : nullptr; 94 } 95 96 void CFDE_CSSComputedStyle::SetMarginWidth(const FDE_CSSRect& rect) { 97 m_NonInheritedData.m_MarginWidth = rect; 98 m_NonInheritedData.m_bHasMargin = true; 99 } 100 101 void CFDE_CSSComputedStyle::SetPaddingWidth(const FDE_CSSRect& rect) { 102 m_NonInheritedData.m_PaddingWidth = rect; 103 m_NonInheritedData.m_bHasPadding = true; 104 } 105 106 FDE_CSSDisplay CFDE_CSSComputedStyle::GetDisplay() const { 107 return m_NonInheritedData.m_eDisplay; 108 } 109 110 FX_FLOAT CFDE_CSSComputedStyle::GetLineHeight() const { 111 return m_InheritedData.m_fLineHeight; 112 } 113 114 const FDE_CSSLength& CFDE_CSSComputedStyle::GetTextIndent() const { 115 return m_InheritedData.m_TextIndent; 116 } 117 118 FDE_CSSTextAlign CFDE_CSSComputedStyle::GetTextAlign() const { 119 return m_InheritedData.m_eTextAlign; 120 } 121 122 FDE_CSSVerticalAlign CFDE_CSSComputedStyle::GetVerticalAlign() const { 123 return m_NonInheritedData.m_eVerticalAlign; 124 } 125 126 FX_FLOAT CFDE_CSSComputedStyle::GetNumberVerticalAlign() const { 127 return m_NonInheritedData.m_fVerticalAlign; 128 } 129 130 uint32_t CFDE_CSSComputedStyle::GetTextDecoration() const { 131 return m_NonInheritedData.m_dwTextDecoration; 132 } 133 134 const FDE_CSSLength& CFDE_CSSComputedStyle::GetLetterSpacing() const { 135 return m_InheritedData.m_LetterSpacing; 136 } 137 138 void CFDE_CSSComputedStyle::SetLineHeight(FX_FLOAT fLineHeight) { 139 m_InheritedData.m_fLineHeight = fLineHeight; 140 } 141 142 void CFDE_CSSComputedStyle::SetTextIndent(const FDE_CSSLength& textIndent) { 143 m_InheritedData.m_TextIndent = textIndent; 144 } 145 146 void CFDE_CSSComputedStyle::SetTextAlign(FDE_CSSTextAlign eTextAlign) { 147 m_InheritedData.m_eTextAlign = eTextAlign; 148 } 149 150 void CFDE_CSSComputedStyle::SetNumberVerticalAlign(FX_FLOAT fAlign) { 151 m_NonInheritedData.m_eVerticalAlign = FDE_CSSVerticalAlign::Number, 152 m_NonInheritedData.m_fVerticalAlign = fAlign; 153 } 154 155 void CFDE_CSSComputedStyle::SetTextDecoration(uint32_t dwTextDecoration) { 156 m_NonInheritedData.m_dwTextDecoration = dwTextDecoration; 157 } 158 159 void CFDE_CSSComputedStyle::SetLetterSpacing( 160 const FDE_CSSLength& letterSpacing) { 161 m_InheritedData.m_LetterSpacing = letterSpacing; 162 } 163 164 void CFDE_CSSComputedStyle::AddCustomStyle(const CFDE_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 CFDE_CSSComputedStyle::InheritedData::InheritedData() 171 : m_LetterSpacing(FDE_CSSLengthUnit::Normal), 172 m_WordSpacing(FDE_CSSLengthUnit::Normal), 173 m_TextIndent(FDE_CSSLengthUnit::Point, 0), 174 m_pFontFamily(nullptr), 175 m_fFontSize(12.0f), 176 m_fLineHeight(14.0f), 177 m_dwFontColor(0xFF000000), 178 m_wFontWeight(400), 179 m_eFontVariant(FDE_CSSFontVariant::Normal), 180 m_eFontStyle(FDE_CSSFontStyle::Normal), 181 m_eTextAlign(FDE_CSSTextAlign::Left) {} 182 183 CFDE_CSSComputedStyle::InheritedData::~InheritedData() {} 184 185 CFDE_CSSComputedStyle::NonInheritedData::NonInheritedData() 186 : m_MarginWidth(FDE_CSSLengthUnit::Point, 0), 187 m_BorderWidth(FDE_CSSLengthUnit::Point, 0), 188 m_PaddingWidth(FDE_CSSLengthUnit::Point, 0), 189 m_fVerticalAlign(0.0f), 190 m_eDisplay(FDE_CSSDisplay::Inline), 191 m_eVerticalAlign(FDE_CSSVerticalAlign::Baseline), 192 m_dwTextDecoration(0), 193 m_bHasMargin(false), 194 m_bHasBorder(false), 195 m_bHasPadding(false) {} 196