// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #ifndef XFA_FDE_CSS_FDE_CSSSTYLESELECTOR_H_ #define XFA_FDE_CSS_FDE_CSSSTYLESELECTOR_H_ #include #include #include #include "core/fxcrt/fx_ext.h" #include "xfa/fde/css/fde_css.h" #include "xfa/fde/css/fde_csscache.h" #include "xfa/fde/css/fde_cssdeclaration.h" class CFDE_CSSAccelerator; class CFDE_CSSComputedStyle; class CXFA_CSSTagProvider; class FDE_CSSRuleData { public: FDE_CSSRuleData(CFDE_CSSSelector* pSel, CFDE_CSSDeclaration* pDecl, uint32_t dwPos); CFDE_CSSSelector* const pSelector; CFDE_CSSDeclaration* const pDeclaration; uint32_t dwPriority; FDE_CSSRuleData* pNext; }; class CFDE_CSSRuleCollection { public: CFDE_CSSRuleCollection(); ~CFDE_CSSRuleCollection(); void AddRulesFrom(const CFX_ArrayTemplate& sheets, uint32_t dwMediaList, CFGAS_FontMgr* pFontMgr); void Clear(); int32_t CountSelectors() const { return m_iSelectors; } FDE_CSSRuleData* GetIDRuleData(uint32_t dwIDHash) { auto it = m_IDRules.find(dwIDHash); return it != m_IDRules.end() ? it->second : nullptr; } FDE_CSSRuleData* GetTagRuleData(uint32_t dwTagHash) { auto it = m_TagRules.find(dwTagHash); return it != m_TagRules.end() ? it->second : nullptr; } FDE_CSSRuleData* GetClassRuleData(uint32_t dwIDHash) { auto it = m_ClassRules.find(dwIDHash); return it != m_ClassRules.end() ? it->second : nullptr; } FDE_CSSRuleData* GetUniversalRuleData() { return m_pUniversalRules; } FDE_CSSRuleData* GetPseudoRuleData() { return m_pPseudoRules; } protected: void AddRulesFrom(IFDE_CSSStyleSheet* pStyleSheet, IFDE_CSSRule* pRule, uint32_t dwMediaList, CFGAS_FontMgr* pFontMgr); void AddRuleTo(std::map* pMap, uint32_t dwKey, CFDE_CSSSelector* pSel, CFDE_CSSDeclaration* pDecl); bool AddRuleTo(FDE_CSSRuleData** pList, FDE_CSSRuleData* pData); FDE_CSSRuleData* NewRuleData(CFDE_CSSSelector* pSel, CFDE_CSSDeclaration* pDecl); std::map m_IDRules; std::map m_TagRules; std::map m_ClassRules; FDE_CSSRuleData* m_pUniversalRules; FDE_CSSRuleData* m_pPseudoRules; int32_t m_iSelectors; }; class CFDE_CSSStyleSelector { public: explicit CFDE_CSSStyleSelector(CFGAS_FontMgr* pFontMgr); ~CFDE_CSSStyleSelector(); void SetDefFontSize(FX_FLOAT fFontSize); bool SetStyleSheet(FDE_CSSStyleSheetGroup eType, IFDE_CSSStyleSheet* pSheet); bool SetStyleSheets(FDE_CSSStyleSheetGroup eType, const CFX_ArrayTemplate* pArray); void SetStylePriority(FDE_CSSStyleSheetGroup eType, FDE_CSSStyleSheetPriority ePriority); void UpdateStyleIndex(uint32_t dwMediaList); CFDE_CSSAccelerator* InitAccelerator(); IFDE_CSSComputedStyle* CreateComputedStyle( IFDE_CSSComputedStyle* pParentStyle); int32_t MatchDeclarations(CXFA_CSSTagProvider* pTag, CFDE_CSSDeclarationArray& matchedDecls, FDE_CSSPseudo ePseudoType = FDE_CSSPseudo::NONE); void ComputeStyle(CXFA_CSSTagProvider* pTag, const CFDE_CSSDeclaration** ppDeclArray, int32_t iDeclCount, IFDE_CSSComputedStyle* pDestStyle); protected: void Reset(); void MatchRules(FDE_CSSTagCache* pCache, FDE_CSSRuleData* pList, FDE_CSSPseudo ePseudoType); bool MatchSelector(FDE_CSSTagCache* pCache, CFDE_CSSSelector* pSel, FDE_CSSPseudo ePseudoType); void AppendInlineStyle(CFDE_CSSDeclaration* pDecl, const FX_WCHAR* psz, int32_t iLen); void ApplyDeclarations(bool bPriority, const CFDE_CSSDeclaration** ppDeclArray, int32_t iDeclCount, IFDE_CSSComputedStyle* pDestStyle); void ApplyProperty(FDE_CSSProperty eProperty, IFDE_CSSValue* pValue, CFDE_CSSComputedStyle* pComputedStyle); FX_FLOAT ApplyNumber(FDE_CSSPrimitiveType eUnit, FX_FLOAT fValue, FX_FLOAT fPercentBase); bool SetLengthWithPercent(FDE_CSSLENGTH& width, FDE_CSSPrimitiveType eType, IFDE_CSSPrimitiveValue* pPrimitive, FX_FLOAT fFontSize); FX_FLOAT ToFontSize(FDE_CSSPropertyValue eValue, FX_FLOAT fCurFontSize); FDE_CSSDisplay ToDisplay(FDE_CSSPropertyValue eValue); FDE_CSSTextAlign ToTextAlign(FDE_CSSPropertyValue eValue); uint16_t ToFontWeight(FDE_CSSPropertyValue eValue); FDE_CSSFontStyle ToFontStyle(FDE_CSSPropertyValue eValue); FDE_CSSVerticalAlign ToVerticalAlign(FDE_CSSPropertyValue eValue); uint32_t ToTextDecoration(IFDE_CSSValueList* pList); FDE_CSSFontVariant ToFontVariant(FDE_CSSPropertyValue eValue); CFGAS_FontMgr* const m_pFontMgr; FX_FLOAT m_fDefFontSize; CFX_ArrayTemplate m_SheetGroups[3]; CFDE_CSSRuleCollection m_RuleCollection[3]; FDE_CSSStyleSheetGroup m_ePriorities[3]; std::unique_ptr m_pAccelerator; std::vector m_MatchedRules; }; class CFDE_CSSInheritedData { public: CFDE_CSSInheritedData(); FDE_CSSLENGTH m_LetterSpacing; FDE_CSSLENGTH m_WordSpacing; FDE_CSSLENGTH m_TextIndent; IFDE_CSSValueList* m_pFontFamily; FX_FLOAT m_fFontSize; FX_FLOAT m_fLineHeight; FX_ARGB m_dwFontColor; uint16_t m_wFontWeight; FDE_CSSFontVariant m_eFontVariant; FDE_CSSFontStyle m_eFontStyle; FDE_CSSTextAlign m_eTextAlign; }; class CFDE_CSSNonInheritedData { public: CFDE_CSSNonInheritedData(); FDE_CSSRECT m_MarginWidth; FDE_CSSRECT m_BorderWidth; FDE_CSSRECT m_PaddingWidth; FDE_CSSLENGTH m_Top; FDE_CSSLENGTH m_Bottom; FDE_CSSLENGTH m_Left; FDE_CSSLENGTH m_Right; FX_FLOAT m_fVerticalAlign; FDE_CSSDisplay m_eDisplay; FDE_CSSVerticalAlign m_eVerticalAlign; uint8_t m_dwTextDecoration; bool m_bHasMargin; bool m_bHasBorder; bool m_bHasPadding; }; class CFDE_CSSComputedStyle : public IFDE_CSSComputedStyle, public IFDE_CSSBoundaryStyle, public IFDE_CSSFontStyle, public IFDE_CSSPositionStyle, public IFDE_CSSParagraphStyle { public: CFDE_CSSComputedStyle(); ~CFDE_CSSComputedStyle() override; // IFX_Retainable uint32_t Retain() override; uint32_t Release() override; // IFDE_CSSComputedStyle IFDE_CSSFontStyle* GetFontStyles() override; IFDE_CSSBoundaryStyle* GetBoundaryStyles() override; IFDE_CSSPositionStyle* GetPositionStyles() override; IFDE_CSSParagraphStyle* GetParagraphStyles() override; bool GetCustomStyle(const CFX_WideStringC& wsName, CFX_WideString& wsValue) const override; // IFDE_CSSFontStyle: int32_t CountFontFamilies() const override; const FX_WCHAR* GetFontFamily(int32_t index) const override; uint16_t GetFontWeight() const override; FDE_CSSFontVariant GetFontVariant() const override; FDE_CSSFontStyle GetFontStyle() const override; FX_FLOAT GetFontSize() const override; FX_ARGB GetColor() const override; void SetFontWeight(uint16_t wFontWeight) override; void SetFontVariant(FDE_CSSFontVariant eFontVariant) override; void SetFontStyle(FDE_CSSFontStyle eFontStyle) override; void SetFontSize(FX_FLOAT fFontSize) override; void SetColor(FX_ARGB dwFontColor) override; // IFDE_CSSBoundaryStyle: const FDE_CSSRECT* GetBorderWidth() const override; const FDE_CSSRECT* GetMarginWidth() const override; const FDE_CSSRECT* GetPaddingWidth() const override; void SetMarginWidth(const FDE_CSSRECT& rect) override; void SetPaddingWidth(const FDE_CSSRECT& rect) override; // IFDE_CSSPositionStyle: FDE_CSSDisplay GetDisplay() const override; // IFDE_CSSParagraphStyle: FX_FLOAT GetLineHeight() const override; const FDE_CSSLENGTH& GetTextIndent() const override; FDE_CSSTextAlign GetTextAlign() const override; FDE_CSSVerticalAlign GetVerticalAlign() const override; FX_FLOAT GetNumberVerticalAlign() const override; uint32_t GetTextDecoration() const override; const FDE_CSSLENGTH& GetLetterSpacing() const override; void SetLineHeight(FX_FLOAT fLineHeight) override; void SetTextIndent(const FDE_CSSLENGTH& textIndent) override; void SetTextAlign(FDE_CSSTextAlign eTextAlign) override; void SetNumberVerticalAlign(FX_FLOAT fAlign) override; void SetTextDecoration(uint32_t dwTextDecoration) override; void SetLetterSpacing(const FDE_CSSLENGTH& letterSpacing) override; void AddCustomStyle(const CFX_WideString& wsName, const CFX_WideString& wsValue); uint32_t m_dwRefCount; CFDE_CSSInheritedData m_InheritedData; CFDE_CSSNonInheritedData m_NonInheritedData; std::vector m_CustomProperties; }; #endif // XFA_FDE_CSS_FDE_CSSSTYLESELECTOR_H_