framework/source/uielement/popuptoolbarcontroller.cxx |   22 +++++-----------
 include/svtools/imagemgr.hxx                          |    5 ++-
 include/vcl/image.hxx                                 |    4 +--
 svtools/source/misc/imagemgr.cxx                      |   14 +++++-----
 vcl/inc/image.h                                       |   24 +++++++++++++-----
 vcl/source/image/Image.cxx                            |    6 ++--
 vcl/source/image/ImplImage.cxx                        |   13 +++++++--
 7 files changed, 50 insertions(+), 38 deletions(-)

New commits:
commit 812f0a83d223cddf00b121db40ca7ff91c22ccfa
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri Apr 12 11:11:13 2019 +0900
Commit:     Tomaž Vajngerl <qui...@gmail.com>
CommitDate: Fri Apr 12 13:56:53 2019 +0200

    internally resize image instead of scaling bitmaps outside
    
    When we want a different size Image, we can now set that as a
    parameter at construction of the Image. Previously we needed to
    create an Image, forcefully take the bitmap out, resize the bitmap
    and create a new Image out of that.
    Doing it internally gives us the benefit to have a more control
    over the scaling process, especially when dealing with HiDPI
    images.
    
    Change-Id: I104118f4d863d519cc7aad1a17ca0289c01ed9ff
    Reviewed-on: https://gerrit.libreoffice.org/70617
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <qui...@gmail.com>

diff --git a/framework/source/uielement/popuptoolbarcontroller.cxx 
b/framework/source/uielement/popuptoolbarcontroller.cxx
index 94d056daf60d..6d325ff4f452 100644
--- a/framework/source/uielement/popuptoolbarcontroller.cxx
+++ b/framework/source/uielement/popuptoolbarcontroller.cxx
@@ -785,25 +785,17 @@ void NewToolbarController::setItemImage( const OUString 
&rCommand )
     bool bBig = SvtMiscOptions().AreCurrentSymbolsLarge();
 
     INetURLObject aURLObj( aURL );
-    Image aImage = SvFileInformationManager::GetImageNoDefault( aURLObj, bBig 
);
-    if ( !aImage )
-        aImage = !!aMenuImage ?
-            aMenuImage :
-            SvFileInformationManager::GetImage( aURLObj, bBig );
-
+    Size aPreferredSize(bBig ? pToolBox->GetDefaultImageSize() : Size());
+    Image aImage = SvFileInformationManager::GetImageNoDefault(aURLObj, bBig, 
aPreferredSize);
+    if (!aImage)
+    {
+        aImage = !!aMenuImage ? aMenuImage : 
SvFileInformationManager::GetImage(aURLObj, bBig, aPreferredSize);
+    }
     // if everything failed, just use the image associated with the toolbar 
item command
     if ( !aImage )
         return;
 
-    Size aBigSize( pToolBox->GetDefaultImageSize() );
-    if ( bBig && aImage.GetSizePixel() != aBigSize )
-    {
-        BitmapEx aScaleBmpEx( aImage.GetBitmapEx() );
-        aScaleBmpEx.Scale( aBigSize, BmpScaleFlag::Interpolate );
-        pToolBox->SetItemImage( m_nToolBoxId, Image( aScaleBmpEx ) );
-    }
-    else
-        pToolBox->SetItemImage( m_nToolBoxId, aImage );
+    pToolBox->SetItemImage( m_nToolBoxId, aImage );
 
     m_aLastURL = aURL;
 }
diff --git a/include/svtools/imagemgr.hxx b/include/svtools/imagemgr.hxx
index 45212829b5c6..697ab8aeb41c 100644
--- a/include/svtools/imagemgr.hxx
+++ b/include/svtools/imagemgr.hxx
@@ -22,6 +22,7 @@
 
 #include <rtl/ustring.hxx>
 #include <svtools/svtdllapi.h>
+#include <tools/gen.hxx>
 
 enum class SvImageId {
     NONE                   =    0,
@@ -119,10 +120,10 @@ private:
 
 public:
     SVT_DLLPUBLIC static OUString GetImageId( const INetURLObject& rURL, bool 
bBig = false );
-    SVT_DLLPUBLIC static Image  GetImage( const INetURLObject& rURL, bool bBig 
= false );
+    SVT_DLLPUBLIC static Image  GetImage( const INetURLObject& rURL, bool bBig 
= false, Size const & rPreferredSize = Size());
     SVT_DLLPUBLIC static OUString GetFileImageId( const INetURLObject& rURL );
     SVT_DLLPUBLIC static Image  GetFileImage( const INetURLObject& rURL );
-    SVT_DLLPUBLIC static Image  GetImageNoDefault( const INetURLObject& rURL, 
bool bBig = false );
+    SVT_DLLPUBLIC static Image  GetImageNoDefault(const INetURLObject& rURL, 
bool bBig = false, Size const & rPreferredSize = Size());
     SVT_DLLPUBLIC static Image  GetFolderImage( const svtools::VolumeInfo& 
rInfo );
 
     SVT_DLLPUBLIC static OUString GetDescription( const INetURLObject& rObject 
);
diff --git a/include/vcl/image.hxx b/include/vcl/image.hxx
index b2f64c138bac..4c5047518bf3 100644
--- a/include/vcl/image.hxx
+++ b/include/vcl/image.hxx
@@ -27,7 +27,7 @@
 
 #include <memory>
 
-struct ImplImage;
+class ImplImage;
 
 namespace com::sun::star::graphic { class XGraphic; }
 namespace com::sun::star::uno { template <class interface_type> class 
Reference; }
@@ -57,7 +57,7 @@ public:
     explicit Image(BitmapEx const & rBitmapEx);
     explicit Image(css::uno::Reference<css::graphic::XGraphic> const & 
rxGraphic);
     explicit Image(OUString const & rPNGFileUrl);
-    explicit Image(StockImage , OUString const & rPNGFilePath);
+    explicit Image(StockImage, OUString const & rPNGFilePath, Size 
aSpecificSize = Size());
 
     Size GetSizePixel() const;
     BitmapEx GetBitmapEx() const;
diff --git a/svtools/source/misc/imagemgr.cxx b/svtools/source/misc/imagemgr.cxx
index fdb556d6184c..5e688394e4dd 100644
--- a/svtools/source/misc/imagemgr.cxx
+++ b/svtools/source/misc/imagemgr.cxx
@@ -686,11 +686,11 @@ static OUString GetImageNameFromList_Impl( SvImageId 
nImageId, bool bBig )
     return OUString();
 }
 
-static Image GetImageFromList_Impl( SvImageId nImageId, bool bBig )
+static Image GetImageFromList_Impl( SvImageId nImageId, bool bBig, Size aSize 
= Size())
 {
     OUString sImageName(GetImageNameFromList_Impl(nImageId, bBig));
     if (!sImageName.isEmpty())
-        return Image(StockImage::Yes, sImageName);
+        return Image(StockImage::Yes, sImageName, aSize);
     return Image();
 }
 
@@ -766,11 +766,11 @@ OUString SvFileInformationManager::GetImageId(const 
INetURLObject& rObject, bool
     return GetImageNameFromList_Impl(nImage, bBig);
 }
 
-Image SvFileInformationManager::GetImage( const INetURLObject& rObject, bool 
bBig )
+Image SvFileInformationManager::GetImage(const INetURLObject& rObject, bool 
bBig, Size const & rPreferredSize)
 {
     SvImageId nImage = GetImageId_Impl( rObject, true );
     DBG_ASSERT( nImage != SvImageId::NONE, "invalid ImageId" );
-    return GetImageFromList_Impl( nImage, bBig );
+    return GetImageFromList_Impl(nImage, bBig, rPreferredSize);
 }
 
 OUString SvFileInformationManager::GetFileImageId(const INetURLObject& rObject)
@@ -787,15 +787,15 @@ Image SvFileInformationManager::GetFileImage( const 
INetURLObject& rObject )
     return GetImageFromList_Impl( nImage, false/*bBig*/ );
 }
 
-Image SvFileInformationManager::GetImageNoDefault( const INetURLObject& 
rObject, bool bBig )
+Image SvFileInformationManager::GetImageNoDefault(const INetURLObject& 
rObject, bool bBig, Size const & rPreferredSize)
 {
-    SvImageId nImage = GetImageId_Impl( rObject, true );
+    SvImageId nImage = GetImageId_Impl(rObject, true);
     DBG_ASSERT( nImage != SvImageId::NONE, "invalid ImageId" );
 
     if ( nImage == SvImageId::File )
         return Image();
 
-    return GetImageFromList_Impl( nImage, bBig );
+    return GetImageFromList_Impl(nImage, bBig, rPreferredSize);
 }
 
 Image SvFileInformationManager::GetFolderImage( const svtools::VolumeInfo& 
rInfo )
diff --git a/vcl/inc/image.h b/vcl/inc/image.h
index c9fb5393191a..c5acc06f782a 100644
--- a/vcl/inc/image.h
+++ b/vcl/inc/image.h
@@ -25,22 +25,31 @@
 #include <unordered_map>
 #include <vector>
 
