cui/source/tabpages/numpages.cxx             |    4 +-
 include/svx/dialog/ThemeColorsPaneBase.hxx   |    2 -
 include/svx/sidebar/LineWidthPopup.hxx       |    6 ++--
 include/svx/svxbmpnumiconview.hxx            |    6 ++--
 sd/source/ui/sidebar/LayoutMenu.cxx          |   21 +++-----------
 sd/source/ui/sidebar/LayoutMenu.hxx          |    3 --
 sd/source/ui/sidebar/MasterPagesSelector.cxx |   27 +++++-------------
 sd/source/ui/sidebar/MasterPagesSelector.hxx |    3 --
 svx/source/dialog/ThemeColorsPaneBase.cxx    |    7 ++--
 svx/source/dialog/svxbmpnumiconview.cxx      |   14 ++++-----
 svx/source/sidebar/line/LineWidthPopup.cxx   |   17 +++++------
 svx/source/tbxctrls/bulletsnumbering.cxx     |    2 -
 svx/source/tbxctrls/tbcontrl.cxx             |   39 +++++++++++++++------------
 13 files changed, 67 insertions(+), 84 deletions(-)

New commits:
commit 604a5672f173fc5b3a62f427e8de345294c1663f
Author:     Mike Kaganski <[email protected]>
AuthorDate: Sat Feb 21 15:27:52 2026 +0500
Commit:     Caolán McNamara <[email protected]>
CommitDate: Fri Feb 27 11:51:12 2026 +0100

    fix VirtualDevice GDI handle leaks in LineWidthPopup
    
    Similar to commit e9392c0c86fcf373e00ede92f8ceeee2c7efd233 (fix
    VirtualDevice GDI handle leaks across IconView callers, 2026-02-21).
    
    Change-Id: Iffe1eba57df0c5b69e0c1726a637050b8992e6bc
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199925
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Andras Timar <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200592
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/include/svx/sidebar/LineWidthPopup.hxx 
b/include/svx/sidebar/LineWidthPopup.hxx
index d8e84ffa0f1d..fafb25d2dfc9 100644
--- a/include/svx/sidebar/LineWidthPopup.hxx
+++ b/include/svx/sidebar/LineWidthPopup.hxx
@@ -61,9 +61,9 @@ private:
     DECL_LINK(QueryTooltipHdl, const weld::TreeIter&, OUString);
     DECL_LINK(MFModifyHdl, weld::MetricSpinButton&, void);
 
-    VclPtr<VirtualDevice> CreateLinePreview(sal_uInt16 nLineWidth, const 
OUString& rText);
-    VclPtr<VirtualDevice> CreateCustomPreview(const Image& rImage, const 
OUString& rText,
-                                              bool bEnabled);
+    ScopedVclPtr<VirtualDevice> CreateLinePreview(sal_uInt16 nLineWidth, const 
OUString& rText);
+    ScopedVclPtr<VirtualDevice> CreateCustomPreview(const Image& rImage, const 
OUString& rText,
+                                                    bool bEnabled);
     void PopulateIconView();
 };
 
diff --git a/svx/source/sidebar/line/LineWidthPopup.cxx 
b/svx/source/sidebar/line/LineWidthPopup.cxx
index 0d0b13c7aa8f..56a35845ee03 100644
--- a/svx/source/sidebar/line/LineWidthPopup.cxx
+++ b/svx/source/sidebar/line/LineWidthPopup.cxx
@@ -196,15 +196,14 @@ void LineWidthPopup::SetWidthSelect(tools::Long lValue, 
bool bValuable, MapUnit
         m_bCustom = true;
 
         OUString aStrTip = 
OUString::number(static_cast<double>(m_nCustomWidth) / 10) + m_sPt;
-        VclPtr<VirtualDevice> aCustomVDev = CreateCustomPreview(m_aIMGCus, 
aStrTip, true);
+        auto aCustomVDev = CreateCustomPreview(m_aIMGCus, aStrTip, true);
         m_xIVWidth->set_image(8, *aCustomVDev);
         m_xIVWidth->set_text(8, aStrTip);
     }
     else
     {
         m_bCustom = false;
-        VclPtr<VirtualDevice> aCustomVDev
-            = CreateCustomPreview(m_aIMGCusGray, maStrUnits[8], false);
+        auto aCustomVDev = CreateCustomPreview(m_aIMGCusGray, maStrUnits[8], 
false);
         m_xIVWidth->set_image(8, *aCustomVDev);
         m_xIVWidth->set_text(8, maStrUnits[8]);
     }
