Subject: bug#36633: Scrolling by pixels: visible stretch glyphs overwrite header-line.

From: Alan Third <[email-masked]>
Date: Tue, 16 Jul 2019 21:38:56 +0100

On Sun, Jul 14, 2019 at 09:47:25AM -0700, Keith David Bershatsky wrote:
> Here are links to two (2) youtube videos showing the issue on Emacs
> 26.1 (built by https://emacsformacosx.com/ a few months ago) and
> also the master branch that I built using a commit from 07/10/2019
> (40cd6278ba965f3a9fcdddc568eb9ee7c69cf899). I don't have a 26.2
> build at the moment. The issue is less noticeable on the master
> branch, but can still be seen nevertheless. I have not studied the
> code as to what makes this feature work, but offhand would think
> that the header-line should not be overwritten by the row moving
> upwards (rather than updated after it has been overwritten).
> 
> Emacs 26.1:  https://youtu.be/Y8cZfURSwZc
> 
> Emacs Master Branch:  https://youtu.be/BO3r9_6OvYo

OK, that’s really not what I was expecting to see. 

It looks to me like the stretch glyph code in nsterm.m is just
nonsensical... I don’t really know what to make of it. I guess I’m
missing something?

Anyway, patch attached. I don’t see anything particularly wrong with
it applied, but it’s possible I’ve reintroduced some bug where the
modeline gets partially overwritten.

The patch is against master, but it’s probably possible to apply it to
26 manually.
-- 
Alan Third
>From 637813be1f6cd6119bddd7864e1f7778e46f2b71 Mon Sep 17 00:00:00 2001
From: Alan Third <[email-masked]>
Date: Tue, 16 Jul 2019 21:32:23 +0100
Subject: [PATCH] Fix stretch glyphs overlap with line above (bug#36633)

* src/nsterm.m (ns_dumpglyphs_stretch): Move overwriting of the
clipping rectangle to after performing clipping.
---
 src/nsterm.m | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/src/nsterm.m b/src/nsterm.m
index 02331826d9..b8754278f0 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -3913,10 +3913,13 @@ Function modeled after x_draw_glyph_string_box ().
   if (!s->background_filled_p)
     {
       n = ns_get_glyph_string_clip_rect (s, r);
-      *r = NSMakeRect (s->x, s->y, s->background_width, s->height);
 
       if (ns_clip_to_rect (s->f, r, n))
         {
+          /* FIXME: Why are we reusing the clipping rectangles? The
+             other terms don't appear to do anything like this.  */
+          *r = NSMakeRect (s->x, s->y, s->background_width, s->height);
+
           if (s->hl == DRAW_MOUSE_FACE)
             {
               face = FACE_FROM_ID_OR_NULL (s->f,
@@ -3951,13 +3954,6 @@ Function modeled after x_draw_glyph_string_box ().
                         r[i].origin.x += leftoverrun;
                         r[i].size.width -= leftoverrun;
                       }
-
-                    /* XXX: Try to work between problem where a stretch glyph on
-                       a partially-visible bottom row will clear part of the
-                       modeline, and another where list-buffers headers and similar
-                       rows erroneously have visible_height set to 0.  Not sure
-                       where this is coming from as other terms seem not to show.  */
-                    r[i].size.height = min (s->height, s->row->visible_height);
                 }
 
               [bgCol set];
-- 
2.21.0