Kaydet (Commit) 9f3926df authored tarafından Caolán McNamara's avatar Caolán McNamara

tdf#123165 cache recently scaled bitmaps for reuse

dropping the cached scaled bitmap when the bitmap
is accesed via BitmapAccessMode::Write for writing

Change-Id: Ib6539522944838238bd699ec3531039d21dc0f8b
Reviewed-on: https://gerrit.libreoffice.org/67459
Tested-by: Jenkins
Reviewed-by: 's avatarCaolán McNamara <caolanm@redhat.com>
Tested-by: 's avatarCaolán McNamara <caolanm@redhat.com>
üst 467324f1
...@@ -73,6 +73,8 @@ public: ...@@ -73,6 +73,8 @@ public:
virtual bool ScalingSupported() const = 0; virtual bool ScalingSupported() const = 0;
virtual bool Scale( const double& rScaleX, const double& rScaleY, BmpScaleFlag nScaleFlag ) = 0; virtual bool Scale( const double& rScaleX, const double& rScaleY, BmpScaleFlag nScaleFlag ) = 0;
void DropScaledCache();
virtual bool Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uInt8 nTol ) = 0; virtual bool Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uInt8 nTol ) = 0;
virtual bool ConvertToGreyscale() virtual bool ConvertToGreyscale()
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <config_version.h> #include <config_version.h>
#include <o3tl/lru_map.hxx>
#include <tools/fldunit.hxx> #include <tools/fldunit.hxx>
#include <unotools/options.hxx> #include <unotools/options.hxx>
#include <vcl/bitmapex.hxx> #include <vcl/bitmapex.hxx>
...@@ -194,6 +195,7 @@ struct ImplSVGDIData ...@@ -194,6 +195,7 @@ struct ImplSVGDIData
std::unique_ptr<ImplPrnQueueList> mpPrinterQueueList; // List of all printer queue std::unique_ptr<ImplPrnQueueList> mpPrinterQueueList; // List of all printer queue
std::shared_ptr<PhysicalFontCollection> mxScreenFontList; // Screen-Font-List std::shared_ptr<PhysicalFontCollection> mxScreenFontList; // Screen-Font-List
std::shared_ptr<ImplFontCache> mxScreenFontCache; // Screen-Font-Cache std::shared_ptr<ImplFontCache> mxScreenFontCache; // Screen-Font-Cache
o3tl::lru_map<SalBitmap*, BitmapEx> maScaleCache = o3tl::lru_map<SalBitmap*, BitmapEx>(10); // Cache for scaled images
ImplDirectFontSubstitution* mpDirectFontSubst = nullptr; // Font-Substitutions defined in Tools->Options->Fonts ImplDirectFontSubstitution* mpDirectFontSubst = nullptr; // Font-Substitutions defined in Tools->Options->Fonts
GraphicConverter* mpGrfConverter = nullptr; // Converter for graphics GraphicConverter* mpGrfConverter = nullptr; // Converter for graphics
long mnAppFontX = 0; // AppFont X-Numenator for 40/tel Width long mnAppFontX = 0; // AppFont X-Numenator for 40/tel Width
......
...@@ -144,8 +144,19 @@ SalTimer::~SalTimer() COVERITY_NOEXCEPT_FALSE ...@@ -144,8 +144,19 @@ SalTimer::~SalTimer() COVERITY_NOEXCEPT_FALSE
{ {
} }
void SalBitmap::DropScaledCache()
{
if (ImplSVData* pSVData = ImplGetSVData())
{
auto& rCache = pSVData->maGDIData.maScaleCache;
rCache.remove_if([this] (const o3tl::lru_map<SalBitmap*, BitmapEx>::key_value_pair_t& rKeyValuePair)
{ return rKeyValuePair.first == this; });
}
}
SalBitmap::~SalBitmap() SalBitmap::~SalBitmap()
{ {
DropScaledCache();
} }
SalI18NImeStatus::~SalI18NImeStatus() SalI18NImeStatus::~SalI18NImeStatus()
......
...@@ -574,6 +574,8 @@ void DeInitVCL() ...@@ -574,6 +574,8 @@ void DeInitVCL()
pSVData->maGDIData.mxScreenFontList.reset(); pSVData->maGDIData.mxScreenFontList.reset();
pSVData->maGDIData.mxScreenFontCache.reset(); pSVData->maGDIData.mxScreenFontCache.reset();
pSVData->maGDIData.maScaleCache.remove_if([](const o3tl::lru_map<SalBitmap*, BitmapEx>::key_value_pair_t&)
{ return true; });
// Deinit Sal // Deinit Sal
if (pSVData->mpDefInst) if (pSVData->mpDefInst)
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <algorithm> #include <algorithm>
#include <memory> #include <memory>
#include <svdata.hxx>
#include <sal/log.hxx> #include <sal/log.hxx>
namespace { namespace {
...@@ -934,6 +935,7 @@ BitmapScaleSuperFilter::~BitmapScaleSuperFilter() ...@@ -934,6 +935,7 @@ BitmapScaleSuperFilter::~BitmapScaleSuperFilter()
BitmapEx BitmapScaleSuperFilter::execute(BitmapEx const& rBitmap) const BitmapEx BitmapScaleSuperFilter::execute(BitmapEx const& rBitmap) const
{ {
Bitmap aBitmap(rBitmap.GetBitmap()); Bitmap aBitmap(rBitmap.GetBitmap());
SalBitmap* pKey = aBitmap.ImplGetSalBitmap().get();
bool bRet = false; bool bRet = false;
...@@ -953,6 +955,16 @@ BitmapEx BitmapScaleSuperFilter::execute(BitmapEx const& rBitmap) const ...@@ -953,6 +955,16 @@ BitmapEx BitmapScaleSuperFilter::execute(BitmapEx const& rBitmap) const
if (nDstW <= 1 || nDstH <= 1) if (nDstW <= 1 || nDstH <= 1)
return BitmapEx(); return BitmapEx();
// check cache for a previously scaled version of this
ImplSVData* pSVData = ImplGetSVData();
auto& rCache = pSVData->maGDIData.maScaleCache;
auto aFind = rCache.find(pKey);
if (aFind != rCache.end())
{
if (aFind->second.GetSizePixel().Width() == nDstW && aFind->second.GetSizePixel().Height() == nDstH)
return aFind->second;
}
{ {
Bitmap::ScopedReadAccess pReadAccess(aBitmap); Bitmap::ScopedReadAccess pReadAccess(aBitmap);
...@@ -1076,7 +1088,9 @@ BitmapEx BitmapScaleSuperFilter::execute(BitmapEx const& rBitmap) const ...@@ -1076,7 +1088,9 @@ BitmapEx BitmapScaleSuperFilter::execute(BitmapEx const& rBitmap) const
{ {
tools::Rectangle aRect(Point(0, 0), Point(nDstW, nDstH)); tools::Rectangle aRect(Point(0, 0), Point(nDstW, nDstH));
aBitmap.Crop(aRect); aBitmap.Crop(aRect);
return BitmapEx(aBitmap); BitmapEx aRet(aBitmap);
rCache.insert(std::make_pair(pKey, aRet));
return aRet;
} }
return BitmapEx(); return BitmapEx();
......
...@@ -41,11 +41,16 @@ BitmapInfoAccess::BitmapInfoAccess( Bitmap& rBitmap, BitmapAccessMode nMode ) : ...@@ -41,11 +41,16 @@ BitmapInfoAccess::BitmapInfoAccess( Bitmap& rBitmap, BitmapAccessMode nMode ) :
if( !xImpBmp ) if( !xImpBmp )
return; return;
if( mnAccessMode == BitmapAccessMode::Write && xImpBmp.use_count() > 2 ) if (mnAccessMode == BitmapAccessMode::Write)
{ {
xImpBmp.reset(); xImpBmp->DropScaledCache();
rBitmap.ImplMakeUnique();
xImpBmp = rBitmap.ImplGetSalBitmap(); if (xImpBmp.use_count() > 2)
{
xImpBmp.reset();
rBitmap.ImplMakeUnique();
xImpBmp = rBitmap.ImplGetSalBitmap();
}
} }
mpBuffer = xImpBmp->AcquireBuffer( mnAccessMode ); mpBuffer = xImpBmp->AcquireBuffer( mnAccessMode );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment