From a36207574ac436fd8871639388cc6400069bb9bb Mon Sep 17 00:00:00 2001 From: Po Lu Date: Sat, 8 Jul 2023 21:49:21 +0800 Subject: [PATCH] Fix EmacsDrawLine again * java/org/gnu/emacs/EmacsDrawLine.java (perform): Symmetrically adjust coordinates to cover the last pixel. Then, fill the left most pixel of the line. --- java/org/gnu/emacs/EmacsDrawLine.java | 33 +++++++++++++++++++-------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/java/org/gnu/emacs/EmacsDrawLine.java b/java/org/gnu/emacs/EmacsDrawLine.java index 3f5067c0bdd..d367ccff9c4 100644 --- a/java/org/gnu/emacs/EmacsDrawLine.java +++ b/java/org/gnu/emacs/EmacsDrawLine.java @@ -32,30 +32,45 @@ public final class EmacsDrawLine Rect rect; Canvas canvas; Paint paint; + int x0, x1, y0, y1; /* TODO implement stippling. */ if (gc.fill_style == EmacsGC.GC_FILL_OPAQUE_STIPPLED) return; + /* Calculate the leftmost and rightmost points. */ + + x0 = Math.min (x, x2 + 1); + x1 = Math.max (x, x2 + 1); + y0 = Math.min (y, y2 + 1); + y1 = Math.max (y, y2 + 1); + + /* And the clip rectangle. */ + paint = gc.gcPaint; - rect = new Rect (Math.min (x, x2 + 1), - Math.min (y, y2 + 1), - Math.max (x2 + 1, x), - Math.max (y2 + 1, y)); + rect = new Rect (x0, y0, x1, y1); canvas = drawable.lockCanvas (gc); if (canvas == null) return; - paint.setStyle (Paint.Style.STROKE); + paint.setStyle (Paint.Style.FILL); /* Since drawLine has PostScript style behavior, adjust the - coordinates appropriately. */ + coordinates appropriately. + + The left most pixel of a straight line is always partially + filled. Patch it in manually. */ if (gc.clip_mask == null) - canvas.drawLine ((float) x, (float) y + 0.5f, - (float) x2 + 0.5f, (float) y2 + 0.5f, - paint); + { + canvas.drawLine ((float) x + 0.5f, (float) y + 0.5f, + (float) x2 + 0.5f, (float) y2 + 0.5f, + paint); + + if (x2 > x) + canvas.drawRect (new Rect (x, y, x + 1, y + 1), paint); + } /* DrawLine with clip mask not implemented; it is not used by Emacs. */ -- 2.39.2