From 50e2a12e1790c47c8d2bb87752482fb339f7dd75 Mon Sep 17 00:00:00 2001 From: Mark Roszko <mark.roszko@gmail.com> Date: Fri, 31 Jan 2025 10:30:43 -0500 Subject: [PATCH] Fix palette icon scaling on Windows, also extend KiBitmapBundle because we use bundles wrong wxBitmapBundle assumes the smallest bitmap added is the intended "original" size for a particular use case. And generally that is probably true. However, we re-use icons in some places where we intend for them to start at 16 or start at 24. This is problematic when GetPreferredBitmapSizeFor is called for calculations because it'll return the 16*scale number instead of 24*scale number. So let's just allow passing in a min height restriction to KiBitmapBundle for when we reuse bitmaps. --- common/bitmap.cpp | 4 ++-- common/bitmap_store.cpp | 5 ++++- common/tool/action_toolbar.cpp | 9 ++++----- common/widgets/bitmap_button.cpp | 6 +++--- include/bitmap_store.h | 8 ++++++-- include/bitmaps/bitmap_types.h | 2 +- 6 files changed, 20 insertions(+), 14 deletions(-) diff --git a/common/bitmap.cpp b/common/bitmap.cpp index c8ed41fbf3..94fb3fdb4c 100644 --- a/common/bitmap.cpp +++ b/common/bitmap.cpp @@ -107,9 +107,9 @@ wxBitmap KiBitmap( BITMAPS aBitmap, int aHeightTag ) } -wxBitmapBundle KiBitmapBundle( BITMAPS aBitmap ) +wxBitmapBundle KiBitmapBundle( BITMAPS aBitmap, int aMinHeight ) { - return GetBitmapStore()->GetBitmapBundle( aBitmap ); + return GetBitmapStore()->GetBitmapBundle( aBitmap, aMinHeight ); } diff --git a/common/bitmap_store.cpp b/common/bitmap_store.cpp index 9e542ebe80..861f781d59 100644 --- a/common/bitmap_store.cpp +++ b/common/bitmap_store.cpp @@ -121,7 +121,7 @@ wxBitmap BITMAP_STORE::GetBitmap( BITMAPS aBitmapId, int aHeight ) } -wxBitmapBundle BITMAP_STORE::GetBitmapBundle( BITMAPS aBitmapId ) +wxBitmapBundle BITMAP_STORE::GetBitmapBundle( BITMAPS aBitmapId, int aMinHeight ) { wxVector<wxBitmap> bmps; @@ -130,6 +130,9 @@ wxBitmapBundle BITMAP_STORE::GetBitmapBundle( BITMAPS aBitmapId ) if( info.theme != m_theme ) continue; + if( aMinHeight > 0 && info.height < aMinHeight ) + continue; + bmps.push_back( wxBitmap( getImage( info.id, info.height ) ) ); } diff --git a/common/tool/action_toolbar.cpp b/common/tool/action_toolbar.cpp index ac2f54e4b5..0f77f11b3e 100644 --- a/common/tool/action_toolbar.cpp +++ b/common/tool/action_toolbar.cpp @@ -114,16 +114,15 @@ ACTION_TOOLBAR_PALETTE::ACTION_TOOLBAR_PALETTE( wxWindow* aParent, bool aVertica void ACTION_TOOLBAR_PALETTE::AddAction( const TOOL_ACTION& aAction ) { - wxBitmapBundle normalBmp = KiBitmapBundle( aAction.GetIcon() ); + int size = Pgm().GetCommonSettings()->m_Appearance.toolbar_icon_size; + wxBitmapBundle normalBmp = KiBitmapBundle( aAction.GetIcon(), size ); int bmpWidth = normalBmp.GetPreferredBitmapSizeFor( this ).GetWidth(); int padding = ( m_buttonSize.GetWidth() - bmpWidth ) / 2; - int size = Pgm().GetCommonSettings()->m_Appearance.toolbar_icon_size; wxSize bmSize( size, size ); - bmSize *= KIPLATFORM::UI::GetPixelScaleFactor( m_parent ); + bmSize *= KIPLATFORM::UI::GetContentScaleFactor( m_parent ); - BITMAP_BUTTON* button = new BITMAP_BUTTON( m_panel, aAction.GetUIId(), wxDefaultPosition, - bmSize ); + BITMAP_BUTTON* button = new BITMAP_BUTTON( m_panel, aAction.GetUIId() ); button->SetIsToolbarButton(); button->SetBitmap( normalBmp ); diff --git a/common/widgets/bitmap_button.cpp b/common/widgets/bitmap_button.cpp index 286db0b60b..51119e4168 100644 --- a/common/widgets/bitmap_button.cpp +++ b/common/widgets/bitmap_button.cpp @@ -336,14 +336,14 @@ void BITMAP_BUTTON::OnPaint( wxPaintEvent& aEvent ) wxPoint drawBmpPos( m_padding, m_padding ); wxBitmap bmpImg; - double scale = KIPLATFORM::UI::GetPixelScaleFactor( this ); + double scale = KIPLATFORM::UI::GetContentScaleFactor( this ); wxSize bmSize; if( m_isToolbarButton ) { int size = Pgm().GetCommonSettings()->m_Appearance.toolbar_icon_size; - bmSize = wxSize( size, size ); - bmpImg = bmp.GetBitmap( bmSize * scale ); + bmSize = wxSize( size, size ) * scale; + bmpImg = bmp.GetBitmap( bmSize ); // wxBitmapBundle::GetBitmap thinks we need this rescaled to match the base size if( bmpImg.IsOk() ) diff --git a/include/bitmap_store.h b/include/bitmap_store.h index db66c7139b..239aff2563 100644 --- a/include/bitmap_store.h +++ b/include/bitmap_store.h @@ -60,9 +60,13 @@ public: /** * Constructs and returns a bitmap bundle containing all available sizes of the given ID * @param aBitmapId is from the BITMAPS enum in bitmaps_list.h + * @param aMinHeight is the minimum height of the bitmaps to include in the bundle. + * This is important for uses of GetPreferredBitmap and more on wxBitmap bundles because + * wx assumes the smallest bitmap is the "original" intended size. This is a problem where + * some icons may be reused between controls at different intended sizes. */ - wxBitmapBundle GetBitmapBundle( BITMAPS aBitmapId ); - + wxBitmapBundle GetBitmapBundle( BITMAPS aBitmapId, int aMinHeight = -1 ); + /** * Constructs and returns a bitmap bundle for the given icon ID, with the bitmaps * converted to disabled state according to the current UI theme. diff --git a/include/bitmaps/bitmap_types.h b/include/bitmaps/bitmap_types.h index 7e5f907b89..3fd58fac9b 100644 --- a/include/bitmaps/bitmap_types.h +++ b/include/bitmaps/bitmap_types.h @@ -56,7 +56,7 @@ KICOMMON_API BITMAP_STORE* GetBitmapStore(); */ KICOMMON_API wxBitmap KiBitmap( BITMAPS aBitmap, int aHeightTag = -1 ); -KICOMMON_API wxBitmapBundle KiBitmapBundle( BITMAPS aBitmap ); +KICOMMON_API wxBitmapBundle KiBitmapBundle( BITMAPS aBitmap, int aMinHeight = -1 ); KICOMMON_API wxBitmapBundle KiDisabledBitmapBundle( BITMAPS aBitmap );