emacs-diffs
[Top][All Lists]
Advanced

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

master ed62de0d39: Resolve clipping related mysteries on Haiku


From: Po Lu
Subject: master ed62de0d39: Resolve clipping related mysteries on Haiku
Date: Wed, 5 Jan 2022 05:41:02 -0500 (EST)

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

    Resolve clipping related mysteries on Haiku
    
    * src/ftcrfont.c (ftcrfont_draw):
    * src/haikufont.c (haikufont_draw): Remove workarounds for
    previously broken clipping code.
    * src/haikuterm.c (haiku_clip_to_string): Handle empty clipping
    rectangles correctly.
    (haiku_clip_to_string_exactly): Stop setting num_clips.
    (haiku_draw_glyph_string): Stop saving face when drawing
    overhangs.
---
 src/ftcrfont.c  |  7 ------
 src/haikufont.c |  7 ------
 src/haikuterm.c | 68 ++++++++++++++++++++++++++++++++++-----------------------
 3 files changed, 41 insertions(+), 41 deletions(-)

diff --git a/src/ftcrfont.c b/src/ftcrfont.c
index e8159d11b1..337e804b89 100644
--- a/src/ftcrfont.c
+++ b/src/ftcrfont.c
@@ -545,13 +545,6 @@ ftcrfont_draw (struct glyph_string *s,
       return 0;
     }
   BView_cr_dump_clipping (FRAME_HAIKU_VIEW (f), cr);
-
-  if (s->left_overhang && s->clip_head && !s->for_overlaps)
-    {
-      cairo_rectangle (cr, s->clip_head->x, 0,
-                      FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f));
-      cairo_clip (cr);
-    }
 #endif
 
   if (with_background)
diff --git a/src/haikufont.c b/src/haikufont.c
index e1a09f407c..e08792be4b 100644
--- a/src/haikufont.c
+++ b/src/haikufont.c
@@ -983,13 +983,6 @@ haikufont_draw (struct glyph_string *s, int from, int to,
       s->background_filled_p = 1;
     }
 
-  if (s->left_overhang && s->clip_head && !s->for_overlaps)
-    {
-      /* XXX: Why is this neccessary? */
-      BView_ClipToRect (view, s->clip_head->x, 0,
-                       FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f));
-    }
-
   if (s->hl == DRAW_CURSOR)
     BView_SetHighColor (view, FRAME_OUTPUT_DATA (s->f)->cursor_fg);
   else
diff --git a/src/haikuterm.c b/src/haikuterm.c
index b8cb57a8fb..928b571855 100644
--- a/src/haikuterm.c
+++ b/src/haikuterm.c
@@ -145,15 +145,32 @@ haiku_clip_to_string (struct glyph_string *s)
   int n = get_glyph_string_clip_rects (s, (struct haiku_rect *) &r, 2);
 
   if (n)
-    BView_ClipToRect (FRAME_HAIKU_VIEW (s->f), r[0].x, r[0].y,
-                     r[0].width, r[0].height);
-  if (n > 1)
     {
-      BView_ClipToRect (FRAME_HAIKU_VIEW (s->f), r[1].x, r[1].y,
-                       r[1].width, r[1].height);
+      /* If n[FOO].width is 0, it means to not draw at all, so set the
+        clipping to some impossible value.  */
+      if (r[0].width <= 0)
+       BView_ClipToRect (FRAME_HAIKU_VIEW (s->f),
+                         FRAME_PIXEL_WIDTH (s->f),
+                         FRAME_PIXEL_HEIGHT (s->f),
+                         10, 10);
+      else
+       BView_ClipToRect (FRAME_HAIKU_VIEW (s->f), r[0].x,
+                         r[0].y, r[0].width, r[0].height);
     }
 
-  s->num_clips = n;
+  if (n > 1)
+    {
+      /* If n[FOO].width is 0, it means to not draw at all, so set the
+        clipping to some impossible value.  */
+      if (r[1].width <= 0)
+       BView_ClipToRect (FRAME_HAIKU_VIEW (s->f),
+                         FRAME_PIXEL_WIDTH (s->f),
+                         FRAME_PIXEL_HEIGHT (s->f),
+                         10, 10);
+      else
+       BView_ClipToRect (FRAME_HAIKU_VIEW (s->f), r[1].x, r[1].y,
+                         r[1].width, r[1].height);
+    }
 }
 
 static void