@@ -246,8 +245,8 @@ void LineWidthPopup::GrabFocus()
         m_xMFWidth->grab_focus();
 }
 
-VclPtr<VirtualDevice> LineWidthPopup::CreateLinePreview(sal_uInt16 nLineWidth,
-                                                        const OUString& rText)
+ScopedVclPtr<VirtualDevice> LineWidthPopup::CreateLinePreview(sal_uInt16 
nLineWidth,
+                                                              const OUString& 
rText)
 {
     VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
     pVDev->SetOutputSizePixel(aPreviewSize);
@@ -285,8 +284,8 @@ VclPtr<VirtualDevice> 
LineWidthPopup::CreateLinePreview(sal_uInt16 nLineWidth,
     return pVDev;
 }
 
-VclPtr<VirtualDevice> LineWidthPopup::CreateCustomPreview(const Image& rImage,
-                                                          const OUString& 
rText, bool bEnabled)
+ScopedVclPtr<VirtualDevice>
+LineWidthPopup::CreateCustomPreview(const Image& rImage, const OUString& 
rText, bool bEnabled)
 {
     VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
     pVDev->SetOutputSizePixel(aPreviewSize);
@@ -329,13 +328,13 @@ void LineWidthPopup::PopulateIconView()
     for (sal_uInt16 i = 1; i <= 8; ++i)
     {
         OUString sId = OUString::number(i);
-        VclPtr<VirtualDevice> aPreview = CreateLinePreview(i, maStrUnits[i - 
1]);
+        auto aPreview = CreateLinePreview(i, maStrUnits[i - 1]);
         Bitmap aBmp = aPreview->GetBitmap(Point(), 
aPreview->GetOutputSizePixel());
         m_xIVWidth->insert(-1, &maStrUnits[i - 1], &sId, &aBmp, nullptr);
     }
 
     OUString sCustomId = OUString::number(9);
-    VclPtr<VirtualDevice> aCustomPreview = CreateCustomPreview(m_aIMGCusGray, 
maStrUnits[8], false);
+    auto aCustomPreview = CreateCustomPreview(m_aIMGCusGray, maStrUnits[8], 
false);
     Bitmap aBmpCustom = aCustomPreview->GetBitmap(Point(), 
aCustomPreview->GetOutputSizePixel());
     m_xIVWidth->insert(-1, &maStrUnits[8], &sCustomId, &aBmpCustom, nullptr);
 }
commit f573b1f663af88ef5dd415350441c0414c4d00b4
Author:     Andras Timar <[email protected]>
AuthorDate: Sat Feb 21 08:41:42 2026 +0100
Commit:     Caolán McNamara <[email protected]>
CommitDate: Fri Feb 27 11:51:04 2026 +0100

    fix VirtualDevice GDI handle leaks across IconView callers
    
    Follow-up to c5f6227d8e71 ("use ScopedVclPtr to avoid leaks").
    
    Change factory functions that create VirtualDevices for IconView
    previews to return ScopedVclPtr<VirtualDevice> instead of plain
    VclPtr, so callers automatically dispose the GDI resources when
    the ScopedVclPtr goes out of scope.
    
    Affected APIs:
    - SvxBmpNumIconView::CreatePreviewFromUserDraw
    - SvxBmpNumIconView::CreateCustomBulletPreview
    - SvxBmpNumIconView::CreateBitmapBulletPreview
    - ThemeColorsPaneBase::CreateColorSetPreview
    - LineListBox::GetVirtualDevice
    - SvxFrameWindow_Impl::GetVirtualDevice
    - LayoutMenu::GetVirtualDevice
    - MasterPagesSelector::GetVirtualDevice
    
    For FontWorkGalleryDialog, where VDs are stored in a std::vector
    (incompatible with non-copyable ScopedVclPtr), add explicit
    disposal in the destructor instead.
    
    Change-Id: I5b3a4c94f6c4781c8eafa4d7a32696ec9fbb2dd3
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199923
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Mike Kaganski <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200591
    Reviewed-by: Caolán McNamara <[email protected]>
    Tested-by: Caolán McNamara <[email protected]>

diff --git a/cui/source/tabpages/numpages.cxx b/cui/source/tabpages/numpages.cxx
index b73fd2eccc6a..576bac4f3564 100644
--- a/cui/source/tabpages/numpages.cxx
+++ b/cui/source/tabpages/numpages.cxx
@@ -915,7 +915,7 @@ SvxBitmapPickTabPage::SvxBitmapPickTabPage(weld::Container* 
pPage, weld::DialogC
     size_t i = 0;
     for (auto & grfName : aGrfNames)
     {
-        VclPtr<VirtualDevice> pVDev = 
SvxBmpNumIconView::CreateBitmapBulletPreview(i);
+        auto pVDev = SvxBmpNumIconView::CreateBitmapBulletPreview(i);
 
         INetURLObject aObj(grfName);
         if (aObj.GetProtocol() == INetProtocol::File)
@@ -1182,7 +1182,7 @@ IMPL_LINK_NOARG(SvxBitmapPickTabPage, 
ClickAddBrowseHdl_Impl, weld::Button&, voi
     size_t i = 0;
     for (auto & grfName : aGrfNames)
     {
-        VclPtr<VirtualDevice> pVDev = 
SvxBmpNumIconView::CreateBitmapBulletPreview(i);
+        auto pVDev = SvxBmpNumIconView::CreateBitmapBulletPreview(i);
 
         INetURLObject aObj(grfName);
         if (aObj.GetProtocol() == INetProtocol::File)
diff --git a/include/svx/dialog/ThemeColorsPaneBase.hxx 
b/include/svx/dialog/ThemeColorsPaneBase.hxx
index 22fe401279c0..e3f00943fe24 100644
--- a/include/svx/dialog/ThemeColorsPaneBase.hxx
+++ b/include/svx/dialog/ThemeColorsPaneBase.hxx
@@ -33,7 +33,7 @@ protected:
     std::shared_ptr<model::ColorSet> mpCurrentColorSet;
 
     void initColorSets(model::Theme* pTheme = nullptr);
-    static VclPtr<VirtualDevice> CreateColorSetPreview(const model::ColorSet& 
rColorSet);
+    static ScopedVclPtr<VirtualDevice> CreateColorSetPreview(const 
model::ColorSet& rColorSet);
 
 public:
     explicit ThemeColorsPaneBase(std::unique_ptr<weld::IconView> xIconView);
diff --git a/include/svx/svxbmpnumiconview.hxx 
b/include/svx/svxbmpnumiconview.hxx
index 44c6cc583cda..fa4838ebf133 100644
--- a/include/svx/svxbmpnumiconview.hxx
+++ b/include/svx/svxbmpnumiconview.hxx
@@ -40,7 +40,7 @@ public:
         Reference<XNumberingFormatter> const& xFormatter = nullptr,
         const Locale& rLocale = Locale());
 
-    static VclPtr<VirtualDevice> CreatePreviewFromUserDraw(
+    static ScopedVclPtr<VirtualDevice> CreatePreviewFromUserDraw(
         NumberingPageType ePageType,
         sal_Int32 nIndex,
         Size previewSize,
@@ -50,7 +50,7 @@ public:
         const Locale& rLocale = Locale(),
         const std::vector<std::pair<OUString, OUString>>& rCustomBullets = 
std::vector<std::pair<OUString, OUString>>());
 
-    static VclPtr<VirtualDevice> CreateCustomBulletPreview(const OUString& 
rBulletChar, const OUString& rFontName);
+    static ScopedVclPtr<VirtualDevice> CreateCustomBulletPreview(const 
OUString& rBulletChar, const OUString& rFontName);
     static OUString GetNumberingDescription(NumberingPageType ePageType, 
sal_Int32 nIndex);
 
     static void SetNumberingSettings(
@@ -69,7 +69,7 @@ public:
         const Locale& rLocale,
         std::vector<std::pair<OUString, OUString>> maCustomBullets = 
std::vector<std::pair<OUString, OUString>>());
 
-    static VclPtr<VirtualDevice> CreateBitmapBulletPreview(sal_uInt32 
nGalleryIndex);
+    static ScopedVclPtr<VirtualDevice> CreateBitmapBulletPreview(sal_uInt32 
nGalleryIndex);
     static void PopulateBitmapIconView(weld::IconView* pIconView);
 };
 
diff --git a/sd/source/ui/sidebar/LayoutMenu.cxx 
b/sd/source/ui/sidebar/LayoutMenu.cxx
index d3278249f4ae..5c7c2e702621 100644
--- a/sd/source/ui/sidebar/LayoutMenu.cxx
+++ b/sd/source/ui/sidebar/LayoutMenu.cxx
@@ -436,7 +436,7 @@ SfxRequest LayoutMenu::CreateRequest (
     return aRequest;
 }
 
-VclPtr<VirtualDevice> LayoutMenu::GetVirtualDevice(Image pImage)
+ScopedVclPtr<VirtualDevice> LayoutMenu::GetVirtualDevice(Image pImage)
 {
     Bitmap aPreviewBitmap = pImage.GetBitmap();
     VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
@@ -450,16 +450,6 @@ VclPtr<VirtualDevice> LayoutMenu::GetVirtualDevice(Image 
pImage)
     return pVDev;
 }
 
-Bitmap LayoutMenu::GetPreviewAsBitmap(const Image& rImage)
-{
-    Bitmap aPreviewBitmap(rImage.GetBitmap());
-    ScopedVclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
-    if (pVDev->GetDPIScaleFactor() > 1)
-        aPreviewBitmap.Scale(pVDev->GetDPIScaleFactor(), 
pVDev->GetDPIScaleFactor());
-
-    return aPreviewBitmap;
-}
-
 void LayoutMenu::Fill()
 {
     bool bVertical = SvtCJKOptions::IsVerticalTextEnabled();
@@ -518,19 +508,18 @@ void LayoutMenu::Fill()
             if (aImg.GetSizePixel().Width() > 0)
             {
                 OUString sId = 
OUString::number(static_cast<int>(elem.maAutoLayout));
+                auto aVDev = GetVirtualDevice(aImg);
                 OUString sLayoutName = SdResId(elem.mpStrResId);
                 if (!mxLayoutIconView->get_id(id).isEmpty())
                 {
-                    VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aImg);
-                    mxLayoutIconView->set_image(id, *pVDev);
+                    mxLayoutIconView->set_image(id, *aVDev);
                     mxLayoutIconView->set_id(id, sId);
                     mxLayoutIconView->set_text(id, sLayoutName);
-                    pVDev.disposeAndClear();
                 }
                 else
                 {
-                    Bitmap aPreviewBitmap = GetPreviewAsBitmap(aImg);
-                    mxLayoutIconView->insert(id, nullptr, &sId, 
&aPreviewBitmap, nullptr);
+                    Bitmap aScaledBmp = aVDev->GetBitmap(Point(0,0), 
aVDev->GetOutputSizePixel());
+                    mxLayoutIconView->insert(id, nullptr, &sId, &aScaledBmp, 
nullptr);
                 }
                 maLayoutToStringMap[elem.maAutoLayout] = elem.mpStrResId;
 
diff --git a/sd/source/ui/sidebar/LayoutMenu.hxx 
b/sd/source/ui/sidebar/LayoutMenu.hxx
index 269e9d9b4b03..d77125dca91a 100644
--- a/sd/source/ui/sidebar/LayoutMenu.hxx
+++ b/sd/source/ui/sidebar/LayoutMenu.hxx
@@ -169,8 +169,7 @@ private:
     DECL_LINK(MenuSelectAsyncHdl, void*, void);
     DECL_LINK(OnPopupEnd, const OUString&, void);
 
-    static VclPtr<VirtualDevice> GetVirtualDevice(Image pPreview);
-    static Bitmap GetPreviewAsBitmap(const Image& rImage);
+    static ScopedVclPtr<VirtualDevice> GetVirtualDevice(Image pPreview);
     void HandleMenuSelect(std::u16string_view rIdent);
 
     TranslateId GetStringResourceIdForLayout(AutoLayout aLayout) const;
diff --git a/sd/source/ui/sidebar/MasterPagesSelector.cxx 
b/sd/source/ui/sidebar/MasterPagesSelector.cxx
index b7e3eb25a1fe..e1ceec5ab1c5 100644
--- a/sd/source/ui/sidebar/MasterPagesSelector.cxx
+++ b/sd/source/ui/sidebar/MasterPagesSelector.cxx
@@ -360,8 +360,8 @@ void MasterPagesSelector::NotifyContainerChangeEvent (const 
MasterPageContainerC
                 Image 
aPreview(mpContainer->GetPreviewForToken(rEvent.maChildToken));
                 if (aPreview.GetSizePixel().Width() > 0)
                 {
-                    VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aPreview);
-                    mxPreviewIconView->set_image(nIndex, *pVDev);
+                    auto aDev = GetVirtualDevice(aPreview);
+                    mxPreviewIconView->set_image(nIndex, *aDev);
                 }
             }
         }
@@ -417,18 +417,17 @@ void MasterPagesSelector::SetItem (
 
         if (aPreview.GetSizePixel().Width() > 0)
         {
+            auto aVDev = GetVirtualDevice(aPreview);
             if (!mxPreviewIconView->get_id(nIndex).isEmpty())
             {
-                VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aPreview);
-                mxPreviewIconView->set_image(nIndex, *pVDev);
+                mxPreviewIconView->set_image(nIndex, *aVDev);
                 mxPreviewIconView->set_id(nIndex, OUString::number(aToken));
-                pVDev.disposeAndClear();
             }
             else
             {
-                Bitmap aPreviewBitmap = GetPreviewAsBitmap(aPreview);
                 OUString sId = OUString::number(aToken);
-                mxPreviewIconView->insert(nIndex, nullptr, &sId, 
&aPreviewBitmap, nullptr);
+                Bitmap aScaledBmp = aVDev->GetBitmap(Point(0,0), 
aVDev->GetOutputSizePixel());
+                mxPreviewIconView->insert(nIndex, nullptr, &sId, &aScaledBmp, 
nullptr);
                 mxPreviewIconView->set_item_accessible_name(
                     nIndex, mpContainer->GetPageNameForToken(aToken));
             }
@@ -495,7 +494,7 @@ void MasterPagesSelector::InvalidatePreview (const SdPage* 
pPage)
     }
 }
 
-VclPtr<VirtualDevice> MasterPagesSelector::GetVirtualDevice(const Image& 
rImage)
+ScopedVclPtr<VirtualDevice> MasterPagesSelector::GetVirtualDevice(const Image& 
rImage)
 {
     Bitmap aPreviewBitmap = rImage.GetBitmap();
     VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
@@ -509,16 +508,6 @@ VclPtr<VirtualDevice> 
MasterPagesSelector::GetVirtualDevice(const Image& rImage)
     return pVDev;
 }
 
-Bitmap MasterPagesSelector::GetPreviewAsBitmap(const Image& rImage)
-{
-    Bitmap aPreviewBitmap(rImage.GetBitmap());
-    ScopedVclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
-    if (pVDev->GetDPIScaleFactor() > 1)
-        aPreviewBitmap.Scale(pVDev->GetDPIScaleFactor(), 
pVDev->GetDPIScaleFactor());
-
-    return aPreviewBitmap;
-}
-
 void MasterPagesSelector::UpdateAllPreviews()
 {
     const ::osl::MutexGuard aGuard (maMutex);
@@ -532,7 +521,7 @@ void MasterPagesSelector::UpdateAllPreviews()
         Image aPreview(mpContainer->GetPreviewForToken(aToken));
         if (aPreview.GetSizePixel().Width() > 0)
         {
-            VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aPreview);
+            auto pVDev = GetVirtualDevice(aPreview);
             mxPreviewIconView->set_image(aIndex, *pVDev);
         }
         else if (mpContainer->GetPreviewState(aToken) == 
MasterPageContainer::PS_CREATABLE)
diff --git a/sd/source/ui/sidebar/MasterPagesSelector.hxx 
b/sd/source/ui/sidebar/MasterPagesSelector.hxx
index 6178112f3cdb..ed9a4b0a3db5 100644
--- a/sd/source/ui/sidebar/MasterPagesSelector.hxx
+++ b/sd/source/ui/sidebar/MasterPagesSelector.hxx
@@ -194,8 +194,7 @@ private:
         sal_uInt16 nIndex,
         MasterPageContainer::Token aToken);
 
-    static VclPtr<VirtualDevice> GetVirtualDevice(const Image& rPreview);
-    static Bitmap GetPreviewAsBitmap(const Image& rPreview);
+    static ScopedVclPtr<VirtualDevice> GetVirtualDevice(const Image& rPreview);
 };
 
 } // end of namespace sd::sidebar
