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 );