-struct ImplImage
+class ImplImage
 {
+private:
     BitmapChecksum maBitmapChecksum;
     /// if non-empty: cached original size of maStockName else Size of maBitmap
-    Size     maSizePixel;
+    Size maSizePixel;
+    Size maPreferedSizePixel;
     /// If set - defines the bitmap via images.zip*
     OUString maStockName;
 
+
     /// Original bitmap - or cache of a potentially scaled bitmap
     BitmapEx maBitmapEx;
     BitmapEx maDisabledBitmapEx;
 
+    bool loadStockAtScale(double fScale, BitmapEx &rBitmapEx);
+
+public:
     ImplImage(const BitmapEx& rBitmapEx);
-    ImplImage(const OUString &aStockName);
+    ImplImage(const OUString &aStockName, Size const & rPreferedSize);
 
-    bool isStock() const { return maStockName.getLength() > 0; }
+    bool isStock() const
+    {
+        return maStockName.getLength() > 0;
+    }
 
     /// get size in co-ordinates not scaled for HiDPI
     Size getSizePixel();
@@ -48,9 +57,12 @@ struct ImplImage
     BitmapEx getBitmapEx(bool bDisabled = false);
     /// Taking account of HiDPI scaling
     BitmapEx getBitmapExForHiDPI(bool bDisabled = false);
+
     bool isEqual(const ImplImage &ref) const;
-    bool isSizeEmpty() const { return maSizePixel == Size(0, 0); }
-    bool loadStockAtScale(double fScale, BitmapEx &rBitmapEx);
+    bool isSizeEmpty() const
+    {
+        return maSizePixel == Size();
+    }
 };
 
 #endif // INCLUDED_VCL_INC_IMAGE_H
diff --git a/vcl/source/image/Image.cxx b/vcl/source/image/Image.cxx
index e52583b99bd9..4316f9145a16 100644
--- a/vcl/source/image/Image.cxx
+++ b/vcl/source/image/Image.cxx
@@ -60,7 +60,7 @@ Image::Image(const OUString & rFileUrl)
     OUString sImageName;
     if (rFileUrl.startsWith("private:graphicrepository/", &sImageName))
     {
-        mpImplData = std::make_shared<ImplImage>(sImageName);
+        mpImplData = std::make_shared<ImplImage>(sImageName, Size());
     }
     else
     {
@@ -72,8 +72,8 @@ Image::Image(const OUString & rFileUrl)
     }
 }
 
-Image::Image(StockImage, const OUString & rFileUrl)
-    : mpImplData(std::make_shared<ImplImage>(rFileUrl))
+Image::Image(StockImage, const OUString & rFileUrl, Size aSpecificSize)
+    : mpImplData(std::make_shared<ImplImage>(rFileUrl, aSpecificSize))
 {
 }
 
diff --git a/vcl/source/image/ImplImage.cxx b/vcl/source/image/ImplImage.cxx
index 95d605e47173..7605f88d9767 100644
--- a/vcl/source/image/ImplImage.cxx
+++ b/vcl/source/image/ImplImage.cxx
@@ -39,14 +39,16 @@
 ImplImage::ImplImage(const BitmapEx &rBitmapEx)
     : maBitmapChecksum(0)
     , maSizePixel(rBitmapEx.GetSizePixel())
+    , maPreferedSizePixel()
     , maBitmapEx(rBitmapEx)
 {
 }
 
-ImplImage::ImplImage(const OUString &aStockName)
+ImplImage::ImplImage(const OUString &aStockName, Size const & rPreferedSize)
     : maBitmapChecksum(0)
-    , maSizePixel(0,0) // defer size lookup
-    , maStockName( aStockName )
+    , maSizePixel() // defer size lookup
+    , maPreferedSizePixel(rPreferedSize)
+    , maStockName(aStockName)
 {
 }
 
@@ -61,6 +63,11 @@ bool ImplImage::loadStockAtScale(double fScale, BitmapEx 
&rBitmapEx)
         SAL_WARN("vcl", "Failed to load scaled image from " << maStockName << 
" at " << fScale);
         return false;
     }
+    if (maPreferedSizePixel != Size())
+    {
+        Size aScaleSize(maPreferedSizePixel.Width() * fScale, 
maPreferedSizePixel.Height() * fScale);
+        aBitmapEx.Scale(aScaleSize);
+    }
     rBitmapEx = aBitmapEx;
     return true;
 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to