void CPDF_PageRenderCache::CacheOptimization(FX_INT32 dwLimitCacheSize) { if (m_nCacheSize <= (FX_DWORD)dwLimitCacheSize) { return; } int nCount = m_ImageCaches.GetCount(); CACHEINFO* pCACHEINFO = (CACHEINFO*)FX_Alloc(FX_BYTE, (sizeof (CACHEINFO)) * nCount); FX_POSITION pos = m_ImageCaches.GetStartPosition(); int i = 0; while (pos) { FX_LPVOID key, value; m_ImageCaches.GetNextAssoc(pos, key, value); pCACHEINFO[i].time = ((CPDF_ImageCache*)value)->GetTimeCount(); pCACHEINFO[i++].pStream = ((CPDF_ImageCache*)value)->GetStream(); } FXSYS_qsort(pCACHEINFO, nCount, sizeof (CACHEINFO), compare); FX_DWORD nTimeCount = m_nTimeCount; if (nTimeCount + 1 < nTimeCount) { for (i = 0; i < nCount; i ++) { ((CPDF_ImageCache*)(m_ImageCaches[pCACHEINFO[i].pStream]))->m_dwTimeCount = i; } m_nTimeCount = nCount; } i = 0; while(nCount > 15) { ClearImageCache(pCACHEINFO[i++].pStream); nCount--; } while (m_nCacheSize > (FX_DWORD)dwLimitCacheSize) { ClearImageCache(pCACHEINFO[i++].pStream); } FX_Free(pCACHEINFO); }
void CPDF_PageRenderCache::CacheOptimization(int32_t dwLimitCacheSize) { if (m_nCacheSize <= (uint32_t)dwLimitCacheSize) return; size_t nCount = m_ImageCache.size(); CACHEINFO* pCACHEINFO = FX_Alloc(CACHEINFO, nCount); size_t i = 0; for (const auto& it : m_ImageCache) { pCACHEINFO[i].time = it.second->GetTimeCount(); pCACHEINFO[i++].pStream = it.second->GetStream(); } FXSYS_qsort(pCACHEINFO, nCount, sizeof(CACHEINFO), compare); uint32_t nTimeCount = m_nTimeCount; // Check if time value is about to roll over and reset all entries. // The comparision is legal because uint32_t is an unsigned type. if (nTimeCount + 1 < nTimeCount) { for (i = 0; i < nCount; i++) m_ImageCache[pCACHEINFO[i].pStream]->m_dwTimeCount = i; m_nTimeCount = nCount; } i = 0; while (i + 15 < nCount) ClearImageCacheEntry(pCACHEINFO[i++].pStream); while (i < nCount && m_nCacheSize > (uint32_t)dwLimitCacheSize) ClearImageCacheEntry(pCACHEINFO[i++].pStream); FX_Free(pCACHEINFO); }
void CXFA_FFTabOrderPageWidgetIterator::OrderContainer( CXFA_LayoutItemIterator* sIterator, CXFA_LayoutItem* pContainerItem, CXFA_TabParam* pContainer, FX_BOOL& bCurrentItem, FX_BOOL& bContentArea, FX_BOOL bMarsterPage) { CFX_ArrayTemplate<CXFA_TabParam*> tabParams; CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext(); while (pSearchItem) { if (!pSearchItem->IsContentLayoutItem()) { bContentArea = TRUE; pSearchItem = sIterator->MoveToNext(); continue; } if (bMarsterPage && bContentArea) { break; } if (bMarsterPage || bContentArea) { CXFA_FFWidget* hWidget = GetWidget(pSearchItem); if (!hWidget) { pSearchItem = sIterator->MoveToNext(); continue; } if (pContainerItem && (pSearchItem->GetParent() != pContainerItem)) { bCurrentItem = TRUE; break; } CXFA_TabParam* pParam = new CXFA_TabParam; pParam->m_pWidget = hWidget; tabParams.Add(pParam); if (XFA_IsLayoutElement(pSearchItem->GetFormNode()->GetElementType(), TRUE)) { OrderContainer(sIterator, pSearchItem, pParam, bCurrentItem, bContentArea, bMarsterPage); } } if (bCurrentItem) { pSearchItem = sIterator->GetCurrent(); bCurrentItem = FALSE; } else { pSearchItem = sIterator->MoveToNext(); } } int32_t iChildren = tabParams.GetSize(); if (iChildren > 1) { FXSYS_qsort(tabParams.GetData(), iChildren, sizeof(void*), XFA_TabOrderWidgetComparator); } for (int32_t iStart = 0; iStart < iChildren; iStart++) { CXFA_TabParam* pParam = tabParams[iStart]; pContainer->m_Children.Add(pParam->m_pWidget); if (pParam->m_Children.GetSize() > 0) { pContainer->m_Children.Append(pParam->m_Children); } delete pParam; } tabParams.RemoveAll(); }
void CXFA_FFTabOrderPageWidgetIterator::OrderContainer( CXFA_LayoutItemIterator* sIterator, CXFA_LayoutItem* pContainerItem, CXFA_TabParam* pContainer, bool& bCurrentItem, bool& bContentArea, bool bMarsterPage) { CFX_ArrayTemplate<CXFA_TabParam*> tabParams; CXFA_LayoutItem* pSearchItem = sIterator->MoveToNext(); while (pSearchItem) { if (!pSearchItem->IsContentLayoutItem()) { bContentArea = true; pSearchItem = sIterator->MoveToNext(); continue; } if (bMarsterPage && bContentArea) { break; } if (bMarsterPage || bContentArea) { CXFA_FFWidget* hWidget = GetWidget(pSearchItem); if (!hWidget) { pSearchItem = sIterator->MoveToNext(); continue; } if (pContainerItem && (pSearchItem->GetParent() != pContainerItem)) { bCurrentItem = true; break; } CXFA_TabParam* pParam = new CXFA_TabParam; pParam->m_pWidget = hWidget; tabParams.Add(pParam); if (IsLayoutElement(pSearchItem->GetFormNode()->GetElementType(), true)) { OrderContainer(sIterator, pSearchItem, pParam, bCurrentItem, bContentArea, bMarsterPage); } } if (bCurrentItem) { pSearchItem = sIterator->GetCurrent(); bCurrentItem = false; } else { pSearchItem = sIterator->MoveToNext(); } } int32_t iChildren = tabParams.GetSize(); if (iChildren > 1) { FXSYS_qsort(tabParams.GetData(), iChildren, sizeof(void*), XFA_TabOrderWidgetComparator); } for (int32_t iStart = 0; iStart < iChildren; iStart++) { std::unique_ptr<CXFA_TabParam> pParam(tabParams[iStart]); pContainer->m_Children.push_back(pParam->m_pWidget); pContainer->m_Children.insert(pContainer->m_Children.end(), pParam->m_Children.begin(), pParam->m_Children.end()); } tabParams.RemoveAll(); }