| Index: xfa/fde/css/fde_cssstyleselector.cpp
|
| diff --git a/xfa/fde/css/fde_cssstyleselector.cpp b/xfa/fde/css/fde_cssstyleselector.cpp
|
| index 60283a66281f33a026075d2922784e2c7d5a7cd8..30502303f4419d1682c049734c094368857d0691 100644
|
| --- a/xfa/fde/css/fde_cssstyleselector.cpp
|
| +++ b/xfa/fde/css/fde_cssstyleselector.cpp
|
| @@ -10,6 +10,7 @@
|
|
|
| #include "xfa/fde/css/fde_csscache.h"
|
| #include "xfa/fde/css/fde_cssdeclaration.h"
|
| +#include "xfa/fxfa/app/xfa_textlayout.h"
|
|
|
| #define FDE_CSSUNIVERSALHASH ('*')
|
|
|
| @@ -312,20 +313,22 @@ void CFDE_CSSStyleSelector::Reset() {
|
| }
|
| }
|
| int32_t CFDE_CSSStyleSelector::MatchDeclarations(
|
| - IFDE_CSSTagProvider* pTag,
|
| + CXFA_CSSTagProvider* pTag,
|
| CFDE_CSSDeclarationArray& matchedDecls,
|
| FDE_CSSPERSUDO ePersudoType) {
|
| - FXSYS_assert(m_pAccelerator != NULL && pTag != NULL);
|
| + FXSYS_assert(m_pAccelerator && pTag);
|
| +
|
| FDE_CSSTagCache* pCache = m_pAccelerator->GetTopElement();
|
| - FXSYS_assert(pCache != NULL && pCache->GetTag() == pTag);
|
| + FXSYS_assert(pCache && pCache->GetTag() == pTag);
|
| +
|
| matchedDecls.RemoveAt(0, matchedDecls.GetSize());
|
| for (int32_t ePriority = FDE_CSSSTYLESHEETPRIORITY_MAX - 1; ePriority >= 0;
|
| --ePriority) {
|
| FDE_CSSSTYLESHEETGROUP eGroup = m_ePriorities[ePriority];
|
| CFDE_CSSRuleCollection& rules = m_RuleCollection[eGroup];
|
| - if (rules.CountSelectors() == 0) {
|
| + if (rules.CountSelectors() == 0)
|
| continue;
|
| - }
|
| +
|
| if (ePersudoType == FDE_CSSPERSUDO_NONE) {
|
| MatchRules(pCache, rules.GetUniversalRuleData(), ePersudoType);
|
| if (pCache->HashTag()) {
|
| @@ -414,45 +417,47 @@ FX_BOOL CFDE_CSSStyleSelector::MatchSelector(FDE_CSSTagCache* pCache,
|
| }
|
|
|
| void CFDE_CSSStyleSelector::ComputeStyle(
|
| - IFDE_CSSTagProvider* pTag,
|
| + CXFA_CSSTagProvider* pTag,
|
| const IFDE_CSSDeclaration** ppDeclArray,
|
| int32_t iDeclCount,
|
| IFDE_CSSComputedStyle* pDestStyle) {
|
| FXSYS_assert(iDeclCount >= 0);
|
| FXSYS_assert(pDestStyle);
|
| - FX_POSITION pos = pTag->GetFirstAttribute();
|
| - if (pos != NULL) {
|
| - if (m_pInlineStyleStore == NULL) {
|
| +
|
| + static const uint32_t s_dwStyleHash =
|
| + FX_HashCode_String_GetW(L"style", 5, TRUE);
|
| + static const uint32_t s_dwAlignHash =
|
| + FX_HashCode_String_GetW(L"align", 5, TRUE);
|
| +
|
| + if (!pTag->empty()) {
|
| + if (!m_pInlineStyleStore)
|
| m_pInlineStyleStore = FX_CreateAllocator(FX_ALLOCTYPE_Static, 2048, 0);
|
| - }
|
| - CFDE_CSSDeclaration* pDecl = NULL;
|
| - CFX_WideStringC wsAttri, wsValue;
|
| - uint32_t dwAttriHash;
|
| - do {
|
| - pTag->GetNextAttribute(pos, wsAttri, wsValue);
|
| - dwAttriHash =
|
| +
|
| + CFDE_CSSDeclaration* pDecl = nullptr;
|
| + for (auto it : *pTag) {
|
| + CFX_WideString wsAttri = it.first;
|
| + CFX_WideString wsValue = it.second;
|
| +
|
| + uint32_t dwAttriHash =
|
| FX_HashCode_String_GetW(wsAttri.c_str(), wsAttri.GetLength(), TRUE);
|
| - static const uint32_t s_dwStyleHash =
|
| - FX_HashCode_String_GetW(L"style", 5, TRUE);
|
| - static const uint32_t s_dwAlignHash =
|
| - FX_HashCode_String_GetW(L"align", 5, TRUE);
|
| if (dwAttriHash == s_dwStyleHash) {
|
| - if (pDecl == NULL) {
|
| + if (!pDecl)
|
| pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;
|
| - }
|
| +
|
| AppendInlineStyle(pDecl, wsValue.c_str(), wsValue.GetLength());
|
| } else if (dwAttriHash == s_dwAlignHash) {
|
| - if (pDecl == NULL) {
|
| + if (!pDecl)
|
| pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;
|
| - }
|
| +
|
| FDE_CSSPROPERTYARGS args;
|
| - args.pStringCache = NULL;
|
| + args.pStringCache = nullptr;
|
| args.pStaticStore = m_pInlineStyleStore;
|
| args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY_TextAlign);
|
| pDecl->AddProperty(&args, wsValue.c_str(), wsValue.GetLength());
|
| }
|
| - } while (pos != NULL);
|
| - if (pDecl != NULL) {
|
| + }
|
| +
|
| + if (pDecl) {
|
| CFDE_CSSDeclarationArray decls;
|
| decls.SetSize(iDeclCount + 1);
|
| IFDE_CSSDeclaration** ppInline = decls.GetData();
|
| @@ -466,12 +471,15 @@ void CFDE_CSSStyleSelector::ComputeStyle(
|
| return;
|
| }
|
| }
|
| +
|
| if (iDeclCount > 0) {
|
| - FXSYS_assert(ppDeclArray != NULL);
|
| + FXSYS_assert(ppDeclArray);
|
| +
|
| ApplyDeclarations(TRUE, ppDeclArray, iDeclCount, pDestStyle);
|
| ApplyDeclarations(FALSE, ppDeclArray, iDeclCount, pDestStyle);
|
| }
|
| }
|
| +
|
| void CFDE_CSSStyleSelector::ApplyDeclarations(
|
| FX_BOOL bPriority,
|
| const IFDE_CSSDeclaration** ppDeclArray,
|
|
|