COLOR_SWATCH, INDICATOR_ICON: DPI-independent scaling
This commit is contained in:
parent
504e7a4a51
commit
445fc0000f
|
@ -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 KiCad Developers, see AUTHORS.TXT for contributors.
|
* Copyright (C) 2017-2018 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
|
||||||
|
@ -31,8 +31,7 @@ wxDEFINE_EVENT(COLOR_SWATCH_CHANGED, wxCommandEvent);
|
||||||
using KIGFX::COLOR4D;
|
using KIGFX::COLOR4D;
|
||||||
|
|
||||||
|
|
||||||
const static int SWATCH_SIZE_X = 14;
|
const static wxSize SWATCH_SIZE_DU( 8, 6 );
|
||||||
const static int SWATCH_SIZE_Y = 12;
|
|
||||||
|
|
||||||
// See selcolor.cpp:
|
// See selcolor.cpp:
|
||||||
extern COLOR4D DisplayColorFrame( wxWindow* aParent, COLOR4D aOldColor );
|
extern COLOR4D DisplayColorFrame( wxWindow* aParent, COLOR4D aOldColor );
|
||||||
|
@ -40,10 +39,13 @@ extern COLOR4D DisplayColorFrame( wxWindow* aParent, COLOR4D aOldColor );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make a simple color swatch bitmap
|
* Make a simple color swatch bitmap
|
||||||
|
*
|
||||||
|
* @param aWindow - window used as context for device-independent size
|
||||||
*/
|
*/
|
||||||
static wxBitmap makeBitmap( COLOR4D aColor, COLOR4D aBackground )
|
static wxBitmap makeBitmap( COLOR4D aColor, COLOR4D aBackground, wxWindow *aWindow )
|
||||||
{
|
{
|
||||||
wxBitmap bitmap( SWATCH_SIZE_X, SWATCH_SIZE_Y );
|
wxSize size( aWindow->ConvertDialogToPixels( SWATCH_SIZE_DU ) );
|
||||||
|
wxBitmap bitmap( size );
|
||||||
wxBrush brush;
|
wxBrush brush;
|
||||||
wxMemoryDC iconDC;
|
wxMemoryDC iconDC;
|
||||||
|
|
||||||
|
@ -52,11 +54,11 @@ static wxBitmap makeBitmap( COLOR4D aColor, COLOR4D aBackground )
|
||||||
brush.SetStyle( wxBRUSHSTYLE_SOLID );
|
brush.SetStyle( wxBRUSHSTYLE_SOLID );
|
||||||
brush.SetColour( aBackground.WithAlpha(1.0).ToColour() );
|
brush.SetColour( aBackground.WithAlpha(1.0).ToColour() );
|
||||||
iconDC.SetBrush( brush );
|
iconDC.SetBrush( brush );
|
||||||
iconDC.DrawRectangle( 0, 0, SWATCH_SIZE_X, SWATCH_SIZE_Y );
|
iconDC.DrawRectangle( 0, 0, size.x, size.y );
|
||||||
|
|
||||||
brush.SetColour( aColor.ToColour() );
|
brush.SetColour( aColor.ToColour() );
|
||||||
iconDC.SetBrush( brush );
|
iconDC.SetBrush( brush );
|
||||||
iconDC.DrawRectangle( 0, 0, SWATCH_SIZE_X, SWATCH_SIZE_Y );
|
iconDC.DrawRectangle( 0, 0, size.x, size.y );
|
||||||
|
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
@ -69,8 +71,7 @@ static wxBitmap makeBitmap( COLOR4D aColor, COLOR4D aBackground )
|
||||||
static std::unique_ptr<wxStaticBitmap> makeColorSwatch(
|
static std::unique_ptr<wxStaticBitmap> makeColorSwatch(
|
||||||
wxWindow* aParent, COLOR4D aColor, COLOR4D aBackground, int aID )
|
wxWindow* aParent, COLOR4D aColor, COLOR4D aBackground, int aID )
|
||||||
{
|
{
|
||||||
// construct a bitmap of the right color and make the swatch from it
|
wxBitmap bitmap = makeBitmap( aColor, aBackground, aParent );
|
||||||
wxBitmap bitmap = makeBitmap( aColor, aBackground );
|
|
||||||
auto ret = std::make_unique<wxStaticBitmap>( aParent, aID, bitmap );
|
auto ret = std::make_unique<wxStaticBitmap>( aParent, aID, bitmap );
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -129,7 +130,7 @@ void COLOR_SWATCH::SetSwatchColor( COLOR4D aColor, bool sendEvent )
|
||||||
{
|
{
|
||||||
m_color = aColor;
|
m_color = aColor;
|
||||||
|
|
||||||
wxBitmap bm = makeBitmap( m_color, m_background );
|
wxBitmap bm = makeBitmap( m_color, m_background, GetParent() );
|
||||||
m_swatch->SetBitmap( bm );
|
m_swatch->SetBitmap( bm );
|
||||||
|
|
||||||
if( sendEvent )
|
if( sendEvent )
|
||||||
|
@ -142,7 +143,7 @@ void COLOR_SWATCH::SetSwatchColor( COLOR4D aColor, bool sendEvent )
|
||||||
void COLOR_SWATCH::SetSwatchBackground( COLOR4D aBackground )
|
void COLOR_SWATCH::SetSwatchBackground( COLOR4D aBackground )
|
||||||
{
|
{
|
||||||
m_background = aBackground;
|
m_background = aBackground;
|
||||||
wxBitmap bm = makeBitmap( m_color, m_background );
|
wxBitmap bm = makeBitmap( m_color, m_background, (wxWindow*) this );
|
||||||
m_swatch->SetBitmap( bm );
|
m_swatch->SetBitmap( bm );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +172,7 @@ void COLOR_SWATCH::GetNewSwatchColor()
|
||||||
{
|
{
|
||||||
m_color = newColor;
|
m_color = newColor;
|
||||||
|
|
||||||
wxBitmap bm = makeBitmap( newColor, m_background );
|
wxBitmap bm = makeBitmap( newColor, m_background, (wxWindow*) this );
|
||||||
m_swatch->SetBitmap( bm );
|
m_swatch->SetBitmap( bm );
|
||||||
|
|
||||||
sendSwatchChangeEvent( *this );
|
sendSwatchChangeEvent( *this );
|
||||||
|
|
|
@ -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 KiCad Developers, see AUTHORS.TXT for contributors.
|
* Copyright (C) 2017-2018 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
|
||||||
|
@ -35,10 +35,11 @@ INDICATOR_ICON::INDICATOR_ICON( wxWindow* aParent,
|
||||||
SetSizer( sizer );
|
SetSizer( sizer );
|
||||||
|
|
||||||
const wxBitmap& initBitmap = m_iconProvider.GetIndicatorIcon( m_currentId );
|
const wxBitmap& initBitmap = m_iconProvider.GetIndicatorIcon( m_currentId );
|
||||||
|
wxBitmap scaled = ScaledIcon( initBitmap );
|
||||||
|
|
||||||
m_bitmap = new wxStaticBitmap( this, aID,
|
m_bitmap = new wxStaticBitmap( this, aID,
|
||||||
initBitmap, wxDefaultPosition,
|
scaled, wxDefaultPosition,
|
||||||
initBitmap.GetSize() );
|
scaled.GetSize() );
|
||||||
|
|
||||||
sizer->Add( m_bitmap, 0, 0 );
|
sizer->Add( m_bitmap, 0, 0 );
|
||||||
|
|
||||||
|
@ -57,7 +58,7 @@ void INDICATOR_ICON::SetIndicatorState( ICON_ID aIconId )
|
||||||
|
|
||||||
m_currentId = aIconId;
|
m_currentId = aIconId;
|
||||||
|
|
||||||
m_bitmap->SetBitmap( m_iconProvider.GetIndicatorIcon( m_currentId ) );
|
m_bitmap->SetBitmap( ScaledIcon( m_iconProvider.GetIndicatorIcon( m_currentId ) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,6 +67,26 @@ INDICATOR_ICON::ICON_ID INDICATOR_ICON::GetIndicatorState() const
|
||||||
return m_currentId;
|
return m_currentId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Uses wxImage::Rescale to provide a bitmap scaled to a fixed size relative to
|
||||||
|
// the system font. This doesn't work particularly well in the general case
|
||||||
|
// and so is not an answer to DPI-independent scaling of e.g. toolbar icons,
|
||||||
|
// but it gives perfectly acceptable results for the simple icons embedded in
|
||||||
|
// this file.
|
||||||
|
wxBitmap INDICATOR_ICON::ScaledIcon( wxBitmap const& aSource ) const
|
||||||
|
{
|
||||||
|
int dest_height = ConvertDialogToPixels( wxSize( 0, 4 ) ).y;
|
||||||
|
wxSize source_size = aSource.GetSize();
|
||||||
|
double scale = (double) dest_height / (double) source_size.y;
|
||||||
|
|
||||||
|
wxImage source = aSource.ConvertToImage();
|
||||||
|
source.Rescale( scale * source_size.x, scale * source_size.y, wxIMAGE_QUALITY_HIGH );
|
||||||
|
|
||||||
|
wxBitmap dest( source );
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
// ====================================================================
|
// ====================================================================
|
||||||
// Common icon providers
|
// Common icon providers
|
||||||
|
|
||||||
|
|
|
@ -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 KiCad Developers, see AUTHORS.txt for contributors.
|
* Copyright (C) 2017-2018 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
|
||||||
|
@ -97,6 +97,11 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scale an icon to one character width.
|
||||||
|
*/
|
||||||
|
wxBitmap ScaledIcon( wxBitmap const& aSource ) const;
|
||||||
|
|
||||||
///> An class that delivers icons for the indictor (currently just
|
///> An class that delivers icons for the indictor (currently just
|
||||||
///> uses a default implementation).
|
///> uses a default implementation).
|
||||||
ICON_PROVIDER& m_iconProvider;
|
ICON_PROVIDER& m_iconProvider;
|
||||||
|
|
Loading…
Reference in New Issue