| 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 |