OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fde/css/fde_cssstyleselector.h" | 7 #include "xfa/fde/css/fde_cssstyleselector.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 if (m_InheritedData.m_eTextEmphasisMark != FDE_CSSTEXTEMPHASISMARK_Auto) { | 78 if (m_InheritedData.m_eTextEmphasisMark != FDE_CSSTEXTEMPHASISMARK_Auto) { |
79 return (FDE_CSSTEXTEMPHASISMARK)m_InheritedData.m_eTextEmphasisMark; | 79 return (FDE_CSSTEXTEMPHASISMARK)m_InheritedData.m_eTextEmphasisMark; |
80 } | 80 } |
81 if (m_InheritedData.m_eWritingMode == FDE_CSSWRITINGMODE_HorizontalTb) { | 81 if (m_InheritedData.m_eWritingMode == FDE_CSSWRITINGMODE_HorizontalTb) { |
82 return FDE_CSSTEXTEMPHASISMARK_Dot; | 82 return FDE_CSSTEXTEMPHASISMARK_Dot; |
83 } | 83 } |
84 return FDE_CSSTEXTEMPHASISMARK_Sesame; | 84 return FDE_CSSTEXTEMPHASISMARK_Sesame; |
85 } | 85 } |
86 FDE_CSSRuleData::FDE_CSSRuleData(IFDE_CSSSelector* pSel, | 86 FDE_CSSRuleData::FDE_CSSRuleData(IFDE_CSSSelector* pSel, |
87 IFDE_CSSDeclaration* pDecl, | 87 IFDE_CSSDeclaration* pDecl, |
88 FX_DWORD dwPos) | 88 uint32_t dwPos) |
89 : pSelector(pSel), pDeclaration(pDecl), dwPriority(dwPos), pNext(NULL) { | 89 : pSelector(pSel), pDeclaration(pDecl), dwPriority(dwPos), pNext(NULL) { |
90 static const FX_DWORD s_Specific[5] = {0x00010000, 0x00010000, 0x00100000, | 90 static const uint32_t s_Specific[5] = {0x00010000, 0x00010000, 0x00100000, |
91 0x00100000, 0x01000000}; | 91 0x00100000, 0x01000000}; |
92 for (; pSel != NULL; pSel = pSel->GetNextSelector()) { | 92 for (; pSel != NULL; pSel = pSel->GetNextSelector()) { |
93 FDE_CSSSELECTORTYPE eType = pSel->GetType(); | 93 FDE_CSSSELECTORTYPE eType = pSel->GetType(); |
94 if (eType > FDE_CSSSELECTORTYPE_Descendant || | 94 if (eType > FDE_CSSSELECTORTYPE_Descendant || |
95 pSel->GetNameHash() != FDE_CSSUNIVERSALHASH) { | 95 pSel->GetNameHash() != FDE_CSSUNIVERSALHASH) { |
96 dwPriority += s_Specific[eType]; | 96 dwPriority += s_Specific[eType]; |
97 } | 97 } |
98 } | 98 } |
99 } | 99 } |
100 void CFDE_CSSRuleCollection::Clear() { | 100 void CFDE_CSSRuleCollection::Clear() { |
101 m_IDRules.RemoveAll(); | 101 m_IDRules.RemoveAll(); |
102 m_TagRules.RemoveAll(); | 102 m_TagRules.RemoveAll(); |
103 m_ClassRules.RemoveAll(); | 103 m_ClassRules.RemoveAll(); |
104 m_pUniversalRules = NULL; | 104 m_pUniversalRules = NULL; |
105 m_pStaticStore = NULL; | 105 m_pStaticStore = NULL; |
106 m_iSelectors = 0; | 106 m_iSelectors = 0; |
107 } | 107 } |
108 void CFDE_CSSRuleCollection::AddRulesFrom(const CFDE_CSSStyleSheetArray& sheets, | 108 void CFDE_CSSRuleCollection::AddRulesFrom(const CFDE_CSSStyleSheetArray& sheets, |
109 FX_DWORD dwMediaList, | 109 uint32_t dwMediaList, |
110 IFX_FontMgr* pFontMgr) { | 110 IFX_FontMgr* pFontMgr) { |
111 int32_t iSheets = sheets.GetSize(); | 111 int32_t iSheets = sheets.GetSize(); |
112 for (int32_t i = 0; i < iSheets; ++i) { | 112 for (int32_t i = 0; i < iSheets; ++i) { |
113 IFDE_CSSStyleSheet* pSheet = sheets.GetAt(i); | 113 IFDE_CSSStyleSheet* pSheet = sheets.GetAt(i); |
114 if (FX_DWORD dwMatchMedia = pSheet->GetMediaList() & dwMediaList) { | 114 if (uint32_t dwMatchMedia = pSheet->GetMediaList() & dwMediaList) { |
115 int32_t iRules = pSheet->CountRules(); | 115 int32_t iRules = pSheet->CountRules(); |
116 for (int32_t j = 0; j < iRules; j++) { | 116 for (int32_t j = 0; j < iRules; j++) { |
117 AddRulesFrom(pSheet, pSheet->GetRule(j), dwMatchMedia, pFontMgr); | 117 AddRulesFrom(pSheet, pSheet->GetRule(j), dwMatchMedia, pFontMgr); |
118 } | 118 } |
119 } | 119 } |
120 } | 120 } |
121 } | 121 } |
122 void CFDE_CSSRuleCollection::AddRulesFrom(IFDE_CSSStyleSheet* pStyleSheet, | 122 void CFDE_CSSRuleCollection::AddRulesFrom(IFDE_CSSStyleSheet* pStyleSheet, |
123 IFDE_CSSRule* pRule, | 123 IFDE_CSSRule* pRule, |
124 FX_DWORD dwMediaList, | 124 uint32_t dwMediaList, |
125 IFX_FontMgr* pFontMgr) { | 125 IFX_FontMgr* pFontMgr) { |
126 switch (pRule->GetType()) { | 126 switch (pRule->GetType()) { |
127 case FDE_CSSRULETYPE_Style: { | 127 case FDE_CSSRULETYPE_Style: { |
128 IFDE_CSSStyleRule* pStyleRule = (IFDE_CSSStyleRule*)pRule; | 128 IFDE_CSSStyleRule* pStyleRule = (IFDE_CSSStyleRule*)pRule; |
129 IFDE_CSSDeclaration* pDeclaration = pStyleRule->GetDeclaration(); | 129 IFDE_CSSDeclaration* pDeclaration = pStyleRule->GetDeclaration(); |
130 int32_t iSelectors = pStyleRule->CountSelectorLists(); | 130 int32_t iSelectors = pStyleRule->CountSelectorLists(); |
131 for (int32_t i = 0; i < iSelectors; ++i) { | 131 for (int32_t i = 0; i < iSelectors; ++i) { |
132 IFDE_CSSSelector* pSelector = pStyleRule->GetSelectorList(i); | 132 IFDE_CSSSelector* pSelector = pStyleRule->GetSelectorList(i); |
133 if (pSelector->GetType() == FDE_CSSSELECTORTYPE_Persudo) { | 133 if (pSelector->GetType() == FDE_CSSSELECTORTYPE_Persudo) { |
134 FDE_CSSRuleData* pData = NewRuleData(pSelector, pDeclaration); | 134 FDE_CSSRuleData* pData = NewRuleData(pSelector, pDeclaration); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 AddRulesFrom(pStyleSheet, pMediaRule->GetRule(i), dwMediaList, | 172 AddRulesFrom(pStyleSheet, pMediaRule->GetRule(i), dwMediaList, |
173 pFontMgr); | 173 pFontMgr); |
174 } | 174 } |
175 } | 175 } |
176 } break; | 176 } break; |
177 default: | 177 default: |
178 break; | 178 break; |
179 } | 179 } |
180 } | 180 } |
181 void CFDE_CSSRuleCollection::AddRuleTo(CFX_MapPtrToPtr& map, | 181 void CFDE_CSSRuleCollection::AddRuleTo(CFX_MapPtrToPtr& map, |
182 FX_DWORD dwKey, | 182 uint32_t dwKey, |
183 IFDE_CSSSelector* pSel, | 183 IFDE_CSSSelector* pSel, |
184 IFDE_CSSDeclaration* pDecl) { | 184 IFDE_CSSDeclaration* pDecl) { |
185 void* pKey = (void*)(uintptr_t)dwKey; | 185 void* pKey = (void*)(uintptr_t)dwKey; |
186 FDE_CSSRuleData* pData = NewRuleData(pSel, pDecl); | 186 FDE_CSSRuleData* pData = NewRuleData(pSel, pDecl); |
187 FDE_CSSRuleData* pList = NULL; | 187 FDE_CSSRuleData* pList = NULL; |
188 if (!map.Lookup(pKey, (void*&)pList)) { | 188 if (!map.Lookup(pKey, (void*&)pList)) { |
189 map.SetAt(pKey, pData); | 189 map.SetAt(pKey, pData); |
190 } else if (AddRuleTo(pList, pData)) { | 190 } else if (AddRuleTo(pList, pData)) { |
191 map.SetAt(pKey, pList); | 191 map.SetAt(pKey, pList); |
192 } | 192 } |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 } else { | 291 } else { |
292 dest.Copy(*pArray); | 292 dest.Copy(*pArray); |
293 } | 293 } |
294 return TRUE; | 294 return TRUE; |
295 } | 295 } |
296 void CFDE_CSSStyleSelector::SetStylePriority( | 296 void CFDE_CSSStyleSelector::SetStylePriority( |
297 FDE_CSSSTYLESHEETGROUP eType, | 297 FDE_CSSSTYLESHEETGROUP eType, |
298 FDE_CSSSTYLESHEETPRIORITY ePriority) { | 298 FDE_CSSSTYLESHEETPRIORITY ePriority) { |
299 m_ePriorities[ePriority] = eType; | 299 m_ePriorities[ePriority] = eType; |
300 } | 300 } |
301 void CFDE_CSSStyleSelector::UpdateStyleIndex(FX_DWORD dwMediaList) { | 301 void CFDE_CSSStyleSelector::UpdateStyleIndex(uint32_t dwMediaList) { |
302 Reset(); | 302 Reset(); |
303 m_pRuleDataStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0); | 303 m_pRuleDataStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 1024, 0); |
304 FXSYS_assert(m_pRuleDataStore != NULL); | 304 FXSYS_assert(m_pRuleDataStore != NULL); |
305 for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) { | 305 for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) { |
306 CFDE_CSSRuleCollection& rules = m_RuleCollection[iGroup]; | 306 CFDE_CSSRuleCollection& rules = m_RuleCollection[iGroup]; |
307 rules.m_pStaticStore = m_pRuleDataStore; | 307 rules.m_pStaticStore = m_pRuleDataStore; |
308 rules.AddRulesFrom(m_SheetGroups[iGroup], dwMediaList, m_pFontMgr); | 308 rules.AddRulesFrom(m_SheetGroups[iGroup], dwMediaList, m_pFontMgr); |
309 } | 309 } |
310 } | 310 } |
311 void CFDE_CSSStyleSelector::Reset() { | 311 void CFDE_CSSStyleSelector::Reset() { |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 while (pList) { | 365 while (pList) { |
366 if (MatchSelector(pCache, pList->pSelector, ePersudoType)) | 366 if (MatchSelector(pCache, pList->pSelector, ePersudoType)) |
367 m_MatchedRules.push_back(pList); | 367 m_MatchedRules.push_back(pList); |
368 pList = pList->pNext; | 368 pList = pList->pNext; |
369 } | 369 } |
370 } | 370 } |
371 | 371 |
372 FX_BOOL CFDE_CSSStyleSelector::MatchSelector(FDE_CSSTagCache* pCache, | 372 FX_BOOL CFDE_CSSStyleSelector::MatchSelector(FDE_CSSTagCache* pCache, |
373 IFDE_CSSSelector* pSel, | 373 IFDE_CSSSelector* pSel, |
374 FDE_CSSPERSUDO ePersudoType) { | 374 FDE_CSSPERSUDO ePersudoType) { |
375 FX_DWORD dwHash; | 375 uint32_t dwHash; |
376 while (pSel != NULL && pCache != NULL) { | 376 while (pSel != NULL && pCache != NULL) { |
377 switch (pSel->GetType()) { | 377 switch (pSel->GetType()) { |
378 case FDE_CSSSELECTORTYPE_Descendant: | 378 case FDE_CSSSELECTORTYPE_Descendant: |
379 dwHash = pSel->GetNameHash(); | 379 dwHash = pSel->GetNameHash(); |
380 while ((pCache = pCache->GetParent()) != NULL) { | 380 while ((pCache = pCache->GetParent()) != NULL) { |
381 if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) { | 381 if (dwHash != FDE_CSSUNIVERSALHASH && dwHash != pCache->HashTag()) { |
382 continue; | 382 continue; |
383 } | 383 } |
384 if (MatchSelector(pCache, pSel->GetNextSelector(), ePersudoType)) { | 384 if (MatchSelector(pCache, pSel->GetNextSelector(), ePersudoType)) { |
385 return TRUE; | 385 return TRUE; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 IFDE_CSSComputedStyle* pDestStyle) { | 426 IFDE_CSSComputedStyle* pDestStyle) { |
427 FXSYS_assert(iDeclCount >= 0); | 427 FXSYS_assert(iDeclCount >= 0); |
428 FXSYS_assert(pDestStyle); | 428 FXSYS_assert(pDestStyle); |
429 FX_POSITION pos = pTag->GetFirstAttribute(); | 429 FX_POSITION pos = pTag->GetFirstAttribute(); |
430 if (pos != NULL) { | 430 if (pos != NULL) { |
431 if (m_pInlineStyleStore == NULL) { | 431 if (m_pInlineStyleStore == NULL) { |
432 m_pInlineStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 2048, 0); | 432 m_pInlineStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 2048, 0); |
433 } | 433 } |
434 CFDE_CSSDeclaration* pDecl = NULL; | 434 CFDE_CSSDeclaration* pDecl = NULL; |
435 CFX_WideStringC wsAttri, wsValue; | 435 CFX_WideStringC wsAttri, wsValue; |
436 FX_DWORD dwAttriHash; | 436 uint32_t dwAttriHash; |
437 do { | 437 do { |
438 pTag->GetNextAttribute(pos, wsAttri, wsValue); | 438 pTag->GetNextAttribute(pos, wsAttri, wsValue); |
439 dwAttriHash = | 439 dwAttriHash = |
440 FX_HashCode_String_GetW(wsAttri.GetPtr(), wsAttri.GetLength(), TRUE); | 440 FX_HashCode_String_GetW(wsAttri.GetPtr(), wsAttri.GetLength(), TRUE); |
441 static const FX_DWORD s_dwStyleHash = | 441 static const uint32_t s_dwStyleHash = |
442 FX_HashCode_String_GetW(L"style", 5, TRUE); | 442 FX_HashCode_String_GetW(L"style", 5, TRUE); |
443 static const FX_DWORD s_dwAlignHash = | 443 static const uint32_t s_dwAlignHash = |
444 FX_HashCode_String_GetW(L"align", 5, TRUE); | 444 FX_HashCode_String_GetW(L"align", 5, TRUE); |
445 if (dwAttriHash == s_dwStyleHash) { | 445 if (dwAttriHash == s_dwStyleHash) { |
446 if (pDecl == NULL) { | 446 if (pDecl == NULL) { |
447 pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration; | 447 pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration; |
448 } | 448 } |
449 AppendInlineStyle(pDecl, wsValue.GetPtr(), wsValue.GetLength()); | 449 AppendInlineStyle(pDecl, wsValue.GetPtr(), wsValue.GetLength()); |
450 } else if (dwAttriHash == s_dwAlignHash) { | 450 } else if (dwAttriHash == s_dwAlignHash) { |
451 if (pDecl == NULL) { | 451 if (pDecl == NULL) { |
452 pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration; | 452 pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration; |
453 } | 453 } |
(...skipping 1282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1736 case FDE_CSSPROPERTYVALUE_Nowrap: | 1736 case FDE_CSSPROPERTYVALUE_Nowrap: |
1737 return FDE_CSSWHITESPACE_Nowrap; | 1737 return FDE_CSSWHITESPACE_Nowrap; |
1738 case FDE_CSSPROPERTYVALUE_PreWrap: | 1738 case FDE_CSSPROPERTYVALUE_PreWrap: |
1739 return FDE_CSSWHITESPACE_PreWrap; | 1739 return FDE_CSSWHITESPACE_PreWrap; |
1740 case FDE_CSSPROPERTYVALUE_PreLine: | 1740 case FDE_CSSPROPERTYVALUE_PreLine: |
1741 return FDE_CSSWHITESPACE_PreLine; | 1741 return FDE_CSSWHITESPACE_PreLine; |
1742 default: | 1742 default: |
1743 return FDE_CSSWHITESPACE_Normal; | 1743 return FDE_CSSWHITESPACE_Normal; |
1744 } | 1744 } |
1745 } | 1745 } |
1746 FX_DWORD CFDE_CSSStyleSelector::ToTextDecoration(IFDE_CSSValueList* pValue) { | 1746 uint32_t CFDE_CSSStyleSelector::ToTextDecoration(IFDE_CSSValueList* pValue) { |
1747 FX_DWORD dwDecoration = 0; | 1747 uint32_t dwDecoration = 0; |
1748 for (int32_t i = pValue->CountValues() - 1; i >= 0; --i) { | 1748 for (int32_t i = pValue->CountValues() - 1; i >= 0; --i) { |
1749 IFDE_CSSPrimitiveValue* pPrimitive = | 1749 IFDE_CSSPrimitiveValue* pPrimitive = |
1750 (IFDE_CSSPrimitiveValue*)pValue->GetValue(i); | 1750 (IFDE_CSSPrimitiveValue*)pValue->GetValue(i); |
1751 if (pPrimitive->GetPrimitiveType() == FDE_CSSPRIMITIVETYPE_Enum) { | 1751 if (pPrimitive->GetPrimitiveType() == FDE_CSSPRIMITIVETYPE_Enum) { |
1752 switch (pPrimitive->GetEnum()) { | 1752 switch (pPrimitive->GetEnum()) { |
1753 case FDE_CSSPROPERTYVALUE_Underline: | 1753 case FDE_CSSPROPERTYVALUE_Underline: |
1754 dwDecoration |= FDE_CSSTEXTDECORATION_Underline; | 1754 dwDecoration |= FDE_CSSTEXTDECORATION_Underline; |
1755 break; | 1755 break; |
1756 case FDE_CSSPROPERTYVALUE_LineThrough: | 1756 case FDE_CSSPROPERTYVALUE_LineThrough: |
1757 dwDecoration |= FDE_CSSTEXTDECORATION_LineThrough; | 1757 dwDecoration |= FDE_CSSTEXTDECORATION_LineThrough; |
(...skipping 27 matching lines...) Expand all Loading... |
1785 return FDE_CSSTEXTTRANSFORM_LowerCase; | 1785 return FDE_CSSTEXTTRANSFORM_LowerCase; |
1786 default: | 1786 default: |
1787 return FDE_CSSTEXTTRANSFORM_None; | 1787 return FDE_CSSTEXTTRANSFORM_None; |
1788 } | 1788 } |
1789 } | 1789 } |
1790 FDE_CSSFONTVARIANT CFDE_CSSStyleSelector::ToFontVariant( | 1790 FDE_CSSFONTVARIANT CFDE_CSSStyleSelector::ToFontVariant( |
1791 FDE_CSSPROPERTYVALUE eValue) { | 1791 FDE_CSSPROPERTYVALUE eValue) { |
1792 return eValue == FDE_CSSPROPERTYVALUE_SmallCaps ? FDE_CSSFONTVARIANT_SmallCaps | 1792 return eValue == FDE_CSSPROPERTYVALUE_SmallCaps ? FDE_CSSFONTVARIANT_SmallCaps |
1793 : FDE_CSSFONTVARIANT_Normal; | 1793 : FDE_CSSFONTVARIANT_Normal; |
1794 } | 1794 } |
OLD | NEW |