Kaydet (Commit) 9097a8ff authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl Kaydeden (comit) Andras Timar

svg icon caching even for 1x scaling

Previously we cached an icon only if we changed the scaling factor
or re-colored the icon, however if we have svg icons we want to
cache all of the variants, including the unscaled/un-colored one
as svg rendering is slower than loading cached png icons.

Change-Id: Ie2c14687892bbd12b8e04c690a66c5a1a92ac8b0
Reviewed-on: https://gerrit.libreoffice.org/47498Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarTomaž Vajngerl <quikee@gmail.com>
(cherry picked from commit 57d95030)
üst 8fefb640
...@@ -45,6 +45,7 @@ struct ImageRequestParameters ...@@ -45,6 +45,7 @@ struct ImageRequestParameters
BitmapEx& mrBitmap; BitmapEx& mrBitmap;
bool mbLocalized; bool mbLocalized;
ImageLoadFlags meFlags; ImageLoadFlags meFlags;
bool mbWriteImageToCache;
ImageRequestParameters(const OUString & rName, const OUString & rStyle, BitmapEx& rBitmap, bool bLocalized, ImageLoadFlags eFlags) ImageRequestParameters(const OUString & rName, const OUString & rStyle, BitmapEx& rBitmap, bool bLocalized, ImageLoadFlags eFlags)
: msName(rName) : msName(rName)
...@@ -52,6 +53,7 @@ struct ImageRequestParameters ...@@ -52,6 +53,7 @@ struct ImageRequestParameters
, mrBitmap(rBitmap) , mrBitmap(rBitmap)
, mbLocalized(bLocalized) , mbLocalized(bLocalized)
, meFlags(eFlags) , meFlags(eFlags)
, mbWriteImageToCache(false)
{} {}
bool convertToDarkTheme(); bool convertToDarkTheme();
......
...@@ -156,6 +156,7 @@ void loadImageFromStream(std::shared_ptr<SvStream> const & xStream, OUString con ...@@ -156,6 +156,7 @@ void loadImageFromStream(std::shared_ptr<SvStream> const & xStream, OUString con
} }
else if (rPath.endsWith(".svg")) else if (rPath.endsWith(".svg"))
{ {
rParameters.mbWriteImageToCache = true; // We always want to cache a SVG image
vcl::bitmap::loadFromSvg(*xStream.get(), rPath, rParameters.mrBitmap, aScalePercentage / 100.0); vcl::bitmap::loadFromSvg(*xStream.get(), rPath, rParameters.mrBitmap, aScalePercentage / 100.0);
if (bConvertToDarkTheme) if (bConvertToDarkTheme)
rParameters.mrBitmap = BitmapProcessor::createLightImage(rParameters.mrBitmap); rParameters.mrBitmap = BitmapProcessor::createLightImage(rParameters.mrBitmap);
...@@ -167,10 +168,14 @@ void loadImageFromStream(std::shared_ptr<SvStream> const & xStream, OUString con ...@@ -167,10 +168,14 @@ void loadImageFromStream(std::shared_ptr<SvStream> const & xStream, OUString con
} }
if (bConvertToDarkTheme) if (bConvertToDarkTheme)
{
rParameters.mbWriteImageToCache = true; // Cache the dark variant
rParameters.mrBitmap = BitmapProcessor::createLightImage(rParameters.mrBitmap); rParameters.mrBitmap = BitmapProcessor::createLightImage(rParameters.mrBitmap);
}
if (aScalePercentage > 100) if (aScalePercentage > 100)
{ {
rParameters.mbWriteImageToCache = true; // Cache the scaled variant
double aScaleFactor(aScalePercentage / 100.0); double aScaleFactor(aScalePercentage / 100.0);
rParameters.mrBitmap.Scale(aScaleFactor, aScaleFactor, BmpScaleFlag::Fast); rParameters.mrBitmap.Scale(aScaleFactor, aScaleFactor, BmpScaleFlag::Fast);
} }
...@@ -267,21 +272,21 @@ OUString ImplImageTree::fallbackStyle(const OUString& rsStyle) ...@@ -267,21 +272,21 @@ OUString ImplImageTree::fallbackStyle(const OUString& rsStyle)
return sResult; return sResult;
} }
bool ImplImageTree::loadImage(OUString const & name, OUString const & style, BitmapEx & rBitmap, bool localized, const ImageLoadFlags eFlags) bool ImplImageTree::loadImage(OUString const & rName, OUString const & rStyle, BitmapEx & rBitmap, bool localized, const ImageLoadFlags eFlags)
{ {
OUString aStyle(style); OUString aCurrentStyle(rStyle);
while (!aStyle.isEmpty()) while (!aCurrentStyle.isEmpty())
{ {
try try
{ {
ImageRequestParameters aParameters(name, aStyle, rBitmap, localized, eFlags); ImageRequestParameters aParameters(rName, aCurrentStyle, rBitmap, localized, eFlags);
if (doLoadImage(aParameters)) if (doLoadImage(aParameters))
return true; return true;
} }
catch (css::uno::RuntimeException &) catch (css::uno::RuntimeException &)
{} {}
aStyle = fallbackStyle(aStyle); aCurrentStyle = fallbackStyle(aCurrentStyle);
} }
return false; return false;
} }
...@@ -291,11 +296,7 @@ OUString createVariant(ImageRequestParameters& rParameters) ...@@ -291,11 +296,7 @@ OUString createVariant(ImageRequestParameters& rParameters)
bool bConvertToDarkTheme = rParameters.convertToDarkTheme(); bool bConvertToDarkTheme = rParameters.convertToDarkTheme();
sal_Int32 aScalePercentage = rParameters.scalePercentage(); sal_Int32 aScalePercentage = rParameters.scalePercentage();
OUString aVariant; OUString aVariant = OUString::number(aScalePercentage);
if (aScalePercentage == 100 && !bConvertToDarkTheme)
return aVariant;
aVariant = OUString::number(aScalePercentage);
if (bConvertToDarkTheme) if (bConvertToDarkTheme)
aVariant += "-dark"; aVariant += "-dark";
...@@ -310,7 +311,7 @@ bool loadDiskCachedVersion(OUString const & sVariant, ImageRequestParameters& rP ...@@ -310,7 +311,7 @@ bool loadDiskCachedVersion(OUString const & sVariant, ImageRequestParameters& rP
return false; return false;
SvFileStream aFileStream(sUrl, StreamMode::READ); SvFileStream aFileStream(sUrl, StreamMode::READ);
vcl::PNGReader aPNGReader(aFileStream); vcl::PNGReader aPNGReader(aFileStream);
aPNGReader.SetIgnoreGammaChunk( true ); aPNGReader.SetIgnoreGammaChunk(true);
rParameters.mrBitmap = aPNGReader.Read(); rParameters.mrBitmap = aPNGReader.Read();
return true; return true;
} }
...@@ -336,18 +337,24 @@ bool ImplImageTree::doLoadImage(ImageRequestParameters& rParameters) ...@@ -336,18 +337,24 @@ bool ImplImageTree::doLoadImage(ImageRequestParameters& rParameters)
if (iconCacheLookup(rParameters)) if (iconCacheLookup(rParameters))
return true; return true;
OUString aVariant = createVariant(rParameters);
if (loadDiskCachedVersion(aVariant, rParameters))
{
return true;
}
if (!rParameters.mrBitmap.IsEmpty()) if (!rParameters.mrBitmap.IsEmpty())
rParameters.mrBitmap.SetEmpty(); rParameters.mrBitmap.SetEmpty();
LanguageTag aLanguageTag = Application::GetSettings().GetUILanguageTag(); LanguageTag aLanguageTag = Application::GetSettings().GetUILanguageTag();
std::vector<OUString> paths = getPaths(rParameters.msName, aLanguageTag); std::vector<OUString> aPaths = getPaths(rParameters.msName, aLanguageTag);
bool bFound = false; bool bFound = false;
try try
{ {
bFound = findImage(paths, rParameters); bFound = findImage(aPaths, rParameters);
} }
catch (css::uno::RuntimeException&) catch (css::uno::RuntimeException&)
{ {
...@@ -355,14 +362,15 @@ bool ImplImageTree::doLoadImage(ImageRequestParameters& rParameters) ...@@ -355,14 +362,15 @@ bool ImplImageTree::doLoadImage(ImageRequestParameters& rParameters)
} }
catch (const css::uno::Exception& e) catch (const css::uno::Exception& e)
{ {
SAL_INFO("vcl", "ImplImageTree::doLoadImage " << e); SAL_INFO("vcl", "ImplImageTree::doLoadImage exception: " << e);
} }
if (bFound) if (bFound)
{ {
OUString aVariant = createVariant(rParameters); if (rParameters.mbWriteImageToCache)
if (!aVariant.isEmpty()) {
cacheBitmapToDisk(aVariant, rParameters); cacheBitmapToDisk(aVariant, rParameters);
}
getCurrentIconSet().maIconCache[rParameters.msName] = std::make_pair(rParameters.mbLocalized, rParameters.mrBitmap); getCurrentIconSet().maIconCache[rParameters.msName] = std::make_pair(rParameters.mbLocalized, rParameters.mrBitmap);
} }
...@@ -442,18 +450,17 @@ bool ImplImageTree::iconCacheLookup(ImageRequestParameters& rParameters) ...@@ -442,18 +450,17 @@ bool ImplImageTree::iconCacheLookup(ImageRequestParameters& rParameters)
return true; return true;
} }
OUString aVariant = createVariant(rParameters); return false;
return !aVariant.isEmpty() && loadDiskCachedVersion(aVariant, rParameters);
} }
bool ImplImageTree::findImage(std::vector<OUString> const & paths, ImageRequestParameters& rParameters) bool ImplImageTree::findImage(std::vector<OUString> const & rPaths, ImageRequestParameters& rParameters)
{ {
if (!checkPathAccess()) if (!checkPathAccess())
return false; return false;
const css::uno::Reference<css::container::XNameAccess>& rNameAccess = getCurrentIconSet().maNameAccess; css::uno::Reference<css::container::XNameAccess> const & rNameAccess = getCurrentIconSet().maNameAccess;
for (const OUString& rPath : paths) for (OUString const & rPath : rPaths)
{ {
if (rNameAccess->hasByName(rPath)) if (rNameAccess->hasByName(rPath))
{ {
......
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