aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gtk/PlatGTK.cxx22
1 files changed, 20 insertions, 2 deletions
diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx
index 4a6d76308..1139b1b97 100644
--- a/gtk/PlatGTK.cxx
+++ b/gtk/PlatGTK.cxx
@@ -1019,10 +1019,28 @@ void SurfaceImpl::MoveTo(int x_, int y_) {
void SurfaceImpl::LineTo(int x_, int y_) {
#ifdef USE_CAIRO
// Lines draw their end position, unlike Win32 or GDK with GDK_CAP_NOT_LAST.
- // Could try to move back one pixel, possibly only for simple cases like horizontal and vertical
+ // For simple cases, move back one pixel from end.
if (context) {
cairo_move_to(context, x + 0.5, y + 0.5);
- cairo_line_to(context, x_ + 0.5, y_ + 0.5);
+ int xdiff = x_ - x;
+ int xdelta = 0;
+ if (xdiff < 0)
+ xdelta = -1;
+ else if (xdiff > 0)
+ xdelta = 1;
+ int ydiff = y_ - y;
+ int ydelta = 0;
+ if (ydiff < 0)
+ ydelta = -1;
+ else if (ydiff > 0)
+ ydelta = 1;
+ if ((abs(xdiff) == abs(ydiff)) || (xdiff == 0) || (ydiff == 0)) {
+ // Horizontal, vertical or 45 degree slope
+ cairo_line_to(context, x_ + 0.5 - xdelta, y_ + 0.5 - ydelta);
+ } else {
+ // Line has a different slope so difficult to avoid last pixel
+ cairo_line_to(context, x_ + 0.5, y_ + 0.5);
+ }
cairo_stroke(context);
}
#else