From fcaf11422a033e185c54369978ce69a332d43e41 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Sat, 11 Jan 2020 09:44:54 -0800 Subject: [PATCH] Fix bitmap clipping When printing (using DC context) the bitmap will clear the full screen unless the clipping region is set to the image itself. Addresses KSC ticket 126 Fixes #1877 | https://gitlab.com/kicad/code/kicad/issues/1877 (cherry picked from commit 195c3d074b881c12a4e8b5570b2e64f219d55d72) --- common/bitmap_base.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/common/bitmap_base.cpp b/common/bitmap_base.cpp index c837cfac4a..dbe910b786 100644 --- a/common/bitmap_base.cpp +++ b/common/bitmap_base.cpp @@ -240,18 +240,23 @@ void BITMAP_BASE::DrawBitmap( wxDC* aDC, const wxPoint& aPos ) aDC->SetLogicalOrigin( logicalOriginX / GetScalingFactor(), logicalOriginY / GetScalingFactor() ); + pos.x = KiROUND( pos.x / GetScalingFactor() ); + pos.y = KiROUND( pos.y / GetScalingFactor() ); + size.x = KiROUND( size.x / GetScalingFactor() ); + size.y = KiROUND( size.y / GetScalingFactor() ); + aDC->SetClippingRegion( pos, size ); + if( GetGRForceBlackPenState() ) { wxBitmap result( m_bitmap->ConvertToImage().ConvertToGreyscale() ); - aDC->DrawBitmap( result, KiROUND( pos.x / GetScalingFactor() ), - KiROUND( pos.y / GetScalingFactor() ), true ); + aDC->DrawBitmap( result, pos.x, pos.y, true ); } else { - aDC->DrawBitmap( *m_bitmap, KiROUND( pos.x / GetScalingFactor() ), - KiROUND( pos.y / GetScalingFactor() ), true ); + aDC->DrawBitmap( *m_bitmap, pos.x, pos.y, true ); } + aDC->DestroyClippingRegion(); aDC->SetUserScale( scale, scale ); aDC->SetLogicalOrigin( logicalOriginX, logicalOriginY ); }