From 2e43c6c64e0bdf7a7c5897db2b7b53d0da31080e Mon Sep 17 00:00:00 2001 From: jean-pierre charras <jp.charras@wanadoo.fr> Date: Mon, 6 May 2019 11:28:14 +0200 Subject: [PATCH] Cairo GAL: fix incorrect arc position in mirror mode. It happens in print mode and also when the Pcb view is flipped. Fixes: lp:1824720 https://bugs.launchpad.net/kicad/+bug/1824720 Fixes: lp:1822772 https://bugs.launchpad.net/kicad/+bug/1822772 Fixes: lp:1823147 https://bugs.launchpad.net/kicad/+bug/1823147 --- common/gal/cairo/cairo_gal.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/common/gal/cairo/cairo_gal.cpp b/common/gal/cairo/cairo_gal.cpp index 76a9da7e8d..fd66fd46a1 100644 --- a/common/gal/cairo/cairo_gal.cpp +++ b/common/gal/cairo/cairo_gal.cpp @@ -259,6 +259,17 @@ void CAIRO_GAL_BASE::DrawArc( const VECTOR2D& aCenterPoint, double aRadius, doub { syncLineWidth(); + // When the view is flipped, the coordinates are flipped by the matrix transform + // However, arc angles need a small change: swapping start and end, *without changing* + // the arc orientation. + // TODO: see the changes if the flip is for the Y axis + if( IsFlippedX() ) + { + double delta = aEndAngle - aStartAngle; + aEndAngle = aStartAngle; + aStartAngle -= delta; + } + SWAP( aStartAngle, >, aEndAngle ); auto startAngleS = angle_xform( aStartAngle ); auto endAngleS = angle_xform( aEndAngle ); @@ -304,6 +315,18 @@ void CAIRO_GAL_BASE::DrawArcSegment( const VECTOR2D& aCenterPoint, double aRadiu } syncLineWidth(); + + // When the view is flipped, the coordinates are flipped by the matrix transform + // However, arc angles need a small change: swapping start and end, *without changing* + // the arc orientation. + // TODO: see the changes if the flip is for the Y axis + if( IsFlippedX() ) + { + double delta = aEndAngle - aStartAngle; + aEndAngle = aStartAngle; + aStartAngle -= delta; + } + SWAP( aStartAngle, >, aEndAngle ); auto startAngleS = angle_xform( aStartAngle ); auto endAngleS = angle_xform( aEndAngle );