emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master ef6ffbdc796: Fix display of stipples on NS with respect to cursor


From: Po Lu
Subject: master ef6ffbdc796: Fix display of stipples on NS with respect to cursor highlight
Date: Thu, 2 May 2024 05:28:19 -0400 (EDT)

branch: master
commit ef6ffbdc79645e719d3b5ef23c9200405c58c61e
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Fix display of stipples on NS with respect to cursor highlight
    
    * src/nsfont.m (nsfont_draw): Delete redundant code.
    
    * src/nsterm.m (ns_maybe_dumpglyphs_background): Conform logic
    to X version by always displaying the background if s->stipple_p
    should be set.
    (ns_draw_stretch_glyph_string): Set stipple background as
    appropriate.
    (ns_set_glyph_string_gc): New function.
    (ns_draw_glyph_string): Call it, as on X.  Reported by Arash
    Esbati <arash@gnu.org>.
---
 src/nsfont.m |  19 +++-------
 src/nsterm.m | 115 +++++++++++++++++++++++++++++++++++++++++------------------
 2 files changed, 86 insertions(+), 48 deletions(-)

diff --git a/src/nsfont.m b/src/nsfont.m
index 4e1d85a5c4a..e1b1b097c17 100644
--- a/src/nsfont.m
+++ b/src/nsfont.m
@@ -1180,21 +1180,12 @@ nsfont_draw (struct glyph_string *s, int from, int to, 
int x, int y,
     {
       NSRect br = NSMakeRect (x, y - FONT_BASE (s->font),
                              s->width, FONT_HEIGHT (s->font));
-
-      if (!s->face->stipple)
-       {
-         if (s->hl != DRAW_CURSOR)
-           [(NS_FACE_BACKGROUND (face) != 0
-             ? [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)]
-             : FRAME_BACKGROUND_COLOR (s->f)) set];
-         else
-           [FRAME_CURSOR_COLOR (s->f) set];
-       }
+      if (s->hl != DRAW_CURSOR)
+       [(NS_FACE_BACKGROUND (face) != 0
+         ? [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)]
+         : FRAME_BACKGROUND_COLOR (s->f)) set];
       else
-        {
-          struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (s->f);
-          [[dpyinfo->bitmaps[face->stipple-1].img stippleMask] set];
-        }
+       [FRAME_CURSOR_COLOR (s->f) set];
       NSRectFill (br);
     }
 
diff --git a/src/nsterm.m b/src/nsterm.m
index 71fa6e22164..f26cdb17903 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -3808,7 +3808,6 @@ ns_dumpglyphs_box_or_relief (struct glyph_string *s)
     }
 }
 
-
 static void
 ns_maybe_dumpglyphs_background (struct glyph_string *s, char force_p)
 /* --------------------------------------------------------------------------
@@ -3816,45 +3815,47 @@ ns_maybe_dumpglyphs_background (struct glyph_string *s, 
char force_p)
       certain cases.  Others are left to the text rendering routine.
    -------------------------------------------------------------------------- 
*/
 {
+  struct face *face = s->face;
+  NSRect r;
+
   NSTRACE ("ns_maybe_dumpglyphs_background");
 
-  if (!s->background_filled_p/* || s->hl == DRAW_MOUSE_FACE*/)
+  if (!s->background_filled_p)
     {
       int box_line_width = max (s->face->box_horizontal_line_width, 0);
 
-      if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width
-         /* When xdisp.c ignores FONT_HEIGHT, we cannot trust font
-            dimensions, since the actual glyphs might be much
-            smaller.  So in that case we always clear the rectangle
-            with background color.  */
-         || FONT_TOO_HIGH (s->font)
-          || s->font_not_found_p || s->extends_to_end_of_line_p || force_p)
+      if (s->stippled_p)
        {
-          struct face *face = s->face;
-          if (!face->stipple)
-            {
-              if (s->hl != DRAW_CURSOR)
-                [(NS_FACE_BACKGROUND (face) != 0
-                  ? [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)]
-                  : FRAME_BACKGROUND_COLOR (s->f)) set];
-              else if (face && (NS_FACE_BACKGROUND (face)
-                                == [(NSColor *) FRAME_CURSOR_COLOR (s->f)
-                                                unsignedLong]))
-                [[NSColor colorWithUnsignedLong:NS_FACE_FOREGROUND (face)] 
set];
-              else
-                [FRAME_CURSOR_COLOR (s->f) set];
-            }
-          else
-            {
-              struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (s->f);
-              [[dpyinfo->bitmaps[face->stipple-1].img stippleMask] set];
-            }
+         struct ns_display_info *dpyinfo = FRAME_DISPLAY_INFO (s->f);
+         [[dpyinfo->bitmaps[face->stipple-1].img stippleMask] set];
+         goto fill;
+       }
+      else if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width
+              /* When xdisp.c ignores FONT_HEIGHT, we cannot trust font
+                 dimensions, since the actual glyphs might be much
+                 smaller.  So in that case we always clear the
+                 rectangle with background color.  */
+              || FONT_TOO_HIGH (s->font)
+              || s->font_not_found_p
+              || s->extends_to_end_of_line_p
+              || force_p)
+       {
+         if (s->hl != DRAW_CURSOR)
+           [(NS_FACE_BACKGROUND (face) != 0
+             ? [NSColor colorWithUnsignedLong:NS_FACE_BACKGROUND (face)]
+             : FRAME_BACKGROUND_COLOR (s->f)) set];
+         else if (face && (NS_FACE_BACKGROUND (face)
+                           == [(NSColor *) FRAME_CURSOR_COLOR (s->f)
+                                           unsignedLong]))
+           [[NSColor colorWithUnsignedLong:NS_FACE_FOREGROUND (face)] set];
+         else
+           [FRAME_CURSOR_COLOR (s->f) set];
 
-         NSRect r = NSMakeRect (s->x, s->y + box_line_width,
-                                s->background_width,
-                                s->height - 2 * box_line_width);
+       fill:
+         r = NSMakeRect (s->x, s->y + box_line_width,
+                         s->background_width,
+                         s->height - 2 * box_line_width);
          NSRectFill (r);
-
          s->background_filled_p = 1;
        }
     }