@@ -161,7 +178,6 @@ haiku_clip_to_string_exactly (struct glyph_string *s, 
struct glyph_string *dst)
 {
   BView_ClipToRect (FRAME_HAIKU_VIEW (s->f), s->x, s->y,
                    s->width, s->height);
-  dst->num_clips = 1;
 }
 
 static void
@@ -1468,7 +1484,6 @@ haiku_draw_glyph_string (struct glyph_string *s)
              haiku_maybe_draw_background (s->next, 1);
             else
              haiku_draw_stretch_glyph_string (s->next);
-            next->num_clips = 0;
            haiku_end_clip (s);
           }
     }
@@ -1486,9 +1501,13 @@ haiku_draw_glyph_string (struct glyph_string *s)
       box_filled_p = 1;
       haiku_draw_string_box (s, 0);
     }
-  else if (!s->clip_head && !s->clip_tail &&
-          ((s->prev && s->left_overhang && s->prev->hl != s->hl) ||
-           (s->next && s->right_overhang && s->next->hl != s->hl)))
+  else if (!s->clip_head /* draw_glyphs didn't specify a clip mask. */
+          && !s->clip_tail
+          && ((s->prev && s->prev->hl != s->hl && s->left_overhang)
+              || (s->next && s->next->hl != s->hl && s->right_overhang)))
+    /* We must clip just this glyph.  left_overhang part has already
+       drawn when s->prev was drawn, and right_overhang part will be
+       drawn later when s->next is drawn. */
     haiku_clip_to_string_exactly (s, s);
   else
     haiku_clip_to_string (s);
@@ -1526,15 +1545,18 @@ haiku_draw_glyph_string (struct glyph_string *s)
        haiku_maybe_draw_background (s, 1);
       haiku_draw_glyphless_glyph_string_foreground (s);
       break;
+    default:
+      emacs_abort ();
     }
 
-  if (!box_filled_p && face->box != FACE_NO_BOX)
-    haiku_draw_string_box (s, 1);
-  else
-    haiku_draw_text_decoration (s, face, face->foreground, s->width, s->x);
-
   if (!s->for_overlaps)
     {
+      if (!box_filled_p && face->box != FACE_NO_BOX)
+       haiku_draw_string_box (s, 1);
+      else
+       haiku_draw_text_decoration (s, face, face->foreground,
+                                   s->width, s->x);
+
       if (s->prev)
        {
          struct glyph_string *prev;
@@ -1546,11 +1568,10 @@ haiku_draw_glyph_string (struct glyph_string *s)
                /* As prev was drawn while clipped to its own area, we
                   must draw the right_overhang part using s->hl now.  */
                enum draw_glyphs_face save = prev->hl;
-               struct face *save_face = prev->face;
 
                prev->hl = s->hl;
-               prev->face = s->face;
                haiku_start_clip (s);
+               haiku_clip_to_string (s);
                haiku_clip_to_string_exactly (s, prev);
                if (prev->first_glyph->type == CHAR_GLYPH)
                  haiku_draw_glyph_string_foreground (prev);
@@ -1558,8 +1579,6 @@ haiku_draw_glyph_string (struct glyph_string *s)
                  haiku_draw_composite_glyph_string_foreground (prev);
                haiku_end_clip (s);
                prev->hl = save;
-               prev->face = save_face;
-               prev->num_clips = 0;
              }
        }
 
@@ -1574,11 +1593,10 @@ haiku_draw_glyph_string (struct glyph_string *s)
                /* As next will be drawn while clipped to its own area,
                   we must draw the left_overhang part using s->hl now.  */
                enum draw_glyphs_face save = next->hl;
-               struct face *save_face = next->face;
 
                next->hl = s->hl;
-               next->face = s->face;
                haiku_start_clip (s);
+               haiku_clip_to_string (s);
                haiku_clip_to_string_exactly (s, next);
                if (next->first_glyph->type == CHAR_GLYPH)
                  haiku_draw_glyph_string_foreground (next);
@@ -1586,15 +1604,11 @@ haiku_draw_glyph_string (struct glyph_string *s)
                  haiku_draw_composite_glyph_string_foreground (next);
                haiku_end_clip (s);
 
-               next->background_filled_p = 0;
                next->hl = save;
-               next->face = save_face;
-               next->clip_head = next;
-               next->num_clips = 0;
+               next->clip_head = s->next;
              }
        }
     }
-  s->num_clips = 0;
   haiku_end_clip (s);
   unblock_input ();
 }



reply via email to

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