Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fdp / src / css / fde_cssstyleselector.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "../../../foxitlib.h"\r
8 #include "fde_csscache.h"\r
9 #include "fde_cssdeclaration.h"\r
10 #include "fde_cssstyleselector.h"\r
11 FX_INT32 CFDE_CSSCounterStyle::FindIndex(FX_LPCWSTR pszIdentifier)\r
12 {\r
13     FX_INT32 iCount = m_arrCounterData.GetSize();\r
14     for (FX_INT32 i = 0; i < iCount; i++) {\r
15         if (FXSYS_wcscmp(pszIdentifier, m_arrCounterData.ElementAt(i).m_pszIdent) == 0) {\r
16             return i;\r
17         }\r
18     }\r
19     return -1;\r
20 }\r
21 void CFDE_CSSCounterStyle::DoUpdateIndex(IFDE_CSSValueList *pList)\r
22 {\r
23     if (pList == NULL) {\r
24         return;\r
25     }\r
26     FX_INT32 iCount = pList->CountValues();\r
27     FX_FLOAT fDefValue = 1.0;\r
28     FX_BOOL     bDefIncrement = TRUE;\r
29     if (pList == m_pCounterReset) {\r
30         fDefValue = 0.0;\r
31         bDefIncrement = FALSE;\r
32     }\r
33     for (FX_INT32 i = 0; i < iCount; i++) {\r
34         IFDE_CSSValueList *pCounter = (IFDE_CSSValueList*)pList->GetValue(i);\r
35         FX_INT32 iLen;\r
36         FX_LPCWSTR pszIdentifier = ((IFDE_CSSPrimitiveValue*)(pCounter->GetValue(0)))->GetString(iLen);\r
37         FX_FLOAT fValue = fDefValue;\r
38         if (pCounter->CountValues() > 1) {\r
39             fValue = ((IFDE_CSSPrimitiveValue*)(pCounter->GetValue(1)))->GetFloat();\r
40         }\r
41         FX_INT32 iIndex = FindIndex(pszIdentifier);\r
42         if (iIndex == -1) {\r
43             FDE_CSSCOUNTERDATA data;\r
44             data.m_pszIdent = pszIdentifier;\r
45             if (bDefIncrement) {\r
46                 data.m_bIncrement = TRUE;\r
47                 data.m_iIncVal = (FX_INT32)fValue;\r
48             } else {\r
49                 data.m_iResetVal = (FX_INT32)fValue;\r
50                 data.m_bReset = TRUE;\r
51             }\r
52             m_arrCounterData.Add(data);\r
53         } else {\r
54             FDE_CSSCOUNTERDATA &data = m_arrCounterData.ElementAt(iIndex);\r
55             if (bDefIncrement) {\r
56                 data.m_bIncrement = TRUE;\r
57                 data.m_iIncVal += (FX_INT32)fValue;\r
58             } else {\r
59                 data.m_bReset = TRUE;\r
60                 data.m_iResetVal = (FX_INT32)fValue;\r
61             }\r
62         }\r
63     }\r
64 }\r
65 void CFDE_CSSCounterStyle::UpdateIndex()\r
66 {\r
67     if (!m_bIndexDirty) {\r
68         return;\r
69     }\r
70     m_arrCounterData.RemoveAll();\r
71     DoUpdateIndex(m_pCounterInc);\r
72     DoUpdateIndex(m_pCounterReset);\r
73     m_bIndexDirty = FALSE;\r
74 }\r
75 FDE_CSSTEXTEMPHASISMARK CFDE_CSSComputedStyle::GetTextEmphasisMark() const\r
76 {\r
77     if (m_InheritedData.m_eTextEmphasisMark != FDE_CSSTEXTEMPHASISMARK_Auto) {\r
78         return (FDE_CSSTEXTEMPHASISMARK)m_InheritedData.m_eTextEmphasisMark;\r
79     }\r
80     if (m_InheritedData.m_eWritingMode == FDE_CSSWRITINGMODE_HorizontalTb) {\r
81         return FDE_CSSTEXTEMPHASISMARK_Dot;\r
82     }\r
83     return FDE_CSSTEXTEMPHASISMARK_Sesame;\r
84 }\r
85 _FDE_CSSRULEDATA::_FDE_CSSRULEDATA(IFDE_CSSSelector *pSel, IFDE_CSSDeclaration *pDecl, FX_DWORD dwPos)\r
86     : pSelector(pSel)\r
87     , pDeclaration(pDecl)\r
88     , dwPriority(dwPos)\r
89     , pNext(NULL)\r
90 {\r
91     static const FX_DWORD s_Specific[5] = {0x00010000, 0x00010000, 0x00100000, 0x00100000, 0x01000000};\r
92     for (; pSel != NULL; pSel = pSel->GetNextSelector()) {\r
93         FDE_CSSSELECTORTYPE eType = pSel->GetType();\r
94         if (eType > FDE_CSSSELECTORTYPE_Descendant || pSel->GetNameHash() != FDE_CSSUNIVERSALHASH) {\r
95             dwPriority += s_Specific[eType];\r
96         }\r
97     }\r
98 }\r
99 void CFDE_CSSRuleCollection::Clear()\r
100 {\r
101     m_IDRules.RemoveAll();\r
102     m_TagRules.RemoveAll();\r
103     m_ClassRules.RemoveAll();\r
104     m_pUniversalRules = NULL;\r
105     m_pStaticStore = NULL;\r
106     m_iSelectors = 0;\r
107 }\r
108 void CFDE_CSSRuleCollection::AddRulesFrom(const CFDE_CSSStyleSheetArray &sheets, FX_DWORD dwMediaList, IFX_FontMgr *pFontMgr)\r
109 {\r
110     FX_INT32 iSheets = sheets.GetSize();\r
111     for (FX_INT32 i = 0; i < iSheets; ++i) {\r
112         IFDE_CSSStyleSheet *pSheet = sheets.GetAt(i);\r
113         if (FX_DWORD dwMatchMedia = pSheet->GetMediaList() & dwMediaList) {\r
114             FX_INT32 iRules = pSheet->CountRules();\r
115             for (FX_INT32 j = 0; j < iRules; j++) {\r
116                 AddRulesFrom(pSheet, pSheet->GetRule(j), dwMatchMedia, pFontMgr);\r
117             }\r
118         }\r
119     }\r
120 }\r
121 void CFDE_CSSRuleCollection::AddRulesFrom(IFDE_CSSStyleSheet *pStyleSheet, IFDE_CSSRule *pRule, FX_DWORD dwMediaList, IFX_FontMgr *pFontMgr)\r
122 {\r
123     switch (pRule->GetType()) {\r
124         case FDE_CSSRULETYPE_Style: {\r
125                 IFDE_CSSStyleRule *pStyleRule = (IFDE_CSSStyleRule*)pRule;\r
126                 IFDE_CSSDeclaration *pDeclaration = pStyleRule->GetDeclaration();\r
127                 FX_INT32 iSelectors = pStyleRule->CountSelectorLists();\r
128                 for (FX_INT32 i = 0; i < iSelectors; ++i) {\r
129                     IFDE_CSSSelector *pSelector = pStyleRule->GetSelectorList(i);\r
130                     if (pSelector->GetType() == FDE_CSSSELECTORTYPE_Persudo) {\r
131                         FDE_LPCSSRULEDATA pData = NewRuleData(pSelector, pDeclaration);\r
132                         AddRuleTo(m_pPersudoRules, pData);\r
133                         continue;\r
134                     }\r
135                     if (pSelector->GetNameHash() != FDE_CSSUNIVERSALHASH) {\r
136                         AddRuleTo(m_TagRules, pSelector->GetNameHash(), pSelector, pDeclaration);\r
137                         continue;\r
138                     }\r
139                     IFDE_CSSSelector *pNext = pSelector->GetNextSelector();\r
140                     if (pNext == NULL) {\r
141                         FDE_LPCSSRULEDATA pData = NewRuleData(pSelector, pDeclaration);\r
142                         AddRuleTo(m_pUniversalRules, pData);\r
143                         continue;\r
144                     }\r
145                     switch (pNext->GetType()) {\r
146                         case FDE_CSSSELECTORTYPE_ID:\r
147                             AddRuleTo(m_IDRules, pNext->GetNameHash(), pSelector, pDeclaration);\r
148                             break;\r
149                         case FDE_CSSSELECTORTYPE_Class:\r
150                             AddRuleTo(m_ClassRules, pNext->GetNameHash(), pSelector, pDeclaration);\r
151                             break;\r
152                         case FDE_CSSSELECTORTYPE_Descendant:\r
153                         case FDE_CSSSELECTORTYPE_Element:\r
154                             AddRuleTo(m_pUniversalRules, NewRuleData(pSelector, pDeclaration));\r
155                             break;\r
156                         default:\r
157                             FXSYS_assert(FALSE);\r
158                             break;\r
159                     }\r
160                 }\r
161             }\r
162             break;\r
163         case FDE_CSSRULETYPE_Media: {\r
164                 IFDE_CSSMediaRule *pMediaRule = (IFDE_CSSMediaRule*)pRule;\r
165                 if (pMediaRule->GetMediaList() & dwMediaList) {\r
166                     FX_INT32 iRules = pMediaRule->CountRules();\r
167                     for (FX_INT32 i = 0; i < iRules; ++i) {\r
168                         AddRulesFrom(pStyleSheet, pMediaRule->GetRule(i), dwMediaList, pFontMgr);\r
169                     }\r
170                 }\r
171             }\r
172             break;\r
173         default:\r
174             break;\r
175     }\r
176 }\r
177 void CFDE_CSSRuleCollection::AddRuleTo(CFX_MapPtrToPtr &map, FX_DWORD dwKey, IFDE_CSSSelector *pSel, IFDE_CSSDeclaration *pDecl)\r
178 {\r
179     FX_LPVOID pKey = (FX_LPVOID)(FX_UINTPTR)dwKey;\r
180     FDE_LPCSSRULEDATA pData = NewRuleData(pSel, pDecl);\r
181     FDE_LPCSSRULEDATA pList = NULL;\r
182     if (!map.Lookup(pKey, (FX_LPVOID&)pList)) {\r
183         map.SetAt(pKey, pData);\r
184     } else if (AddRuleTo(pList, pData)) {\r
185         map.SetAt(pKey, pList);\r
186     }\r
187 }\r
188 inline FX_BOOL CFDE_CSSRuleCollection::AddRuleTo(FDE_LPCSSRULEDATA &pList, FDE_LPCSSRULEDATA pData)\r
189 {\r
190     if (pList == NULL) {\r
191         pList = pData;\r
192         return TRUE;\r
193     } else {\r
194         pData->pNext = pList->pNext;\r
195         pList->pNext = pData;\r
196         return FALSE;\r
197     }\r
198 }\r
199 inline FDE_LPCSSRULEDATA CFDE_CSSRuleCollection::NewRuleData(IFDE_CSSSelector *pSel, IFDE_CSSDeclaration *pDecl)\r
200 {\r
201     return FDE_NewWith(m_pStaticStore) FDE_CSSRULEDATA(pSel, pDecl, ++m_iSelectors);\r
202 }\r
203 IFDE_CSSStyleSelector* IFDE_CSSStyleSelector::Create()\r
204 {\r
205     return FDE_New CFDE_CSSStyleSelector;\r
206 }\r
207 CFDE_CSSStyleSelector::CFDE_CSSStyleSelector()\r
208     : m_pFontMgr(NULL)\r
209     , m_fDefFontSize(12.0f)\r
210     , m_pRuleDataStore(NULL)\r
211     , m_pInlineStyleStore(NULL)\r
212     , m_pFixedStyleStore(NULL)\r
213     , m_pAccelerator(NULL)\r
214 {\r
215     m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_High] = FDE_CSSSTYLESHEETGROUP_Author;\r
216     m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Mid] = FDE_CSSSTYLESHEETGROUP_User;\r
217     m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Low] = FDE_CSSSTYLESHEETGROUP_UserAgent;\r
218 }\r
219 CFDE_CSSStyleSelector::~CFDE_CSSStyleSelector()\r
220 {\r
221     Reset();\r
222     if (m_pInlineStyleStore != NULL) {\r
223         m_pInlineStyleStore->Release();\r
224     }\r
225     if (m_pFixedStyleStore != NULL) {\r
226         m_pFixedStyleStore->Release();\r
227     }\r
228     if (m_pAccelerator != NULL) {\r
229         FDE_Delete m_pAccelerator;\r
230     }\r
231 }\r
232 void CFDE_CSSStyleSelector::SetFontMgr(IFX_FontMgr *pFontMgr)\r
233 {\r
234     m_pFontMgr = pFontMgr;\r
235 }\r
236 void CFDE_CSSStyleSelector::SetDefFontSize(FX_FLOAT fFontSize)\r
237 {\r
238     FXSYS_assert(fFontSize > 0);\r
239     m_fDefFontSize = fFontSize;\r
240 }\r
241 IFDE_CSSAccelerator* CFDE_CSSStyleSelector::InitAccelerator()\r
242 {\r
243     if (m_pAccelerator == NULL) {\r
244         m_pAccelerator = FDE_New CFDE_CSSAccelerator;\r
245         FXSYS_assert(m_pAccelerator != NULL);\r
246     }\r
247     m_pAccelerator->Clear();\r
248     return m_pAccelerator;\r
249 }\r
250 IFDE_CSSComputedStyle* CFDE_CSSStyleSelector::CreateComputedStyle(IFDE_CSSComputedStyle *pParentStyle)\r
251 {\r
252     if (m_pFixedStyleStore == NULL) {\r
253         m_pFixedStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Fixed, 16, sizeof(CFDE_CSSComputedStyle));\r
254         FXSYS_assert(m_pFixedStyleStore != NULL);\r
255     }\r
256     CFDE_CSSComputedStyle *pStyle = FDE_NewWith(m_pFixedStyleStore) CFDE_CSSComputedStyle(m_pFixedStyleStore);\r
257     if (pParentStyle) {\r
258         pStyle->m_InheritedData = ((CFDE_CSSComputedStyle*)pParentStyle)->m_InheritedData;\r
259     } else {\r
260         pStyle->m_InheritedData.Reset();\r
261     }\r
262     pStyle->m_NonInheritedData.Reset();\r
263     return pStyle;\r
264 }\r
265 FX_BOOL CFDE_CSSStyleSelector::SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType, IFDE_CSSStyleSheet *pSheet)\r
266 {\r
267     FXSYS_assert(eType < FDE_CSSSTYLESHEETGROUP_MAX);\r
268     CFDE_CSSStyleSheetArray &dest = m_SheetGroups[eType];\r
269     dest.RemoveAt(0, dest.GetSize());\r
270     if (pSheet != NULL) {\r
271         dest.Add(pSheet);\r
272     }\r
273     return TRUE;\r
274 }\r
275 FX_BOOL CFDE_CSSStyleSelector::SetStyleSheets(FDE_CSSSTYLESHEETGROUP eType, const CFDE_CSSStyleSheetArray *pArray)\r
276 {\r
277     FXSYS_assert(eType < FDE_CSSSTYLESHEETGROUP_MAX);\r
278     CFDE_CSSStyleSheetArray &dest = m_SheetGroups[eType];\r
279     if (pArray == NULL) {\r
280         dest.RemoveAt(0, dest.GetSize());\r
281     } else {\r
282         dest.Copy(*pArray);\r
283     }\r
284     return TRUE;\r
285 }\r
286 void CFDE_CSSStyleSelector::SetStylePriority(FDE_CSSSTYLESHEETGROUP eType, FDE_CSSSTYLESHEETPRIORITY ePriority)\r
287 {\r
288     m_ePriorities[ePriority] = eType;\r
289 }\r
290 void CFDE_CSSStyleSelector::UpdateStyleIndex(FX_DWORD dwMediaList)\r
291 {\r
292     Reset();\r
293     m_pRuleDataStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0);\r
294     FXSYS_assert(m_pRuleDataStore != NULL);\r
295     for (FX_INT32 iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) {\r
296         CFDE_CSSRuleCollection &rules = m_RuleCollection[iGroup];\r
297         rules.m_pStaticStore = m_pRuleDataStore;\r
298         rules.AddRulesFrom(m_SheetGroups[iGroup], dwMediaList, m_pFontMgr);\r
299     }\r
300 }\r
301 void CFDE_CSSStyleSelector::Reset()\r
302 {\r
303     for (FX_INT32 iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) {\r
304         m_RuleCollection[iGroup].Clear();\r
305     }\r
306     if (m_pRuleDataStore != NULL) {\r
307         m_pRuleDataStore->Release();\r
308         m_pRuleDataStore = NULL;\r
309     }\r
310 }\r
311 FX_INT32 CFDE_CSSStyleSelector::MatchDeclarations(IFDE_CSSTagProvider *pTag, CFDE_CSSDeclarationArray &matchedDecls, FDE_CSSPERSUDO ePersudoType)\r
312 {\r
313     FXSYS_assert(m_pAccelerator != NULL && pTag != NULL);\r
314     FDE_LPCSSTAGCACHE pCache = m_pAccelerator->GetTopElement();\r
315     FXSYS_assert(pCache != NULL && pCache->GetTag() == pTag);\r
316     matchedDecls.RemoveAt(0, matchedDecls.GetSize());\r
317     for (FX_INT32 ePriority = FDE_CSSSTYLESHEETPRIORITY_MAX - 1; ePriority >= 0; --ePriority) {\r
318         FDE_CSSSTYLESHEETGROUP eGroup = m_ePriorities[ePriority];\r
319         CFDE_CSSRuleCollection &rules = m_RuleCollection[eGroup];\r
320         if (rules.CountSelectors() == 0) {\r
321             continue;\r
322         }\r
323         if (ePersudoType == FDE_CSSPERSUDO_NONE) {\r
324             MatchRules(pCache, rules.GetUniversalRuleData(), ePersudoType);\r
325             if (pCache->HashTag()) {\r
326                 MatchRules(pCache, rules.GetTagRuleData(pCache->HashTag()), ePersudoType);\r
327             }\r
328             FX_INT32 iCount = pCache->CountHashClass();\r
329             for (FX_INT32 i = 0; i < iCount; i++) {\r
330                 pCache->SetClassIndex(i);\r
331                 MatchRules(pCache, rules.GetClassRuleData(pCache->HashClass()), ePersudoType);\r
332             }\r
333         } else {\r
334             MatchRules(pCache, rules.GetPersudoRuleData(), ePersudoType);\r
335         }\r
336         if (m_MatchedRules.GetSize() > 0) {\r
337             SortRulesTo(matchedDecls);\r
338             m_MatchedRules.RemoveAt(0, m_MatchedRules.GetSize());\r
339         }\r
340     }\r
341     return matchedDecls.GetSize();\r
342 }\r
343 inline void CFDE_CSSStyleSelector::MatchRules(FDE_LPCSSTAGCACHE pCache, FDE_LPCSSRULEDATA pList, FDE_CSSPERSUDO ePersudoType)\r
344 {\r
345     while (pList != NULL) {\r
346         if (MatchSelector(pCache, pList->pSelector, ePersudoType)) {\r
347             m_MatchedRules.Add(pList);\r
348         }\r
349         pList = pList->pNext;\r
350     }\r
351 }\r
352 FX_BOOL CFDE_CSSStyleSelector::MatchSelector(FDE_LPCSSTAGCACHE pCache, IFDE_CSSSelector *pSel, FDE_CSSPERSUDO ePersudoType)\r
353 {\r
354     FX_DWORD dwHash;\r
355     while (pSel != NULL && pCache != NULL) {\r
356         switch (pSel->GetType()) {\r
357             case FDE_CSSSELECTORTYPE_Descendant:\r
358                 dwHash = pSel->GetNameHash();\r
359                 while ((pCache = pCache->GetParent()) != NULL) {\r
360                     if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) {\r
361                         continue;\r
362                     }\r
363                     if (MatchSelector(pCache, pSel->GetNextSelector(), ePersudoType)) {\r
364                         return TRUE;\r
365                     }\r
366                 }\r
367                 return FALSE;\r
368             case FDE_CSSSELECTORTYPE_ID:\r
369                 dwHash = pCache->HashID();\r
370                 if (dwHash != pSel->GetNameHash()) {\r
371                     return FALSE;\r
372                 }\r
373                 break;\r
374             case FDE_CSSSELECTORTYPE_Class:\r
375                 dwHash = pCache->HashClass();\r
376                 if (dwHash != pSel->GetNameHash()) {\r
377                     return FALSE;\r
378                 }\r
379                 break;\r
380             case FDE_CSSSELECTORTYPE_Element:\r
381                 dwHash = pSel->GetNameHash();\r
382                 if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) {\r
383                     return FALSE;\r
384                 }\r
385                 break;\r
386             case FDE_CSSSELECTORTYPE_Persudo:\r
387                 dwHash = FDE_GetCSSPersudoByEnum(ePersudoType)->dwHash;\r
388                 if (dwHash != pSel->GetNameHash()) {\r
389                     return FALSE;\r
390                 }\r
391                 break;\r
392             default:\r
393                 FXSYS_assert(FALSE);\r
394                 break;\r
395         }\r
396         pSel = pSel->GetNextSelector();\r
397     }\r
398     return pSel == NULL && pCache != NULL;\r
399 }\r
400 void CFDE_CSSStyleSelector::SortRulesTo(CFDE_CSSDeclarationArray &matchDecls)\r
401 {\r
402     for (FX_INT32 j = m_MatchedRules.GetUpperBound(); j >= 0; --j) {\r
403         FDE_LPCSSRULEDATA &pMin = m_MatchedRules.ElementAt(j);\r
404         FX_DWORD dwMin = pMin->dwPriority;\r
405         for (FX_INT32 i = j - 1; i >= 0; --i) {\r
406             FDE_LPCSSRULEDATA &pCur = m_MatchedRules.ElementAt(i);\r
407             if (dwMin > pCur->dwPriority) {\r
408                 dwMin = pCur->dwPriority;\r
409                 FDE_LPCSSRULEDATA p = pMin;\r
410                 pMin = pCur;\r
411                 pCur = p;\r
412             }\r
413         }\r
414         matchDecls.Add(pMin->pDeclaration);\r
415     }\r
416 }\r
417 void CFDE_CSSStyleSelector::ComputeStyle(IFDE_CSSTagProvider *pTag, const IFDE_CSSDeclaration **ppDeclArray, FX_INT32 iDeclCount, IFDE_CSSComputedStyle *pDestStyle)\r
418 {\r
419     CFDE_CSSComputedStyle *pComputedStyle = (CFDE_CSSComputedStyle*)pDestStyle;\r
420     FXSYS_assert(pTag && iDeclCount >= 0 && pComputedStyle != NULL);\r
421     FX_POSITION pos = pTag->GetFirstAttribute();\r
422     if (pos != NULL) {\r
423         if (m_pInlineStyleStore == NULL) {\r
424             m_pInlineStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 2048, 0);\r
425         }\r
426         CFDE_CSSDeclaration *pDecl = NULL;\r
427         CFX_WideStringC wsAttri, wsValue;\r
428         FX_DWORD dwAttriHash;\r
429         do {\r
430             pTag->GetNextAttribute(pos, wsAttri, wsValue);\r
431             dwAttriHash = FX_HashCode_String_GetW(wsAttri.GetPtr(), wsAttri.GetLength(), TRUE);\r
432             static const FX_DWORD s_dwStyleHash = FX_HashCode_String_GetW((FX_LPCWSTR)L"style", 5, TRUE);\r
433             static const FX_DWORD s_dwAlignHash = FX_HashCode_String_GetW((FX_LPCWSTR)L"align", 5, TRUE);\r
434             if (dwAttriHash == s_dwStyleHash) {\r
435                 if (pDecl == NULL) {\r
436                     pDecl = FDE_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;\r
437                 }\r
438                 AppendInlineStyle(pDecl, wsValue.GetPtr(), wsValue.GetLength());\r
439             } else if (dwAttriHash == s_dwAlignHash) {\r
440                 if (pDecl == NULL) {\r
441                     pDecl = FDE_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;\r
442                 }\r
443                 FDE_CSSPROPERTYARGS args;\r
444                 args.pStringCache = NULL;\r
445                 args.pStaticStore = m_pInlineStyleStore;\r
446                 args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY_TextAlign);\r
447                 pDecl->AddProperty(&args, wsValue.GetPtr(), wsValue.GetLength());\r
448             }\r
449         } while (pos != NULL);\r
450         if (pDecl != NULL) {\r
451             CFDE_CSSDeclarationArray decls;\r
452             decls.SetSize(iDeclCount + 1);\r
453             IFDE_CSSDeclaration **ppInline = decls.GetData();\r
454             FXSYS_memcpy(ppInline, ppDeclArray, iDeclCount * sizeof(IFDE_CSSDeclaration*));\r
455             ppInline[iDeclCount++] = pDecl;\r
456             ApplyDeclarations(TRUE, (const IFDE_CSSDeclaration **)ppInline, iDeclCount, pDestStyle);\r
457             ApplyDeclarations(FALSE, (const IFDE_CSSDeclaration **)ppInline, iDeclCount, pDestStyle);\r
458             return;\r
459         }\r
460     }\r
461     if (iDeclCount > 0) {\r
462         FXSYS_assert(ppDeclArray != NULL);\r
463         ApplyDeclarations(TRUE, ppDeclArray, iDeclCount, pDestStyle);\r
464         ApplyDeclarations(FALSE, ppDeclArray, iDeclCount, pDestStyle);\r
465     }\r
466 }\r
467 void CFDE_CSSStyleSelector::ApplyDeclarations(FX_BOOL bPriority, const IFDE_CSSDeclaration **ppDeclArray, FX_INT32 iDeclCount, IFDE_CSSComputedStyle *pDestStyle)\r
468 {\r
469     CFDE_CSSComputedStyle *pComputedStyle = (CFDE_CSSComputedStyle*)pDestStyle;\r
470     IFDE_CSSValue *pVal;\r
471     FX_BOOL bImportant;\r
472     FX_INT32 i;\r
473     if (bPriority) {\r
474         IFDE_CSSValue *pLastest = NULL, *pImportant = NULL;\r
475         for (i = 0; i < iDeclCount; ++i) {\r
476             pVal = ppDeclArray[i]->GetProperty(FDE_CSSPROPERTY_FontSize, bImportant);\r
477             if (pVal == NULL) {\r
478                 continue;\r
479             } else if (bImportant) {\r
480                 pImportant = pVal;\r
481             } else {\r
482                 pLastest = pVal;\r
483             }\r
484         }\r
485         if (pImportant) {\r
486             ApplyProperty(FDE_CSSPROPERTY_FontSize, pImportant, pComputedStyle);\r
487         } else if (pLastest) {\r
488             ApplyProperty(FDE_CSSPROPERTY_FontSize, pLastest, pComputedStyle);\r
489         }\r
490     } else {\r
491         CFDE_CSSDeclarationArray importants;\r
492         const IFDE_CSSDeclaration *pDecl = NULL;\r
493         FDE_CSSPROPERTY eProp;\r
494         FX_POSITION pos;\r
495         for (i = 0; i < iDeclCount; ++i) {\r
496             pDecl = ppDeclArray[i];\r
497             pos = pDecl->GetStartPosition();\r
498             while (pos != NULL) {\r
499                 pDecl->GetNextProperty(pos, eProp, pVal, bImportant);\r
500                 if (eProp == FDE_CSSPROPERTY_FontSize) {\r
501                     continue;\r
502                 } else if (!bImportant) {\r
503                     ApplyProperty(eProp, pVal, pComputedStyle);\r
504                 } else if (importants.GetSize() == 0 || importants[importants.GetUpperBound()] != pDecl) {\r
505                     importants.Add((IFDE_CSSDeclaration*)pDecl);\r
506                 }\r
507             }\r
508         }\r
509         iDeclCount = importants.GetSize();\r
510         for (i = 0; i < iDeclCount; ++i) {\r
511             pDecl = importants[i];\r
512             pos = pDecl->GetStartPosition();\r
513             while (pos != NULL) {\r
514                 pDecl->GetNextProperty(pos, eProp, pVal, bImportant);\r
515                 if (bImportant && eProp != FDE_CSSPROPERTY_FontSize) {\r
516                     ApplyProperty(eProp, pVal, pComputedStyle);\r
517                 }\r
518             }\r
519         }\r
520         CFX_WideString wsName, wsValue;\r
521         pos = pDecl->GetStartCustom();\r
522         while (pos) {\r
523             pDecl->GetNextCustom(pos, wsName, wsValue);\r
524             pComputedStyle->AddCustomStyle(wsName, wsValue);\r
525         }\r
526     }\r
527 }\r
528 void CFDE_CSSStyleSelector::AppendInlineStyle(CFDE_CSSDeclaration *pDecl, FX_LPCWSTR psz, FX_INT32 iLen)\r
529 {\r
530     FXSYS_assert(pDecl != NULL && psz != NULL && iLen > 0);\r
531     IFDE_CSSSyntaxParser *pSyntax = IFDE_CSSSyntaxParser::Create();\r
532     if (pSyntax == NULL) {\r
533         return;\r
534     }\r
535     if (pSyntax->Init(psz, iLen, 32, TRUE)) {\r
536         FX_INT32 iLen;\r
537         FX_LPCWSTR psz;\r
538         FDE_CSSPROPERTYARGS args;\r
539         args.pStringCache = NULL;\r
540         args.pStaticStore = m_pInlineStyleStore;\r
541         args.pProperty = NULL;\r
542         CFX_WideString wsName;\r
543         for (;;) {\r
544             FDE_CSSSYNTAXSTATUS eStatus = pSyntax->DoSyntaxParse();\r
545             if (eStatus == FDE_CSSSYNTAXSTATUS_PropertyName) {\r
546                 psz = pSyntax->GetCurrentString(iLen);\r
547                 args.pProperty = FDE_GetCSSPropertyByName(psz, iLen);\r
548                 if (args.pProperty == NULL) {\r
549                     wsName = CFX_WideStringC(psz, iLen);\r
550                 }\r
551             } else if (eStatus == FDE_CSSSYNTAXSTATUS_PropertyValue) {\r
552                 if (args.pProperty != NULL) {\r
553                     psz = pSyntax->GetCurrentString(iLen);\r
554                     if (iLen > 0) {\r
555                         pDecl->AddProperty(&args, psz, iLen);\r
556                     }\r
557                 } else if (iLen > 0) {\r
558                     psz = pSyntax->GetCurrentString(iLen);\r
559                     if (iLen > 0) {\r
560                         pDecl->AddProperty(&args, wsName, wsName.GetLength(), psz, iLen);\r
561                     }\r
562                 }\r
563             } else {\r
564                 break;\r
565             }\r
566         }\r
567     }\r
568     pSyntax->Release();\r
569 }\r
570 void CFDE_CSSStyleSelector::ApplyProperty(FDE_CSSPROPERTY eProperty, IFDE_CSSValue *pValue, CFDE_CSSComputedStyle *pComputedStyle)\r
571 {\r
572 #define FDE_CSSNONINHERITS      (pComputedStyle->m_NonInheritedData)\r
573 #define FDE_CSSINHERITS         (pComputedStyle->m_InheritedData)\r
574 #define FDE_CSSFONTSIZE         (FDE_CSSINHERITS.m_fFontSize)\r
575     if (pComputedStyle->m_InheritedData.m_pFontFamily && *(FX_DWORD*)pComputedStyle->m_InheritedData.m_pFontFamily == 0xcdcdcdcd) {\r
576         pComputedStyle = pComputedStyle;\r
577     }\r
578     if (pValue->GetType() == FDE_CSSVALUETYPE_Primitive) {\r
579         IFDE_CSSPrimitiveValue *pPrimitive = (IFDE_CSSPrimitiveValue*)pValue;\r
580         FDE_CSSPRIMITIVETYPE eType = pPrimitive->GetPrimitiveType();\r
581         switch (eProperty) {\r
582             case FDE_CSSPROPERTY_Display:\r
583                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
584                     FDE_CSSNONINHERITS.m_eDisplay = ToDisplay(pPrimitive->GetEnum());\r
585                 }\r
586                 break;\r
587             case FDE_CSSPROPERTY_FontSize: {\r
588                     FX_FLOAT &fFontSize = FDE_CSSFONTSIZE;\r
589                     if (eType >= FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) {\r
590                         fFontSize = ApplyNumber(eType, pPrimitive->GetFloat(), fFontSize);\r
591                     } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
592                         fFontSize = ToFontSize(pPrimitive->GetEnum(), fFontSize);\r
593                     }\r
594                 }\r
595                 break;\r
596             case FDE_CSSPROPERTY_LineHeight:\r
597                 if (eType == FDE_CSSPRIMITIVETYPE_Number) {\r
598                     FDE_CSSINHERITS.m_fLineHeight = pPrimitive->GetFloat() * FDE_CSSFONTSIZE;\r
599                 } else if (eType > FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) {\r
600                     FDE_CSSINHERITS.m_fLineHeight = ApplyNumber(eType, pPrimitive->GetFloat(), FDE_CSSFONTSIZE);\r
601                 }\r
602                 break;\r
603             case FDE_CSSPROPERTY_TextAlign:\r
604                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
605                     FDE_CSSINHERITS.m_eTextAligh = ToTextAlign(pPrimitive->GetEnum());\r
606                 }\r
607                 break;\r
608             case FDE_CSSPROPERTY_TextIndent:\r
609                 SetLengthWithPercent(FDE_CSSINHERITS.m_TextIndent, eType, pPrimitive, FDE_CSSFONTSIZE);\r
610                 break;\r
611             case FDE_CSSPROPERTY_FontWeight:\r
612                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
613                     FDE_CSSINHERITS.m_wFontWeight = ToFontWeight(pPrimitive->GetEnum());\r
614                 } else if (eType == FDE_CSSPRIMITIVETYPE_Number) {\r
615                     FX_INT32 iValue = (FX_INT32)pPrimitive->GetFloat() / 100;\r
616                     if (iValue >= 1 && iValue <= 9) {\r
617                         FDE_CSSINHERITS.m_wFontWeight = iValue * 100;\r
618                     }\r
619                 }\r
620                 break;\r
621             case FDE_CSSPROPERTY_FontStyle:\r
622                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
623                     FDE_CSSINHERITS.m_eFontStyle = ToFontStyle(pPrimitive->GetEnum());\r
624                 }\r
625                 break;\r
626             case FDE_CSSPROPERTY_Color:\r
627                 if (eType == FDE_CSSPRIMITIVETYPE_RGB) {\r
628                     FDE_CSSINHERITS.m_dwFontColor = pPrimitive->GetRGBColor();\r
629                 }\r
630                 break;\r
631             case FDE_CSSPROPERTY_MarginLeft:\r
632                 FDE_CSSNONINHERITS.m_bHasMargin |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.left, eType, pPrimitive, FDE_CSSFONTSIZE);\r
633                 break;\r
634             case FDE_CSSPROPERTY_MarginTop:\r
635                 FDE_CSSNONINHERITS.m_bHasMargin |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.top, eType, pPrimitive, FDE_CSSFONTSIZE);\r
636                 break;\r
637             case FDE_CSSPROPERTY_MarginRight:\r
638                 FDE_CSSNONINHERITS.m_bHasMargin |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.right, eType, pPrimitive, FDE_CSSFONTSIZE);\r
639                 break;\r
640             case FDE_CSSPROPERTY_MarginBottom:\r
641                 FDE_CSSNONINHERITS.m_bHasMargin |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_MarginWidth.bottom, eType, pPrimitive, FDE_CSSFONTSIZE);\r
642                 break;\r
643             case FDE_CSSPROPERTY_PaddingLeft:\r
644                 FDE_CSSNONINHERITS.m_bHasPadding |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.left, eType, pPrimitive, FDE_CSSFONTSIZE);\r
645                 break;\r
646             case FDE_CSSPROPERTY_PaddingTop:\r
647                 FDE_CSSNONINHERITS.m_bHasPadding |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.top, eType, pPrimitive, FDE_CSSFONTSIZE);\r
648                 break;\r
649             case FDE_CSSPROPERTY_PaddingRight:\r
650                 FDE_CSSNONINHERITS.m_bHasPadding |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.right, eType, pPrimitive, FDE_CSSFONTSIZE);\r
651                 break;\r
652             case FDE_CSSPROPERTY_PaddingBottom:\r
653                 FDE_CSSNONINHERITS.m_bHasPadding |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_PaddingWidth.bottom, eType, pPrimitive, FDE_CSSFONTSIZE);\r
654                 break;\r
655             case FDE_CSSPROPERTY_BorderLeftWidth:\r
656                 FDE_CSSNONINHERITS.m_bHasBorder |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.left, eType, pPrimitive, FDE_CSSFONTSIZE);\r
657                 break;\r
658             case FDE_CSSPROPERTY_BorderTopWidth:\r
659                 FDE_CSSNONINHERITS.m_bHasBorder |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.top, eType, pPrimitive, FDE_CSSFONTSIZE);\r
660                 break;\r
661             case FDE_CSSPROPERTY_BorderRightWidth:\r
662                 FDE_CSSNONINHERITS.m_bHasBorder |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.right, eType, pPrimitive, FDE_CSSFONTSIZE);\r
663                 break;\r
664             case FDE_CSSPROPERTY_BorderBottomWidth:\r
665                 FDE_CSSNONINHERITS.m_bHasBorder |= SetLengthWithPercent(FDE_CSSNONINHERITS.m_BorderWidth.bottom, eType, pPrimitive, FDE_CSSFONTSIZE);\r
666                 break;\r
667             case FDE_CSSPROPERTY_BorderLeftStyle:\r
668                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
669                     FDE_CSSNONINHERITS.m_eBDRLeftStyle = ToBorderStyle(pPrimitive->GetEnum());\r
670                 }\r
671                 break;\r
672             case FDE_CSSPROPERTY_BorderTopStyle:\r
673                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
674                     FDE_CSSNONINHERITS.m_eBDRTopStyle = ToBorderStyle(pPrimitive->GetEnum());\r
675                 }\r
676                 break;\r
677             case FDE_CSSPROPERTY_BorderRightStyle:\r
678                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
679                     FDE_CSSNONINHERITS.m_eBDRRightStyle = ToBorderStyle(pPrimitive->GetEnum());\r
680                 }\r
681                 break;\r
682             case FDE_CSSPROPERTY_BorderBottomStyle:\r
683                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
684                     FDE_CSSNONINHERITS.m_eBDRBottomStyle = ToBorderStyle(pPrimitive->GetEnum());\r
685                 }\r
686                 break;\r
687             case FDE_CSSPROPERTY_BorderLeftColor:\r
688                 if (eType == FDE_CSSPRIMITIVETYPE_RGB) {\r
689                     FDE_CSSNONINHERITS.m_dwBDRLeftColor = pPrimitive->GetRGBColor();\r
690                 }\r
691                 break;\r
692             case FDE_CSSPROPERTY_BorderTopColor:\r
693                 if (eType == FDE_CSSPRIMITIVETYPE_RGB) {\r
694                     FDE_CSSNONINHERITS.m_dwBDRTopColor = pPrimitive->GetRGBColor();\r
695                 }\r
696                 break;\r
697             case FDE_CSSPROPERTY_BorderRightColor:\r
698                 if (eType == FDE_CSSPRIMITIVETYPE_RGB) {\r
699                     FDE_CSSNONINHERITS.m_dwBDRRightColor = pPrimitive->GetRGBColor();\r
700                 }\r
701                 break;\r
702             case FDE_CSSPROPERTY_BorderBottomColor:\r
703                 if (eType == FDE_CSSPRIMITIVETYPE_RGB) {\r
704                     FDE_CSSNONINHERITS.m_dwBDRBottomColor = pPrimitive->GetRGBColor();\r
705                 }\r
706                 break;\r
707             case FDE_CSSPROPERTY_ListStyleType:\r
708                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
709                     FDE_CSSNONINHERITS.m_eListStyleType = ToListStyleType(pPrimitive->GetEnum());\r
710                 }\r
711                 break;\r
712             case FDE_CSSPROPERTY_ListStylePosition:\r
713                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
714                     FDE_CSSNONINHERITS.m_eListStylePosition = ToListStylePosition(pPrimitive->GetEnum());\r
715                 }\r
716                 break;\r
717             case FDE_CSSPROPERTY_BackgroundColor:\r
718                 if (eType == FDE_CSSPRIMITIVETYPE_RGB) {\r
719                     FDE_CSSNONINHERITS.m_dwBKGColor = pPrimitive->GetRGBColor();\r
720                 } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
721                     FDE_CSSNONINHERITS.m_dwBKGColor = 0;\r
722                 }\r
723                 break;\r
724             case FDE_CSSPROPERTY_Visibility:\r
725                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
726                     FDE_CSSINHERITS.m_eVisibility = ToVisibility(pPrimitive->GetEnum());\r
727                 }\r
728                 break;\r
729             case FDE_CSSPROPERTY_Width:\r
730                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_BoxSize.cx, eType, pPrimitive, FDE_CSSFONTSIZE);\r
731                 break;\r
732             case FDE_CSSPROPERTY_Height:\r
733                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_BoxSize.cy, eType, pPrimitive, FDE_CSSFONTSIZE);\r
734                 break;\r
735             case FDE_CSSPROPERTY_MinWidth:\r
736                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_MinBoxSize.cx, eType, pPrimitive, FDE_CSSFONTSIZE);\r
737                 break;\r
738             case FDE_CSSPROPERTY_MinHeight:\r
739                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_MinBoxSize.cy, eType, pPrimitive, FDE_CSSFONTSIZE);\r
740                 break;\r
741             case FDE_CSSPROPERTY_MaxWidth:\r
742                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_MaxBoxSize.cx, eType, pPrimitive, FDE_CSSFONTSIZE);\r
743                 break;\r
744             case FDE_CSSPROPERTY_MaxHeight:\r
745                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_MaxBoxSize.cy, eType, pPrimitive, FDE_CSSFONTSIZE);\r
746                 break;\r
747             case FDE_CSSPROPERTY_VerticalAlign:\r
748                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
749                     FDE_CSSNONINHERITS.m_eVerticalAlign = ToVerticalAlign(pPrimitive->GetEnum());\r
750                 } else if (eType >= FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) {\r
751                     FDE_CSSNONINHERITS.m_eVerticalAlign = FDE_CSSVERTICALALIGN_Number;\r
752                     FDE_CSSNONINHERITS.m_fVerticalAlign = ApplyNumber(eType, pPrimitive->GetFloat(), FDE_CSSFONTSIZE);\r
753                 }\r
754                 break;\r
755             case FDE_CSSPROPERTY_WhiteSpace:\r
756                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
757                     FDE_CSSINHERITS.m_eWhiteSpace = ToWhiteSpace(pPrimitive->GetEnum());\r
758                 }\r
759                 break;\r
760             case FDE_CSSPROPERTY_TextTransform:\r
761                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
762                     FDE_CSSINHERITS.m_eTextTransform = ToTextTransform(pPrimitive->GetEnum());\r
763                 }\r
764                 break;\r
765             case FDE_CSSPROPERTY_FontVariant:\r
766                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
767                     FDE_CSSINHERITS.m_eFontVariant = ToFontVariant(pPrimitive->GetEnum());\r
768                 }\r
769                 break;\r
770             case FDE_CSSPROPERTY_LetterSpacing:\r
771                 if (eType == FDE_CSSPRIMITIVETYPE_Percent) {\r
772                     break;\r
773                 } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
774                     FDE_CSSINHERITS.m_LetterSpacing.Set(FDE_CSSLENGTHUNIT_Normal);\r
775                 } else if (eType >= FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) {\r
776                     SetLengthWithPercent(FDE_CSSINHERITS.m_LetterSpacing, eType, pPrimitive, FDE_CSSFONTSIZE);\r
777                 }\r
778                 break;\r
779             case FDE_CSSPROPERTY_WordSpacing:\r
780                 if (eType == FDE_CSSPRIMITIVETYPE_Percent) {\r
781                     break;\r
782                 } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
783                     FDE_CSSINHERITS.m_WordSpacing.Set(FDE_CSSLENGTHUNIT_Normal);\r
784                 } else if (eType >= FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) {\r
785                     SetLengthWithPercent(FDE_CSSINHERITS.m_WordSpacing, eType, pPrimitive, FDE_CSSFONTSIZE);\r
786                 }\r
787                 break;\r
788             case FDE_CSSPROPERTY_Float:\r
789                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
790                     FDE_CSSNONINHERITS.m_eFloat = ToFloat(pPrimitive->GetEnum());\r
791                 }\r
792                 break;\r
793             case FDE_CSSPROPERTY_Clear:\r
794                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
795                     FDE_CSSNONINHERITS.m_eClear = ToClear(pPrimitive->GetEnum());\r
796                 }\r
797                 break;\r
798             case FDE_CSSPROPERTY_WritingMode:\r
799                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
800                     FDE_CSSINHERITS.m_eWritingMode = ToWritingMode(pPrimitive->GetEnum());\r
801                 }\r
802                 break;\r
803             case FDE_CSSPROPERTY_WordBreak:\r
804                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
805                     FDE_CSSINHERITS.m_eWordBreak = ToWordBreak(pPrimitive->GetEnum());\r
806                 }\r
807                 break;\r
808             case FDE_CSSPROPERTY_Widows:\r
809                 if (eType == FDE_CSSPRIMITIVETYPE_Number) {\r
810                     FDE_CSSINHERITS.m_iWidows = (FX_INT32)pPrimitive->GetFloat();\r
811                 }\r
812                 break;\r
813             case FDE_CSSPROPERTY_Orphans:\r
814                 if (eType == FDE_CSSPRIMITIVETYPE_Number) {\r
815                     FDE_CSSINHERITS.m_iOrphans = (FX_INT32)pPrimitive->GetFloat();\r
816                 }\r
817                 break;\r
818             case FDE_CSSPROPERTY_TextEmphasisColor:\r
819                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
820                     switch (pPrimitive->GetEnum()) {\r
821                         case FDE_CSSPROPERTYVALUE_Transparent:\r
822                             FDE_CSSINHERITS.m_dwTextEmphasisColor = 0;\r
823                             FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = FALSE;\r
824                             break;\r
825                         case FDE_CSSPROPERTYVALUE_Currentcolor:\r
826                             FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = TRUE;\r
827                             break;\r
828                         default:\r
829                             break;\r
830                     }\r
831                 } else if (eType == FDE_CSSPRIMITIVETYPE_RGB) {\r
832                     FDE_CSSINHERITS.m_dwTextEmphasisColor = pPrimitive->GetRGBColor();\r
833                     FDE_CSSINHERITS.m_bTextEmphasisColorCurrent = FALSE;\r
834                 }\r
835                 break;\r
836             case FDE_CSSPROPERTY_PageBreakBefore:\r
837                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
838                     FDE_CSSNONINHERITS.m_ePageBreakBefore = ToPageBreak(pPrimitive->GetEnum());\r
839                 }\r
840                 break;\r
841             case FDE_CSSPROPERTY_PageBreakAfter:\r
842                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
843                     FDE_CSSNONINHERITS.m_ePageBreakAfter = ToPageBreak(pPrimitive->GetEnum());\r
844                 }\r
845                 break;\r
846             case FDE_CSSPROPERTY_PageBreakInside:\r
847                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
848                     FDE_CSSNONINHERITS.m_ePageBreakInside = ToPageBreak(pPrimitive->GetEnum());\r
849                 }\r
850                 break;\r
851             case FDE_CSSPROPERTY_OverflowX:\r
852                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
853                     FDE_CSSNONINHERITS.m_eOverflowX = ToOverflow(pPrimitive->GetEnum());\r
854                 }\r
855                 break;\r
856             case FDE_CSSPROPERTY_OverflowY:\r
857                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
858                     FDE_CSSNONINHERITS.m_eOverflowY = ToOverflow(pPrimitive->GetEnum());\r
859                 }\r
860                 break;\r
861             case FDE_CSSPROPERTY_LineBreak:\r
862                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
863                     FDE_CSSINHERITS.m_eLineBreak = ToLineBreak(pPrimitive->GetEnum());\r
864                 }\r
865                 break;\r
866             case FDE_CSSPROPERTY_ColumnCount:\r
867                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
868                     FDE_CSSNONINHERITS.m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Auto);\r
869                 } else if (eType == FDE_CSSPRIMITIVETYPE_Number) {\r
870                     FDE_CSSNONINHERITS.m_ColumnCount.Set(FDE_CSSLENGTHUNIT_Point, pPrimitive->GetFloat());\r
871                 }\r
872                 break;\r
873             case FDE_CSSPROPERTY_ColumnGap:\r
874                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnGap, eType, pPrimitive, FDE_CSSFONTSIZE);\r
875                 break;\r
876             case FDE_CSSPROPERTY_ColumnRuleColor:\r
877                 if (eType == FDE_CSSPRIMITIVETYPE_RGB) {\r
878                     FDE_CSSNONINHERITS.m_dwColumnRuleColor = pPrimitive->GetRGBColor();\r
879                     FDE_CSSNONINHERITS.m_bColumnRuleColorSame = FALSE;\r
880                 }\r
881                 break;\r
882             case FDE_CSSPROPERTY_ColumnRuleStyle:\r
883                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
884                     FDE_CSSNONINHERITS.m_eColumnRuleStyle = ToBorderStyle(pPrimitive->GetEnum());\r
885                 }\r
886                 break;\r
887             case FDE_CSSPROPERTY_ColumnRuleWidth:\r
888                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnRuleWidth, eType, pPrimitive, FDE_CSSFONTSIZE);\r
889                 break;\r
890             case FDE_CSSPROPERTY_ColumnWidth:\r
891                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_ColumnWidth, eType, pPrimitive, FDE_CSSFONTSIZE);\r
892                 break;\r
893             case FDE_CSSPROPERTY_BackgroundImage:\r
894                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
895                     FDE_CSSNONINHERITS.m_pszBKGImage = NULL;\r
896                 } else if (eType == FDE_CSSPRIMITIVETYPE_URI) {\r
897                     FX_INT32 iLength;\r
898                     FDE_CSSNONINHERITS.m_pszBKGImage = pPrimitive->GetString(iLength);\r
899                 }\r
900                 break;\r
901             case FDE_CSSPROPERTY_Position:\r
902                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
903                     FDE_CSSNONINHERITS.m_ePosition = ToPosition(pPrimitive->GetEnum());\r
904                 }\r
905                 break;\r
906             case FDE_CSSPROPERTY_Top:\r
907                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_Top, eType, pPrimitive, FDE_CSSFONTSIZE);\r
908                 break;\r
909             case FDE_CSSPROPERTY_Bottom:\r
910                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_Bottom, eType, pPrimitive, FDE_CSSFONTSIZE);\r
911                 break;\r
912             case FDE_CSSPROPERTY_Left:\r
913                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_Left, eType, pPrimitive, FDE_CSSFONTSIZE);\r
914                 break;\r
915             case FDE_CSSPROPERTY_Right:\r
916                 SetLengthWithPercent(FDE_CSSNONINHERITS.m_Right, eType, pPrimitive, FDE_CSSFONTSIZE);\r
917                 break;\r
918             case FDE_CSSPROPERTY_ListStyleImage:\r
919                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
920                     FDE_CSSINHERITS.m_pszListStyleImage = NULL;\r
921                 } else if (eType == FDE_CSSPRIMITIVETYPE_URI) {\r
922                     FX_INT32 iLength;\r
923                     FDE_CSSINHERITS.m_pszListStyleImage = pPrimitive->GetString(iLength);\r
924                 }\r
925                 break;\r
926             case FDE_CSSPROPERTY_CaptionSide:\r
927                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
928                     FDE_CSSINHERITS.m_eCaptionSide = ToCaptionSide(pPrimitive->GetEnum());\r
929                 }\r
930                 break;\r
931             case FDE_CSSPROPERTY_BackgroundRepeat:\r
932                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
933                     FDE_CSSNONINHERITS.m_eBKGRepeat = ToBKGRepeat(pPrimitive->GetEnum());\r
934                 }\r
935                 break;\r
936             case FDE_CSSPROPERTY_BackgroundAttachment:\r
937                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
938                     FDE_CSSNONINHERITS.m_eBKGAttachment = ToBKGAttachment(pPrimitive->GetEnum());\r
939                 }\r
940                 break;\r
941             case FDE_CSSPROPERTY_RubyAlign:\r
942                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
943                     FDE_CSSINHERITS.m_eRubyAlign = ToRubyAlign(pPrimitive->GetEnum());\r
944                 }\r
945                 break;\r
946             case FDE_CSSPROPERTY_RubyOverhang:\r
947                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
948                     FDE_CSSINHERITS.m_eRubyOverhang = ToRubyOverhang(pPrimitive->GetEnum());\r
949                 }\r
950                 break;\r
951             case FDE_CSSPROPERTY_RubyPosition:\r
952                 if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
953                     FDE_CSSINHERITS.m_eRubyPosition = ToRubyPosition(pPrimitive->GetEnum());\r
954                 }\r
955                 break;\r
956             case FDE_CSSPROPERTY_RubySpan:\r
957                 FDE_CSSNONINHERITS.m_pRubySpan = pPrimitive;\r
958                 break;\r
959             default:\r
960                 break;\r
961         }\r
962     } else if (pValue->GetType() == FDE_CSSVALUETYPE_List) {\r
963         IFDE_CSSValueList *pList = (IFDE_CSSValueList*)pValue;\r
964         FX_INT32 iCount = pList->CountValues();\r
965         if (iCount > 0) {\r
966             switch (eProperty) {\r
967                 case FDE_CSSPROPERTY_FontFamily:\r
968                     FDE_CSSINHERITS.m_pFontFamily = pList;\r
969                     break;\r
970                 case FDE_CSSPROPERTY_TextDecoration:\r
971                     FDE_CSSNONINHERITS.m_dwTextDecoration = ToTextDecoration(pList);\r
972                     break;\r
973                 case FDE_CSSPROPERTY_CounterIncrement: {\r
974                         if (FDE_CSSNONINHERITS.m_pCounterStyle == NULL) {\r
975                             FDE_CSSNONINHERITS.m_pCounterStyle = FDE_New CFDE_CSSCounterStyle;\r
976                         }\r
977                         FDE_CSSNONINHERITS.m_pCounterStyle->SetCounterIncrementList(pList);\r
978                     }\r
979                     break;\r
980                 case FDE_CSSPROPERTY_CounterReset: {\r
981                         if (FDE_CSSNONINHERITS.m_pCounterStyle == NULL) {\r
982                             FDE_CSSNONINHERITS.m_pCounterStyle = FDE_New CFDE_CSSCounterStyle;\r
983                         }\r
984                         FDE_CSSNONINHERITS.m_pCounterStyle->SetCounterResetList(pList);\r
985                     }\r
986                     break;\r
987                 case FDE_CSSPROPERTY_Content:\r
988                     FDE_CSSNONINHERITS.m_pContentList = pList;\r
989                     break;\r
990                 case FDE_CSSPROPERTY_Quotes:\r
991                     FDE_CSSINHERITS.m_pQuotes = pList;\r
992                     break;\r
993                 case FDE_CSSPROPERTY_TextCombine: {\r
994                         for (FX_INT32 i = 0; i < pList->CountValues(); i++) {\r
995                             IFDE_CSSPrimitiveValue *pVal = (IFDE_CSSPrimitiveValue*)pList->GetValue(i);\r
996                             switch (pVal->GetPrimitiveType()) {\r
997                                 case FDE_CSSPRIMITIVETYPE_Enum: {\r
998                                         switch (pVal->GetEnum()) {\r
999                                             case FDE_CSSPROPERTYVALUE_None: {\r
1000                                                     FDE_CSSNONINHERITS.m_eTextCombine = FDE_CSSTEXTCOMBINE_None;\r
1001                                                     FDE_CSSNONINHERITS.m_bHasTextCombineNumber = FALSE;\r
1002                                                 }\r
1003                                                 break;\r
1004                                             case FDE_CSSPROPERTYVALUE_Horizontal: {\r
1005                                                     FDE_CSSNONINHERITS.m_eTextCombine = FDE_CSSTEXTCOMBINE_Horizontal;\r
1006                                                     FDE_CSSNONINHERITS.m_bHasTextCombineNumber = FALSE;\r
1007                                                 }\r
1008                                                 break;\r
1009                                             default:\r
1010                                                 break;\r
1011                                         }\r
1012                                     }\r
1013                                     break;\r
1014                                 case FDE_CSSPRIMITIVETYPE_Number:\r
1015                                     FDE_CSSNONINHERITS.m_fTextCombineNumber = pVal->GetFloat();\r
1016                                     break;\r
1017                                 default:\r
1018                                     break;\r
1019                             }\r
1020                         }\r
1021                     }\r
1022                     break;\r
1023                 case FDE_CSSPROPERTY_TextEmphasisStyle: {\r
1024                         FDE_CSSTEXTEMPHASISFILL eFill;\r
1025                         FDE_CSSTEXTEMPHASISMARK eMark;\r
1026                         for (FX_INT32 i = 0; i < pList->CountValues(); i++) {\r
1027                             IFDE_CSSPrimitiveValue *pVal = (IFDE_CSSPrimitiveValue*)pList->GetValue(i);\r
1028                             switch (pVal->GetPrimitiveType()) {\r
1029                                 case FDE_CSSPRIMITIVETYPE_Enum: {\r
1030                                         if (ToTextEmphasisFill(pVal->GetEnum(), eFill)) {\r
1031                                             FDE_CSSINHERITS.m_eTextEmphasisFill = eFill;\r
1032                                             continue;\r
1033                                         } else if (ToTextEmphasisMark(pVal->GetEnum(), eMark)) {\r
1034                                             FDE_CSSINHERITS.m_eTextEmphasisMark = eMark;\r
1035                                         }\r
1036                                     }\r
1037                                     break;\r
1038                                 case FDE_CSSPRIMITIVETYPE_String: {\r
1039                                         FDE_CSSINHERITS.m_eTextEmphasisMark = FDE_CSSTEXTEMPHASISMARK_Custom;\r
1040                                         FX_INT32 iLen;\r
1041                                         FDE_CSSINHERITS.m_pszTextEmphasisCustomMark = pVal->GetString(iLen);\r
1042                                     }\r
1043                                     break;\r
1044                                 default:\r
1045                                     break;\r
1046                             }\r
1047                         }\r
1048                     }\r
1049                     break;\r
1050                 default:\r
1051                     break;\r
1052             }\r
1053         }\r
1054     } else {\r
1055         FXSYS_assert(FALSE);\r
1056     }\r
1057 }\r
1058 FX_FLOAT CFDE_CSSStyleSelector::ApplyNumber(FDE_CSSPRIMITIVETYPE eUnit, FX_FLOAT fValue, FX_FLOAT fPercentBase)\r
1059 {\r
1060     switch (eUnit) {\r
1061         case FDE_CSSPRIMITIVETYPE_PX:\r
1062         case FDE_CSSPRIMITIVETYPE_Number:\r
1063             return fValue * 72 / 96;\r
1064         case FDE_CSSPRIMITIVETYPE_PT:\r
1065             return fValue;\r
1066         case FDE_CSSPRIMITIVETYPE_EMS:\r
1067         case FDE_CSSPRIMITIVETYPE_EXS:\r
1068             return fValue * fPercentBase;\r
1069         case FDE_CSSPRIMITIVETYPE_Percent:\r
1070             return fValue * fPercentBase / 100.0f;\r
1071         case FDE_CSSPRIMITIVETYPE_CM:\r
1072             return fValue * 28.3464f;\r
1073         case FDE_CSSPRIMITIVETYPE_MM:\r
1074             return fValue * 2.8346f;\r
1075         case FDE_CSSPRIMITIVETYPE_IN:\r
1076             return fValue * 72.0f;\r
1077         case FDE_CSSPRIMITIVETYPE_PC:\r
1078             return fValue / 12.0f;\r
1079         default:\r
1080             return fValue;\r
1081     }\r
1082 }\r
1083 FDE_CSSRUBYSPAN CFDE_CSSStyleSelector::ToRubySpan(FDE_CSSPROPERTYVALUE eValue)\r
1084 {\r
1085     switch (eValue) {\r
1086         case FDE_CSSPROPERTYVALUE_None:\r
1087         default:\r
1088             return FDE_CSSRUBYSPAN_None;\r
1089     }\r
1090 }\r
1091 FDE_CSSRUBYPOSITION CFDE_CSSStyleSelector::ToRubyPosition(FDE_CSSPROPERTYVALUE eValue)\r
1092 {\r
1093     switch (eValue) {\r
1094         case FDE_CSSPROPERTYVALUE_Before:\r
1095             return FDE_CSSRUBYPOSITION_Before;\r
1096         case FDE_CSSPROPERTYVALUE_After:\r
1097             return FDE_CSSRUBYPOSITION_After;\r
1098         case FDE_CSSPROPERTYVALUE_Right:\r
1099             return FDE_CSSRUBYPOSITION_Right;\r
1100         case FDE_CSSPROPERTYVALUE_Inline:\r
1101             return FDE_CSSRUBYPOSITION_Inline;\r
1102         default:\r
1103             return FDE_CSSRUBYPOSITION_Before;\r
1104     }\r
1105 }\r
1106 FDE_CSSRUBYOVERHANG CFDE_CSSStyleSelector::ToRubyOverhang(FDE_CSSPROPERTYVALUE eValue)\r
1107 {\r
1108     switch (eValue) {\r
1109         case FDE_CSSPROPERTYVALUE_Auto:\r
1110             return FDE_CSSRUBYOVERHANG_Auto;\r
1111         case FDE_CSSPROPERTYVALUE_Start:\r
1112             return FDE_CSSRUBYOVERHANG_Start;\r
1113         case FDE_CSSPROPERTYVALUE_End:\r
1114             return FDE_CSSRUBYOVERHANG_End;\r
1115         case FDE_CSSPROPERTYVALUE_None:\r
1116         default:\r
1117             return FDE_CSSRUBYOVERHANG_None;\r
1118     }\r
1119 }\r
1120 FDE_CSSRUBYALIGN CFDE_CSSStyleSelector::ToRubyAlign(FDE_CSSPROPERTYVALUE eValue)\r
1121 {\r
1122     switch (eValue) {\r
1123         case FDE_CSSPROPERTYVALUE_Auto:\r
1124             return FDE_CSSRUBYALIGN_Auto;\r
1125         case FDE_CSSPROPERTYVALUE_Start:\r
1126             return FDE_CSSRUBYALIGN_Start;\r
1127         case FDE_CSSPROPERTYVALUE_Left:\r
1128             return FDE_CSSRUBYALIGN_End;\r
1129         case FDE_CSSPROPERTYVALUE_Center:\r
1130             return FDE_CSSRUBYALIGN_Center;\r
1131         case FDE_CSSPROPERTYVALUE_End:\r
1132             return FDE_CSSRUBYALIGN_End;\r
1133         case FDE_CSSPROPERTYVALUE_Right:\r
1134             return FDE_CSSRUBYALIGN_Right;\r
1135         case FDE_CSSPROPERTYVALUE_DistributeLetter:\r
1136             return FDE_CSSRUBYALIGN_DistributeLetter;\r
1137         case FDE_CSSPROPERTYVALUE_DistributeSpace:\r
1138             return FDE_CSSRUBYALIGN_DistributeSpace;\r
1139         case FDE_CSSPROPERTYVALUE_LineEdge:\r
1140             return FDE_CSSRUBYALIGN_LineEdge;\r
1141         default:\r
1142             return FDE_CSSRUBYALIGN_Auto;\r
1143     }\r
1144 }\r
1145 FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisMark(FDE_CSSPROPERTYVALUE eValue, FDE_CSSTEXTEMPHASISMARK &eMark)\r
1146 {\r
1147     switch (eValue) {\r
1148         case FDE_CSSPROPERTYVALUE_None:\r
1149             eMark = FDE_CSSTEXTEMPHASISMARK_None;\r
1150             return TRUE;\r
1151         case FDE_CSSPROPERTYVALUE_Dot:\r
1152             eMark = FDE_CSSTEXTEMPHASISMARK_Dot;\r
1153             return TRUE;\r
1154         case FDE_CSSPROPERTYVALUE_Circle:\r
1155             eMark = FDE_CSSTEXTEMPHASISMARK_Circle;\r
1156             return TRUE;\r
1157         case FDE_CSSPROPERTYVALUE_DoubleCircle:\r
1158             eMark = FDE_CSSTEXTEMPHASISMARK_DoubleCircle;\r
1159             return TRUE;\r
1160         case FDE_CSSPROPERTYVALUE_Triangle:\r
1161             eMark = FDE_CSSTEXTEMPHASISMARK_Triangle;\r
1162             return TRUE;\r
1163         case FDE_CSSPROPERTYVALUE_Sesame:\r
1164             eMark = FDE_CSSTEXTEMPHASISMARK_Sesame;\r
1165             return TRUE;\r
1166         default:\r
1167             return FALSE;\r
1168     }\r
1169 }\r
1170 FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisFill(FDE_CSSPROPERTYVALUE eValue, FDE_CSSTEXTEMPHASISFILL &eFill)\r
1171 {\r
1172     switch (eValue) {\r
1173         case FDE_CSSPROPERTYVALUE_Filled:\r
1174             eFill = FDE_CSSTEXTEMPHASISFILL_Filled;\r
1175             return TRUE;\r
1176         case FDE_CSSPROPERTYVALUE_Open:\r
1177             eFill = FDE_CSSTEXTEMPHASISFILL_Open;\r
1178             return TRUE;\r
1179         default:\r
1180             return FALSE;\r
1181     }\r
1182 }\r
1183 FDE_CSSBKGATTACHMENT CFDE_CSSStyleSelector::ToBKGAttachment(FDE_CSSPROPERTYVALUE eValue)\r
1184 {\r
1185     switch (eValue) {\r
1186         case FDE_CSSPROPERTYVALUE_Fixed:\r
1187             return FDE_CSSBKGATTACHMENT_Fixed;\r
1188         case FDE_CSSPROPERTYVALUE_Scroll:\r
1189             return FDE_CSSBKGATTACHMENT_Scroll;\r
1190         default:\r
1191             return FDE_CSSBKGATTACHMENT_Fixed;\r
1192     }\r
1193 }\r
1194 FDE_CSSCAPTIONSIDE CFDE_CSSStyleSelector::ToCaptionSide(FDE_CSSPROPERTYVALUE eValue)\r
1195 {\r
1196     switch (eValue) {\r
1197         case FDE_CSSPROPERTYVALUE_Top:\r
1198             return FDE_CSSCAPTIONSIDE_Top;\r
1199         case FDE_CSSPROPERTYVALUE_Bottom:\r
1200             return FDE_CSSCAPTIONSIDE_Bottom;\r
1201         case FDE_CSSPROPERTYVALUE_Left:\r
1202             return FDE_CSSCAPTIONSIDE_Left;\r
1203         case FDE_CSSPROPERTYVALUE_Right:\r
1204             return FDE_CSSCAPTIONSIDE_Right;\r
1205         case FDE_CSSPROPERTYVALUE_Before:\r
1206             return FDE_CSSCAPTIONSIDE_Before;\r
1207         case FDE_CSSPROPERTYVALUE_After:\r
1208             return FDE_CSSCAPTIONSIDE_After;\r
1209         default:\r
1210             return FDE_CSSCAPTIONSIDE_Top;\r
1211     }\r
1212 }\r
1213 FDE_CSSPOSITION CFDE_CSSStyleSelector::ToPosition(FDE_CSSPROPERTYVALUE eValue)\r
1214 {\r
1215     switch (eValue) {\r
1216         case FDE_CSSPROPERTYVALUE_Static:\r
1217             return FDE_CSSPOSITION_Static;\r
1218         case FDE_CSSPROPERTYVALUE_Relative:\r
1219             return FDE_CSSPOSITION_Relative;\r
1220         case FDE_CSSPROPERTYVALUE_Fixed:\r
1221             return FDE_CSSPOSITION_Fixed;\r
1222         case FDE_CSSPROPERTYVALUE_Absolute:\r
1223             return FDE_CSSPOSITION_Absolute;\r
1224         default:\r
1225             return FDE_CSSPOSITION_Static;\r
1226     }\r
1227 }\r
1228 FDE_CSSCURSOR CFDE_CSSStyleSelector::ToCursor(FDE_CSSPROPERTYVALUE eValue)\r
1229 {\r
1230     switch (eValue) {\r
1231         case FDE_CSSPROPERTYVALUE_Auto:\r
1232             return FDE_CSSCURSOR_Auto;\r
1233         case FDE_CSSPROPERTYVALUE_Crosshair:\r
1234             return FDE_CSSCURSOR_Crosshair;\r
1235         case FDE_CSSPROPERTYVALUE_Default:\r
1236             return FDE_CSSCURSOR_Default;\r
1237         case FDE_CSSPROPERTYVALUE_Pointer:\r
1238             return FDE_CSSCURSOR_Pointer;\r
1239         case FDE_CSSPROPERTYVALUE_Move:\r
1240             return FDE_CSSCURSOR_Move;\r
1241         case FDE_CSSPROPERTYVALUE_EResize:\r
1242             return FDE_CSSCURSOR_EResize;\r
1243         case FDE_CSSPROPERTYVALUE_NeResize:\r
1244             return FDE_CSSCURSOR_NeResize;\r
1245         case FDE_CSSPROPERTYVALUE_NwResize:\r
1246             return FDE_CSSCURSOR_NwResize;\r
1247         case FDE_CSSPROPERTYVALUE_NResize:\r
1248             return FDE_CSSCURSOR_NResize;\r
1249         case FDE_CSSPROPERTYVALUE_SeResize:\r
1250             return FDE_CSSCURSOR_SeResize;\r
1251         case FDE_CSSPROPERTYVALUE_SwResize:\r
1252             return FDE_CSSCURSOR_SwResize;\r
1253         default:\r
1254             return FDE_CSSCURSOR_Auto;\r
1255     }\r
1256 }\r
1257 FDE_CSSBKGREPEAT CFDE_CSSStyleSelector::ToBKGRepeat(FDE_CSSPROPERTYVALUE eValue)\r
1258 {\r
1259     switch (eValue) {\r
1260         case FDE_CSSPROPERTYVALUE_Repeat:\r
1261             return FDE_CSSBKGREPEAT_Repeat;\r
1262         case FDE_CSSPROPERTYVALUE_RepeatX:\r
1263             return FDE_CSSBKGREPEAT_RepeatX;\r
1264         case FDE_CSSPROPERTYVALUE_RepeatY:\r
1265             return FDE_CSSBKGREPEAT_RepeatY;\r
1266         case FDE_CSSPROPERTYVALUE_NoRepeat:\r
1267             return FDE_CSSBKGREPEAT_NoRepeat;\r
1268         default:\r
1269             return FDE_CSSBKGREPEAT_Repeat;\r
1270     }\r
1271 }\r
1272 FDE_CSSTEXTCOMBINE CFDE_CSSStyleSelector::ToTextCombine(FDE_CSSPROPERTYVALUE eValue)\r
1273 {\r
1274     switch (eValue) {\r
1275         case FDE_CSSPROPERTYVALUE_Horizontal:\r
1276             return FDE_CSSTEXTCOMBINE_Horizontal;\r
1277         case FDE_CSSPROPERTYVALUE_None:\r
1278         default:\r
1279             return FDE_CSSTEXTCOMBINE_None;\r
1280     }\r
1281 }\r
1282 FDE_CSSLINEBREAK CFDE_CSSStyleSelector::ToLineBreak(FDE_CSSPROPERTYVALUE eValue)\r
1283 {\r
1284     switch (eValue) {\r
1285         case FDE_CSSPROPERTYVALUE_Auto:\r
1286             return FDE_CSSLINEBREAK_Auto;\r
1287         case FDE_CSSPROPERTYVALUE_Loose:\r
1288             return FDE_CSSLINEBREAK_Loose;\r
1289         case FDE_CSSPROPERTYVALUE_Normal:\r
1290             return FDE_CSSLINEBREAK_Normal;\r
1291         case FDE_CSSPROPERTYVALUE_Strict:\r
1292             return FDE_CSSLINEBREAK_Strict;\r
1293         default:\r
1294             return FDE_CSSLINEBREAK_Auto;\r
1295     }\r
1296 }\r
1297 FDE_CSSOVERFLOW CFDE_CSSStyleSelector::ToOverflow(FDE_CSSPROPERTYVALUE eValue)\r
1298 {\r
1299     switch (eValue) {\r
1300         case FDE_CSSPROPERTYVALUE_Visible:\r
1301             return FDE_CSSOVERFLOW_Visible;\r
1302         case FDE_CSSPROPERTYVALUE_Hidden:\r
1303             return FDE_CSSOVERFLOW_Hidden;\r
1304         case FDE_CSSPROPERTYVALUE_Scroll:\r
1305             return FDE_CSSOVERFLOW_Scroll;\r
1306         case FDE_CSSPROPERTYVALUE_Auto:\r
1307             return FDE_CSSOVERFLOW_Auto;\r
1308         case FDE_CSSPROPERTYVALUE_NoDisplay:\r
1309             return FDE_CSSOVERFLOW_NoDisplay;\r
1310         case FDE_CSSPROPERTYVALUE_NoContent:\r
1311             return FDE_CSSOVERFLOW_NoContent;\r
1312         default:\r
1313             return FDE_CSSOVERFLOW_Visible;\r
1314     }\r
1315 }\r
1316 FDE_CSSWRITINGMODE CFDE_CSSStyleSelector::ToWritingMode(FDE_CSSPROPERTYVALUE eValue)\r
1317 {\r
1318     switch (eValue) {\r
1319         case FDE_CSSPROPERTYVALUE_HorizontalTb:\r
1320             return FDE_CSSWRITINGMODE_HorizontalTb;\r
1321         case FDE_CSSPROPERTYVALUE_VerticalRl:\r
1322             return FDE_CSSWRITINGMODE_VerticalRl;\r
1323         case FDE_CSSPROPERTYVALUE_VerticalLr:\r
1324             return FDE_CSSWRITINGMODE_VerticalLr;\r
1325         default:\r
1326             return FDE_CSSWRITINGMODE_HorizontalTb;\r
1327     }\r
1328 }\r
1329 FDE_CSSWORDBREAK CFDE_CSSStyleSelector::ToWordBreak(FDE_CSSPROPERTYVALUE eValue)\r
1330 {\r
1331     switch (eValue) {\r
1332         case FDE_CSSPROPERTYVALUE_Normal:\r
1333             return FDE_CSSWORDBREAK_Normal;\r
1334         case FDE_CSSPROPERTYVALUE_KeepAll:\r
1335             return FDE_CSSWORDBREAK_KeepAll;\r
1336         case FDE_CSSPROPERTYVALUE_BreakAll:\r
1337             return FDE_CSSWORDBREAK_BreakAll;\r
1338         case FDE_CSSPROPERTYVALUE_KeepWords:\r
1339             return FDE_CSSWORDBREAK_KeepWords;\r
1340         default:\r
1341             return FDE_CSSWORDBREAK_Normal;\r
1342     }\r
1343 }\r
1344 FDE_CSSFLOAT CFDE_CSSStyleSelector::ToFloat(FDE_CSSPROPERTYVALUE eValue)\r
1345 {\r
1346     switch (eValue) {\r
1347         case FDE_CSSPROPERTYVALUE_Left:\r
1348             return FDE_CSSFLOAT_Left;\r
1349         case FDE_CSSPROPERTYVALUE_Right:\r
1350             return FDE_CSSFLOAT_Right;\r
1351         case FDE_CSSPROPERTYVALUE_None:\r
1352             return FDE_CSSFLOAT_None;\r
1353         default:\r
1354             return FDE_CSSFLOAT_None;\r
1355     }\r
1356 }\r
1357 FDE_CSSCLEAR CFDE_CSSStyleSelector::ToClear(FDE_CSSPROPERTYVALUE eValue)\r
1358 {\r
1359     switch (eValue) {\r
1360         case FDE_CSSPROPERTYVALUE_None:\r
1361             return FDE_CSSCLEAR_None;\r
1362         case FDE_CSSPROPERTYVALUE_Left:\r
1363             return FDE_CSSCLEAR_Left;\r
1364         case FDE_CSSPROPERTYVALUE_Right:\r
1365             return FDE_CSSCLEAR_Right;\r
1366         case FDE_CSSPROPERTYVALUE_Both:\r
1367             return FDE_CSSCLEAR_Both;\r
1368         default:\r
1369             return FDE_CSSCLEAR_None;\r
1370     }\r
1371 }\r
1372 FDE_CSSPAGEBREAK CFDE_CSSStyleSelector::ToPageBreak(FDE_CSSPROPERTYVALUE eValue)\r
1373 {\r
1374     switch (eValue) {\r
1375         case FDE_CSSPROPERTYVALUE_Avoid:\r
1376             return FDE_CSSPAGEBREAK_Avoid;\r
1377         case FDE_CSSPROPERTYVALUE_Auto:\r
1378             return FDE_CSSPAGEBREAK_Auto;\r
1379         case FDE_CSSPROPERTYVALUE_Always:\r
1380             return FDE_CSSPAGEBREAK_Always;\r
1381         case FDE_CSSPROPERTYVALUE_Left:\r
1382             return FDE_CSSPAGEBREAK_Left;\r
1383         case FDE_CSSPROPERTYVALUE_Right:\r
1384             return FDE_CSSPAGEBREAK_Right;\r
1385         default:\r
1386             return FDE_CSSPAGEBREAK_Auto;\r
1387     }\r
1388 }\r
1389 FDE_CSSDISPLAY CFDE_CSSStyleSelector::ToDisplay(FDE_CSSPROPERTYVALUE eValue)\r
1390 {\r
1391     switch (eValue) {\r
1392         case FDE_CSSPROPERTYVALUE_Inline:\r
1393             return FDE_CSSDISPLAY_Inline;\r
1394         case FDE_CSSPROPERTYVALUE_Block:\r
1395             return FDE_CSSDISPLAY_Block;\r
1396         case FDE_CSSPROPERTYVALUE_None:\r
1397             return FDE_CSSDISPLAY_None;\r
1398         case FDE_CSSPROPERTYVALUE_ListItem:\r
1399             return FDE_CSSDISPLAY_ListItem;\r
1400         case FDE_CSSPROPERTYVALUE_TableCell:\r
1401             return FDE_CSSDISPLAY_TableCell;\r
1402         case FDE_CSSPROPERTYVALUE_TableRow:\r
1403             return FDE_CSSDISPLAY_TableRow;\r
1404         case FDE_CSSPROPERTYVALUE_Table:\r
1405             return FDE_CSSDISPLAY_Table;\r
1406         case FDE_CSSPROPERTYVALUE_TableCaption:\r
1407             return FDE_CSSDISPLAY_TableCaption;\r
1408         case FDE_CSSPROPERTYVALUE_TableRowGroup:\r
1409             return FDE_CSSDISPLAY_TableRowGroup;\r
1410         case FDE_CSSPROPERTYVALUE_TableHeaderGroup:\r
1411             return FDE_CSSDISPLAY_TableHeaderGroup;\r
1412         case FDE_CSSPROPERTYVALUE_TableFooterGroup:\r
1413             return FDE_CSSDISPLAY_TableFooterGroup;\r
1414         case FDE_CSSPROPERTYVALUE_TableColumnGroup:\r
1415             return FDE_CSSDISPLAY_TableColumnGroup;\r
1416         case FDE_CSSPROPERTYVALUE_TableColumn:\r
1417             return FDE_CSSDISPLAY_TableColumn;\r
1418         case FDE_CSSPROPERTYVALUE_InlineTable:\r
1419             return FDE_CSSDISPLAY_InlineTable;\r
1420         case FDE_CSSPROPERTYVALUE_InlineBlock:\r
1421             return FDE_CSSDISPLAY_InlineBlock;\r
1422         case FDE_CSSPROPERTYVALUE_RunIn:\r
1423             return FDE_CSSDISPLAY_RunIn;\r
1424         case FDE_CSSPROPERTYVALUE_Ruby:\r
1425             return FDE_CSSDISPLAY_Ruby;\r
1426         case FDE_CSSPROPERTYVALUE_RubyBase:\r
1427             return FDE_CSSDISPLAY_RubyBase;\r
1428         case FDE_CSSPROPERTYVALUE_RubyText:\r
1429             return FDE_CSSDISPLAY_RubyText;\r
1430         case FDE_CSSPROPERTYVALUE_RubyBaseGroup:\r
1431             return FDE_CSSDISPLSY_RubyBaseGroup;\r
1432         case FDE_CSSPROPERTYVALUE_RubyTextGroup:\r
1433             return FDE_CSSDISPLAY_RubyTextGroup;\r
1434         default:\r
1435             return FDE_CSSDISPLAY_Inline;\r
1436     }\r
1437 }\r
1438 FDE_CSSTEXTALIGN CFDE_CSSStyleSelector::ToTextAlign(FDE_CSSPROPERTYVALUE eValue)\r
1439 {\r
1440     switch (eValue) {\r
1441         case FDE_CSSPROPERTYVALUE_Left:\r
1442             return FDE_CSSTEXTALIGN_Left;\r
1443         case FDE_CSSPROPERTYVALUE_Center:\r
1444             return FDE_CSSTEXTALIGN_Center;\r
1445         case FDE_CSSPROPERTYVALUE_Right:\r
1446             return FDE_CSSTEXTALIGN_Right;\r
1447         case FDE_CSSPROPERTYVALUE_Justify:\r
1448             return FDE_CSSTEXTALIGN_Justify;\r
1449         default:\r
1450             return FDE_CSSTEXTALIGN_Left;\r
1451     }\r
1452 }\r
1453 FX_WORD CFDE_CSSStyleSelector::ToFontWeight(FDE_CSSPROPERTYVALUE eValue)\r
1454 {\r
1455     switch (eValue) {\r
1456         case FDE_CSSPROPERTYVALUE_Normal:\r
1457             return 400;\r
1458         case FDE_CSSPROPERTYVALUE_Bold:\r
1459             return 700;\r
1460         case FDE_CSSPROPERTYVALUE_Bolder:\r
1461             return 900;\r
1462         case FDE_CSSPROPERTYVALUE_Lighter:\r
1463             return 200;\r
1464         default:\r
1465             return 400;\r
1466     }\r
1467 }\r
1468 FDE_CSSFONTSTYLE CFDE_CSSStyleSelector::ToFontStyle(FDE_CSSPROPERTYVALUE eValue)\r
1469 {\r
1470     switch (eValue) {\r
1471         case FDE_CSSPROPERTYVALUE_Italic:\r
1472         case FDE_CSSPROPERTYVALUE_Oblique:\r
1473             return FDE_CSSFONTSTYLE_Italic;\r
1474         default:\r
1475             return FDE_CSSFONTSTYLE_Normal;\r
1476     }\r
1477 }\r
1478 FDE_CSSBORDERSTYLE CFDE_CSSStyleSelector::ToBorderStyle(FDE_CSSPROPERTYVALUE eValue)\r
1479 {\r
1480     switch (eValue) {\r
1481         case FDE_CSSPROPERTYVALUE_None:\r
1482             return FDE_CSSBORDERSTYLE_None;\r
1483         case FDE_CSSPROPERTYVALUE_Solid:\r
1484             return FDE_CSSBORDERSTYLE_Solid;\r
1485         case FDE_CSSPROPERTYVALUE_Hidden:\r
1486             return FDE_CSSBORDERSTYLE_Hidden;\r
1487         case FDE_CSSPROPERTYVALUE_Dotted:\r
1488             return FDE_CSSBORDERSTYLE_Dotted;\r
1489         case FDE_CSSPROPERTYVALUE_Dashed:\r
1490             return FDE_CSSBORDERSTYLE_Dashed;\r
1491         case FDE_CSSPROPERTYVALUE_Double:\r
1492             return FDE_CSSBORDERSTYLE_Double;\r
1493         case FDE_CSSPROPERTYVALUE_Groove:\r
1494             return FDE_CSSBORDERSTYLE_Groove;\r
1495         case FDE_CSSPROPERTYVALUE_Ridge:\r
1496             return FDE_CSSBORDERSTYLE_Ridge;\r
1497         case FDE_CSSPROPERTYVALUE_Inset:\r
1498             return FDE_CSSBORDERSTYLE_Inset;\r
1499         case FDE_CSSPROPERTYVALUE_Outset:\r
1500             return FDE_CSSBORDERSTYLE_outset;\r
1501         default:\r
1502             return FDE_CSSBORDERSTYLE_None;\r
1503     }\r
1504 }\r
1505 FX_BOOL CFDE_CSSStyleSelector::SetLengthWithPercent(FDE_CSSLENGTH &width, FDE_CSSPRIMITIVETYPE eType, IFDE_CSSPrimitiveValue *pPrimitive, FX_FLOAT fFontSize)\r
1506 {\r
1507     if (eType == FDE_CSSPRIMITIVETYPE_Percent) {\r
1508         width.Set(FDE_CSSLENGTHUNIT_Percent, pPrimitive->GetFloat() / 100.0f);\r
1509         return width.NonZero();\r
1510     } else if (eType >= FDE_CSSPRIMITIVETYPE_Number && eType <= FDE_CSSPRIMITIVETYPE_PC) {\r
1511         FX_FLOAT fValue = ApplyNumber(eType, pPrimitive->GetFloat(), fFontSize);\r
1512         width.Set(FDE_CSSLENGTHUNIT_Point, fValue);\r
1513         return width.NonZero();\r
1514     } else if (eType == FDE_CSSPRIMITIVETYPE_Enum) {\r
1515         switch (pPrimitive->GetEnum()) {\r
1516             case FDE_CSSPROPERTYVALUE_Auto:\r
1517                 width.Set(FDE_CSSLENGTHUNIT_Auto);\r
1518                 return TRUE;\r
1519             case FDE_CSSPROPERTYVALUE_None:\r
1520                 width.Set(FDE_CSSLENGTHUNIT_None);\r
1521                 return TRUE;\r
1522             case FDE_CSSPROPERTYVALUE_Thin:\r
1523                 width.Set(FDE_CSSLENGTHUNIT_Point, 2);\r
1524                 return TRUE;\r
1525             case FDE_CSSPROPERTYVALUE_Medium:\r
1526                 width.Set(FDE_CSSLENGTHUNIT_Point, 3);\r
1527                 return TRUE;\r
1528             case FDE_CSSPROPERTYVALUE_Thick:\r
1529                 width.Set(FDE_CSSLENGTHUNIT_Point, 4);\r
1530                 return TRUE;\r
1531             default:\r
1532                 return FALSE;\r
1533         }\r
1534     }\r
1535     return FALSE;\r
1536 }\r
1537 FX_FLOAT CFDE_CSSStyleSelector::ToFontSize(FDE_CSSPROPERTYVALUE eValue, FX_FLOAT fCurFontSize)\r
1538 {\r
1539     switch (eValue) {\r
1540         case FDE_CSSPROPERTYVALUE_XxSmall:\r
1541             return m_fDefFontSize / 1.2f / 1.2f / 1.2f;\r
1542         case FDE_CSSPROPERTYVALUE_XSmall:\r
1543             return m_fDefFontSize / 1.2f / 1.2f;\r
1544         case FDE_CSSPROPERTYVALUE_Small:\r
1545             return m_fDefFontSize / 1.2f;\r
1546         case FDE_CSSPROPERTYVALUE_Medium:\r
1547             return m_fDefFontSize;\r
1548         case FDE_CSSPROPERTYVALUE_Large:\r
1549             return m_fDefFontSize * 1.2f;\r
1550         case FDE_CSSPROPERTYVALUE_XLarge:\r
1551             return m_fDefFontSize * 1.2f * 1.2f;\r
1552         case FDE_CSSPROPERTYVALUE_XxLarge:\r
1553             return m_fDefFontSize * 1.2f * 1.2f * 1.2f;\r
1554         case FDE_CSSPROPERTYVALUE_Larger:\r
1555             return fCurFontSize * 1.2f;\r
1556         case FDE_CSSPROPERTYVALUE_Smaller:\r
1557             return fCurFontSize / 1.2f;\r
1558         default:\r
1559             return fCurFontSize;\r
1560     }\r
1561 }\r
1562 FDE_CSSVERTICALALIGN CFDE_CSSStyleSelector::ToVerticalAlign(FDE_CSSPROPERTYVALUE eValue)\r
1563 {\r
1564     switch (eValue) {\r
1565         case FDE_CSSPROPERTYVALUE_Baseline:\r
1566             return FDE_CSSVERTICALALIGN_Baseline;\r
1567         case FDE_CSSPROPERTYVALUE_Middle:\r
1568             return FDE_CSSVERTICALALIGN_Middle;\r
1569         case FDE_CSSPROPERTYVALUE_Bottom:\r
1570             return FDE_CSSVERTICALALIGN_Bottom;\r
1571         case FDE_CSSPROPERTYVALUE_Super:\r
1572             return FDE_CSSVERTICALALIGN_Super;\r
1573         case FDE_CSSPROPERTYVALUE_Sub:\r
1574             return FDE_CSSVERTICALALIGN_Sub;\r
1575         case FDE_CSSPROPERTYVALUE_Top:\r
1576             return FDE_CSSVERTICALALIGN_Top;\r
1577         case FDE_CSSPROPERTYVALUE_TextTop:\r
1578             return FDE_CSSVERTICALALIGN_TextTop;\r
1579         case FDE_CSSPROPERTYVALUE_TextBottom:\r
1580             return FDE_CSSVERTICALALIGN_TextBottom;\r
1581         default:\r
1582             return FDE_CSSVERTICALALIGN_Baseline;\r
1583     }\r
1584 }\r
1585 FDE_CSSLISTSTYLETYPE CFDE_CSSStyleSelector::ToListStyleType(FDE_CSSPROPERTYVALUE eValue)\r
1586 {\r
1587     switch (eValue) {\r
1588         case FDE_CSSPROPERTYVALUE_None:\r
1589             return FDE_CSSLISTSTYLETYPE_None;\r
1590         case FDE_CSSPROPERTYVALUE_Disc:\r
1591             return FDE_CSSLISTSTYLETYPE_Disc;\r
1592         case FDE_CSSPROPERTYVALUE_Circle:\r
1593             return FDE_CSSLISTSTYLETYPE_Circle;\r
1594         case FDE_CSSPROPERTYVALUE_Square:\r
1595             return FDE_CSSLISTSTYLETYPE_Square;\r
1596         case FDE_CSSPROPERTYVALUE_Decimal:\r
1597             return FDE_CSSLISTSTYLETYPE_Decimal;\r
1598         case FDE_CSSPROPERTYVALUE_DecimalLeadingZero:\r
1599             return FDE_CSSLISTSTYLETYPE_DecimalLeadingZero;\r
1600         case FDE_CSSPROPERTYVALUE_LowerRoman:\r
1601             return FDE_CSSLISTSTYLETYPE_LowerRoman;\r
1602         case FDE_CSSPROPERTYVALUE_UpperRoman:\r
1603             return FDE_CSSLISTSTYLETYPE_UpperRoman;\r
1604         case FDE_CSSPROPERTYVALUE_LowerGreek:\r
1605             return FDE_CSSLISTSTYLETYPE_LowerGreek;\r
1606         case FDE_CSSPROPERTYVALUE_LowerLatin:\r
1607             return FDE_CSSLISTSTYLETYPE_LowerLatin;\r
1608         case FDE_CSSPROPERTYVALUE_UpperLatin:\r
1609             return FDE_CSSLISTSTYLETYPE_UpperLatin;\r
1610         case FDE_CSSPROPERTYVALUE_Armenian:\r
1611             return FDE_CSSLISTSTYLETYPE_Armenian;\r
1612         case FDE_CSSPROPERTYVALUE_Georgian:\r
1613             return FDE_CSSLISTSTYLETYPE_Georgian;\r
1614         case FDE_CSSPROPERTYVALUE_LowerAlpha:\r
1615             return FDE_CSSLISTSTYLETYPE_LowerAlpha;\r
1616         case FDE_CSSPROPERTYVALUE_UpperAlpha:\r
1617             return FDE_CSSLISTSTYLETYPE_UpperAlpha;\r
1618         case FDE_CSSPROPERTYVALUE_CjkIdeographic:\r
1619             return FDE_CSSLISTSTYLETYPE_CjkIdeographic;\r
1620         case FDE_CSSPROPERTYVALUE_Hebrew:\r
1621             return FDE_CSSLISTSTYLETYPE_Hebrew;\r
1622         case FDE_CSSLISTSTYLETYPE_Hiragana:\r
1623             return FDE_CSSLISTSTYLETYPE_Hiragana;\r
1624         case FDE_CSSLISTSTYLETYPE_HiraganaIroha:\r
1625             return FDE_CSSLISTSTYLETYPE_HiraganaIroha;\r
1626         case FDE_CSSLISTSTYLETYPE_Katakana:\r
1627             return FDE_CSSLISTSTYLETYPE_Katakana;\r
1628         case FDE_CSSLISTSTYLETYPE_KatakanaIroha:\r
1629             return FDE_CSSLISTSTYLETYPE_KatakanaIroha;\r
1630         default:\r
1631             return FDE_CSSLISTSTYLETYPE_Disc;\r
1632     }\r
1633 }\r
1634 FDE_CSSLISTSTYLEPOSITION CFDE_CSSStyleSelector::ToListStylePosition(FDE_CSSPROPERTYVALUE eValue)\r
1635 {\r
1636     return eValue == FDE_CSSPROPERTYVALUE_Inside ? FDE_CSSLISTSTYLEPOSITION_Inside : FDE_CSSLISTSTYLEPOSITION_Outside;\r
1637 }\r
1638 FDE_CSSVISIBILITY CFDE_CSSStyleSelector::ToVisibility(FDE_CSSPROPERTYVALUE eValue)\r
1639 {\r
1640     switch (eValue) {\r
1641         case FDE_CSSPROPERTYVALUE_Visible:\r
1642             return FDE_CSSVISIBILITY_Visible;\r
1643         case FDE_CSSPROPERTYVALUE_Hidden:\r
1644             return FDE_CSSVISIBILITY_Hidden;\r
1645         case FDE_CSSPROPERTYVALUE_Collapse:\r
1646             return FDE_CSSVISIBILITY_Collapse;\r
1647         default:\r
1648             return FDE_CSSVISIBILITY_Visible;\r
1649     }\r
1650 }\r
1651 FDE_CSSWHITESPACE CFDE_CSSStyleSelector::ToWhiteSpace(FDE_CSSPROPERTYVALUE eValue)\r
1652 {\r
1653     switch (eValue) {\r
1654         case FDE_CSSPROPERTYVALUE_Normal:\r
1655             return FDE_CSSWHITESPACE_Normal;\r
1656         case FDE_CSSPROPERTYVALUE_Pre:\r
1657             return FDE_CSSWHITESPACE_Pre;\r
1658         case FDE_CSSPROPERTYVALUE_Nowrap:\r
1659             return FDE_CSSWHITESPACE_Nowrap;\r
1660         case FDE_CSSPROPERTYVALUE_PreWrap:\r
1661             return FDE_CSSWHITESPACE_PreWrap;\r
1662         case FDE_CSSPROPERTYVALUE_PreLine:\r
1663             return FDE_CSSWHITESPACE_PreLine;\r
1664         default:\r
1665             return FDE_CSSWHITESPACE_Normal;\r
1666     }\r
1667 }\r
1668 FX_DWORD CFDE_CSSStyleSelector::ToTextDecoration(IFDE_CSSValueList *pValue)\r
1669 {\r
1670     FX_DWORD dwDecoration = 0;\r
1671     for (FX_INT32 i = pValue->CountValues() - 1; i >= 0; --i) {\r
1672         IFDE_CSSPrimitiveValue *pPrimitive = (IFDE_CSSPrimitiveValue*)pValue->GetValue(i);\r
1673         if (pPrimitive->GetPrimitiveType() == FDE_CSSPRIMITIVETYPE_Enum) {\r
1674             switch (pPrimitive->GetEnum()) {\r
1675                 case FDE_CSSPROPERTYVALUE_Underline:\r
1676                     dwDecoration |= FDE_CSSTEXTDECORATION_Underline;\r
1677                     break;\r
1678                 case FDE_CSSPROPERTYVALUE_LineThrough:\r
1679                     dwDecoration |= FDE_CSSTEXTDECORATION_LineThrough;\r
1680                     break;\r
1681                 case FDE_CSSPROPERTYVALUE_Overline:\r
1682                     dwDecoration |= FDE_CSSTEXTDECORATION_Overline;\r
1683                     break;\r
1684                 case FDE_CSSPROPERTYVALUE_Blink:\r
1685                     dwDecoration |= FDE_CSSTEXTDECORATION_Blink;\r
1686                     break;\r
1687                 case FDE_CSSPROPERTYVALUE_Double:\r
1688                     dwDecoration |= FDE_CSSTEXTDECORATION_Double;\r
1689                     break;\r
1690                 default:\r
1691                     break;\r
1692             }\r
1693         }\r
1694     }\r
1695     return dwDecoration;\r
1696 }\r
1697 FDE_CSSTEXTTRANSFORM CFDE_CSSStyleSelector::ToTextTransform(FDE_CSSPROPERTYVALUE eValue)\r
1698 {\r
1699     switch (eValue) {\r
1700         case FDE_CSSPROPERTYVALUE_None:\r
1701             return FDE_CSSTEXTTRANSFORM_None;\r
1702         case FDE_CSSPROPERTYVALUE_Capitalize:\r
1703             return FDE_CSSTEXTTRANSFORM_Capitalize;\r
1704         case FDE_CSSPROPERTYVALUE_Uppercase:\r
1705             return FDE_CSSTEXTTRANSFORM_UpperCase;\r
1706         case FDE_CSSPROPERTYVALUE_Lowercase:\r
1707             return FDE_CSSTEXTTRANSFORM_LowerCase;\r
1708         default:\r
1709             return FDE_CSSTEXTTRANSFORM_None;\r
1710     }\r
1711 }\r
1712 FDE_CSSFONTVARIANT CFDE_CSSStyleSelector::ToFontVariant(FDE_CSSPROPERTYVALUE eValue)\r
1713 {\r
1714     return eValue == FDE_CSSPROPERTYVALUE_SmallCaps ? FDE_CSSFONTVARIANT_SmallCaps : FDE_CSSFONTVARIANT_Normal;\r
1715 }\r