Browse Source

Put background color behind transparent bitmaps in eeschema printing.

Most virtual printers don't support alpha blending via AlphaBlend (MSW)
properly, nor masks.
newinvert
Alex Shvartzkop 2 years ago
parent
commit
b242779f3b
  1. 24
      common/bitmap_base.cpp
  2. 3
      common/drawing_sheet/ds_draw_item.cpp
  3. 2
      eeschema/sch_bitmap.cpp
  4. 11
      include/bitmap_base.h

24
common/bitmap_base.cpp

@ -281,7 +281,8 @@ const BOX2I BITMAP_BASE::GetBoundingBox() const
}
void BITMAP_BASE::DrawBitmap( wxDC* aDC, const VECTOR2I& aPos )
void BITMAP_BASE::DrawBitmap( wxDC* aDC, const VECTOR2I& aPos,
const KIGFX::COLOR4D& aBackgroundColor )
{
if( m_bitmap == nullptr )
return;
@ -358,7 +359,26 @@ void BITMAP_BASE::DrawBitmap( wxDC* aDC, const VECTOR2I& aPos )
aDC->SetClippingRegion( clipAreaPos, wxSize( size.x, size.y ) );
#endif
if( GetGRForceBlackPenState() )
if( aBackgroundColor != COLOR4D::UNSPECIFIED && m_bitmap->HasAlpha() )
{
// Most printers don't support transparent images properly,
// so blend the image with background color.
int w = m_bitmap->GetWidth();
int h = m_bitmap->GetHeight();
wxImage image( w, h );
wxColour bgColor = aBackgroundColor.ToColour();
image.SetRGB( wxRect( 0, 0, w, h ), bgColor.Red(), bgColor.Green(), bgColor.Blue() );
image.Paste( m_bitmap->ConvertToImage(), 0, 0, wxIMAGE_ALPHA_BLEND_COMPOSE );
if( GetGRForceBlackPenState() )
image = image.ConvertToGreyscale();
aDC->DrawBitmap( wxBitmap( image ), pos.x, pos.y, true );
}
else if( GetGRForceBlackPenState() )
{
wxBitmap result( m_bitmap->ConvertToImage().ConvertToGreyscale() );
aDC->DrawBitmap( result, pos.x, pos.y, true );

3
common/drawing_sheet/ds_draw_item.cpp

@ -463,7 +463,8 @@ void DS_DRAW_ITEM_BITMAP::PrintWsItem( const RENDER_SETTINGS* aSettings, const V
if( !bitmap->m_ImageBitmap )
return;
bitmap->m_ImageBitmap->DrawBitmap( aSettings->GetPrintDC(), m_pos + aOffset );
bitmap->m_ImageBitmap->DrawBitmap( aSettings->GetPrintDC(), m_pos + aOffset,
aSettings->GetBackgroundColor() );
}

2
eeschema/sch_bitmap.cpp

@ -131,7 +131,7 @@ void SCH_BITMAP::Print( const RENDER_SETTINGS* aSettings, const VECTOR2I& aOffse
{
VECTOR2I pos = m_pos + aOffset;
m_bitmapBase->DrawBitmap( aSettings->GetPrintDC(), pos );
m_bitmapBase->DrawBitmap( aSettings->GetPrintDC(), pos, aSettings->GetBackgroundColor() );
}

11
include/bitmap_base.h

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2018 jean-pierre.charras jp.charras at wanadoo.fr
* Copyright (C) 2013-2020 KiCad Developers, see AUTHORS.txt for contributors.
* Copyright (C) 2013-2023 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -29,11 +29,7 @@
#include <wx/image.h>
#include <kiid.h>
#include <math/box2.h>
namespace KIGFX
{
class COLOR4D;
}
#include <gal/color4d.h>
class LINE_READER;
class PLOTTER;
@ -134,7 +130,8 @@ public:
*/
const BOX2I GetBoundingBox() const;
void DrawBitmap( wxDC* aDC, const VECTOR2I& aPos );
void DrawBitmap( wxDC* aDC, const VECTOR2I& aPos,
const KIGFX::COLOR4D& aBackgroundColor = KIGFX::COLOR4D::UNSPECIFIED );
/**
* Reads and stores in memory an image file.

Loading…
Cancel
Save