summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@collabora.com>2018-11-26 14:13:29 +0000
committerAndras Timar <andras.timar@collabora.com>2018-12-06 10:51:13 +0100
commit6dca7a2411c96f955c768b425bc4ac62bafacd0b (patch)
treec22d34314a80005a2e10ac2624fdd99abe2ae2b7 /vcl
parent244df39479a161ce6865cc3dde7629af15d5fa8f (diff)
Add explicit API scaling via ImageTree API.
Also add image scale to in-memory cache lookup. Change-Id: I1e84b922d4a9ab2f1723c5cb8a72f295c6940504 (cherry picked from commit 59b3cdbc27b65fb3e72dd0b3b2565851bc8f772c)
Diffstat (limited to 'vcl')
-rw-r--r--vcl/inc/implimagetree.hxx15
-rw-r--r--vcl/source/image/ImageTree.cxx10
-rw-r--r--vcl/source/image/ImplImageTree.cxx37
3 files changed, 45 insertions, 17 deletions
diff --git a/vcl/inc/implimagetree.hxx b/vcl/inc/implimagetree.hxx
index 98954704f2a7..31afc0663564 100644
--- a/vcl/inc/implimagetree.hxx
+++ b/vcl/inc/implimagetree.hxx
@@ -46,14 +46,17 @@ struct ImageRequestParameters
bool mbLocalized;
ImageLoadFlags meFlags;
bool mbWriteImageToCache;
+ sal_Int32 mnScalePercentage;
- 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, sal_Int32 nScalePercentage)
: msName(rName)
, msStyle(rStyle)
, mrBitmap(rBitmap)
, mbLocalized(bLocalized)
, meFlags(eFlags)
, mbWriteImageToCache(false)
+ , mnScalePercentage(nScalePercentage)
{}
bool convertToDarkTheme();
@@ -72,7 +75,8 @@ public:
bool loadImage(
OUString const & name, OUString const & style,
BitmapEx & bitmap, bool localized,
- const ImageLoadFlags eFlags);
+ const ImageLoadFlags eFlags,
+ sal_Int32 nScalePercentage = -1);
/** a crude form of life cycle control (called from DeInitVCL; otherwise,
* if the ImplImageTree singleton were destroyed during exit that would
@@ -85,14 +89,15 @@ private:
ImplImageTree(const ImplImageTree&) = delete;
ImplImageTree& operator=(const ImplImageTree&) = delete;
- typedef std::unordered_map<OUString, std::pair<bool, BitmapEx>> IconCache;
+ typedef std::unordered_map<OUString, std::pair<bool,BitmapEx>> IconCache;
+ typedef std::unordered_map<sal_Int32, std::unique_ptr<IconCache>> ScaledIconCache;
typedef std::unordered_map<OUString, OUString> IconLinkHash;
struct IconSet
{
OUString maURL;
css::uno::Reference<css::container::XNameAccess> maNameAccess;
- IconCache maIconCache;
+ ScaledIconCache maScaledIconCaches;
IconLinkHash maLinkHash;
IconSet()
@@ -127,6 +132,8 @@ private:
void createStyle();
+ IconCache &getIconCache(ImageRequestParameters& rParameters);
+
bool iconCacheLookup(ImageRequestParameters& rParameters);
bool findImage(std::vector<OUString> const & rPaths, ImageRequestParameters& rParameters);
diff --git a/vcl/source/image/ImageTree.cxx b/vcl/source/image/ImageTree.cxx
index bbce46b0f280..7978e5d0cdd7 100644
--- a/vcl/source/image/ImageTree.cxx
+++ b/vcl/source/image/ImageTree.cxx
@@ -32,9 +32,17 @@ OUString ImageTree::getImageUrl(OUString const & rName, OUString const & rStyle,
bool ImageTree::loadImage(OUString const & rName, OUString const & rStyle,
BitmapEx & rBitmap, bool bLocalized,
+ sal_Int32 nScalePercentage,
const ImageLoadFlags eFlags)
{
- return mpImplImageTree->loadImage(rName, rStyle, rBitmap, bLocalized, eFlags);
+ return mpImplImageTree->loadImage(rName, rStyle, rBitmap, bLocalized, eFlags, nScalePercentage);
+}
+
+bool ImageTree::loadImage(OUString const & rName, OUString const & rStyle,
+ BitmapEx & rBitmap, bool bLocalized,
+ const ImageLoadFlags eFlags)
+{
+ return loadImage(rName, rStyle, rBitmap, bLocalized, -1, eFlags);
}
css::uno::Reference<css::container::XNameAccess> ImageTree::getNameAccess()
diff --git a/vcl/source/image/ImplImageTree.cxx b/vcl/source/image/ImplImageTree.cxx
index a21700cc8501..30d9d9d38b7d 100644
--- a/vcl/source/image/ImplImageTree.cxx
+++ b/vcl/source/image/ImplImageTree.cxx
@@ -66,6 +66,8 @@ sal_Int32 ImageRequestParameters::scalePercentage()
sal_Int32 aScalePercentage = 100;
if (!(meFlags & ImageLoadFlags::IgnoreScalingFactor))
aScalePercentage = Application::GetDefaultDevice()->GetDPIScalePercentage();
+ else if (mnScalePercentage > 0)
+ aScalePercentage = mnScalePercentage;
return aScalePercentage;
}
@@ -93,17 +95,17 @@ OUString createPath(OUString const & name, sal_Int32 pos, OUString const & local
return name.copy(0, pos + 1) + locale + name.copy(pos);
}
-OUString getIconCacheUrl(OUString const & sStyle, OUString const & sVariant, OUString const & sName)
+OUString getIconCacheUrl(OUString const & sVariant, ImageRequestParameters const & rParameters)
{
OUString sUrl("${$BRAND_BASE_DIR/" LIBO_ETC_FOLDER "/" SAL_CONFIGFILE("bootstrap") ":UserInstallation}/cache/");
- sUrl += sStyle + "/" + sVariant + "/" + sName;
+ sUrl += rParameters.msStyle + "/" + sVariant + "/" + rParameters.msName;
rtl::Bootstrap::expandMacros(sUrl);
return sUrl;
}
-OUString createIconCacheUrl(OUString const & sStyle, OUString const & sVariant, OUString const & sName)
+OUString createIconCacheUrl(OUString const & sVariant, ImageRequestParameters const & rParameters)
{
- OUString sUrl(getIconCacheUrl(sStyle, sVariant, sName));
+ OUString sUrl(getIconCacheUrl(sVariant, rParameters));
OUString sDir = sUrl.copy(0, sUrl.lastIndexOf('/'));
osl::Directory::createPath(sDir);
return sUrl;
@@ -272,14 +274,15 @@ OUString ImplImageTree::fallbackStyle(const OUString& rsStyle)
return sResult;
}
-bool ImplImageTree::loadImage(OUString const & rName, OUString const & rStyle, BitmapEx & rBitmap, bool localized, const ImageLoadFlags eFlags)
+bool ImplImageTree::loadImage(OUString const & rName, OUString const & rStyle, BitmapEx & rBitmap, bool localized,
+ const ImageLoadFlags eFlags, sal_Int32 nScalePercentage)
{
OUString aCurrentStyle(rStyle);
while (!aCurrentStyle.isEmpty())
{
try
{
- ImageRequestParameters aParameters(rName, aCurrentStyle, rBitmap, localized, eFlags);
+ ImageRequestParameters aParameters(rName, aCurrentStyle, rBitmap, localized, eFlags, nScalePercentage);
if (doLoadImage(aParameters))
return true;
}
@@ -306,7 +309,7 @@ OUString createVariant(ImageRequestParameters& rParameters)
bool loadDiskCachedVersion(OUString const & sVariant, ImageRequestParameters& rParameters)
{
- OUString sUrl(getIconCacheUrl(rParameters.msStyle, sVariant, rParameters.msName));
+ OUString sUrl(getIconCacheUrl(sVariant, rParameters));
if (!urlExists(sUrl))
return false;
SvFileStream aFileStream(sUrl, StreamMode::READ);
@@ -318,7 +321,7 @@ bool loadDiskCachedVersion(OUString const & sVariant, ImageRequestParameters& rP
void cacheBitmapToDisk(OUString const & sVariant, ImageRequestParameters const & rParameters)
{
- OUString sUrl(createIconCacheUrl(rParameters.msStyle, sVariant, rParameters.msName));
+ OUString sUrl(createIconCacheUrl(sVariant, rParameters));
vcl::PNGWriter aWriter(rParameters.mrBitmap);
try
{
@@ -339,9 +342,7 @@ bool ImplImageTree::doLoadImage(ImageRequestParameters& rParameters)
OUString aVariant = createVariant(rParameters);
if (loadDiskCachedVersion(aVariant, rParameters))
- {
return true;
- }
if (!rParameters.mrBitmap.IsEmpty())
rParameters.mrBitmap.SetEmpty();
@@ -371,7 +372,7 @@ bool ImplImageTree::doLoadImage(ImageRequestParameters& rParameters)
{
cacheBitmapToDisk(aVariant, rParameters);
}
- getCurrentIconSet().maIconCache[rParameters.msName] = std::make_pair(rParameters.mbLocalized, rParameters.mrBitmap);
+ getIconCache(rParameters)[rParameters.msName] = std::make_pair(rParameters.mbLocalized, rParameters.mrBitmap);
}
return bFound;
@@ -439,9 +440,20 @@ void ImplImageTree::createStyle()
loadImageLinks();
}
+/// Find an icon cache for the right scale factor
+ImplImageTree::IconCache &ImplImageTree::getIconCache(ImageRequestParameters& rParameters)
+{
+ IconSet &rSet = getCurrentIconSet();
+ auto it = rSet.maScaledIconCaches.find(rParameters.mnScalePercentage);
+ if ( it != rSet.maScaledIconCaches.end() )
+ return *it->second.get();
+ rSet.maScaledIconCaches[rParameters.mnScalePercentage] = std::unique_ptr<IconCache>(new IconCache);
+ return *rSet.maScaledIconCaches[rParameters.mnScalePercentage].get();
+}
+
bool ImplImageTree::iconCacheLookup(ImageRequestParameters& rParameters)
{
- IconCache& rIconCache = getCurrentIconSet().maIconCache;
+ IconCache& rIconCache = getIconCache(rParameters);
IconCache::iterator i(rIconCache.find(getRealImageName(rParameters.msName)));
if (i != rIconCache.end() && i->second.first == rParameters.mbLocalized)
@@ -470,6 +482,7 @@ bool ImplImageTree::findImage(std::vector<OUString> const & rPaths, ImageRequest
(void)ok; // prevent unused warning in release build
loadImageFromStream(wrapStream(aStream), rPath, rParameters);
+
return true;
}
}