| Index: xfa/src/fdp/src/css/fde_csscache.cpp
|
| diff --git a/xfa/src/fdp/src/css/fde_csscache.cpp b/xfa/src/fdp/src/css/fde_csscache.cpp
|
| index 3d3b040a87e41a116ee1cbc68e516c714bc66034..a4f89c9867628e3d58fd346400e31546cfe9dc99 100644
|
| --- a/xfa/src/fdp/src/css/fde_csscache.cpp
|
| +++ b/xfa/src/fdp/src/css/fde_csscache.cpp
|
| @@ -1,147 +1,147 @@
|
| -// 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 <algorithm>
|
| -
|
| -#include "xfa/src/foxitlib.h"
|
| -#include "fde_csscache.h"
|
| -_FDE_CSSCACHEITEM::_FDE_CSSCACHEITEM(IFDE_CSSStyleSheet* p)
|
| - : pStylesheet(p), dwActivity(0) {
|
| - FXSYS_assert(pStylesheet);
|
| - pStylesheet->AddRef();
|
| -}
|
| -_FDE_CSSCACHEITEM::~_FDE_CSSCACHEITEM() {
|
| - pStylesheet->Release();
|
| -}
|
| -IFDE_CSSStyleSheetCache* IFDE_CSSStyleSheetCache::Create() {
|
| - return new CFDE_CSSStyleSheetCache;
|
| -}
|
| -
|
| -CFDE_CSSStyleSheetCache::CFDE_CSSStyleSheetCache()
|
| - : m_pFixedStore(NULL), m_iMaxItems(5) {}
|
| -
|
| -CFDE_CSSStyleSheetCache::~CFDE_CSSStyleSheetCache() {
|
| - for (const auto& pair : m_Stylesheets) {
|
| - FDE_DeleteWith(FDE_CSSCACHEITEM, m_pFixedStore, pair.second);
|
| - }
|
| - m_Stylesheets.clear();
|
| - if (m_pFixedStore) {
|
| - m_pFixedStore->Release();
|
| - }
|
| -}
|
| -void CFDE_CSSStyleSheetCache::AddStyleSheet(const CFX_ByteStringC& szKey,
|
| - IFDE_CSSStyleSheet* pStyleSheet) {
|
| - FXSYS_assert(pStyleSheet != NULL);
|
| - if (m_pFixedStore == NULL) {
|
| - m_pFixedStore =
|
| - FX_CreateAllocator(FX_ALLOCTYPE_Fixed, std::max(10, m_iMaxItems),
|
| - sizeof(FDE_CSSCACHEITEM));
|
| - FXSYS_assert(m_pFixedStore != NULL);
|
| - }
|
| - auto it = m_Stylesheets.find(szKey);
|
| - if (it != m_Stylesheets.end()) {
|
| - FDE_LPCSSCACHEITEM pItem = it->second;
|
| - if (pItem->pStylesheet != pStyleSheet) {
|
| - pItem->pStylesheet->Release();
|
| - pItem->pStylesheet = pStyleSheet;
|
| - pItem->pStylesheet->AddRef();
|
| - pItem->dwActivity = 0;
|
| - }
|
| - } else {
|
| - while (static_cast<int32_t>(m_Stylesheets.size()) >= m_iMaxItems) {
|
| - RemoveLowestActivityItem();
|
| - }
|
| - m_Stylesheets[szKey] =
|
| - FDE_NewWith(m_pFixedStore) FDE_CSSCACHEITEM(pStyleSheet);
|
| - }
|
| -}
|
| -IFDE_CSSStyleSheet* CFDE_CSSStyleSheetCache::GetStyleSheet(
|
| - const CFX_ByteStringC& szKey) const {
|
| - auto it = m_Stylesheets.find(szKey);
|
| - if (it == m_Stylesheets.end()) {
|
| - return nullptr;
|
| - }
|
| - FDE_LPCSSCACHEITEM pItem = it->second;
|
| - pItem->dwActivity++;
|
| - pItem->pStylesheet->AddRef();
|
| - return pItem->pStylesheet;
|
| -}
|
| -void CFDE_CSSStyleSheetCache::RemoveStyleSheet(const CFX_ByteStringC& szKey) {
|
| - auto it = m_Stylesheets.find(szKey);
|
| - if (it == m_Stylesheets.end()) {
|
| - return;
|
| - }
|
| - FDE_DeleteWith(FDE_CSSCACHEITEM, m_pFixedStore, it->second);
|
| - m_Stylesheets.erase(it);
|
| -}
|
| -void CFDE_CSSStyleSheetCache::RemoveLowestActivityItem() {
|
| - auto found = m_Stylesheets.end();
|
| - for (auto it = m_Stylesheets.begin(); it != m_Stylesheets.end(); ++it) {
|
| - switch (it->first.GetID()) {
|
| - case FXBSTR_ID('#', 'U', 'S', 'E'):
|
| - case FXBSTR_ID('#', 'A', 'G', 'E'):
|
| - continue;
|
| - }
|
| - if (found == m_Stylesheets.end() ||
|
| - it->second->dwActivity > found->second->dwActivity) {
|
| - found = it;
|
| - }
|
| - }
|
| - if (found != m_Stylesheets.end()) {
|
| - FDE_DeleteWith(FDE_CSSCACHEITEM, m_pFixedStore, found->second);
|
| - m_Stylesheets.erase(found);
|
| - }
|
| -}
|
| -_FDE_CSSTAGCACHE::_FDE_CSSTAGCACHE(_FDE_CSSTAGCACHE* parent,
|
| - IFDE_CSSTagProvider* tag)
|
| - : pTag(tag),
|
| - pParent(parent),
|
| - dwIDHash(0),
|
| - dwTagHash(0),
|
| - iClassIndex(0),
|
| - dwClassHashs(1) {
|
| - FXSYS_assert(pTag != NULL);
|
| - CFX_WideStringC wsValue, wsName = pTag->GetTagName();
|
| - dwTagHash =
|
| - FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), TRUE);
|
| - FX_POSITION pos = pTag->GetFirstAttribute();
|
| - while (pos != NULL) {
|
| - pTag->GetNextAttribute(pos, wsName, wsValue);
|
| - FX_DWORD dwNameHash =
|
| - FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), TRUE);
|
| - static const FX_DWORD s_dwIDHash = FX_HashCode_String_GetW(L"id", 2, TRUE);
|
| - static const FX_DWORD s_dwClassHash =
|
| - FX_HashCode_String_GetW(L"class", 5, TRUE);
|
| - if (dwNameHash == s_dwClassHash) {
|
| - FX_DWORD dwHash =
|
| - FX_HashCode_String_GetW(wsValue.GetPtr(), wsValue.GetLength());
|
| - dwClassHashs.Add(dwHash);
|
| - } else if (dwNameHash == s_dwIDHash) {
|
| - dwIDHash = FX_HashCode_String_GetW(wsValue.GetPtr(), 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(IFDE_CSSTagProvider* pTag) {
|
| - FDE_CSSTAGCACHE* pTop = GetTopElement();
|
| - FDE_CSSTAGCACHE item(pTop, pTag);
|
| - m_Stack.Push(item);
|
| -}
|
| -void CFDE_CSSAccelerator::OnLeaveTag(IFDE_CSSTagProvider* pTag) {
|
| - FDE_CSSTAGCACHE* pItem = m_Stack.GetTopElement();
|
| - FXSYS_assert(pItem && pItem->GetTag() == pTag);
|
| - m_Stack.Pop();
|
| -}
|
| +// 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 <algorithm>
|
| +
|
| +#include "xfa/src/foxitlib.h"
|
| +#include "fde_csscache.h"
|
| +_FDE_CSSCACHEITEM::_FDE_CSSCACHEITEM(IFDE_CSSStyleSheet* p)
|
| + : pStylesheet(p), dwActivity(0) {
|
| + FXSYS_assert(pStylesheet);
|
| + pStylesheet->AddRef();
|
| +}
|
| +_FDE_CSSCACHEITEM::~_FDE_CSSCACHEITEM() {
|
| + pStylesheet->Release();
|
| +}
|
| +IFDE_CSSStyleSheetCache* IFDE_CSSStyleSheetCache::Create() {
|
| + return new CFDE_CSSStyleSheetCache;
|
| +}
|
| +
|
| +CFDE_CSSStyleSheetCache::CFDE_CSSStyleSheetCache()
|
| + : m_pFixedStore(NULL), m_iMaxItems(5) {}
|
| +
|
| +CFDE_CSSStyleSheetCache::~CFDE_CSSStyleSheetCache() {
|
| + for (const auto& pair : m_Stylesheets) {
|
| + FDE_DeleteWith(FDE_CSSCACHEITEM, m_pFixedStore, pair.second);
|
| + }
|
| + m_Stylesheets.clear();
|
| + if (m_pFixedStore) {
|
| + m_pFixedStore->Release();
|
| + }
|
| +}
|
| +void CFDE_CSSStyleSheetCache::AddStyleSheet(const CFX_ByteStringC& szKey,
|
| + IFDE_CSSStyleSheet* pStyleSheet) {
|
| + FXSYS_assert(pStyleSheet != NULL);
|
| + if (m_pFixedStore == NULL) {
|
| + m_pFixedStore =
|
| + FX_CreateAllocator(FX_ALLOCTYPE_Fixed, std::max(10, m_iMaxItems),
|
| + sizeof(FDE_CSSCACHEITEM));
|
| + FXSYS_assert(m_pFixedStore != NULL);
|
| + }
|
| + auto it = m_Stylesheets.find(szKey);
|
| + if (it != m_Stylesheets.end()) {
|
| + FDE_LPCSSCACHEITEM pItem = it->second;
|
| + if (pItem->pStylesheet != pStyleSheet) {
|
| + pItem->pStylesheet->Release();
|
| + pItem->pStylesheet = pStyleSheet;
|
| + pItem->pStylesheet->AddRef();
|
| + pItem->dwActivity = 0;
|
| + }
|
| + } else {
|
| + while (static_cast<int32_t>(m_Stylesheets.size()) >= m_iMaxItems) {
|
| + RemoveLowestActivityItem();
|
| + }
|
| + m_Stylesheets[szKey] =
|
| + FDE_NewWith(m_pFixedStore) FDE_CSSCACHEITEM(pStyleSheet);
|
| + }
|
| +}
|
| +IFDE_CSSStyleSheet* CFDE_CSSStyleSheetCache::GetStyleSheet(
|
| + const CFX_ByteStringC& szKey) const {
|
| + auto it = m_Stylesheets.find(szKey);
|
| + if (it == m_Stylesheets.end()) {
|
| + return nullptr;
|
| + }
|
| + FDE_LPCSSCACHEITEM pItem = it->second;
|
| + pItem->dwActivity++;
|
| + pItem->pStylesheet->AddRef();
|
| + return pItem->pStylesheet;
|
| +}
|
| +void CFDE_CSSStyleSheetCache::RemoveStyleSheet(const CFX_ByteStringC& szKey) {
|
| + auto it = m_Stylesheets.find(szKey);
|
| + if (it == m_Stylesheets.end()) {
|
| + return;
|
| + }
|
| + FDE_DeleteWith(FDE_CSSCACHEITEM, m_pFixedStore, it->second);
|
| + m_Stylesheets.erase(it);
|
| +}
|
| +void CFDE_CSSStyleSheetCache::RemoveLowestActivityItem() {
|
| + auto found = m_Stylesheets.end();
|
| + for (auto it = m_Stylesheets.begin(); it != m_Stylesheets.end(); ++it) {
|
| + switch (it->first.GetID()) {
|
| + case FXBSTR_ID('#', 'U', 'S', 'E'):
|
| + case FXBSTR_ID('#', 'A', 'G', 'E'):
|
| + continue;
|
| + }
|
| + if (found == m_Stylesheets.end() ||
|
| + it->second->dwActivity > found->second->dwActivity) {
|
| + found = it;
|
| + }
|
| + }
|
| + if (found != m_Stylesheets.end()) {
|
| + FDE_DeleteWith(FDE_CSSCACHEITEM, m_pFixedStore, found->second);
|
| + m_Stylesheets.erase(found);
|
| + }
|
| +}
|
| +_FDE_CSSTAGCACHE::_FDE_CSSTAGCACHE(_FDE_CSSTAGCACHE* parent,
|
| + IFDE_CSSTagProvider* tag)
|
| + : pTag(tag),
|
| + pParent(parent),
|
| + dwIDHash(0),
|
| + dwTagHash(0),
|
| + iClassIndex(0),
|
| + dwClassHashs(1) {
|
| + FXSYS_assert(pTag != NULL);
|
| + CFX_WideStringC wsValue, wsName = pTag->GetTagName();
|
| + dwTagHash =
|
| + FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), TRUE);
|
| + FX_POSITION pos = pTag->GetFirstAttribute();
|
| + while (pos != NULL) {
|
| + pTag->GetNextAttribute(pos, wsName, wsValue);
|
| + FX_DWORD dwNameHash =
|
| + FX_HashCode_String_GetW(wsName.GetPtr(), wsName.GetLength(), TRUE);
|
| + static const FX_DWORD s_dwIDHash = FX_HashCode_String_GetW(L"id", 2, TRUE);
|
| + static const FX_DWORD s_dwClassHash =
|
| + FX_HashCode_String_GetW(L"class", 5, TRUE);
|
| + if (dwNameHash == s_dwClassHash) {
|
| + FX_DWORD dwHash =
|
| + FX_HashCode_String_GetW(wsValue.GetPtr(), wsValue.GetLength());
|
| + dwClassHashs.Add(dwHash);
|
| + } else if (dwNameHash == s_dwIDHash) {
|
| + dwIDHash = FX_HashCode_String_GetW(wsValue.GetPtr(), 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(IFDE_CSSTagProvider* pTag) {
|
| + FDE_CSSTAGCACHE* pTop = GetTopElement();
|
| + FDE_CSSTAGCACHE item(pTop, pTag);
|
| + m_Stack.Push(item);
|
| +}
|
| +void CFDE_CSSAccelerator::OnLeaveTag(IFDE_CSSTagProvider* pTag) {
|
| + FDE_CSSTAGCACHE* pItem = m_Stack.GetTopElement();
|
| + FXSYS_assert(pItem && pItem->GetTag() == pTag);
|
| + m_Stack.Pop();
|
| +}
|
|
|