Home | History | Annotate | Download | only in css
      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