1 // Copyright 2014 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 #ifndef _FDE_CSSSTYLESELECTOR
8 #define _FDE_CSSSTYLESELECTOR
9 #define FDE_CSSUNIVERSALHASH ('*')
10 typedef struct _FDE_CSSRULEDATA : public CFX_Target {
11  public:
12   _FDE_CSSRULEDATA(IFDE_CSSSelector* pSel,
13                    IFDE_CSSDeclaration* pDecl,
14                    FX_DWORD dwPos);
15   IFDE_CSSSelector* pSelector;
16   IFDE_CSSDeclaration* pDeclaration;
17   FX_DWORD dwPriority;
18   _FDE_CSSRULEDATA* pNext;
19 } FDE_CSSRULEDATA, *FDE_LPCSSRULEDATA;
20 typedef CFX_ArrayTemplate<FDE_LPCSSRULEDATA> CFDE_CSSRuleDataArray;
21 class CFDE_CSSRuleCollection : public CFX_Target {
22  public:
CFDE_CSSRuleCollection()23   CFDE_CSSRuleCollection()
24       : m_pStaticStore(nullptr),
25         m_pUniversalRules(nullptr),
26         m_pPersudoRules(nullptr),
27         m_iSelectors(0) {}
~CFDE_CSSRuleCollection()28   ~CFDE_CSSRuleCollection() { Clear(); }
29   void AddRulesFrom(const CFDE_CSSStyleSheetArray& sheets,
30                     FX_DWORD dwMediaList,
31                     IFX_FontMgr* pFontMgr);
32   void Clear();
33 
CountSelectors()34   int32_t CountSelectors() const { return m_iSelectors; }
GetIDRuleData(FX_DWORD dwIDHash)35   FDE_LPCSSRULEDATA GetIDRuleData(FX_DWORD dwIDHash) {
36     void* pData;
37     return m_IDRules.Lookup((void*)(uintptr_t)dwIDHash, pData)
38                ? (FDE_LPCSSRULEDATA)pData
39                : NULL;
40   }
GetTagRuleData(FX_DWORD dwTagHasn)41   FDE_LPCSSRULEDATA GetTagRuleData(FX_DWORD dwTagHasn) {
42     void* pData;
43     return m_TagRules.Lookup((void*)(uintptr_t)dwTagHasn, pData)
44                ? (FDE_LPCSSRULEDATA)pData
45                : NULL;
46   }
GetClassRuleData(FX_DWORD dwIDHash)47   FDE_LPCSSRULEDATA GetClassRuleData(FX_DWORD dwIDHash) {
48     void* pData;
49     return m_ClassRules.Lookup((void*)(uintptr_t)dwIDHash, pData)
50                ? (FDE_LPCSSRULEDATA)pData
51                : NULL;
52   }
GetUniversalRuleData()53   FDE_LPCSSRULEDATA GetUniversalRuleData() { return m_pUniversalRules; }
GetPersudoRuleData()54   FDE_LPCSSRULEDATA GetPersudoRuleData() { return m_pPersudoRules; }
55   IFX_MEMAllocator* m_pStaticStore;
56 
57  protected:
58   void AddRulesFrom(IFDE_CSSStyleSheet* pStyleSheet,
59                     IFDE_CSSRule* pRule,
60                     FX_DWORD dwMediaList,
61                     IFX_FontMgr* pFontMgr);
62   void AddRuleTo(CFX_MapPtrToPtr& map,
63                  FX_DWORD dwKey,
64                  IFDE_CSSSelector* pSel,
65                  IFDE_CSSDeclaration* pDecl);
66   FX_BOOL AddRuleTo(FDE_LPCSSRULEDATA& pList, FDE_LPCSSRULEDATA pData);
67   FDE_LPCSSRULEDATA NewRuleData(IFDE_CSSSelector* pSel,
68                                 IFDE_CSSDeclaration* pDecl);
69   CFX_MapPtrToPtr m_IDRules;
70   CFX_MapPtrToPtr m_TagRules;
71   CFX_MapPtrToPtr m_ClassRules;
72   FDE_LPCSSRULEDATA m_pUniversalRules;
73   FDE_LPCSSRULEDATA m_pPersudoRules;
74   int32_t m_iSelectors;
75 };
76 class CFDE_CSSAccelerator;
77 class CFDE_CSSComputedStyle;
78 class CFDE_CSSStyleSelector : public IFDE_CSSStyleSelector, public CFX_Target {
79  public:
80   CFDE_CSSStyleSelector();
81   ~CFDE_CSSStyleSelector();
Release()82   virtual void Release() { delete this; }
83 
84   virtual void SetFontMgr(IFX_FontMgr* pFontMgr);
85   virtual void SetDefFontSize(FX_FLOAT fFontSize);
86 
87   virtual FX_BOOL SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
88                                 IFDE_CSSStyleSheet* pSheet);
89   virtual FX_BOOL SetStyleSheets(FDE_CSSSTYLESHEETGROUP eType,
90                                  const CFDE_CSSStyleSheetArray* pArray);
91   virtual void SetStylePriority(FDE_CSSSTYLESHEETGROUP eType,
92                                 FDE_CSSSTYLESHEETPRIORITY ePriority);
93   virtual void UpdateStyleIndex(FX_DWORD dwMediaList);
94   virtual IFDE_CSSAccelerator* InitAccelerator();
95   virtual IFDE_CSSComputedStyle* CreateComputedStyle(
96       IFDE_CSSComputedStyle* pParentStyle);
97   virtual int32_t MatchDeclarations(
98       IFDE_CSSTagProvider* pTag,
99       CFDE_CSSDeclarationArray& matchedDecls,
100       FDE_CSSPERSUDO ePersudoType = FDE_CSSPERSUDO_NONE);
101   virtual void ComputeStyle(IFDE_CSSTagProvider* pTag,
102                             const IFDE_CSSDeclaration** ppDeclArray,
103                             int32_t iDeclCount,
104                             IFDE_CSSComputedStyle* pDestStyle);
105 
106  protected:
107   void Reset();
108   void MatchRules(FDE_LPCSSTAGCACHE pCache,
109                   FDE_LPCSSRULEDATA pList,
110                   FDE_CSSPERSUDO ePersudoType);
111   void SortRulesTo(CFDE_CSSDeclarationArray& matchDecls);
112   FX_BOOL MatchSelector(FDE_LPCSSTAGCACHE pCache,
113                         IFDE_CSSSelector* pSel,
114                         FDE_CSSPERSUDO ePersudoType);
115   void AppendInlineStyle(CFDE_CSSDeclaration* pDecl,
116                          const FX_WCHAR* psz,
117                          int32_t iLen);
118   void ApplyDeclarations(FX_BOOL bPriority,
119                          const IFDE_CSSDeclaration** ppDeclArray,
120                          int32_t iDeclCount,
121                          IFDE_CSSComputedStyle* pDestStyle);
122   void ApplyProperty(FDE_CSSPROPERTY eProperty,
123                      IFDE_CSSValue* pValue,
124                      CFDE_CSSComputedStyle* pComputedStyle);
125 
126   FX_FLOAT ApplyNumber(FDE_CSSPRIMITIVETYPE eUnit,
127                        FX_FLOAT fValue,
128                        FX_FLOAT fPercentBase);
129   FX_BOOL SetLengthWithPercent(FDE_CSSLENGTH& width,
130                                FDE_CSSPRIMITIVETYPE eType,
131                                IFDE_CSSPrimitiveValue* pPrimitive,
132                                FX_FLOAT fFontSize);
133   FX_FLOAT ToFontSize(FDE_CSSPROPERTYVALUE eValue, FX_FLOAT fCurFontSize);
134   FDE_CSSDISPLAY ToDisplay(FDE_CSSPROPERTYVALUE eValue);
135   FDE_CSSTEXTALIGN ToTextAlign(FDE_CSSPROPERTYVALUE eValue);
136   FX_WORD ToFontWeight(FDE_CSSPROPERTYVALUE eValue);
137   FDE_CSSFONTSTYLE ToFontStyle(FDE_CSSPROPERTYVALUE eValue);
138   FDE_CSSBORDERSTYLE ToBorderStyle(FDE_CSSPROPERTYVALUE eValue);
139   FDE_CSSVERTICALALIGN ToVerticalAlign(FDE_CSSPROPERTYVALUE eValue);
140   FDE_CSSLISTSTYLETYPE ToListStyleType(FDE_CSSPROPERTYVALUE eValue);
141   FDE_CSSLISTSTYLEPOSITION ToListStylePosition(FDE_CSSPROPERTYVALUE eValue);
142   FDE_CSSVISIBILITY ToVisibility(FDE_CSSPROPERTYVALUE eValue);
143   FDE_CSSWHITESPACE ToWhiteSpace(FDE_CSSPROPERTYVALUE eValue);
144   FX_DWORD ToTextDecoration(IFDE_CSSValueList* pList);
145   FDE_CSSTEXTTRANSFORM ToTextTransform(FDE_CSSPROPERTYVALUE eValue);
146   FDE_CSSFONTVARIANT ToFontVariant(FDE_CSSPROPERTYVALUE eValue);
147   FDE_CSSFLOAT ToFloat(FDE_CSSPROPERTYVALUE eValue);
148   FDE_CSSCLEAR ToClear(FDE_CSSPROPERTYVALUE eValue);
149   FDE_CSSWRITINGMODE ToWritingMode(FDE_CSSPROPERTYVALUE eValue);
150   FDE_CSSWORDBREAK ToWordBreak(FDE_CSSPROPERTYVALUE eValue);
151   FDE_CSSPAGEBREAK ToPageBreak(FDE_CSSPROPERTYVALUE eValue);
152   FDE_CSSOVERFLOW ToOverflow(FDE_CSSPROPERTYVALUE eValue);
153   FDE_CSSLINEBREAK ToLineBreak(FDE_CSSPROPERTYVALUE eValue);
154   FDE_CSSTEXTCOMBINE ToTextCombine(FDE_CSSPROPERTYVALUE eValue);
155   FX_BOOL ToTextEmphasisMark(FDE_CSSPROPERTYVALUE eValue,
156                              FDE_CSSTEXTEMPHASISMARK& eMark);
157   FX_BOOL ToTextEmphasisFill(FDE_CSSPROPERTYVALUE eValue,
158                              FDE_CSSTEXTEMPHASISFILL& eFill);
159   FDE_CSSCURSOR ToCursor(FDE_CSSPROPERTYVALUE eValue);
160   FDE_CSSPOSITION ToPosition(FDE_CSSPROPERTYVALUE eValue);
161   FDE_CSSCAPTIONSIDE ToCaptionSide(FDE_CSSPROPERTYVALUE eValue);
162   FDE_CSSBKGREPEAT ToBKGRepeat(FDE_CSSPROPERTYVALUE eValue);
163   FDE_CSSBKGATTACHMENT ToBKGAttachment(FDE_CSSPROPERTYVALUE eValue);
164   FDE_CSSRUBYALIGN ToRubyAlign(FDE_CSSPROPERTYVALUE eValue);
165   FDE_CSSRUBYOVERHANG ToRubyOverhang(FDE_CSSPROPERTYVALUE eValue);
166   FDE_CSSRUBYPOSITION ToRubyPosition(FDE_CSSPROPERTYVALUE eValue);
167   FDE_CSSRUBYSPAN ToRubySpan(FDE_CSSPROPERTYVALUE eValue);
168   IFX_FontMgr* m_pFontMgr;
169   FX_FLOAT m_fDefFontSize;
170   IFX_MEMAllocator* m_pRuleDataStore;
171   CFDE_CSSStyleSheetArray m_SheetGroups[FDE_CSSSTYLESHEETGROUP_MAX];
172   CFDE_CSSRuleCollection m_RuleCollection[FDE_CSSSTYLESHEETGROUP_MAX];
173   FDE_CSSSTYLESHEETGROUP m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_MAX];
174   IFX_MEMAllocator* m_pInlineStyleStore;
175   IFX_MEMAllocator* m_pFixedStyleStore;
176   CFDE_CSSAccelerator* m_pAccelerator;
177   CFDE_CSSRuleDataArray m_MatchedRules;
178 };
179 typedef struct _FDE_CSSCOUNTERDATA {
180  public:
_FDE_CSSCOUNTERDATA_FDE_CSSCOUNTERDATA181   _FDE_CSSCOUNTERDATA() { FX_memset(this, 0, sizeof(_FDE_CSSCOUNTERDATA)); }
GetCounterIncrement_FDE_CSSCOUNTERDATA182   FX_BOOL GetCounterIncrement(int32_t& iValue) {
183     iValue = m_iIncVal;
184     return m_bIncrement;
185   }
GetCounterReset_FDE_CSSCOUNTERDATA186   FX_BOOL GetCounterReset(int32_t& iValue) {
187     iValue = m_iResetVal;
188     return m_bReset;
189   }
190   const FX_WCHAR* m_pszIdent;
191   FX_BOOL m_bIncrement;
192   FX_BOOL m_bReset;
193   int32_t m_iIncVal;
194   int32_t m_iResetVal;
195 } FDE_CSSCOUNTERDATA, *FDE_LPCSSCOUNTERDATA;
196 class CFDE_CSSCounterStyle {
197  public:
CFDE_CSSCounterStyle()198   CFDE_CSSCounterStyle() : m_pCounterInc(NULL), m_pCounterReset(NULL) {}
SetCounterIncrementList(IFDE_CSSValueList * pList)199   void SetCounterIncrementList(IFDE_CSSValueList* pList) {
200     m_pCounterInc = pList;
201     m_bIndexDirty = TRUE;
202   }
SetCounterResetList(IFDE_CSSValueList * pList)203   void SetCounterResetList(IFDE_CSSValueList* pList) {
204     m_pCounterReset = pList;
205     m_bIndexDirty = TRUE;
206   }
CountCounters()207   int32_t CountCounters() {
208     UpdateIndex();
209     return m_arrCounterData.GetSize();
210   }
GetCounterIncrement(int32_t index,int32_t & iValue)211   FX_BOOL GetCounterIncrement(int32_t index, int32_t& iValue) {
212     UpdateIndex();
213     return m_arrCounterData.ElementAt(index).GetCounterIncrement(iValue);
214   }
GetCounterReset(int32_t index,int32_t & iValue)215   FX_BOOL GetCounterReset(int32_t index, int32_t& iValue) {
216     UpdateIndex();
217     return m_arrCounterData.ElementAt(index).GetCounterReset(iValue);
218   }
GetCounterIdentifier(int32_t index)219   const FX_WCHAR* GetCounterIdentifier(int32_t index) {
220     UpdateIndex();
221     return m_arrCounterData.ElementAt(index).m_pszIdent;
222   }
223 
224  protected:
225   void UpdateIndex();
226   void DoUpdateIndex(IFDE_CSSValueList* pList);
227   int32_t FindIndex(const FX_WCHAR* pszIdentifier);
228   IFDE_CSSValueList* m_pCounterInc;
229   IFDE_CSSValueList* m_pCounterReset;
230   CFX_ArrayTemplate<FDE_CSSCOUNTERDATA> m_arrCounterData;
231   FX_BOOL m_bIndexDirty;
232 };
233 class CFDE_CSSInheritedData {
234  public:
Reset()235   void Reset() {
236     FX_memset(this, 0, sizeof(CFDE_CSSInheritedData));
237     m_LetterSpacing.Set(FDE_CSSLENGTHUNIT_Normal);
238     m_WordSpacing.Set(FDE_CSSLENGTHUNIT_Normal);
239     m_TextIndent.Set(FDE_CSSLENGTHUNIT_Point, 0);
240     m_fFontSize = 12.0f;
241     m_fLineHeight = 14.0f;
242     m_wFontWeight = 400;
243     m_dwFontColor = 0xFF000000;
244     m_iWidows = 2;
245     m_bTextEmphasisColorCurrent = TRUE;
246     m_iOrphans = 2;
247   }
248   const FX_WCHAR* m_pszListStyleImage;
249   FDE_CSSLENGTH m_LetterSpacing;
250   FDE_CSSLENGTH m_WordSpacing;
251   FDE_CSSLENGTH m_TextIndent;
252   IFDE_CSSValueList* m_pFontFamily;
253   IFDE_CSSValueList* m_pQuotes;
254   IFDE_CSSValueList* m_pCursorUris;
255   FDE_CSSCURSOR m_eCursor;
256   FX_FLOAT m_fFontSize;
257   FX_FLOAT m_fLineHeight;
258   FX_ARGB m_dwFontColor;
259   FX_ARGB m_dwTextEmphasisColor;
260   FX_WORD m_wFontWeight;
261   int32_t m_iWidows;
262   int32_t m_iOrphans;
263   const FX_WCHAR* m_pszTextEmphasisCustomMark;
264   FX_WORD m_eFontVariant : 1;
265   FX_WORD m_eFontStyle : 1;
266   FX_WORD m_bTextEmphasisColorCurrent : 1;
267   FX_WORD m_eTextAligh : 2;
268   FX_WORD m_eVisibility : 2;
269   FX_WORD m_eWhiteSpace : 3;
270   FX_WORD m_eTextTransform : 2;
271   FX_WORD m_eWritingMode : 2;
272   FX_WORD m_eWordBreak : 2;
273   FX_WORD m_eLineBreak : 2;
274   FX_WORD m_eTextEmphasisFill : 1;
275   FX_WORD m_eTextEmphasisMark : 3;
276   FX_WORD m_eCaptionSide : 3;
277 
278   FX_WORD m_eRubyAlign : 4;
279   FX_WORD m_eRubyOverhang : 2;
280   FX_WORD m_eRubyPosition : 2;
281 };
282 class CFDE_CSSNonInheritedData {
283  public:
Reset()284   void Reset() {
285     FX_memset(this, 0, sizeof(CFDE_CSSNonInheritedData));
286     m_MarginWidth = m_BorderWidth =
287         m_PaddingWidth.Set(FDE_CSSLENGTHUNIT_Point, 0);
288     m_MinBoxSize.Set(FDE_CSSLENGTHUNIT_Point, 0);
289     m_MaxBoxSize.Set(FDE_CSSLENGTHUNIT_None);
290     m_eDisplay = FDE_CSSDISPLAY_Inline;
291     m_fVerticalAlign = 0.0f;
292     m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Auto);
293     m_ColumnGap.Set(FDE_CSSLENGTHUNIT_Normal);
294     m_bColumnRuleColorSame = TRUE;
295     m_ColumnWidth.Set(FDE_CSSLENGTHUNIT_Auto);
296     m_ColumnRuleWidth.Set(FDE_CSSLENGTHUNIT_Auto);
297     m_eTextCombine = FDE_CSSTEXTCOMBINE_None;
298   }
299 
300   IFDE_CSSValueList* m_pContentList;
301   CFDE_CSSCounterStyle* m_pCounterStyle;
302   FDE_CSSRECT m_MarginWidth;
303   FDE_CSSRECT m_BorderWidth;
304   FDE_CSSRECT m_PaddingWidth;
305   FDE_CSSSIZE m_BoxSize;
306   FDE_CSSSIZE m_MinBoxSize;
307   FDE_CSSSIZE m_MaxBoxSize;
308   FDE_CSSPOINT m_BKGPosition;
309   const FX_WCHAR* m_pszBKGImage;
310   FX_ARGB m_dwBKGColor;
311   FX_ARGB m_dwBDRLeftColor;
312   FX_ARGB m_dwBDRTopColor;
313   FX_ARGB m_dwBDRRightColor;
314   FX_ARGB m_dwBDRBottomColor;
315   IFDE_CSSValue* m_pRubySpan;
316   FDE_CSSLENGTH m_ColumnCount;
317   FDE_CSSLENGTH m_ColumnGap;
318   FDE_CSSLENGTH m_ColumnRuleWidth;
319   FDE_CSSLENGTH m_ColumnWidth;
320   FX_ARGB m_dwColumnRuleColor;
321   FDE_CSSLENGTH m_Top;
322   FDE_CSSLENGTH m_Bottom;
323   FDE_CSSLENGTH m_Left;
324   FDE_CSSLENGTH m_Right;
325 
326   FX_FLOAT m_fVerticalAlign;
327   FX_FLOAT m_fTextCombineNumber;
328   FX_DWORD m_eBDRLeftStyle : 4;
329   FX_DWORD m_eBDRTopStyle : 4;
330   FX_DWORD m_eBDRRightStyle : 4;
331   FX_DWORD m_eBDRBottomStyle : 4;
332   FX_DWORD m_eDisplay : 5;
333   FX_DWORD m_eVerticalAlign : 4;
334   FX_DWORD m_eListStyleType : 5;
335   FX_DWORD m_eColumnRuleStyle : 4;
336   FX_DWORD m_ePageBreakInside : 3;
337   FX_DWORD m_ePageBreakAfter : 3;
338   FX_DWORD m_ePageBreakBefore : 3;
339   FX_DWORD m_ePosition : 2;
340   FX_DWORD m_eBKGRepeat : 2;
341   FX_DWORD m_eFloat : 2;
342   FX_DWORD m_eClear : 2;
343   FX_DWORD m_eOverflowX : 3;
344   FX_DWORD m_eOverflowY : 3;
345   FX_DWORD m_eListStylePosition : 1;
346   FX_DWORD m_eBKGAttachment : 1;
347   FX_DWORD m_bHasMargin : 1;
348   FX_DWORD m_bHasBorder : 1;
349   FX_DWORD m_bHasPadding : 1;
350   FX_DWORD m_dwTextDecoration : 5;
351   FX_DWORD m_eTextCombine : 1;
352   FX_DWORD m_bColumnRuleColorSame : 1;
353   FX_DWORD m_bHasTextCombineNumber : 1;
354 };
355 class CFDE_CSSComputedStyle : public IFDE_CSSComputedStyle,
356                               public IFDE_CSSFontStyle,
357                               public IFDE_CSSBoundaryStyle,
358                               public IFDE_CSSPositionStyle,
359                               public IFDE_CSSParagraphStyle,
360                               public IFDE_CSSBackgroundStyle,
361                               public IFDE_CSSVisualStyle,
362                               public IFDE_CSSListStyle,
363                               public IFDE_CSSMultiColumnStyle,
364                               public IFDE_CSSGeneratedContentStyle,
365                               public IFDE_CSSTableStyle,
366                               public IFDE_CSSRubyStyle,
367                               public CFX_Target {
368  public:
CFDE_CSSComputedStyle(IFX_MEMAllocator * pAlloc)369   CFDE_CSSComputedStyle(IFX_MEMAllocator* pAlloc)
370       : m_dwRefCount(1), m_pAllocator(pAlloc) {}
~CFDE_CSSComputedStyle()371   ~CFDE_CSSComputedStyle() {}
AddRef()372   virtual FX_DWORD AddRef() { return ++m_dwRefCount; }
Release()373   virtual FX_DWORD Release() {
374     FX_DWORD dwRefCount = --m_dwRefCount;
375     if (dwRefCount == 0) {
376       if (m_NonInheritedData.m_pCounterStyle != NULL) {
377         delete m_NonInheritedData.m_pCounterStyle;
378       }
379       FDE_DeleteWith(CFDE_CSSComputedStyle, m_pAllocator, this);
380     }
381     return dwRefCount;
382   }
383 
Reset()384   virtual void Reset() {
385     m_InheritedData.Reset();
386     m_NonInheritedData.Reset();
387   }
GetFontStyles()388   virtual IFDE_CSSFontStyle* GetFontStyles() const {
389     return (IFDE_CSSFontStyle * const) this;
390   }
GetBoundaryStyles()391   virtual IFDE_CSSBoundaryStyle* GetBoundaryStyles() const {
392     return (IFDE_CSSBoundaryStyle * const) this;
393   }
GetPositionStyles()394   virtual IFDE_CSSPositionStyle* GetPositionStyles() const {
395     return (IFDE_CSSPositionStyle * const) this;
396   }
GetParagraphStyles()397   virtual IFDE_CSSParagraphStyle* GetParagraphStyles() const {
398     return (IFDE_CSSParagraphStyle * const) this;
399   }
GetBackgroundStyles()400   virtual IFDE_CSSBackgroundStyle* GetBackgroundStyles() const {
401     return (IFDE_CSSBackgroundStyle * const) this;
402   }
GetVisualStyles()403   virtual IFDE_CSSVisualStyle* GetVisualStyles() const {
404     return (IFDE_CSSVisualStyle * const) this;
405   }
GetListStyles()406   virtual IFDE_CSSListStyle* GetListStyles() const {
407     return (IFDE_CSSListStyle * const) this;
408   }
GetTableStyle()409   virtual IFDE_CSSTableStyle* GetTableStyle() const {
410     return (IFDE_CSSTableStyle * const) this;
411   }
GetMultiColumnStyle()412   virtual IFDE_CSSMultiColumnStyle* GetMultiColumnStyle() const {
413     return (IFDE_CSSMultiColumnStyle * const) this;
414   }
GetGeneratedContentStyle()415   virtual IFDE_CSSGeneratedContentStyle* GetGeneratedContentStyle() const {
416     return (IFDE_CSSGeneratedContentStyle * const) this;
417   }
GetRubyStyle()418   virtual IFDE_CSSRubyStyle* GetRubyStyle() const {
419     return (IFDE_CSSRubyStyle * const) this;
420   }
GetCustomStyle(const CFX_WideStringC & wsName,CFX_WideString & wsValue)421   virtual FX_BOOL GetCustomStyle(const CFX_WideStringC& wsName,
422                                  CFX_WideString& wsValue) const {
423     for (int32_t i = m_CustomProperties.GetSize() - 2; i > -1; i -= 2) {
424       if (wsName == m_CustomProperties[i]) {
425         wsValue = m_CustomProperties[i + 1];
426         return TRUE;
427       }
428     }
429     return FALSE;
430   }
GetRubyAlign()431   virtual FDE_CSSRUBYALIGN GetRubyAlign() const {
432     return (FDE_CSSRUBYALIGN)m_InheritedData.m_eRubyAlign;
433   }
GetRubyPosition()434   virtual FDE_CSSRUBYPOSITION GetRubyPosition() const {
435     return (FDE_CSSRUBYPOSITION)m_InheritedData.m_eRubyPosition;
436   }
GetRubyOverhang()437   virtual FDE_CSSRUBYOVERHANG GetRubyOverhang() const {
438     return (FDE_CSSRUBYOVERHANG)m_InheritedData.m_eRubyOverhang;
439   }
GetRubySpanType()440   virtual FDE_CSSRUBYSPAN GetRubySpanType() const {
441     return m_NonInheritedData.m_pRubySpan == NULL ? FDE_CSSRUBYSPAN_None
442                                                   : FDE_CSSRUBYSPAN_Attr;
443   }
GetRubySpanAttr()444   virtual IFDE_CSSValue* GetRubySpanAttr() const {
445     return m_NonInheritedData.m_pRubySpan;
446   }
GetCaptionSide()447   virtual FDE_CSSCAPTIONSIDE GetCaptionSide() const {
448     return (FDE_CSSCAPTIONSIDE)m_InheritedData.m_eCaptionSide;
449   }
CountCounters()450   virtual int32_t CountCounters() {
451     return (m_NonInheritedData.m_pCounterStyle == NULL)
452                ? 0
453                : m_NonInheritedData.m_pCounterStyle->CountCounters();
454   }
GetCounterIdentifier(int32_t index)455   virtual const FX_WCHAR* GetCounterIdentifier(int32_t index) {
456     return m_NonInheritedData.m_pCounterStyle->GetCounterIdentifier(index);
457   }
GetCounterReset(int32_t index,int32_t & iValue)458   virtual FX_BOOL GetCounterReset(int32_t index, int32_t& iValue) {
459     return m_NonInheritedData.m_pCounterStyle->GetCounterReset(index, iValue);
460   }
GetCounterIncrement(int32_t index,int32_t & iValue)461   virtual FX_BOOL GetCounterIncrement(int32_t index, int32_t& iValue) {
462     return m_NonInheritedData.m_pCounterStyle->GetCounterIncrement(index,
463                                                                    iValue);
464   }
GetContent()465   virtual IFDE_CSSValueList* GetContent() const {
466     return m_NonInheritedData.m_pContentList;
467   }
CountQuotes()468   virtual int32_t CountQuotes() const {
469     return m_InheritedData.m_pQuotes == NULL
470                ? 0
471                : m_InheritedData.m_pQuotes->CountValues();
472   }
GetQuotes(int32_t index)473   virtual const FX_WCHAR* GetQuotes(int32_t index) const {
474     FXSYS_assert(m_InheritedData.m_pQuotes != NULL &&
475                  m_InheritedData.m_pQuotes->CountValues() > index);
476     return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pQuotes->GetValue(
477                 index)))
478         ->GetString(index);
479   }
GetColumnCount()480   virtual const FDE_CSSLENGTH& GetColumnCount() const {
481     return m_NonInheritedData.m_ColumnCount;
482   }
GetColumnGap()483   virtual const FDE_CSSLENGTH& GetColumnGap() const {
484     return m_NonInheritedData.m_ColumnGap;
485   }
GetColumnRuleColor()486   virtual FX_ARGB GetColumnRuleColor() const {
487     return m_NonInheritedData.m_bColumnRuleColorSame
488                ? m_InheritedData.m_dwFontColor
489                : m_NonInheritedData.m_dwColumnRuleColor;
490   }
GetColumnRuleStyle()491   virtual FDE_CSSBORDERSTYLE GetColumnRuleStyle() const {
492     return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eColumnRuleStyle;
493   }
GetColumnRuleWidth()494   virtual const FDE_CSSLENGTH& GetColumnRuleWidth() const {
495     return m_NonInheritedData.m_ColumnRuleWidth;
496   }
GetColumnWidth()497   virtual const FDE_CSSLENGTH& GetColumnWidth() const {
498     return m_NonInheritedData.m_ColumnWidth;
499   }
SetColumnCount(const FDE_CSSLENGTH & columnCount)500   virtual void SetColumnCount(const FDE_CSSLENGTH& columnCount) {
501     m_NonInheritedData.m_ColumnCount = columnCount;
502   }
SetColumnGap(const FDE_CSSLENGTH & columnGap)503   virtual void SetColumnGap(const FDE_CSSLENGTH& columnGap) {
504     m_NonInheritedData.m_ColumnGap = columnGap;
505   }
SetColumnRuleColor(FX_ARGB dwColumnRuleColor)506   virtual void SetColumnRuleColor(FX_ARGB dwColumnRuleColor) {
507     m_NonInheritedData.m_dwColumnRuleColor = dwColumnRuleColor,
508     m_NonInheritedData.m_bColumnRuleColorSame = FALSE;
509   }
SetColumnRuleStyle(FDE_CSSBORDERSTYLE eColumnRuleStyle)510   virtual void SetColumnRuleStyle(FDE_CSSBORDERSTYLE eColumnRuleStyle) {
511     m_NonInheritedData.m_eColumnRuleStyle = eColumnRuleStyle;
512   }
SetColumnRuleWidth(const FDE_CSSLENGTH & columnRuleWidth)513   virtual void SetColumnRuleWidth(const FDE_CSSLENGTH& columnRuleWidth) {
514     m_NonInheritedData.m_ColumnRuleWidth = columnRuleWidth;
515   }
SetColumnWidth(const FDE_CSSLENGTH & columnWidth)516   virtual void SetColumnWidth(const FDE_CSSLENGTH& columnWidth) {
517     m_NonInheritedData.m_ColumnWidth = columnWidth;
518   }
CountFontFamilies()519   virtual int32_t CountFontFamilies() const {
520     return m_InheritedData.m_pFontFamily
521                ? m_InheritedData.m_pFontFamily->CountValues()
522                : 0;
523   }
GetFontFamily(int32_t index)524   virtual const FX_WCHAR* GetFontFamily(int32_t index) const {
525     return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pFontFamily->GetValue(
526                 index)))
527         ->GetString(index);
528   }
GetFontWeight()529   virtual FX_WORD GetFontWeight() const {
530     return m_InheritedData.m_wFontWeight;
531   }
GetFontVariant()532   virtual FDE_CSSFONTVARIANT GetFontVariant() const {
533     return (FDE_CSSFONTVARIANT)m_InheritedData.m_eFontVariant;
534   }
GetFontStyle()535   virtual FDE_CSSFONTSTYLE GetFontStyle() const {
536     return (FDE_CSSFONTSTYLE)m_InheritedData.m_eFontStyle;
537   }
GetFontSize()538   virtual FX_FLOAT GetFontSize() const { return m_InheritedData.m_fFontSize; }
GetColor()539   virtual FX_ARGB GetColor() const { return m_InheritedData.m_dwFontColor; }
SetFontWeight(FX_WORD wFontWeight)540   virtual void SetFontWeight(FX_WORD wFontWeight) {
541     m_InheritedData.m_wFontWeight = wFontWeight;
542   }
SetFontVariant(FDE_CSSFONTVARIANT eFontVariant)543   virtual void SetFontVariant(FDE_CSSFONTVARIANT eFontVariant) {
544     m_InheritedData.m_eFontVariant = eFontVariant;
545   }
SetFontStyle(FDE_CSSFONTSTYLE eFontStyle)546   virtual void SetFontStyle(FDE_CSSFONTSTYLE eFontStyle) {
547     m_InheritedData.m_eFontStyle = eFontStyle;
548   }
SetFontSize(FX_FLOAT fFontSize)549   virtual void SetFontSize(FX_FLOAT fFontSize) {
550     m_InheritedData.m_fFontSize = fFontSize;
551   }
SetColor(FX_ARGB dwFontColor)552   virtual void SetColor(FX_ARGB dwFontColor) {
553     m_InheritedData.m_dwFontColor = dwFontColor;
554   }
GetBorderLeftColor()555   virtual FX_ARGB GetBorderLeftColor() const {
556     return m_NonInheritedData.m_dwBDRLeftColor;
557   }
GetBorderTopColor()558   virtual FX_ARGB GetBorderTopColor() const {
559     return m_NonInheritedData.m_dwBDRTopColor;
560   }
GetBorderRightColor()561   virtual FX_ARGB GetBorderRightColor() const {
562     return m_NonInheritedData.m_dwBDRRightColor;
563   }
GetBorderBottomColor()564   virtual FX_ARGB GetBorderBottomColor() const {
565     return m_NonInheritedData.m_dwBDRBottomColor;
566   }
567 
GetBorderLeftStyle()568   virtual FDE_CSSBORDERSTYLE GetBorderLeftStyle() const {
569     return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRLeftStyle;
570   }
GetBorderTopStyle()571   virtual FDE_CSSBORDERSTYLE GetBorderTopStyle() const {
572     return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRTopStyle;
573   }
GetBorderRightStyle()574   virtual FDE_CSSBORDERSTYLE GetBorderRightStyle() const {
575     return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRRightStyle;
576   }
GetBorderBottomStyle()577   virtual FDE_CSSBORDERSTYLE GetBorderBottomStyle() const {
578     return (FDE_CSSBORDERSTYLE)m_NonInheritedData.m_eBDRBottomStyle;
579   }
580 
GetBorderWidth()581   virtual const FDE_CSSRECT* GetBorderWidth() const {
582     return m_NonInheritedData.m_bHasBorder ? &(m_NonInheritedData.m_BorderWidth)
583                                            : NULL;
584   }
GetMarginWidth()585   virtual const FDE_CSSRECT* GetMarginWidth() const {
586     return m_NonInheritedData.m_bHasMargin ? &(m_NonInheritedData.m_MarginWidth)
587                                            : NULL;
588   }
GetPaddingWidth()589   virtual const FDE_CSSRECT* GetPaddingWidth() const {
590     return m_NonInheritedData.m_bHasPadding
591                ? &(m_NonInheritedData.m_PaddingWidth)
592                : NULL;
593   }
SetBorderLeftColor(FX_ARGB dwBorderColor)594   virtual void SetBorderLeftColor(FX_ARGB dwBorderColor) {
595     m_NonInheritedData.m_dwBDRLeftColor = dwBorderColor;
596   }
SetBorderTopColor(FX_ARGB dwBorderColor)597   virtual void SetBorderTopColor(FX_ARGB dwBorderColor) {
598     m_NonInheritedData.m_dwBDRTopColor = dwBorderColor;
599   }
SetBorderRightColor(FX_ARGB dwBorderColor)600   virtual void SetBorderRightColor(FX_ARGB dwBorderColor) {
601     m_NonInheritedData.m_dwBDRRightColor = dwBorderColor;
602   }
SetBorderBottomColor(FX_ARGB dwBorderColor)603   virtual void SetBorderBottomColor(FX_ARGB dwBorderColor) {
604     m_NonInheritedData.m_dwBDRBottomColor = dwBorderColor;
605   }
606 
SetBorderLeftStyle(FDE_CSSBORDERSTYLE eBorderStyle)607   virtual void SetBorderLeftStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
608     m_NonInheritedData.m_eBDRLeftStyle = eBorderStyle;
609   }
SetBorderTopStyle(FDE_CSSBORDERSTYLE eBorderStyle)610   virtual void SetBorderTopStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
611     m_NonInheritedData.m_eBDRTopStyle = eBorderStyle;
612   }
SetBorderRightStyle(FDE_CSSBORDERSTYLE eBorderStyle)613   virtual void SetBorderRightStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
614     m_NonInheritedData.m_eBDRRightStyle = eBorderStyle;
615   }
SetBorderBottomStyle(FDE_CSSBORDERSTYLE eBorderStyle)616   virtual void SetBorderBottomStyle(FDE_CSSBORDERSTYLE eBorderStyle) {
617     m_NonInheritedData.m_eBDRBottomStyle = eBorderStyle;
618   }
619 
SetBorderWidth(const FDE_CSSRECT & rect)620   virtual void SetBorderWidth(const FDE_CSSRECT& rect) {
621     m_NonInheritedData.m_BorderWidth = rect;
622     m_NonInheritedData.m_bHasBorder = TRUE;
623   }
SetMarginWidth(const FDE_CSSRECT & rect)624   virtual void SetMarginWidth(const FDE_CSSRECT& rect) {
625     m_NonInheritedData.m_MarginWidth = rect;
626     m_NonInheritedData.m_bHasMargin = TRUE;
627   }
SetPaddingWidth(const FDE_CSSRECT & rect)628   virtual void SetPaddingWidth(const FDE_CSSRECT& rect) {
629     m_NonInheritedData.m_PaddingWidth = rect;
630     m_NonInheritedData.m_bHasPadding = TRUE;
631   }
GetDisplay()632   virtual FDE_CSSDISPLAY GetDisplay() const {
633     return (FDE_CSSDISPLAY)m_NonInheritedData.m_eDisplay;
634   }
GetBoxSize()635   virtual const FDE_CSSSIZE& GetBoxSize() const {
636     return m_NonInheritedData.m_BoxSize;
637   }
GetMinBoxSize()638   virtual const FDE_CSSSIZE& GetMinBoxSize() const {
639     return m_NonInheritedData.m_MinBoxSize;
640   }
GetMaxBoxSize()641   virtual const FDE_CSSSIZE& GetMaxBoxSize() const {
642     return m_NonInheritedData.m_MaxBoxSize;
643   }
GetFloat()644   virtual FDE_CSSFLOAT GetFloat() const {
645     return (FDE_CSSFLOAT)m_NonInheritedData.m_eFloat;
646   }
GetClear()647   virtual FDE_CSSCLEAR GetClear() const {
648     return (FDE_CSSCLEAR)m_NonInheritedData.m_eClear;
649   }
GetPosition()650   virtual FDE_CSSPOSITION GetPosition() const {
651     return (FDE_CSSPOSITION)m_NonInheritedData.m_ePosition;
652   }
GetTop()653   virtual FDE_CSSLENGTH GetTop() const { return m_NonInheritedData.m_Top; }
GetBottom()654   virtual FDE_CSSLENGTH GetBottom() const {
655     return m_NonInheritedData.m_Bottom;
656   }
GetLeft()657   virtual FDE_CSSLENGTH GetLeft() const { return m_NonInheritedData.m_Left; }
GetRight()658   virtual FDE_CSSLENGTH GetRight() const { return m_NonInheritedData.m_Right; }
659 
SetDisplay(FDE_CSSDISPLAY eDisplay)660   virtual void SetDisplay(FDE_CSSDISPLAY eDisplay) {
661     m_NonInheritedData.m_eDisplay = eDisplay;
662   }
SetBoxSize(const FDE_CSSSIZE & size)663   virtual void SetBoxSize(const FDE_CSSSIZE& size) {
664     m_NonInheritedData.m_BoxSize = size;
665   }
SetMinBoxSize(const FDE_CSSSIZE & size)666   virtual void SetMinBoxSize(const FDE_CSSSIZE& size) {
667     m_NonInheritedData.m_MinBoxSize = size;
668   }
SetMaxBoxSize(const FDE_CSSSIZE & size)669   virtual void SetMaxBoxSize(const FDE_CSSSIZE& size) {
670     m_NonInheritedData.m_MaxBoxSize = size;
671   }
SetFloat(FDE_CSSFLOAT eFloat)672   virtual void SetFloat(FDE_CSSFLOAT eFloat) {
673     m_NonInheritedData.m_eFloat = eFloat;
674   }
SetClear(FDE_CSSCLEAR eClear)675   virtual void SetClear(FDE_CSSCLEAR eClear) {
676     m_NonInheritedData.m_eClear = eClear;
677   }
GetLineHeight()678   virtual FX_FLOAT GetLineHeight() const {
679     return m_InheritedData.m_fLineHeight;
680   }
GetWhiteSpace()681   virtual FDE_CSSWHITESPACE GetWhiteSpace() const {
682     return (FDE_CSSWHITESPACE)m_InheritedData.m_eWhiteSpace;
683   }
GetTextIndent()684   virtual const FDE_CSSLENGTH& GetTextIndent() const {
685     return m_InheritedData.m_TextIndent;
686   }
GetTextAlign()687   virtual FDE_CSSTEXTALIGN GetTextAlign() const {
688     return (FDE_CSSTEXTALIGN)m_InheritedData.m_eTextAligh;
689   }
GetVerticalAlign()690   virtual FDE_CSSVERTICALALIGN GetVerticalAlign() const {
691     return (FDE_CSSVERTICALALIGN)m_NonInheritedData.m_eVerticalAlign;
692   }
GetNumberVerticalAlign()693   virtual FX_FLOAT GetNumberVerticalAlign() const {
694     return m_NonInheritedData.m_fVerticalAlign;
695   }
GetTextTransform()696   virtual FDE_CSSTEXTTRANSFORM GetTextTransform() const {
697     return (FDE_CSSTEXTTRANSFORM)m_InheritedData.m_eTextTransform;
698   }
GetTextDecoration()699   virtual FX_DWORD GetTextDecoration() const {
700     return m_NonInheritedData.m_dwTextDecoration;
701   }
GetLetterSpacing()702   virtual const FDE_CSSLENGTH& GetLetterSpacing() const {
703     return m_InheritedData.m_LetterSpacing;
704   }
GetWordSpacing()705   virtual const FDE_CSSLENGTH& GetWordSpacing() const {
706     return m_InheritedData.m_WordSpacing;
707   }
GetWritingMode()708   virtual FDE_CSSWRITINGMODE GetWritingMode() const {
709     return (FDE_CSSWRITINGMODE)m_InheritedData.m_eWritingMode;
710   }
GetWordBreak()711   virtual FDE_CSSWORDBREAK GetWordBreak() const {
712     return (FDE_CSSWORDBREAK)m_InheritedData.m_eWordBreak;
713   }
GetWidows()714   virtual int32_t GetWidows() const { return m_InheritedData.m_iWidows; }
GetTextEmphasisColor()715   virtual FX_ARGB GetTextEmphasisColor() const {
716     return m_InheritedData.m_bTextEmphasisColorCurrent
717                ? m_InheritedData.m_dwFontColor
718                : m_InheritedData.m_dwTextEmphasisColor;
719   }
GetPageBreakBefore()720   virtual FDE_CSSPAGEBREAK GetPageBreakBefore() const {
721     return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakBefore;
722   }
GetPageBreakAfter()723   virtual FDE_CSSPAGEBREAK GetPageBreakAfter() const {
724     return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakAfter;
725   }
GetPageBreakInside()726   virtual FDE_CSSPAGEBREAK GetPageBreakInside() const {
727     return (FDE_CSSPAGEBREAK)m_NonInheritedData.m_ePageBreakInside;
728   }
GetOrphans()729   virtual int32_t GetOrphans() const { return m_InheritedData.m_iOrphans; }
GetLineBreak()730   virtual FDE_CSSLINEBREAK GetLineBreak() const {
731     return (FDE_CSSLINEBREAK)m_InheritedData.m_eLineBreak;
732   }
733   virtual FDE_CSSTEXTEMPHASISMARK GetTextEmphasisMark() const;
GetTextEmphasisFill()734   virtual FDE_CSSTEXTEMPHASISFILL GetTextEmphasisFill() const {
735     return (FDE_CSSTEXTEMPHASISFILL)m_InheritedData.m_eTextEmphasisFill;
736   }
GetTextEmphasisCustom()737   virtual const FX_WCHAR* GetTextEmphasisCustom() const {
738     FXSYS_assert(m_InheritedData.m_eTextEmphasisMark ==
739                  FDE_CSSTEXTEMPHASISMARK_Custom);
740     return m_InheritedData.m_pszTextEmphasisCustomMark;
741   }
GetTextCombineType()742   virtual FDE_CSSTEXTCOMBINE GetTextCombineType() const {
743     return (FDE_CSSTEXTCOMBINE)m_NonInheritedData.m_eTextCombine;
744   }
HasTextCombineNumber()745   virtual FX_BOOL HasTextCombineNumber() const {
746     return m_NonInheritedData.m_bHasTextCombineNumber;
747   }
GetTextCombineNumber()748   virtual FX_FLOAT GetTextCombineNumber() const {
749     FXSYS_assert(m_NonInheritedData.m_eTextCombine ==
750                  FDE_CSSTEXTCOMBINE_Horizontal);
751     return m_NonInheritedData.m_fTextCombineNumber;
752   }
SetLineHeight(FX_FLOAT fLineHeight)753   virtual void SetLineHeight(FX_FLOAT fLineHeight) {
754     m_InheritedData.m_fLineHeight = fLineHeight;
755   }
SetWhiteSpace(FDE_CSSWHITESPACE eWhiteSpace)756   virtual void SetWhiteSpace(FDE_CSSWHITESPACE eWhiteSpace) {
757     m_InheritedData.m_eWhiteSpace = eWhiteSpace;
758   }
SetTextIndent(const FDE_CSSLENGTH & textIndent)759   virtual void SetTextIndent(const FDE_CSSLENGTH& textIndent) {
760     m_InheritedData.m_TextIndent = textIndent;
761   }
SetTextAlign(FDE_CSSTEXTALIGN eTextAlign)762   virtual void SetTextAlign(FDE_CSSTEXTALIGN eTextAlign) {
763     m_InheritedData.m_eTextAligh = eTextAlign;
764   }
SetVerticalAlign(FDE_CSSVERTICALALIGN eVerticalAlign)765   virtual void SetVerticalAlign(FDE_CSSVERTICALALIGN eVerticalAlign) {
766     m_NonInheritedData.m_eVerticalAlign = eVerticalAlign;
767   }
SetNumberVerticalAlign(FX_FLOAT fAlign)768   virtual void SetNumberVerticalAlign(FX_FLOAT fAlign) {
769     m_NonInheritedData.m_eVerticalAlign = FDE_CSSVERTICALALIGN_Number,
770     m_NonInheritedData.m_fVerticalAlign = fAlign;
771   }
SetTextTransform(FDE_CSSTEXTTRANSFORM eTextTransform)772   virtual void SetTextTransform(FDE_CSSTEXTTRANSFORM eTextTransform) {
773     m_InheritedData.m_eTextTransform = eTextTransform;
774   }
SetTextDecoration(FX_DWORD dwTextDecoration)775   virtual void SetTextDecoration(FX_DWORD dwTextDecoration) {
776     m_NonInheritedData.m_dwTextDecoration = dwTextDecoration;
777   }
SetLetterSpacing(const FDE_CSSLENGTH & letterSpacing)778   virtual void SetLetterSpacing(const FDE_CSSLENGTH& letterSpacing) {
779     m_InheritedData.m_LetterSpacing = letterSpacing;
780   }
SetWordSpacing(const FDE_CSSLENGTH & wordSpacing)781   virtual void SetWordSpacing(const FDE_CSSLENGTH& wordSpacing) {
782     m_InheritedData.m_WordSpacing = wordSpacing;
783   }
SetWritingMode(FDE_CSSWRITINGMODE eWritingMode)784   virtual void SetWritingMode(FDE_CSSWRITINGMODE eWritingMode) {
785     m_InheritedData.m_eWritingMode = eWritingMode;
786   }
SetWordBreak(FDE_CSSWORDBREAK eWordBreak)787   virtual void SetWordBreak(FDE_CSSWORDBREAK eWordBreak) {
788     m_InheritedData.m_eWordBreak = eWordBreak;
789   }
SetWidows(int32_t iWidows)790   virtual void SetWidows(int32_t iWidows) {
791     m_InheritedData.m_iWidows = iWidows;
792   }
SetTextEmphasisColor(FX_ARGB dwTextEmphasisColor)793   virtual void SetTextEmphasisColor(FX_ARGB dwTextEmphasisColor) {
794     m_InheritedData.m_dwTextEmphasisColor = dwTextEmphasisColor,
795     m_InheritedData.m_bTextEmphasisColorCurrent = FALSE;
796   }
SetPageBreakBefore(FDE_CSSPAGEBREAK ePageBreakBefore)797   virtual void SetPageBreakBefore(FDE_CSSPAGEBREAK ePageBreakBefore) {
798     m_NonInheritedData.m_ePageBreakBefore = ePageBreakBefore;
799   }
SetPageBreakAfter(FDE_CSSPAGEBREAK ePageBreakAfter)800   virtual void SetPageBreakAfter(FDE_CSSPAGEBREAK ePageBreakAfter) {
801     m_NonInheritedData.m_ePageBreakAfter = ePageBreakAfter;
802   }
SetPageBreakInside(FDE_CSSPAGEBREAK ePageBreakInside)803   virtual void SetPageBreakInside(FDE_CSSPAGEBREAK ePageBreakInside) {
804     m_NonInheritedData.m_ePageBreakInside = ePageBreakInside;
805   }
SetOrphans(int32_t iOrphans)806   virtual void SetOrphans(int32_t iOrphans) {
807     m_InheritedData.m_iOrphans = iOrphans;
808   }
SetLineBreak(FDE_CSSLINEBREAK eLineBreak)809   virtual void SetLineBreak(FDE_CSSLINEBREAK eLineBreak) {
810     m_InheritedData.m_eLineBreak = eLineBreak;
811   }
GetBKGColor()812   virtual FX_ARGB GetBKGColor() const {
813     return m_NonInheritedData.m_dwBKGColor;
814   }
GetBKGImage()815   virtual const FX_WCHAR* GetBKGImage() const {
816     return m_NonInheritedData.m_pszBKGImage;
817   }
GetBKGPosition()818   virtual const FDE_CSSPOINT& GetBKGPosition() const {
819     return m_NonInheritedData.m_BKGPosition;
820   }
GetBKGRepeat()821   virtual FDE_CSSBKGREPEAT GetBKGRepeat() const {
822     return (FDE_CSSBKGREPEAT)m_NonInheritedData.m_eBKGRepeat;
823   }
GetBKGAttachment()824   virtual FDE_CSSBKGATTACHMENT GetBKGAttachment() const {
825     return (FDE_CSSBKGATTACHMENT)m_NonInheritedData.m_eBKGAttachment;
826   }
SetBKGColor(FX_ARGB dwBKGColor)827   virtual void SetBKGColor(FX_ARGB dwBKGColor) {
828     m_NonInheritedData.m_dwBKGColor = dwBKGColor;
829   }
SetBKGPosition(const FDE_CSSPOINT & bkgPosition)830   virtual void SetBKGPosition(const FDE_CSSPOINT& bkgPosition) {
831     m_NonInheritedData.m_BKGPosition = bkgPosition;
832   }
GetVisibility()833   virtual FDE_CSSVISIBILITY GetVisibility() const {
834     return (FDE_CSSVISIBILITY)m_InheritedData.m_eVisibility;
835   }
GetOverflowX()836   virtual FDE_CSSOVERFLOW GetOverflowX() const {
837     return (FDE_CSSOVERFLOW)m_NonInheritedData.m_eOverflowX;
838   }
GetOverflowY()839   virtual FDE_CSSOVERFLOW GetOverflowY() const {
840     return (FDE_CSSOVERFLOW)m_NonInheritedData.m_eOverflowY;
841   }
CountCursorUrls()842   virtual int32_t CountCursorUrls() const {
843     return m_InheritedData.m_pCursorUris == NULL
844                ? 0
845                : m_InheritedData.m_pCursorUris->CountValues();
846   }
GetCursorUrl(int32_t index)847   virtual const FX_WCHAR* GetCursorUrl(int32_t index) const {
848     FXSYS_assert(m_InheritedData.m_pCursorUris != NULL);
849     return ((IFDE_CSSPrimitiveValue*)(m_InheritedData.m_pCursorUris->GetValue(
850                 index)))
851         ->GetString(index);
852   }
GetCursorType()853   virtual FDE_CSSCURSOR GetCursorType() const {
854     return m_InheritedData.m_eCursor;
855   }
SetVisibility(FDE_CSSVISIBILITY eVisibility)856   virtual void SetVisibility(FDE_CSSVISIBILITY eVisibility) {
857     m_InheritedData.m_eVisibility = eVisibility;
858   }
GetListStyleType()859   virtual FDE_CSSLISTSTYLETYPE GetListStyleType() const {
860     return (FDE_CSSLISTSTYLETYPE)m_NonInheritedData.m_eListStyleType;
861   }
GetListStylePosition()862   virtual FDE_CSSLISTSTYLEPOSITION GetListStylePosition() const {
863     return (FDE_CSSLISTSTYLEPOSITION)m_NonInheritedData.m_eListStylePosition;
864   }
GetListStyleImage()865   virtual const FX_WCHAR* GetListStyleImage() const {
866     return m_InheritedData.m_pszListStyleImage;
867   }
SetListStyleType(FDE_CSSLISTSTYLETYPE eListStyleType)868   virtual void SetListStyleType(FDE_CSSLISTSTYLETYPE eListStyleType) {
869     m_NonInheritedData.m_eListStyleType = eListStyleType;
870   }
SetListStylePosition(FDE_CSSLISTSTYLEPOSITION eListStylePosition)871   virtual void SetListStylePosition(
872       FDE_CSSLISTSTYLEPOSITION eListStylePosition) {
873     m_NonInheritedData.m_eListStylePosition = eListStylePosition;
874   }
AddCustomStyle(const CFX_WideString & wsName,const CFX_WideString & wsValue)875   void AddCustomStyle(const CFX_WideString& wsName,
876                       const CFX_WideString& wsValue) {
877     m_CustomProperties.Add(wsName);
878     m_CustomProperties.Add(wsValue);
879   }
880   FX_DWORD m_dwRefCount;
881   IFX_MEMAllocator* m_pAllocator;
882   CFDE_CSSInheritedData m_InheritedData;
883   CFDE_CSSNonInheritedData m_NonInheritedData;
884   CFX_WideStringArray m_CustomProperties;
885 };
886 #endif
887