From 92c4ea50f559f03ef0e28cf0746b5f888c49fc61 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 5 Dec 2020 14:20:17 -0500 Subject: [PATCH] contour: Special-case rectangles for strokes In many cases, the outline of a rectangle is just two rectangles. --- gsk/gskcontour.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/gsk/gskcontour.c b/gsk/gskcontour.c index 2011fc725a..0f20a3dc51 100644 --- a/gsk/gskcontour.c +++ b/gsk/gskcontour.c @@ -518,11 +518,43 @@ gsk_rect_contour_reverse (const GskContour *contour) self->height)); } +static gboolean +stroke_is_simple (GskStroke *stroke) +{ + if (stroke->line_join == GSK_LINE_JOIN_ROUND || + stroke->line_join == GSK_LINE_JOIN_BEVEL) + return FALSE; + + if (stroke->miter_limit < 1.5) + return FALSE; + + if (stroke->dash_length != 0) + return FALSE; + + return TRUE; +} + static void gsk_rect_contour_add_stroke (const GskContour *contour, GskPathBuilder *builder, GskStroke *stroke) { + const GskRectContour *self = (const GskRectContour *) contour; + + if (stroke_is_simple (stroke)) + { + graphene_rect_t rect; + + graphene_rect_init (&rect, self->x, self->y, self->width, self->height); + + graphene_rect_inset (&rect, stroke->line_width / 2, stroke->line_width / 2); + gsk_path_builder_add_rect (builder, &rect); + + graphene_rect_inset (&rect, - stroke->line_width, - stroke->line_width); + rect.origin.x += rect.size.width; + rect.size.width = - rect.size.width; + gsk_path_builder_add_rect (builder, &rect); + } } static void