diff --git a/svx/source/dialog/ThemeColorsPaneBase.cxx 
b/svx/source/dialog/ThemeColorsPaneBase.cxx
index 02c9cb53c3d8..260d6b5858a9 100644
--- a/svx/source/dialog/ThemeColorsPaneBase.cxx
+++ b/svx/source/dialog/ThemeColorsPaneBase.cxx
@@ -47,9 +47,9 @@ void ThemeColorsPaneBase::initColorSets(model::Theme* pTheme)
         for (size_t i = 0; i < maColorSets.size(); ++i)
         {
             auto const& rColorSet = maColorSets[i];
-            VclPtr<VirtualDevice> pVirDev = CreateColorSetPreview(rColorSet);
-            Bitmap aBitmap(pVirDev->GetBitmap(Point(0, 0), 
pVirDev->GetOutputSizePixel()));
+            auto pVirDev = CreateColorSetPreview(rColorSet);
 
+            Bitmap aBitmap(pVirDev->GetBitmap(Point(0, 0), 
pVirDev->GetOutputSizePixel()));
             OUString sId = OUString::number(i);
             OUString sName = rColorSet.getName();
             mxIconViewThemeColors->insert(-1, &sName, &sId, &aBitmap, nullptr);
@@ -63,7 +63,8 @@ void ThemeColorsPaneBase::initColorSets(model::Theme* pTheme)
     }
 }
 
