diff options
Diffstat (limited to 'xfa/fde/css')
-rw-r--r-- | xfa/fde/css/cfde_cssstyleselector.cpp | 156 | ||||
-rw-r--r-- | xfa/fde/css/cfde_cssstyleselector.h | 34 |
2 files changed, 68 insertions, 122 deletions
diff --git a/xfa/fde/css/cfde_cssstyleselector.cpp b/xfa/fde/css/cfde_cssstyleselector.cpp index 1b4aa0e13b..e09f79c877 100644 --- a/xfa/fde/css/cfde_cssstyleselector.cpp +++ b/xfa/fde/css/cfde_cssstyleselector.cpp @@ -73,44 +73,26 @@ void CFDE_CSSStyleSelector::UpdateStyleIndex() { m_UARules.AddRulesFrom(m_UAStyles.get(), m_pFontMgr); } -int32_t CFDE_CSSStyleSelector::MatchDeclarations( - CXFA_CSSTagProvider* pTag, - CFX_ArrayTemplate<CFDE_CSSDeclaration*>& matchedDecls) { +std::vector<const CFDE_CSSDeclaration*> +CFDE_CSSStyleSelector::MatchDeclarations(CXFA_CSSTagProvider* pTag) { ASSERT(pTag); CFDE_CSSTagCache* pCache = m_pAccelerator->top(); ASSERT(pCache && pCache->GetTag() == pTag); - matchedDecls.RemoveAt(0, matchedDecls.GetSize()); - - if (m_UARules.CountSelectors() == 0) - return 0; - - // The ::Data is owned by the m_RuleCollection. - std::vector<CFDE_CSSRuleCollection::Data*> matchedRules; - - if (pCache->HashTag()) { - MatchRules(&matchedRules, pCache, - m_UARules.GetTagRuleData(pCache->HashTag())); - } - - for (const auto& rule : matchedRules) - matchedDecls.Add(rule->pDeclaration); + std::vector<const CFDE_CSSDeclaration*> matchedDecls; + if (m_UARules.CountSelectors() == 0 || !pCache->HashTag()) + return matchedDecls; - return matchedDecls.GetSize(); -} - -void CFDE_CSSStyleSelector::MatchRules( - std::vector<CFDE_CSSRuleCollection::Data*>* matchedRules, - CFDE_CSSTagCache* pCache, - const std::vector<std::unique_ptr<CFDE_CSSRuleCollection::Data>>* pList) { - if (!pList) - return; + auto rules = m_UARules.GetTagRuleData(pCache->HashTag()); + if (!rules) + return matchedDecls; - for (const auto& d : *pList) { + for (const auto& d : *rules) { if (MatchSelector(pCache, d->pSelector)) - matchedRules->push_back(d.get()); + matchedDecls.push_back(d->pDeclaration); } + return matchedDecls; } bool CFDE_CSSStyleSelector::MatchSelector(CFDE_CSSTagCache* pCache, @@ -143,29 +125,27 @@ bool CFDE_CSSStyleSelector::MatchSelector(CFDE_CSSTagCache* pCache, void CFDE_CSSStyleSelector::ComputeStyle( CXFA_CSSTagProvider* pTag, - const CFDE_CSSDeclaration** ppDeclArray, - int32_t iDeclCount, + const std::vector<const CFDE_CSSDeclaration*>& declArray, CFDE_CSSComputedStyle* pDestStyle) { - ASSERT(iDeclCount >= 0); ASSERT(pDestStyle); static const uint32_t s_dwStyleHash = FX_HashCode_GetW(L"style", true); static const uint32_t s_dwAlignHash = FX_HashCode_GetW(L"align", true); if (!pTag->empty()) { - CFDE_CSSDeclaration* pDecl = nullptr; + std::unique_ptr<CFDE_CSSDeclaration> pDecl; for (auto it : *pTag) { CFX_WideString wsAttri = it.first; CFX_WideString wsValue = it.second; uint32_t dwAttriHash = FX_HashCode_GetW(wsAttri.AsStringC(), true); if (dwAttriHash == s_dwStyleHash) { if (!pDecl) - pDecl = new CFDE_CSSDeclaration; + pDecl = pdfium::MakeUnique<CFDE_CSSDeclaration>(); - AppendInlineStyle(pDecl, wsValue.c_str(), wsValue.GetLength()); + AppendInlineStyle(pDecl.get(), wsValue.c_str(), wsValue.GetLength()); } else if (dwAttriHash == s_dwAlignHash) { if (!pDecl) - pDecl = new CFDE_CSSDeclaration; + pDecl = pdfium::MakeUnique<CFDE_CSSDeclaration>(); FDE_CSSPropertyArgs args; args.pStringCache = nullptr; @@ -175,89 +155,53 @@ void CFDE_CSSStyleSelector::ComputeStyle( } if (pDecl) { - CFX_ArrayTemplate<CFDE_CSSDeclaration*> decls; - decls.SetSize(iDeclCount + 1); - CFDE_CSSDeclaration** ppInline = decls.GetData(); - FXSYS_memcpy(ppInline, ppDeclArray, - iDeclCount * sizeof(CFDE_CSSDeclaration*)); - ppInline[iDeclCount++] = pDecl; - ApplyDeclarations(true, const_cast<const CFDE_CSSDeclaration**>(ppInline), - iDeclCount, pDestStyle); - ApplyDeclarations(false, - const_cast<const CFDE_CSSDeclaration**>(ppInline), - iDeclCount, pDestStyle); + ApplyDeclarations(declArray, pDecl.get(), pDestStyle); return; } } - if (iDeclCount > 0) { - ASSERT(ppDeclArray); + if (declArray.empty()) + return; - ApplyDeclarations(true, ppDeclArray, iDeclCount, pDestStyle); - ApplyDeclarations(false, ppDeclArray, iDeclCount, pDestStyle); - } + ApplyDeclarations(declArray, nullptr, pDestStyle); } void CFDE_CSSStyleSelector::ApplyDeclarations( - bool bPriority, - const CFDE_CSSDeclaration** ppDeclArray, - int32_t iDeclCount, + const std::vector<const CFDE_CSSDeclaration*>& declArray, + const CFDE_CSSDeclaration* extraDecl, CFDE_CSSComputedStyle* pDestStyle) { CFDE_CSSComputedStyle* pComputedStyle = pDestStyle; - int32_t i; - if (bPriority) { - CFDE_CSSValue* pLastest = nullptr; - CFDE_CSSValue* pImportant = nullptr; - for (i = 0; i < iDeclCount; ++i) { - bool bImportant; - CFDE_CSSValue* pVal = - ppDeclArray[i]->GetProperty(FDE_CSSProperty::FontSize, bImportant); - if (!pVal) - continue; - - if (bImportant) - pImportant = pVal; - else - pLastest = pVal; - } - if (pImportant) { - ApplyProperty(FDE_CSSProperty::FontSize, pImportant, pComputedStyle); - } else if (pLastest) { - ApplyProperty(FDE_CSSProperty::FontSize, pLastest, pComputedStyle); - } - } else { - CFX_ArrayTemplate<CFDE_CSSDeclaration*> importants; - const CFDE_CSSDeclaration* pDecl = nullptr; - - for (i = 0; i < iDeclCount; ++i) { - pDecl = ppDeclArray[i]; - for (auto it = pDecl->begin(); it != pDecl->end(); it++) { - if ((*it)->eProperty == FDE_CSSProperty::FontSize) - continue; - if (!(*it)->bImportant) { - ApplyProperty((*it)->eProperty, (*it)->pValue.Get(), pComputedStyle); - } else if (importants.GetSize() == 0 || - importants[importants.GetUpperBound()] != pDecl) { - importants.Add(const_cast<CFDE_CSSDeclaration*>(pDecl)); - } - } - } - - iDeclCount = importants.GetSize(); - for (i = 0; i < iDeclCount; ++i) { - pDecl = importants[i]; - - for (auto it = pDecl->begin(); it != pDecl->end(); it++) { - if ((*it)->bImportant && (*it)->eProperty != FDE_CSSProperty::FontSize) - ApplyProperty((*it)->eProperty, (*it)->pValue.Get(), pComputedStyle); - } - } + std::vector<const CFDE_CSSPropertyHolder*> importants; + std::vector<const CFDE_CSSPropertyHolder*> normals; + std::vector<const CFDE_CSSCustomProperty*> customs; + + for (auto& decl : declArray) + ExtractValues(decl, &importants, &normals, &customs); + if (extraDecl) + ExtractValues(extraDecl, &importants, &normals, &customs); + + for (auto& prop : normals) + ApplyProperty(prop->eProperty, prop->pValue.Get(), pComputedStyle); + for (auto& prop : customs) + pComputedStyle->AddCustomStyle(prop->pwsName, prop->pwsValue); + for (auto& prop : importants) + ApplyProperty(prop->eProperty, prop->pValue.Get(), pComputedStyle); +} - for (auto it = pDecl->custom_begin(); it != pDecl->custom_end(); it++) { - pComputedStyle->AddCustomStyle((*it)->pwsName, (*it)->pwsValue); - } +void CFDE_CSSStyleSelector::ExtractValues( + const CFDE_CSSDeclaration* decl, + std::vector<const CFDE_CSSPropertyHolder*>* importants, + std::vector<const CFDE_CSSPropertyHolder*>* normals, + std::vector<const CFDE_CSSCustomProperty*>* custom) { + for (const auto& holder : *decl) { + if (holder->bImportant) + importants->push_back(holder.get()); + else + normals->push_back(holder.get()); } + for (auto it = decl->custom_begin(); it != decl->custom_end(); it++) + custom->push_back(it->get()); } void CFDE_CSSStyleSelector::AppendInlineStyle(CFDE_CSSDeclaration* pDecl, diff --git a/xfa/fde/css/cfde_cssstyleselector.h b/xfa/fde/css/cfde_cssstyleselector.h index c2262d7aa7..15bce93334 100644 --- a/xfa/fde/css/cfde_cssstyleselector.h +++ b/xfa/fde/css/cfde_cssstyleselector.h @@ -17,7 +17,9 @@ class CFDE_CSSAccelerator; class CFDE_CSSComputedStyle; +class CFDE_CSSCustomProperty; class CFDE_CSSDeclaration; +class CFDE_CSSPropertyHolder; class CFDE_CSSSelector; class CFDE_CSSStyleSheet; class CFDE_CSSTagCache; @@ -31,38 +33,38 @@ class CFDE_CSSStyleSelector { explicit CFDE_CSSStyleSelector(CFGAS_FontMgr* pFontMgr); ~CFDE_CSSStyleSelector(); - void SetDefFontSize(FX_FLOAT fFontSize); + CFDE_CSSAccelerator* InitAccelerator(); + void SetDefFontSize(FX_FLOAT fFontSize); void SetUAStyleSheet(std::unique_ptr<CFDE_CSSStyleSheet> pSheet); - void UpdateStyleIndex(); - CFDE_CSSAccelerator* InitAccelerator(); + CFX_RetainPtr<CFDE_CSSComputedStyle> CreateComputedStyle( CFDE_CSSComputedStyle* pParentStyle); - int32_t MatchDeclarations( - CXFA_CSSTagProvider* pTag, - CFX_ArrayTemplate<CFDE_CSSDeclaration*>& matchedDecls); void ComputeStyle(CXFA_CSSTagProvider* pTag, - const CFDE_CSSDeclaration** ppDeclArray, - int32_t iDeclCount, + const std::vector<const CFDE_CSSDeclaration*>& declArray, CFDE_CSSComputedStyle* pDestStyle); + std::vector<const CFDE_CSSDeclaration*> MatchDeclarations( + CXFA_CSSTagProvider* pTag); + private: - void MatchRules( - std::vector<CFDE_CSSRuleCollection::Data*>* matchedRules, - CFDE_CSSTagCache* pCache, - const std::vector<std::unique_ptr<CFDE_CSSRuleCollection::Data>>* pList); bool MatchSelector(CFDE_CSSTagCache* pCache, CFDE_CSSSelector* pSel); + void AppendInlineStyle(CFDE_CSSDeclaration* pDecl, const FX_WCHAR* psz, int32_t iLen); - void ApplyDeclarations(bool bPriority, - const CFDE_CSSDeclaration** ppDeclArray, - int32_t iDeclCount, - CFDE_CSSComputedStyle* pDestStyle); + void ApplyDeclarations( + const std::vector<const CFDE_CSSDeclaration*>& declArray, + const CFDE_CSSDeclaration* extraDecl, + CFDE_CSSComputedStyle* pDestStyle); void ApplyProperty(FDE_CSSProperty eProperty, CFDE_CSSValue* pValue, CFDE_CSSComputedStyle* pComputedStyle); + void ExtractValues(const CFDE_CSSDeclaration* decl, + std::vector<const CFDE_CSSPropertyHolder*>* importants, + std::vector<const CFDE_CSSPropertyHolder*>* normals, + std::vector<const CFDE_CSSCustomProperty*>* custom); bool SetLengthWithPercent(FDE_CSSLength& width, FDE_CSSPrimitiveType eType, |