27#include <rtl/ustring.hxx>
29#include <com/sun/star/uno/Any.hxx>
40class NoCacheCompaction
46 sal_Int32 nMaximalCacheSize)
47 : CacheCompactor(rCache, nMaximalCacheSize)
53 virtual void Run()
override { };
62class CacheCompactionByCompression
66 CacheCompactionByCompression (
68 sal_Int32 nMaximalCacheSize,
69 std::shared_ptr< ::sd::slidesorter::cache::BitmapCompressor> pCompressor);
72 virtual void Run()
override;
75 std::shared_ptr< ::sd::slidesorter::cache::BitmapCompressor> mpCompressor;
84 sal_Int32 nMaximalCacheSize)
86 static const char sNone[] =
"None";
88 std::shared_ptr<BitmapCompressor> pCompressor;
89 OUString sCompressionPolicy(
"PNGCompression");
91 if (aCompressionPolicy.has<OUString>())
92 aCompressionPolicy >>= sCompressionPolicy;
93 if (sCompressionPolicy ==
sNone)
94 pCompressor = std::make_shared<NoBitmapCompression>();
95 else if (sCompressionPolicy ==
"Erase")
96 pCompressor = std::make_shared<CompressionByDeletion>();
97 else if (sCompressionPolicy ==
"ResolutionReduction")
98 pCompressor = std::make_shared<ResolutionReduction>();
100 pCompressor = std::make_shared<PngCompression>();
102 ::std::unique_ptr<CacheCompactor> pCompactor;
103 OUString sCompactionPolicy(
"Compress");
105 if (aCompactionPolicy.has<OUString>())
106 aCompactionPolicy >>= sCompactionPolicy;
107 if (sCompactionPolicy ==
sNone)
108 pCompactor.reset(
new NoCacheCompaction(rCache,nMaximalCacheSize));
110 pCompactor.reset(
new CacheCompactionByCompression(rCache,nMaximalCacheSize,pCompressor));
123 sal_Int32 nMaximalCacheSize)
125 mnMaximalCacheSize(nMaximalCacheSize),
126 maCompactionTimer(
"sd CacheCompactor maCompactionTimer"),
127 mbIsCompactionRunning(false)
135 mbIsCompactionRunning =
true;
141 catch (
const css::uno::RuntimeException&)
144 catch (
const css::uno::Exception&)
148 mbIsCompactionRunning =
false;
157CacheCompactionByCompression::CacheCompactionByCompression (
159 sal_Int32 nMaximalCacheSize,
160 std::shared_ptr< ::sd::slidesorter::cache::BitmapCompressor> pCompressor)
161 : CacheCompactor(rCache,nMaximalCacheSize),
162 mpCompressor(
std::move(pCompressor))
166void CacheCompactionByCompression::Run()
168 if (mrCache.GetSize() <= mnMaximalCacheSize)
171 SAL_INFO(
"sd.sls", __func__ <<
": bitmap cache uses too much space: " << mrCache.GetSize() <<
" > " << mnMaximalCacheSize);
174 mrCache.GetCacheIndex());
175 for (
const auto& rpIndex : aIndex)
177 if (rpIndex ==
nullptr)
180 mrCache.Compress(rpIndex, mpCompressor);
181 if (mrCache.GetSize() < mnMaximalCacheSize)
184 mrCache.ReCalculateTotalCacheSize();
185 SAL_INFO(
"sd.sls", __func__ <<
": there are now " << mrCache.GetSize() <<
" bytes occupied");
void SetTimeout(sal_uInt64 nTimeoutMs)
void SetInvokeHandler(const Link< Timer *, void > &rLink)
virtual void Start(bool bStartTimer=true) override
This low level cache is the actual bitmap container.
::std::vector< CacheKey > CacheIndex
This is an interface class whose implementations are created via the Create() factory method.
virtual void RequestCompaction()
Request a compaction of the off-screen previews in the bitmap cache.
bool mbIsCompactionRunning
Timer maCompactionTimer
This timer is used to collect calls to RequestCompaction() and eventually call Run().
static ::std::unique_ptr< CacheCompactor > Create(BitmapCache &rCache, sal_Int32 nMaximalCacheSize)
Create a new instance of the CacheCompactor interface class.
virtual void Run()=0
This method actually tries to reduce the total number of bytes used by the off-screen preview bitmaps...
CacheCompactor(BitmapCache &rCache, sal_Int32 nMaximalCacheSize)
static std::shared_ptr< CacheConfiguration > Instance()
Return an instance to this class.
std::deque< AttacherIndex_Impl > aIndex
#define LINK(Instance, Class, Member)
#define SAL_INFO(area, stream)
IMPL_LINK_NOARG(CacheCompactor, CompactionCallback, Timer *, void)
constexpr OUStringLiteral sNone