@@ -4083,8 +4084,7 @@ ns_draw_stretch_glyph_string (struct glyph_string *s)
   struct face *face;
   NSColor *fg_color;
 
-  if (s->hl == DRAW_CURSOR
-      && !x_stretch_cursor_p)
+  if (s->hl == DRAW_CURSOR && !x_stretch_cursor_p)
     {
       /* If `x-stretch-cursor' is nil, don't draw a block cursor as
         wide as the stretch glyph.  */
@@ -4170,8 +4170,13 @@ ns_draw_stretch_glyph_string (struct glyph_string *s)
 
       if (background_width > 0)
        {
+         struct ns_display_info *dpyinfo;
+
+         dpyinfo = FRAME_DISPLAY_INFO (s->f);
          if (s->hl == DRAW_CURSOR)
            [FRAME_CURSOR_COLOR (s->f) set];
+         else if (s->stippled_p)
+           [[dpyinfo->bitmaps[s->face->stipple - 1].img stippleMask] set];
          else
            [[NSColor colorWithUnsignedLong: s->face->background] set];
 
@@ -4389,6 +4394,45 @@ ns_draw_glyphless_glyph_string_foreground (struct 
glyph_string *s)
   s->char2b = NULL;
 }
 
+/* Transfer glyph string parameters from S's face to S itself.
+   Set S->stipple_p as appropriate, taking the draw type into
+   account.  */
+
+static void
+ns_set_glyph_string_gc (struct glyph_string *s)
+{
+  prepare_face_for_display (s->f, s->face);
+
+  if (s->hl == DRAW_NORMAL_TEXT)
+    {
+      /* s->gc = s->face->gc; */
+      s->stippled_p = s->face->stipple != 0;
+    }
+  else if (s->hl == DRAW_INVERSE_VIDEO)
+    {
+      /* x_set_mode_line_face_gc (s); */
+      s->stippled_p = s->face->stipple != 0;
+    }
+  else if (s->hl == DRAW_CURSOR)
+    {
+      /* x_set_cursor_gc (s); */
+      s->stippled_p = false;
+    }
+  else if (s->hl == DRAW_MOUSE_FACE)
+    {
+      /* x_set_mouse_face_gc (s); */
+      s->stippled_p = s->face->stipple != 0;
+    }
+  else if (s->hl == DRAW_IMAGE_RAISED
+          || s->hl == DRAW_IMAGE_SUNKEN)
+    {
+      /* s->gc = s->face->gc; */
+      s->stippled_p = s->face->stipple != 0;
+    }
+  else
+    emacs_abort ();
+}
+
 static void
 ns_draw_glyph_string (struct glyph_string *s)
 /* --------------------------------------------------------------------------
@@ -4414,6 +4458,7 @@ ns_draw_glyph_string (struct glyph_string *s)
           width += next->width, next = next->next)
        if (next->first_glyph->type != IMAGE_GLYPH)
           {
+           ns_set_glyph_string_gc (next);
            n = ns_get_glyph_string_clip_rect (s->next, r);
            ns_focus (s->f, r, n);
             if (next->first_glyph->type != STRETCH_GLYPH)
@@ -4425,6 +4470,8 @@ ns_draw_glyph_string (struct glyph_string *s)
           }
     }
 
+  ns_set_glyph_string_gc (s);
+
   if (!s->for_overlaps && s->face->box != FACE_NO_BOX
         && (s->first_glyph->type == CHAR_GLYPH
            || s->first_glyph->type == COMPOSITE_GLYPH))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]