Alpha-blend color with the checkerboard in color swatches.
This commit is contained in:
parent
daf178b64f
commit
bbba7fd4d7
|
@ -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-2023 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
|
||||||
|
@ -33,10 +33,6 @@ wxDEFINE_EVENT( COLOR_SWATCH_CHANGED, wxCommandEvent );
|
||||||
using KIGFX::COLOR4D;
|
using KIGFX::COLOR4D;
|
||||||
|
|
||||||
|
|
||||||
// See selcolor.cpp:
|
|
||||||
extern COLOR4D DisplayColorFrame( wxWindow* aParent, COLOR4D aOldColor );
|
|
||||||
|
|
||||||
|
|
||||||
wxBitmap COLOR_SWATCH::MakeBitmap( const COLOR4D& aColor, const COLOR4D& aBackground,
|
wxBitmap COLOR_SWATCH::MakeBitmap( const COLOR4D& aColor, const COLOR4D& aBackground,
|
||||||
const wxSize& aSize, const wxSize& aCheckerboardSize,
|
const wxSize& aSize, const wxSize& aCheckerboardSize,
|
||||||
const COLOR4D& aCheckerboardBackground )
|
const COLOR4D& aCheckerboardBackground )
|
||||||
|
@ -57,66 +53,68 @@ void COLOR_SWATCH::RenderToDC( wxDC* aDC, const KIGFX::COLOR4D& aColor,
|
||||||
const wxSize& aCheckerboardSize,
|
const wxSize& aCheckerboardSize,
|
||||||
const KIGFX::COLOR4D& aCheckerboardBackground )
|
const KIGFX::COLOR4D& aCheckerboardBackground )
|
||||||
{
|
{
|
||||||
wxBrush brush;
|
wxBrush brush;
|
||||||
wxPen pen;
|
wxPen pen;
|
||||||
|
|
||||||
brush.SetStyle( wxBRUSHSTYLE_SOLID );
|
brush.SetStyle( wxBRUSHSTYLE_SOLID );
|
||||||
|
|
||||||
if( aColor == COLOR4D::UNSPECIFIED )
|
// Draw a checkerboard
|
||||||
|
COLOR4D white;
|
||||||
|
COLOR4D black;
|
||||||
|
bool rowCycle;
|
||||||
|
|
||||||
|
if( aCheckerboardBackground.GetBrightness() > 0.4 )
|
||||||
{
|
{
|
||||||
// Draw a checkerboard
|
white = COLOR4D::WHITE;
|
||||||
COLOR4D white;
|
black = white.Darkened( 0.15 );
|
||||||
COLOR4D black;
|
rowCycle = true;
|
||||||
bool rowCycle;
|
|
||||||
|
|
||||||
if( aCheckerboardBackground.GetBrightness() > 0.4 )
|
|
||||||
{
|
|
||||||
white = COLOR4D::WHITE;
|
|
||||||
black = white.Darkened( 0.15 );
|
|
||||||
rowCycle = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
black = COLOR4D::BLACK;
|
|
||||||
white = black.Brightened( 0.15 );
|
|
||||||
rowCycle = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for( int x = aRect.GetLeft(); x < aRect.GetRight(); x += aCheckerboardSize.x )
|
|
||||||
{
|
|
||||||
bool colCycle = rowCycle;
|
|
||||||
|
|
||||||
for( int y = aRect.GetTop(); y < aRect.GetBottom(); y += aCheckerboardSize.y )
|
|
||||||
{
|
|
||||||
COLOR4D color = colCycle ? black : white;
|
|
||||||
brush.SetColour( color.ToColour() );
|
|
||||||
pen.SetColour( color.ToColour() );
|
|
||||||
|
|
||||||
aDC->SetBrush( brush );
|
|
||||||
aDC->SetPen( pen );
|
|
||||||
aDC->DrawRectangle( x, y, aCheckerboardSize.x, aCheckerboardSize.y );
|
|
||||||
|
|
||||||
colCycle = !colCycle;
|
|
||||||
}
|
|
||||||
|
|
||||||
rowCycle = !rowCycle;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
brush.SetColour( aBackground.WithAlpha(1.0).ToColour() );
|
black = COLOR4D::BLACK;
|
||||||
pen.SetColour( aBackground.WithAlpha(1.0).ToColour() );
|
white = black.Brightened( 0.15 );
|
||||||
|
rowCycle = false;
|
||||||
|
}
|
||||||
|
|
||||||
aDC->SetBrush( brush );
|
for( int x = aRect.GetLeft(); x <= aRect.GetRight(); x += aCheckerboardSize.x )
|
||||||
aDC->SetPen( pen );
|
{
|
||||||
aDC->DrawRectangle( aRect );
|
bool colCycle = rowCycle;
|
||||||
|
|
||||||
brush.SetColour( aColor.ToColour() );
|
for( int y = aRect.GetTop(); y <= aRect.GetBottom(); y += aCheckerboardSize.y )
|
||||||
pen.SetColour( aColor.ToColour() );
|
{
|
||||||
|
COLOR4D color = colCycle ? black : white;
|
||||||
|
brush.SetColour( color.ToColour() );
|
||||||
|
pen.SetColour( color.ToColour() );
|
||||||
|
|
||||||
aDC->SetBrush( brush );
|
aDC->SetBrush( brush );
|
||||||
aDC->SetPen( pen );
|
aDC->SetPen( pen );
|
||||||
aDC->DrawRectangle( aRect );
|
aDC->DrawRectangle( x, y, aCheckerboardSize.x, aCheckerboardSize.y );
|
||||||
|
|
||||||
|
colCycle = !colCycle;
|
||||||
|
}
|
||||||
|
|
||||||
|
rowCycle = !rowCycle;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Blend fg color with the checkerboard
|
||||||
|
wxColor fg = aColor.ToColour();
|
||||||
|
|
||||||
|
for( int y = aRect.GetTop(); y <= aRect.GetBottom(); y++ )
|
||||||
|
{
|
||||||
|
for( int x = aRect.GetLeft(); x <= aRect.GetRight(); x++ )
|
||||||
|
{
|
||||||
|
wxColor bg;
|
||||||
|
aDC->GetPixel( x, y, &bg );
|
||||||
|
|
||||||
|
unsigned char r = wxColor::AlphaBlend( fg.Red(), bg.Red(), aColor.a );
|
||||||
|
unsigned char g = wxColor::AlphaBlend( fg.Green(), bg.Green(), aColor.a );
|
||||||
|
unsigned char b = wxColor::AlphaBlend( fg.Blue(), bg.Blue(), aColor.a );
|
||||||
|
|
||||||
|
pen.SetColour( r, g, b );
|
||||||
|
aDC->SetPen( pen );
|
||||||
|
|
||||||
|
aDC->DrawPoint( x, y );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue