Fix color swatches and color picker dialog on GTK with window scaling.

This commit is contained in:
Alex Shvartzkop 2024-05-26 13:02:37 +03:00
parent 296630d484
commit b64a30f44b
3 changed files with 57 additions and 85 deletions

View File

@ -129,13 +129,9 @@ void DIALOG_COLOR_PICKER::updatePreview( wxStaticBitmap* aStaticBitmap, COLOR4D&
wxSize swatchSize = aStaticBitmap->GetSize(); wxSize swatchSize = aStaticBitmap->GetSize();
wxSize checkerboardSize = ConvertDialogToPixels( CHECKERBOARD_SIZE_DU ); wxSize checkerboardSize = ConvertDialogToPixels( CHECKERBOARD_SIZE_DU );
#ifdef __WXMAC__ wxBitmap newBm = COLOR_SWATCH::MakeBitmap( aColor4D, COLOR4D::WHITE,
// Adjust for Retina ToPhys( swatchSize ),
swatchSize *= KIPLATFORM::UI::GetPixelScaleFactor( this ); ToPhys( checkerboardSize ),
checkerboardSize *= KIPLATFORM::UI::GetPixelScaleFactor( this );
#endif
wxBitmap newBm = COLOR_SWATCH::MakeBitmap( aColor4D, COLOR4D::WHITE, swatchSize, checkerboardSize,
aStaticBitmap->GetParent()->GetBackgroundColour() ); aStaticBitmap->GetParent()->GetBackgroundColour() );
newBm.SetScaleFactor( GetDPIScaleFactor() ); newBm.SetScaleFactor( GetDPIScaleFactor() );
@ -185,17 +181,13 @@ void DIALOG_COLOR_PICKER::initDefinedColors( CUSTOM_COLORS_LIST* aPredefinedColo
wxSize checkerboardSize = ConvertDialogToPixels( CHECKERBOARD_SIZE_DU ); wxSize checkerboardSize = ConvertDialogToPixels( CHECKERBOARD_SIZE_DU );
COLOR4D checkboardBackground = m_OldColorRect->GetParent()->GetBackgroundColour(); COLOR4D checkboardBackground = m_OldColorRect->GetParent()->GetBackgroundColour();
#ifdef __WXMAC__
// Adjust for Retina
swatchSize *= KIPLATFORM::UI::GetPixelScaleFactor( this );
checkerboardSize *= KIPLATFORM::UI::GetPixelScaleFactor( this );
#endif
auto addSwatch = auto addSwatch =
[&]( int aId, COLOR4D aColor, const wxString& aColorName ) [&]( int aId, COLOR4D aColor, const wxString& aColorName )
{ {
wxBitmap bm = COLOR_SWATCH::MakeBitmap( aColor, COLOR4D::WHITE, swatchSize, wxBitmap bm = COLOR_SWATCH::MakeBitmap( aColor, COLOR4D::WHITE,
checkerboardSize, checkboardBackground ); ToPhys( swatchSize ),
ToPhys( checkerboardSize ),
checkboardBackground );
bm.SetScaleFactor( GetDPIScaleFactor() ); bm.SetScaleFactor( GetDPIScaleFactor() );
wxStaticBitmap* swatch = new wxStaticBitmap( m_panelDefinedColors, aId, bm ); wxStaticBitmap* swatch = new wxStaticBitmap( m_panelDefinedColors, aId, bm );
@ -254,7 +246,7 @@ void DIALOG_COLOR_PICKER::initDefinedColors( CUSTOM_COLORS_LIST* aPredefinedColo
void DIALOG_COLOR_PICKER::createRGBBitmap() void DIALOG_COLOR_PICKER::createRGBBitmap()
{ {
wxSize bmsize = m_RgbBitmap->GetSize(); wxSize bmsize = ToPhys( m_RgbBitmap->GetSize() );
int half_size = std::min( bmsize.x, bmsize.y )/2; int half_size = std::min( bmsize.x, bmsize.y )/2;
// We use here a Y axis from bottom to top and origin to center, So we need to map // We use here a Y axis from bottom to top and origin to center, So we need to map
@ -342,21 +334,14 @@ void DIALOG_COLOR_PICKER::createRGBBitmap()
delete m_bitmapRGB; delete m_bitmapRGB;
m_bitmapRGB = new wxBitmap( img, 24 ); m_bitmapRGB = new wxBitmap( img, 24 );
double scaleFactor = m_HsvBitmap->GetDPIScaleFactor(); m_bitmapRGB->SetScaleFactor( GetDPIScaleFactor() );
#ifdef __WXMAC__
// Adjust for Retina
scaleFactor /= KIPLATFORM::UI::GetPixelScaleFactor( this );
#endif
m_bitmapRGB->SetScaleFactor( scaleFactor );
m_RgbBitmap->SetBitmap( *m_bitmapRGB ); m_RgbBitmap->SetBitmap( *m_bitmapRGB );
} }
void DIALOG_COLOR_PICKER::createHSVBitmap() void DIALOG_COLOR_PICKER::createHSVBitmap()
{ {
wxSize bmsize = m_HsvBitmap->GetSize(); wxSize bmsize = ToPhys( m_HsvBitmap->GetSize() );
int half_size = std::min( bmsize.x, bmsize.y )/2; int half_size = std::min( bmsize.x, bmsize.y )/2;
// We use here a Y axis from bottom to top and origin to center, So we need to map // We use here a Y axis from bottom to top and origin to center, So we need to map
@ -415,27 +400,23 @@ void DIALOG_COLOR_PICKER::createHSVBitmap()
delete m_bitmapHSV; delete m_bitmapHSV;
m_bitmapHSV = new wxBitmap( img, 24 ); m_bitmapHSV = new wxBitmap( img, 24 );
double scaleFactor = m_HsvBitmap->GetDPIScaleFactor(); m_bitmapHSV->SetScaleFactor( GetDPIScaleFactor() );
#ifdef __WXMAC__
// Adjust for Retina
scaleFactor /= KIPLATFORM::UI::GetPixelScaleFactor( this );
#endif
m_bitmapHSV->SetScaleFactor( scaleFactor );
m_HsvBitmap->SetBitmap( *m_bitmapHSV ); m_HsvBitmap->SetBitmap( *m_bitmapHSV );
} }
void DIALOG_COLOR_PICKER::drawRGBPalette() void DIALOG_COLOR_PICKER::drawRGBPalette()
{ {
if( !m_bitmapRGB || m_bitmapRGB->GetSize() != m_RgbBitmap->GetSize() ) if( !m_bitmapRGB || m_bitmapRGB->GetSize() != ToPhys( m_RgbBitmap->GetSize() ) )
createRGBBitmap(); createRGBBitmap();
wxMemoryDC bitmapDC; wxMemoryDC bitmapDC;
wxSize bmsize = m_bitmapRGB->GetSize(); wxSize bmsize = m_bitmapRGB->GetSize();
int half_size = std::min( bmsize.x, bmsize.y )/2; int half_size = std::min( bmsize.x, bmsize.y ) / 2;
wxBitmap newBm( *m_bitmapRGB ); wxBitmap newBm( *m_bitmapRGB );
newBm.SetScaleFactor( 1.0 );
bitmapDC.SelectObject( newBm ); bitmapDC.SelectObject( newBm );
// Use Y axis from bottom to top and origin to center // Use Y axis from bottom to top and origin to center
@ -488,6 +469,7 @@ void DIALOG_COLOR_PICKER::drawRGBPalette()
bitmapDC.DrawLine( 0, 0, half_size, - half_size*slope ); // Blue axis (X 3D axis) bitmapDC.DrawLine( 0, 0, half_size, - half_size*slope ); // Blue axis (X 3D axis)
bitmapDC.DrawLine( 0, 0, -half_size, - half_size*slope ); // green axis (Y 3D axis) bitmapDC.DrawLine( 0, 0, -half_size, - half_size*slope ); // green axis (Y 3D axis)
newBm.SetScaleFactor( GetDPIScaleFactor() );
m_RgbBitmap->SetBitmap( newBm ); m_RgbBitmap->SetBitmap( newBm );
/* Deselect the Tool Bitmap from DC, /* Deselect the Tool Bitmap from DC,
@ -498,13 +480,16 @@ void DIALOG_COLOR_PICKER::drawRGBPalette()
void DIALOG_COLOR_PICKER::drawHSVPalette() void DIALOG_COLOR_PICKER::drawHSVPalette()
{ {
if( !m_bitmapHSV || m_bitmapHSV->GetSize() != m_HsvBitmap->GetSize() ) if( !m_bitmapHSV || m_bitmapHSV->GetSize() != ToPhys( m_HsvBitmap->GetSize() ) )
createHSVBitmap(); createHSVBitmap();
wxMemoryDC bitmapDC; wxMemoryDC bitmapDC;
wxSize bmsize = m_bitmapHSV->GetSize(); wxSize bmsize = m_bitmapHSV->GetSize();
int half_size = std::min( bmsize.x, bmsize.y ) / 2; int half_size = std::min( bmsize.x, bmsize.y ) / 2;
wxBitmap newBm( *m_bitmapHSV ); wxBitmap newBm( *m_bitmapHSV );
newBm.SetScaleFactor( 1.0 );
bitmapDC.SelectObject( newBm ); bitmapDC.SelectObject( newBm );
// Use Y axis from bottom to top and origin to center // Use Y axis from bottom to top and origin to center
@ -532,6 +517,7 @@ void DIALOG_COLOR_PICKER::drawHSVPalette()
m_cursorBitmapHSV.y - ( m_cursorsSize / 2 ), m_cursorBitmapHSV.y - ( m_cursorsSize / 2 ),
m_cursorsSize, m_cursorsSize ); m_cursorsSize, m_cursorsSize );
newBm.SetScaleFactor( GetDPIScaleFactor() );
m_HsvBitmap->SetBitmap( newBm ); m_HsvBitmap->SetBitmap( newBm );
/* Deselect the Tool Bitmap from DC, /* Deselect the Tool Bitmap from DC,
@ -583,7 +569,7 @@ void DIALOG_COLOR_PICKER::SetEditVals( CHANGED_COLOR aChanged, bool aCheckTransp
void DIALOG_COLOR_PICKER::updateHandleSize() void DIALOG_COLOR_PICKER::updateHandleSize()
{ {
m_cursorsSize = FromDIP( 8 ); // Size of square cursors drawn on color bitmaps m_cursorsSize = ToPhys( FromDIP( 8 ) ); // Size of square cursors drawn on color bitmaps
} }
@ -632,11 +618,12 @@ void DIALOG_COLOR_PICKER::buttColorClick( wxMouseEvent& event )
void DIALOG_COLOR_PICKER::onRGBMouseClick( wxMouseEvent& event ) void DIALOG_COLOR_PICKER::onRGBMouseClick( wxMouseEvent& event )
{ {
m_allowMouseEvents = true; m_allowMouseEvents = true;
wxPoint mousePos = event.GetPosition();
// The cursor position is relative to the m_bitmapHSV wxBitmap center // The cursor position is relative to the m_bitmapHSV wxBitmap center
wxSize bmsize = m_bitmapRGB->GetSize(); wxPoint mousePos = ToPhys( event.GetPosition() );
int half_size = std::min( bmsize.x, bmsize.y ) / 2; wxSize bmsize = m_bitmapRGB->GetSize();
int half_size = std::min( bmsize.x, bmsize.y ) / 2;
mousePos.x -= half_size; mousePos.x -= half_size;
mousePos.y -= half_size; mousePos.y -= half_size;
mousePos.y = -mousePos.y; // Use the bottom to top vertical axis mousePos.y = -mousePos.y; // Use the bottom to top vertical axis
@ -686,9 +673,10 @@ void DIALOG_COLOR_PICKER::onRGBMouseDrag( wxMouseEvent& event )
// Adjust the HSV cursor position to follow the mouse cursor // Adjust the HSV cursor position to follow the mouse cursor
// The cursor position is relative to the m_bitmapHSV wxBitmap center // The cursor position is relative to the m_bitmapHSV wxBitmap center
wxPoint mousePos = event.GetPosition(); wxPoint mousePos = ToPhys( event.GetPosition() );
wxSize bmsize = m_bitmapRGB->GetSize(); wxSize bmsize = m_bitmapRGB->GetSize();
int half_size = std::min( bmsize.x, bmsize.y ) / 2; int half_size = std::min( bmsize.x, bmsize.y ) / 2;
mousePos.x -= half_size; mousePos.x -= half_size;
mousePos.y -= half_size; mousePos.y -= half_size;
mousePos.y = -mousePos.y; // Use the bottom to top vertical axis mousePos.y = -mousePos.y; // Use the bottom to top vertical axis
@ -770,9 +758,9 @@ void DIALOG_COLOR_PICKER::OnColorValueText( wxCommandEvent& event )
bool DIALOG_COLOR_PICKER::setHSvaluesFromCursor( const wxPoint& aMouseCursor ) bool DIALOG_COLOR_PICKER::setHSvaluesFromCursor( const wxPoint& aMouseCursor )
{ {
wxPoint mousePos = aMouseCursor; wxPoint mousePos = ToPhys( aMouseCursor );
wxSize bmsize = m_bitmapHSV->GetSize(); wxSize bmsize = m_bitmapHSV->GetSize();
int half_size = std::min( bmsize.x, bmsize.y )/2; int half_size = std::min( bmsize.x, bmsize.y ) / 2;
// Make the cursor position relative to the m_bitmapHSV wxBitmap center // Make the cursor position relative to the m_bitmapHSV wxBitmap center
mousePos.x -= half_size; mousePos.x -= half_size;

View File

@ -49,6 +49,17 @@ wxBitmap COLOR_SWATCH::MakeBitmap( const COLOR4D& aColor, const COLOR4D& aBackgr
} }
wxBitmap COLOR_SWATCH::makeBitmap()
{
wxBitmap bitmap = COLOR_SWATCH::MakeBitmap( m_color, m_background,
ToPhys( m_size ), ToPhys( m_checkerboardSize ),
m_checkerboardBg );
bitmap.SetScaleFactor( GetDPIScaleFactor() );
return bitmap;
}
void COLOR_SWATCH::RenderToDC( wxDC* aDC, const KIGFX::COLOR4D& aColor, void COLOR_SWATCH::RenderToDC( wxDC* aDC, const KIGFX::COLOR4D& aColor,
const KIGFX::COLOR4D& aBackground, const wxRect& aRect, const KIGFX::COLOR4D& aBackground, const wxRect& aRect,
const wxSize& aCheckerboardSize, const wxSize& aCheckerboardSize,
@ -147,20 +158,10 @@ COLOR_SWATCH::COLOR_SWATCH( wxWindow* aParent, const COLOR4D& aColor, int aID,
m_checkerboardSize = ConvertDialogToPixels( CHECKERBOARD_SIZE_DU ); m_checkerboardSize = ConvertDialogToPixels( CHECKERBOARD_SIZE_DU );
m_checkerboardBg = aParent->GetBackgroundColour(); m_checkerboardBg = aParent->GetBackgroundColour();
#ifdef __WXMAC__
// Adjust for Retina
m_size *= KIPLATFORM::UI::GetPixelScaleFactor( aParent );
m_checkerboardSize *= KIPLATFORM::UI::GetPixelScaleFactor( aParent );
#endif
auto sizer = new wxBoxSizer( wxHORIZONTAL ); auto sizer = new wxBoxSizer( wxHORIZONTAL );
SetSizer( sizer ); SetSizer( sizer );
wxBitmap bitmap = COLOR_SWATCH::MakeBitmap( aColor, aBackground, m_size, m_checkerboardSize, m_swatch = new wxStaticBitmap( this, aID, makeBitmap() );
m_checkerboardBg );
bitmap.SetScaleFactor( GetDPIScaleFactor() );
m_swatch = new wxStaticBitmap( this, aID, bitmap );
sizer->Add( m_swatch, 0, 0 ); sizer->Add( m_swatch, 0, 0 );
@ -187,10 +188,6 @@ COLOR_SWATCH::COLOR_SWATCH( wxWindow* aParent, wxWindowID aID, const wxPoint& aP
// Adjust for border // Adjust for border
m_size.x -= 2; m_size.x -= 2;
m_size.y -= 2; m_size.y -= 2;
// Adjust for Retina
m_size *= KIPLATFORM::UI::GetPixelScaleFactor( aParent );
m_checkerboardSize *= KIPLATFORM::UI::GetPixelScaleFactor( aParent );
#endif #endif
SetSize( m_size ); SetSize( m_size );
@ -198,11 +195,7 @@ COLOR_SWATCH::COLOR_SWATCH( wxWindow* aParent, wxWindowID aID, const wxPoint& aP
auto sizer = new wxBoxSizer( wxHORIZONTAL ); auto sizer = new wxBoxSizer( wxHORIZONTAL );
SetSizer( sizer ); SetSizer( sizer );
wxBitmap bitmap = COLOR_SWATCH::MakeBitmap( COLOR4D::UNSPECIFIED, COLOR4D::UNSPECIFIED, m_swatch = new wxStaticBitmap( this, aID, makeBitmap() );
m_size, m_checkerboardSize, m_checkerboardBg );
bitmap.SetScaleFactor( GetDPIScaleFactor() );
m_swatch = new wxStaticBitmap( this, aID, bitmap );
sizer->Add( m_swatch, 0, 0 ); sizer->Add( m_swatch, 0, 0 );
@ -276,10 +269,7 @@ void COLOR_SWATCH::SetSwatchColor( const COLOR4D& aColor, bool aSendEvent )
{ {
m_color = aColor; m_color = aColor;
wxBitmap bm = MakeBitmap( m_color, m_background, m_size, m_checkerboardSize, m_checkerboardBg ); m_swatch->SetBitmap( makeBitmap() );
bm.SetScaleFactor( GetDPIScaleFactor() );
m_swatch->SetBitmap( bm );
if( aSendEvent ) if( aSendEvent )
sendSwatchChangeEvent( *this ); sendSwatchChangeEvent( *this );
@ -295,10 +285,8 @@ void COLOR_SWATCH::SetDefaultColor( const COLOR4D& aColor )
void COLOR_SWATCH::SetSwatchBackground( const COLOR4D& aBackground ) void COLOR_SWATCH::SetSwatchBackground( const COLOR4D& aBackground )
{ {
m_background = aBackground; m_background = aBackground;
wxBitmap bm = MakeBitmap( m_color, m_background, m_size, m_checkerboardSize, m_checkerboardBg );
bm.SetScaleFactor( GetDPIScaleFactor() ); m_swatch->SetBitmap( makeBitmap() );
m_swatch->SetBitmap( bm );
} }
@ -329,11 +317,7 @@ void COLOR_SWATCH::GetNewSwatchColor()
{ {
m_color = newColor; m_color = newColor;
wxBitmap bm = MakeBitmap( newColor, m_background, m_size, m_checkerboardSize, m_swatch->SetBitmap( makeBitmap() );
m_checkerboardBg );
bm.SetScaleFactor( GetDPIScaleFactor() );
m_swatch->SetBitmap( bm );
sendSwatchChangeEvent( *this ); sendSwatchChangeEvent( *this );
} }
@ -344,8 +328,6 @@ void COLOR_SWATCH::GetNewSwatchColor()
void COLOR_SWATCH::OnDarkModeToggle() void COLOR_SWATCH::OnDarkModeToggle()
{ {
m_checkerboardBg = m_parent->GetBackgroundColour(); m_checkerboardBg = m_parent->GetBackgroundColour();
wxBitmap bm = MakeBitmap( m_color, m_background, m_size, m_checkerboardSize, m_checkerboardBg );
bm.SetScaleFactor( GetDPIScaleFactor() ); m_swatch->SetBitmap( makeBitmap() );
m_swatch->SetBitmap( bm );
} }

View File

@ -1,7 +1,7 @@
/* /*
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2017-2024 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -139,6 +139,8 @@ public:
private: private:
void setupEvents( bool aTriggerWithSingleClick ); void setupEvents( bool aTriggerWithSingleClick );
wxBitmap makeBitmap();
/** /**
* Pass unwanted events on to listeners of this object * Pass unwanted events on to listeners of this object
*/ */