-VclPtr<VirtualDevice> ThemeColorsPaneBase::CreateColorSetPreview(const 
model::ColorSet& rColorSet)
+ScopedVclPtr<VirtualDevice>
+ThemeColorsPaneBase::CreateColorSetPreview(const model::ColorSet& rColorSet)
 {
     VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
     const Size aSize(100, 50);
diff --git a/svx/source/dialog/svxbmpnumiconview.cxx 
b/svx/source/dialog/svxbmpnumiconview.cxx
index 19252fba1365..7f14d584f86b 100644
--- a/svx/source/dialog/svxbmpnumiconview.cxx
+++ b/svx/source/dialog/svxbmpnumiconview.cxx
@@ -98,7 +98,7 @@ void SvxBmpNumIconView::PopulateIconView(
 
         for (sal_Int32 i = 0; i < std::min(aBulletSymbols.getLength(), 
sal_Int32(8)); ++i)
         {
-            VclPtr<VirtualDevice> pVDev = 
CreatePreviewFromUserDraw(NumberingPageType::BULLET, i, previewSize, 
rNumSettings, rOutlineSettings, xFormatter, rLocale);
+            auto pVDev = CreatePreviewFromUserDraw(NumberingPageType::BULLET, 
i, previewSize, rNumSettings, rOutlineSettings, xFormatter, rLocale);
             Bitmap aBmp = pVDev->GetBitmap(Point(), 
pVDev->GetOutputSizePixel());
             OUString sId = OUString::number(i);
             OUString sText = GetNumberingDescription(ePageType, i);
@@ -107,7 +107,7 @@ void SvxBmpNumIconView::PopulateIconView(
     }
 }
 
-VclPtr<VirtualDevice> SvxBmpNumIconView::CreatePreviewFromUserDraw(
+ScopedVclPtr<VirtualDevice> SvxBmpNumIconView::CreatePreviewFromUserDraw(
     NumberingPageType ePageType,
     sal_Int32 nIndex,
     Size previewSize,
@@ -422,7 +422,7 @@ VclPtr<VirtualDevice> 
SvxBmpNumIconView::CreatePreviewFromUserDraw(
     return pVDev;
 }
 
-VclPtr<VirtualDevice> SvxBmpNumIconView::CreateCustomBulletPreview(const 
OUString& rBulletChar, const OUString& rFontName)
+ScopedVclPtr<VirtualDevice> SvxBmpNumIconView::CreateCustomBulletPreview(const 
OUString& rBulletChar, const OUString& rFontName)
 {
     VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
     Size aSize(80, 100);
@@ -506,7 +506,7 @@ void SvxBmpNumIconView::SetNumberingSettings(
 
     for (sal_Int32 i = 0; i < aNum.getLength(); ++i)
     {
-        VclPtr<VirtualDevice> pVDev = CreatePreviewFromUserDraw(
+        auto pVDev = CreatePreviewFromUserDraw(
             NumberingPageType::SINGLENUM, i, previewSize, aNum, 
Sequence<Reference<XIndexAccess>>(),
             xFormat, rLocale, maCustomBullets);
 
@@ -529,7 +529,7 @@ void SvxBmpNumIconView::SetOutlineNumberingSettings(
 
     for (sal_Int32 i = 0; i < rOutline.getLength(); ++i)
     {
-        VclPtr<VirtualDevice> pVDev = CreatePreviewFromUserDraw(
+        auto pVDev = CreatePreviewFromUserDraw(
             NumberingPageType::OUTLINE, i, previewSize, 
Sequence<Sequence<PropertyValue>>(), rOutline,
             xFormat, rLocale, maCustomBullets);
 
@@ -540,7 +540,7 @@ void SvxBmpNumIconView::SetOutlineNumberingSettings(
     }
 }
 
-VclPtr<VirtualDevice> SvxBmpNumIconView::CreateBitmapBulletPreview(sal_uInt32 
nGalleryIndex)
+ScopedVclPtr<VirtualDevice> 
SvxBmpNumIconView::CreateBitmapBulletPreview(sal_uInt32 nGalleryIndex)
 {
     VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
     Size aRectSize(150, 200);
@@ -602,7 +602,7 @@ void 
SvxBmpNumIconView::PopulateBitmapIconView(weld::IconView* pIconView)
 
     for (sal_uInt32 i = 0; i < std::min(nCount, sal_uInt32(8)); ++i)
     {
-        VclPtr<VirtualDevice> pVDev = CreateBitmapBulletPreview(i);
+        auto pVDev = CreateBitmapBulletPreview(i);
         Bitmap aBmp = pVDev->GetBitmap(Point(), pVDev->GetOutputSizePixel());
         OUString sId = OUString::number(i);
         pIconView->insert(-1, nullptr, &sId, &aBmp, nullptr);
diff --git a/svx/source/tbxctrls/bulletsnumbering.cxx 
b/svx/source/tbxctrls/bulletsnumbering.cxx
index 994c8440405f..7c04ee54d22a 100644
--- a/svx/source/tbxctrls/bulletsnumbering.cxx
+++ b/svx/source/tbxctrls/bulletsnumbering.cxx
@@ -181,7 +181,7 @@ void NumberingPopup::statusChanged( const 
css::frame::FeatureStateEvent& rEvent
                 if (lcl_BulletIsDefault(sBullet, sFont))
                     continue;
 
-                VclPtr<VirtualDevice> pVDev = 
SvxBmpNumIconView::CreateCustomBulletPreview(sBullet, sFont);
+                auto pVDev = 
SvxBmpNumIconView::CreateCustomBulletPreview(sBullet, sFont);
                 Bitmap aBmp = pVDev->GetBitmap(Point(), 
pVDev->GetOutputSizePixel());
                 OUString sId = OUString::number(aList.size());
                 mxIconViewDoc->insert(-1, nullptr, &sId, &aBmp, nullptr);
diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index 64e9be97a99b..8b1019f0eeca 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -470,7 +470,6 @@ private:
     rtl::Reference<SvxFrameToolBoxControl> mxControl;
     std::unique_ptr<weld::IconView> mxFrameIV;
     std::vector<std::pair<Bitmap, OUString>> aImgVec;
-    static Bitmap ScaleBitmapForDPI(Bitmap aPreviewBitmap);
     bool                        bParagraphMode;
     bool                        m_bIsWriter;
     bool                        m_bIsCalc;
@@ -488,6 +487,8 @@ private:
 
     void SetDiagonalDownBorder(const SvxLineItem& dDownLineItem);
     void SetDiagonalUpBorder(const SvxLineItem& dUpLineItem);
+    static ScopedVclPtr<VirtualDevice> GetVirtualDevice(Bitmap aPreviewBitmap);
+
 public:
     SvxFrameWindow_Impl(SvxFrameToolBoxControl* pControl, weld::Widget* 
pParent);
     virtual void GrabFocus() override
@@ -562,7 +563,7 @@ private:
 
         void            UpdatePaintLineColor();       // returns sal_True if 
maPaintCol has changed
 
-        static VclPtr<VirtualDevice> GetVirtualDevice(Image pImage);
+        static ScopedVclPtr<VirtualDevice> GetVirtualDevice(Image pImage);
         sal_Int32       GetStylePos( sal_Int32  nListPos, tools::Long nWidth );
 
         const Color& GetPaintColor() const
@@ -731,7 +732,7 @@ private:
         return nullptr;
     }
 
-    VclPtr<VirtualDevice> LineListBox::GetVirtualDevice(Image pImage)
+    ScopedVclPtr<VirtualDevice> LineListBox::GetVirtualDevice(Image pImage)
     {
         constexpr tools::Long nMarginTopBottom = 5;
         constexpr tools::Long nMarginLeftRight = 2;
@@ -767,7 +768,7 @@ private:
         if (!m_sNone.isEmpty())
         {
             Size aPreviewSize = getPreviewSize(rIconView);
-            VclPtr<VirtualDevice> pVDevNone = GetVirtualDevice(Image());
+            auto pVDevNone = GetVirtualDevice(Image());
             pVDevNone->SetOutputSizePixel(aPreviewSize);
             Bitmap aNoneBmp = pVDevNone->GetBitmap(Point(0,0), aPreviewSize);
             rIconView.append("0", m_sNone, &aNoneBmp);
@@ -793,12 +794,11 @@ private:
                         GetColorDist( n ),
                         pData->GetStyle(), aBmp );
 
-                VclPtr<VirtualDevice> pVDev = GetVirtualDevice(Image(aBmp));
-                Bitmap aPreview = pVDev->GetBitmap(Point(0,0), 
pVDev->GetOutputSizePixel());
+                auto pVDev = GetVirtualDevice(Image(aBmp));
                 OUString sStyleName = 
SvtLineListBox::GetLineStyleName(pData->GetStyle());
-
+                Bitmap aScaledBmp = pVDev->GetBitmap(Point(0,0), 
pVDev->GetOutputSizePixel());
                 OUString sId = OUString::number(n + 1);
-                rIconView.append(sId, sStyleName, &aPreview);
+                rIconView.append(sId, sStyleName, &aScaledBmp);
 
                 if (sCurrentSelectedId == sId)
                     rIconView.select(nPos);
@@ -2575,8 +2575,9 @@ 
SvxFrameWindow_Impl::SvxFrameWindow_Impl(SvxFrameToolBoxControl* pControl, weld:
     // Writer uses 8 of them - for a single cell.
     for ( i=1; i < (m_bIsCalc ? 11 : 9); i++ )
     {
-        Bitmap aScaled = ScaleBitmapForDPI(aImgVec[i-1].first);
-        mxFrameIV->append(OUString::number(i), aImgVec[i-1].second, &aScaled);
+        auto pVDev = GetVirtualDevice(aImgVec[i-1].first);
+        Bitmap aScaledBmp = pVDev->GetBitmap(Point(0,0), 
pVDev->GetOutputSizePixel());
+        mxFrameIV->append(OUString::number(i), aImgVec[i-1].second, 
&aScaledBmp);
     }
 
     //bParagraphMode should have been set in StateChanged
@@ -2585,8 +2586,9 @@ 
SvxFrameWindow_Impl::SvxFrameWindow_Impl(SvxFrameToolBoxControl* pControl, weld:
         // Writer has 12 border types and Calc has 15 of them.
         for ( i = (m_bIsCalc ? 11 : 9); i < (m_bIsCalc ? 16 : 13); i++ )
         {
-            Bitmap aScaled = ScaleBitmapForDPI(aImgVec[i-1].first);
-            mxFrameIV->append(OUString::number(i), aImgVec[i-1].second, 
&aScaled);
+            auto pVDev = GetVirtualDevice(aImgVec[i-1].first);
+            Bitmap aScaledBmp = pVDev->GetBitmap(Point(0,0), 
pVDev->GetOutputSizePixel());
+            mxFrameIV->append(OUString::number(i), aImgVec[i-1].second, 
&aScaledBmp);
         }
 
     mxFrameIV->connect_mouse_press(LINK(this, SvxFrameWindow_Impl, 
MousePressHdl));
@@ -2876,12 +2878,16 @@ IMPL_LINK(SvxFrameWindow_Impl, KeyReleaseHdl, const 
KeyEvent&, /*rKEvt*/, bool)
     return true;
 }
 
-Bitmap SvxFrameWindow_Impl::ScaleBitmapForDPI(Bitmap aPreviewBitmap)
+ScopedVclPtr<VirtualDevice> SvxFrameWindow_Impl::GetVirtualDevice(Bitmap 
aPreviewBitmap)
 {
     VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
+    const Point aNull(0, 0);
     if (pVDev->GetDPIScaleFactor() > 1)
         aPreviewBitmap.Scale(pVDev->GetDPIScaleFactor(), 
pVDev->GetDPIScaleFactor());
-    return aPreviewBitmap;
+    const Size aSize(aPreviewBitmap.GetSizePixel());
+    pVDev->SetOutputSizePixel(aSize);
+    pVDev->DrawBitmap(aNull, aPreviewBitmap);
+    return pVDev;
 }
 
 IMPL_LINK(SvxFrameWindow_Impl, QueryTooltipHdl, const weld::TreeIter&, iter, 
OUString)
@@ -2953,9 +2959,10 @@ void SvxFrameWindow_Impl::statusChanged( const 
css::frame::FeatureStateEvent& rE
     {
         for ( sal_uInt16 i = (m_bIsWriter ? 9 : 11); i < (m_bIsWriter ? 13 : 
16); i++ )
         {
-            Bitmap aScaled = ScaleBitmapForDPI(aImgVec[i-1].first);
+            auto pVDev = GetVirtualDevice(aImgVec[i-1].first);
+            Bitmap aScaledBmp = pVDev->GetBitmap(Point(0,0), 
pVDev->GetOutputSizePixel());
             OUString sId = OUString::number(i);
-            mxFrameIV->insert(i - 1, &aImgVec[i-1].second, &sId, &aScaled, 
nullptr);
+            mxFrameIV->insert(i - 1, &aImgVec[i-1].second, &sId, &aScaledBmp, 
nullptr);
         }
     }
 }

Reply via email to