[gtk/cairo-borders-breakage] Revert "GskRenderNode: Fix fallback border drawing"



commit bedaa0895c84d5081610a4567924a0b602330edc
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Apr 18 08:25:11 2019 -0400

    Revert "GskRenderNode: Fix fallback border drawing"
    
    This reverts commit c18d2872f292607c921c959e6e97c4d6635bdfd2.
    
    While this commit fixes some aspects of border drawing
    that show up in our reference tests, it breaks highly
    visible button corners.

 gsk/gskrendernodeimpl.c | 84 ++++++++++++++++++++++++++-----------------------
 1 file changed, 44 insertions(+), 40 deletions(-)
---
diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c
index cbf96179fd..212f6abc79 100644
--- a/gsk/gskrendernodeimpl.c
+++ b/gsk/gskrendernodeimpl.c
@@ -542,52 +542,56 @@ gsk_border_node_draw (GskRenderNode *node,
   else
     {
       const graphene_rect_t *bounds = &self->outline.bounds;
+      /* distance to center "line":
+       * +-------------------------+
+       * |                         |
+       * |                         |
+       * |     ---this-line---     |
+       * |                         |
+       * |                         |
+       * +-------------------------+
+       * That line is equidistant from all sides. It's either horiontal
+       * or vertical, depending on if the rect is wider or taller.
+       * We use the 4 sides spanned up by connecting the line to the corner
+       * points to color the regions of the rectangle differently.
+       * Note that the call to cairo_fill() will add the potential final
+       * segment by closing the path, so we don't have to care.
+       */
+      float dst = MIN (bounds->size.width, bounds->size.height) / 2.0;
 
       cairo_clip (cr);
 
-      /* Top */
-      if (self->border_width[0] > 0)
-        {
-          cairo_move_to (cr, bounds->origin.x, bounds->origin.y);
-          cairo_rel_line_to (cr, self->border_width[3], self->border_width[0]);
-          cairo_rel_line_to (cr, bounds->size.width - self->border_width[3] - self->border_width[1], 0);
-          cairo_rel_line_to (cr, self->border_width[1], - self->border_width[0]);
-          gdk_cairo_set_source_rgba (cr, &self->border_color[0]);
-          cairo_fill (cr);
-        }
+      /* top */
+      cairo_move_to (cr, bounds->origin.x + dst, bounds->origin.y + dst);
+      cairo_rel_line_to (cr, - dst, - dst);
+      cairo_rel_line_to (cr, bounds->size.width, 0);
+      cairo_rel_line_to (cr, - dst, dst);
+      gdk_cairo_set_source_rgba (cr, &self->border_color[0]);
+      cairo_fill (cr);
 
-      /* Right */
-      if (self->border_width[1] > 0)
-        {
-          cairo_move_to (cr, bounds->origin.x + bounds->size.width, bounds->origin.y);
-          cairo_rel_line_to (cr, - self->border_width[1], self->border_width[0]);
-          cairo_rel_line_to (cr, 0, bounds->size.height - self->border_width[0] - self->border_width[2]);
-          cairo_rel_line_to (cr, self->border_width[1], self->border_width[2]);
-          gdk_cairo_set_source_rgba (cr, &self->border_color[1]);
-          cairo_fill (cr);
-        }
+      /* right */
+      cairo_move_to (cr, bounds->origin.x + bounds->size.width - dst, bounds->origin.y + dst);
+      cairo_rel_line_to (cr, dst, - dst);
+      cairo_rel_line_to (cr, 0, bounds->size.height);
+      cairo_rel_line_to (cr, - dst, - dst);
+      gdk_cairo_set_source_rgba (cr, &self->border_color[1]);
+      cairo_fill (cr);
 
-      /* Bottom */
-      if (self->border_width[2] > 0)
-        {
-          cairo_move_to (cr, bounds->origin.x, bounds->origin.y + bounds->size.height);
-          cairo_rel_line_to (cr, self->border_width[3], - self->border_width[2]);
-          cairo_rel_line_to (cr, bounds->size.width - self->border_width[3] - self->border_width[1], 0);
-          cairo_rel_line_to (cr, self->border_width[1], self->border_width[2]);
-          gdk_cairo_set_source_rgba (cr, &self->border_color[2]);
-          cairo_fill (cr);
-        }
+      /* bottom */
+      cairo_move_to (cr, bounds->origin.x + bounds->size.width - dst, bounds->origin.y + bounds->size.height 
- dst);
+      cairo_rel_line_to (cr, dst, dst);
+      cairo_rel_line_to (cr, - bounds->size.width, 0);
+      cairo_rel_line_to (cr, dst, - dst);
+      gdk_cairo_set_source_rgba (cr, &self->border_color[2]);
+      cairo_fill (cr);
 
-      /* Left */
-      if (self->border_width[3] > 0)
-        {
-          cairo_move_to (cr, bounds->origin.x, bounds->origin.y);
-          cairo_rel_line_to (cr, self->border_width[3], self->border_width[0]);
-          cairo_rel_line_to (cr, 0, bounds->size.height - self->border_width[0] - self->border_width[2]);
-          cairo_rel_line_to (cr, - self->border_width[3], self->border_width[2]);
-          gdk_cairo_set_source_rgba (cr, &self->border_color[3]);
-          cairo_fill (cr);
-        }
+      /* left */
+      cairo_move_to (cr, bounds->origin.x + dst, bounds->origin.y + bounds->size.height - dst);
+      cairo_rel_line_to (cr, - dst, dst);
+      cairo_rel_line_to (cr, 0, - bounds->size.height);
+      cairo_rel_line_to (cr, dst, dst);
+      gdk_cairo_set_source_rgba (cr, &self->border_color[3]);
+      cairo_fill (cr);
     }
 
   cairo_restore (cr);


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