mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
136 lines
2.1 KiB
C++
136 lines
2.1 KiB
C++
#pragma once
|
|
#include "..\stdafx.h"
|
|
|
|
#include "..\agg\AVSWrapper\Image.h"
|
|
#include "TemporaryCS.h"
|
|
|
|
class CCacheImage
|
|
{
|
|
private:
|
|
Aggplus::CImage m_oImage;
|
|
LONG m_lRef;
|
|
|
|
public:
|
|
CCacheImage() : m_oImage()
|
|
{
|
|
m_lRef = 1;
|
|
}
|
|
CCacheImage(CString& strFile) : m_oImage(strFile)
|
|
{
|
|
m_lRef = 1;
|
|
}
|
|
|
|
LONG AddRef()
|
|
{
|
|
++m_lRef;
|
|
return m_lRef;
|
|
}
|
|
LONG Release()
|
|
{
|
|
--m_lRef;
|
|
|
|
if (0 == m_lRef)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
return m_lRef;
|
|
}
|
|
|
|
Aggplus::CImage* GetImage()
|
|
{
|
|
return &m_oImage;
|
|
}
|
|
};
|
|
|
|
class CImageFilesCache
|
|
{
|
|
private:
|
|
CAtlMap<CString, CCacheImage*> m_mapImages;
|
|
LONG m_lMaxCount;
|
|
|
|
LONG m_lRef;
|
|
|
|
CRITICAL_SECTION m_oCS;
|
|
|
|
public:
|
|
CImageFilesCache()
|
|
{
|
|
m_lMaxCount = 10;
|
|
m_lRef = 1;
|
|
|
|
InitializeCriticalSection(&m_oCS);
|
|
}
|
|
|
|
~CImageFilesCache()
|
|
{
|
|
Clear();
|
|
DeleteCriticalSection(&m_oCS);
|
|
}
|
|
|
|
void Clear()
|
|
{
|
|
CTemporaryCS oCS(&m_oCS);
|
|
POSITION pos = m_mapImages.GetStartPosition();
|
|
while (NULL != pos)
|
|
{
|
|
CCacheImage* pImage = m_mapImages.GetNextValue(pos);
|
|
pImage->Release();
|
|
}
|
|
|
|
m_mapImages.RemoveAll();
|
|
}
|
|
|
|
CCacheImage* Lock(CString& strFile)
|
|
{
|
|
CTemporaryCS oCS(&m_oCS);
|
|
|
|
CAtlMap<CString, CCacheImage*>::CPair* pPair = m_mapImages.Lookup(strFile);
|
|
if (NULL != pPair)
|
|
{
|
|
CCacheImage* pImage = pPair->m_value;
|
|
pImage->AddRef();
|
|
return pImage;
|
|
}
|
|
|
|
if ((LONG)m_mapImages.GetCount() >= m_lMaxCount)
|
|
{
|
|
LONG lNeedDelete = (LONG)m_mapImages.GetCount() - m_lMaxCount + 1;
|
|
|
|
POSITION pos = m_mapImages.GetStartPosition();
|
|
while ((NULL != pos) && (lNeedDelete > 0))
|
|
{
|
|
POSITION posRemove = pos;
|
|
CCacheImage* pImage = m_mapImages.GetNextValue(pos);
|
|
m_mapImages.RemoveAtPos(posRemove);
|
|
--lNeedDelete;
|
|
pImage->Release();
|
|
}
|
|
}
|
|
|
|
CCacheImage* pImage = new CCacheImage(strFile);
|
|
m_mapImages.SetAt(strFile, pImage);
|
|
|
|
pImage->AddRef();
|
|
return pImage;
|
|
}
|
|
|
|
LONG AddRef()
|
|
{
|
|
++m_lRef;
|
|
return m_lRef;
|
|
}
|
|
LONG Release()
|
|
{
|
|
--m_lRef;
|
|
|
|
if (0 == m_lRef)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
return m_lRef;
|
|
}
|
|
}; |