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); } } }
