// Copyright 2014 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "xfa/fde/css/fde_csscache.h" #include #include "core/fxcrt/include/fx_ext.h" #include "xfa/fxfa/app/xfa_textlayout.h" FDE_CSSCacheItem::FDE_CSSCacheItem(IFDE_CSSStyleSheet* p) : pStylesheet(p), dwActivity(0) { FXSYS_assert(pStylesheet); pStylesheet->AddRef(); } FDE_CSSCacheItem::~FDE_CSSCacheItem() { pStylesheet->Release(); } FDE_CSSTagCache::FDE_CSSTagCache(FDE_CSSTagCache* parent, CXFA_CSSTagProvider* tag) : pTag(tag), pParent(parent), dwIDHash(0), dwTagHash(0), iClassIndex(0), dwClassHashs(1) { static const uint32_t s_dwIDHash = FX_HashCode_String_GetW(L"id", 2, TRUE); static const uint32_t s_dwClassHash = FX_HashCode_String_GetW(L"class", 5, TRUE); CFX_WideString wsTag = pTag->GetTagName(); dwTagHash = FX_HashCode_String_GetW(wsTag.c_str(), wsTag.GetLength(), TRUE); for (auto it : *pTag) { CFX_WideString wsValue = it.first; CFX_WideString wsName = it.second; uint32_t dwNameHash = FX_HashCode_String_GetW(wsName.c_str(), wsName.GetLength(), TRUE); if (dwNameHash == s_dwClassHash) { uint32_t dwHash = FX_HashCode_String_GetW(wsValue.c_str(), wsValue.GetLength()); dwClassHashs.Add(dwHash); } else if (dwNameHash == s_dwIDHash) { dwIDHash = FX_HashCode_String_GetW(wsValue.c_str(), wsValue.GetLength()); } } } FDE_CSSTagCache::FDE_CSSTagCache(const FDE_CSSTagCache& it) : pTag(it.pTag), pParent(it.pParent), dwIDHash(it.dwIDHash), dwTagHash(it.dwTagHash), iClassIndex(0), dwClassHashs(1) { if (it.dwClassHashs.GetSize() > 0) dwClassHashs.Copy(it.dwClassHashs); } void CFDE_CSSAccelerator::OnEnterTag(CXFA_CSSTagProvider* pTag) { FDE_CSSTagCache* pTop = GetTopElement(); FDE_CSSTagCache item(pTop, pTag); m_Stack.Push(item); } void CFDE_CSSAccelerator::OnLeaveTag(CXFA_CSSTagProvider* pTag) { FXSYS_assert(m_Stack.GetTopElement()); FXSYS_assert(m_Stack.GetTopElement()->GetTag() == pTag); m_Stack.Pop(); }