| 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  | 
|    11 #include "xfa/fde/css/fde_csscache.h" |    11 #include "xfa/fde/css/fde_csscache.h" | 
|    12 #include "xfa/fde/css/fde_cssdeclaration.h" |    12 #include "xfa/fde/css/fde_cssdeclaration.h" | 
 |    13 #include "xfa/fxfa/app/xfa_textlayout.h" | 
|    13  |    14  | 
|    14 #define FDE_CSSUNIVERSALHASH ('*') |    15 #define FDE_CSSUNIVERSALHASH ('*') | 
|    15  |    16  | 
|    16 int32_t CFDE_CSSCounterStyle::FindIndex(const FX_WCHAR* pszIdentifier) { |    17 int32_t CFDE_CSSCounterStyle::FindIndex(const FX_WCHAR* pszIdentifier) { | 
|    17   int32_t iCount = m_arrCounterData.GetSize(); |    18   int32_t iCount = m_arrCounterData.GetSize(); | 
|    18   for (int32_t i = 0; i < iCount; i++) { |    19   for (int32_t i = 0; i < iCount; i++) { | 
|    19     if (FXSYS_wcscmp(pszIdentifier, m_arrCounterData.ElementAt(i).m_pszIdent) == |    20     if (FXSYS_wcscmp(pszIdentifier, m_arrCounterData.ElementAt(i).m_pszIdent) == | 
|    20         0) { |    21         0) { | 
|    21       return i; |    22       return i; | 
|    22     } |    23     } | 
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   305 void CFDE_CSSStyleSelector::Reset() { |   306 void CFDE_CSSStyleSelector::Reset() { | 
|   306   for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) { |   307   for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) { | 
|   307     m_RuleCollection[iGroup].Clear(); |   308     m_RuleCollection[iGroup].Clear(); | 
|   308   } |   309   } | 
|   309   if (m_pRuleDataStore != NULL) { |   310   if (m_pRuleDataStore != NULL) { | 
|   310     m_pRuleDataStore->Release(); |   311     m_pRuleDataStore->Release(); | 
|   311     m_pRuleDataStore = NULL; |   312     m_pRuleDataStore = NULL; | 
|   312   } |   313   } | 
|   313 } |   314 } | 
|   314 int32_t CFDE_CSSStyleSelector::MatchDeclarations( |   315 int32_t CFDE_CSSStyleSelector::MatchDeclarations( | 
|   315     IFDE_CSSTagProvider* pTag, |   316     CXFA_CSSTagProvider* pTag, | 
|   316     CFDE_CSSDeclarationArray& matchedDecls, |   317     CFDE_CSSDeclarationArray& matchedDecls, | 
|   317     FDE_CSSPERSUDO ePersudoType) { |   318     FDE_CSSPERSUDO ePersudoType) { | 
|   318   FXSYS_assert(m_pAccelerator != NULL && pTag != NULL); |   319   FXSYS_assert(m_pAccelerator && pTag); | 
 |   320  | 
|   319   FDE_CSSTagCache* pCache = m_pAccelerator->GetTopElement(); |   321   FDE_CSSTagCache* pCache = m_pAccelerator->GetTopElement(); | 
|   320   FXSYS_assert(pCache != NULL && pCache->GetTag() == pTag); |   322   FXSYS_assert(pCache && pCache->GetTag() == pTag); | 
 |   323  | 
|   321   matchedDecls.RemoveAt(0, matchedDecls.GetSize()); |   324   matchedDecls.RemoveAt(0, matchedDecls.GetSize()); | 
|   322   for (int32_t ePriority = FDE_CSSSTYLESHEETPRIORITY_MAX - 1; ePriority >= 0; |   325   for (int32_t ePriority = FDE_CSSSTYLESHEETPRIORITY_MAX - 1; ePriority >= 0; | 
|   323        --ePriority) { |   326        --ePriority) { | 
|   324     FDE_CSSSTYLESHEETGROUP eGroup = m_ePriorities[ePriority]; |   327     FDE_CSSSTYLESHEETGROUP eGroup = m_ePriorities[ePriority]; | 
|   325     CFDE_CSSRuleCollection& rules = m_RuleCollection[eGroup]; |   328     CFDE_CSSRuleCollection& rules = m_RuleCollection[eGroup]; | 
|   326     if (rules.CountSelectors() == 0) { |   329     if (rules.CountSelectors() == 0) | 
|   327       continue; |   330       continue; | 
|   328     } |   331  | 
|   329     if (ePersudoType == FDE_CSSPERSUDO_NONE) { |   332     if (ePersudoType == FDE_CSSPERSUDO_NONE) { | 
|   330       MatchRules(pCache, rules.GetUniversalRuleData(), ePersudoType); |   333       MatchRules(pCache, rules.GetUniversalRuleData(), ePersudoType); | 
|   331       if (pCache->HashTag()) { |   334       if (pCache->HashTag()) { | 
|   332         MatchRules(pCache, rules.GetTagRuleData(pCache->HashTag()), |   335         MatchRules(pCache, rules.GetTagRuleData(pCache->HashTag()), | 
|   333                    ePersudoType); |   336                    ePersudoType); | 
|   334       } |   337       } | 
|   335       int32_t iCount = pCache->CountHashClass(); |   338       int32_t iCount = pCache->CountHashClass(); | 
|   336       for (int32_t i = 0; i < iCount; i++) { |   339       for (int32_t i = 0; i < iCount; i++) { | 
|   337         pCache->SetClassIndex(i); |   340         pCache->SetClassIndex(i); | 
|   338         MatchRules(pCache, rules.GetClassRuleData(pCache->HashClass()), |   341         MatchRules(pCache, rules.GetClassRuleData(pCache->HashClass()), | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   407       default: |   410       default: | 
|   408         FXSYS_assert(FALSE); |   411         FXSYS_assert(FALSE); | 
|   409         break; |   412         break; | 
|   410     } |   413     } | 
|   411     pSel = pSel->GetNextSelector(); |   414     pSel = pSel->GetNextSelector(); | 
|   412   } |   415   } | 
|   413   return pSel == NULL && pCache != NULL; |   416   return pSel == NULL && pCache != NULL; | 
|   414 } |   417 } | 
|   415  |   418  | 
|   416 void CFDE_CSSStyleSelector::ComputeStyle( |   419 void CFDE_CSSStyleSelector::ComputeStyle( | 
|   417     IFDE_CSSTagProvider* pTag, |   420     CXFA_CSSTagProvider* pTag, | 
|   418     const IFDE_CSSDeclaration** ppDeclArray, |   421     const IFDE_CSSDeclaration** ppDeclArray, | 
|   419     int32_t iDeclCount, |   422     int32_t iDeclCount, | 
|   420     IFDE_CSSComputedStyle* pDestStyle) { |   423     IFDE_CSSComputedStyle* pDestStyle) { | 
|   421   FXSYS_assert(iDeclCount >= 0); |   424   FXSYS_assert(iDeclCount >= 0); | 
|   422   FXSYS_assert(pDestStyle); |   425   FXSYS_assert(pDestStyle); | 
|   423   FX_POSITION pos = pTag->GetFirstAttribute(); |   426  | 
|   424   if (pos != NULL) { |   427   static const uint32_t s_dwStyleHash = | 
|   425     if (m_pInlineStyleStore == NULL) { |   428       FX_HashCode_String_GetW(L"style", 5, TRUE); | 
 |   429   static const uint32_t s_dwAlignHash = | 
 |   430       FX_HashCode_String_GetW(L"align", 5, TRUE); | 
 |   431  | 
 |   432   if (!pTag->empty()) { | 
 |   433     if (!m_pInlineStyleStore) | 
|   426       m_pInlineStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 2048, 0); |   434       m_pInlineStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 2048, 0); | 
|   427     } |   435  | 
|   428     CFDE_CSSDeclaration* pDecl = NULL; |   436     CFDE_CSSDeclaration* pDecl = nullptr; | 
|   429     CFX_WideStringC wsAttri, wsValue; |   437     for (auto it : *pTag) { | 
|   430     uint32_t dwAttriHash; |   438       CFX_WideString wsAttri = it.first; | 
|   431     do { |   439       CFX_WideString wsValue = it.second; | 
|   432       pTag->GetNextAttribute(pos, wsAttri, wsValue); |   440  | 
|   433       dwAttriHash = |   441       uint32_t dwAttriHash = | 
|   434           FX_HashCode_String_GetW(wsAttri.c_str(), wsAttri.GetLength(), TRUE); |   442           FX_HashCode_String_GetW(wsAttri.c_str(), wsAttri.GetLength(), TRUE); | 
|   435       static const uint32_t s_dwStyleHash = |  | 
|   436           FX_HashCode_String_GetW(L"style", 5, TRUE); |  | 
|   437       static const uint32_t s_dwAlignHash = |  | 
|   438           FX_HashCode_String_GetW(L"align", 5, TRUE); |  | 
|   439       if (dwAttriHash == s_dwStyleHash) { |   443       if (dwAttriHash == s_dwStyleHash) { | 
|   440         if (pDecl == NULL) { |   444         if (!pDecl) | 
|   441           pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration; |   445           pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration; | 
|   442         } |   446  | 
|   443         AppendInlineStyle(pDecl, wsValue.c_str(), wsValue.GetLength()); |   447         AppendInlineStyle(pDecl, wsValue.c_str(), wsValue.GetLength()); | 
|   444       } else if (dwAttriHash == s_dwAlignHash) { |   448       } else if (dwAttriHash == s_dwAlignHash) { | 
|   445         if (pDecl == NULL) { |   449         if (!pDecl) | 
|   446           pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration; |   450           pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration; | 
|   447         } |   451  | 
|   448         FDE_CSSPROPERTYARGS args; |   452         FDE_CSSPROPERTYARGS args; | 
|   449         args.pStringCache = NULL; |   453         args.pStringCache = nullptr; | 
|   450         args.pStaticStore = m_pInlineStyleStore; |   454         args.pStaticStore = m_pInlineStyleStore; | 
|   451         args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY_TextAlign); |   455         args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY_TextAlign); | 
|   452         pDecl->AddProperty(&args, wsValue.c_str(), wsValue.GetLength()); |   456         pDecl->AddProperty(&args, wsValue.c_str(), wsValue.GetLength()); | 
|   453       } |   457       } | 
|   454     } while (pos != NULL); |   458     } | 
|   455     if (pDecl != NULL) { |   459  | 
 |   460     if (pDecl) { | 
|   456       CFDE_CSSDeclarationArray decls; |   461       CFDE_CSSDeclarationArray decls; | 
|   457       decls.SetSize(iDeclCount + 1); |   462       decls.SetSize(iDeclCount + 1); | 
|   458       IFDE_CSSDeclaration** ppInline = decls.GetData(); |   463       IFDE_CSSDeclaration** ppInline = decls.GetData(); | 
|   459       FXSYS_memcpy(ppInline, ppDeclArray, |   464       FXSYS_memcpy(ppInline, ppDeclArray, | 
|   460                    iDeclCount * sizeof(IFDE_CSSDeclaration*)); |   465                    iDeclCount * sizeof(IFDE_CSSDeclaration*)); | 
|   461       ppInline[iDeclCount++] = pDecl; |   466       ppInline[iDeclCount++] = pDecl; | 
|   462       ApplyDeclarations(TRUE, (const IFDE_CSSDeclaration**)ppInline, iDeclCount, |   467       ApplyDeclarations(TRUE, (const IFDE_CSSDeclaration**)ppInline, iDeclCount, | 
|   463                         pDestStyle); |   468                         pDestStyle); | 
|   464       ApplyDeclarations(FALSE, (const IFDE_CSSDeclaration**)ppInline, |   469       ApplyDeclarations(FALSE, (const IFDE_CSSDeclaration**)ppInline, | 
|   465                         iDeclCount, pDestStyle); |   470                         iDeclCount, pDestStyle); | 
|   466       return; |   471       return; | 
|   467     } |   472     } | 
|   468   } |   473   } | 
 |   474  | 
|   469   if (iDeclCount > 0) { |   475   if (iDeclCount > 0) { | 
|   470     FXSYS_assert(ppDeclArray != NULL); |   476     FXSYS_assert(ppDeclArray); | 
 |   477  | 
|   471     ApplyDeclarations(TRUE, ppDeclArray, iDeclCount, pDestStyle); |   478     ApplyDeclarations(TRUE, ppDeclArray, iDeclCount, pDestStyle); | 
|   472     ApplyDeclarations(FALSE, ppDeclArray, iDeclCount, pDestStyle); |   479     ApplyDeclarations(FALSE, ppDeclArray, iDeclCount, pDestStyle); | 
|   473   } |   480   } | 
|   474 } |   481 } | 
 |   482  | 
|   475 void CFDE_CSSStyleSelector::ApplyDeclarations( |   483 void CFDE_CSSStyleSelector::ApplyDeclarations( | 
|   476     FX_BOOL bPriority, |   484     FX_BOOL bPriority, | 
|   477     const IFDE_CSSDeclaration** ppDeclArray, |   485     const IFDE_CSSDeclaration** ppDeclArray, | 
|   478     int32_t iDeclCount, |   486     int32_t iDeclCount, | 
|   479     IFDE_CSSComputedStyle* pDestStyle) { |   487     IFDE_CSSComputedStyle* pDestStyle) { | 
|   480   CFDE_CSSComputedStyle* pComputedStyle = (CFDE_CSSComputedStyle*)pDestStyle; |   488   CFDE_CSSComputedStyle* pComputedStyle = (CFDE_CSSComputedStyle*)pDestStyle; | 
|   481   IFDE_CSSValue* pVal; |   489   IFDE_CSSValue* pVal; | 
|   482   FX_BOOL bImportant; |   490   FX_BOOL bImportant; | 
|   483   int32_t i; |   491   int32_t i; | 
|   484   if (bPriority) { |   492   if (bPriority) { | 
| (...skipping 1295 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1780       return FDE_CSSTEXTTRANSFORM_LowerCase; |  1788       return FDE_CSSTEXTTRANSFORM_LowerCase; | 
|  1781     default: |  1789     default: | 
|  1782       return FDE_CSSTEXTTRANSFORM_None; |  1790       return FDE_CSSTEXTTRANSFORM_None; | 
|  1783   } |  1791   } | 
|  1784 } |  1792 } | 
|  1785 FDE_CSSFONTVARIANT CFDE_CSSStyleSelector::ToFontVariant( |  1793 FDE_CSSFONTVARIANT CFDE_CSSStyleSelector::ToFontVariant( | 
|  1786     FDE_CSSPROPERTYVALUE eValue) { |  1794     FDE_CSSPROPERTYVALUE eValue) { | 
|  1787   return eValue == FDE_CSSPROPERTYVALUE_SmallCaps ? FDE_CSSFONTVARIANT_SmallCaps |  1795   return eValue == FDE_CSSPROPERTYVALUE_SmallCaps ? FDE_CSSFONTVARIANT_SmallCaps | 
|  1788                                                   : FDE_CSSFONTVARIANT_Normal; |  1796                                                   : FDE_CSSFONTVARIANT_Normal; | 
|  1789 } |  1797 } | 
| OLD | NEW |