diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-04-30 11:19:47 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-05-01 13:43:33 -0400 |
commit | 4e501d2d4415a52d2acbc566acaf4036ad5e0948 (patch) | |
tree | 5563edb86be652a07c1759c0c19f1441f6b3b741 /gsk | |
parent | 5afd5cfec7dc2c2338c6ffc7ffd89bd3e1ebb229 (diff) | |
download | gtk+-4e501d2d4415a52d2acbc566acaf4036ad5e0948.tar.gz |
gsk: Transform rounded rects better
Diffstat (limited to 'gsk')
-rw-r--r-- | gsk/gl/gskglrenderjob.c | 60 |
1 files changed, 37 insertions, 23 deletions
diff --git a/gsk/gl/gskglrenderjob.c b/gsk/gl/gskglrenderjob.c index d3bdef751d..ec42a0a8a7 100644 --- a/gsk/gl/gskglrenderjob.c +++ b/gsk/gl/gskglrenderjob.c @@ -920,13 +920,42 @@ gsk_gl_render_job_untransform_bounds (GskGLRenderJob *job, static inline void gsk_gl_render_job_transform_rounded_rect (GskGLRenderJob *job, const GskRoundedRect *rect, - GskRoundedRect *out_rect) + GskRoundedRect *out) { - out_rect->bounds.origin.x = job->offset_x + rect->bounds.origin.x; - out_rect->bounds.origin.y = job->offset_y + rect->bounds.origin.y; - out_rect->bounds.size.width = rect->bounds.size.width; - out_rect->bounds.size.height = rect->bounds.size.height; - memcpy (out_rect->corner, rect->corner, sizeof rect->corner); + float scale_x = job->scale_x; + float scale_y = job->scale_y; + + gsk_gl_render_job_transform_bounds (job, &rect->bounds, &out->bounds); + + for (guint i = 0; i < G_N_ELEMENTS (out->corner); i++) + { + out->corner[i].width = rect->corner[i].width * fabs (scale_x); + out->corner[i].height = rect->corner[i].height * fabs (scale_y); + } + + if (scale_x < 0) + { + graphene_size_t p; + + p = out->corner[GSK_CORNER_TOP_LEFT]; + out->corner[GSK_CORNER_TOP_LEFT] = out->corner[GSK_CORNER_TOP_RIGHT]; + out->corner[GSK_CORNER_TOP_RIGHT] = p; + p = out->corner[GSK_CORNER_BOTTOM_LEFT]; + out->corner[GSK_CORNER_BOTTOM_LEFT] = out->corner[GSK_CORNER_BOTTOM_RIGHT]; + out->corner[GSK_CORNER_BOTTOM_RIGHT] = p; + } + + if (scale_y < 0) + { + graphene_size_t p; + + p = out->corner[GSK_CORNER_TOP_LEFT]; + out->corner[GSK_CORNER_TOP_LEFT] = out->corner[GSK_CORNER_BOTTOM_LEFT]; + out->corner[GSK_CORNER_BOTTOM_LEFT] = p; + p = out->corner[GSK_CORNER_TOP_RIGHT]; + out->corner[GSK_CORNER_TOP_RIGHT] = out->corner[GSK_CORNER_BOTTOM_RIGHT]; + out->corner[GSK_CORNER_BOTTOM_RIGHT] = p; + } } static inline void @@ -1741,20 +1770,12 @@ gsk_gl_render_job_visit_rounded_clip_node (GskGLRenderJob *job, const GskRenderNode *child = gsk_rounded_clip_node_get_child (node); const GskRoundedRect *clip = gsk_rounded_clip_node_get_clip (node); GskRoundedRect transformed_clip; - float scale_x = job->scale_x; - float scale_y = job->scale_y; gboolean need_offscreen; if (node_is_invisible (child)) return; - gsk_gl_render_job_transform_bounds (job, &clip->bounds, &transformed_clip.bounds); - - for (guint i = 0; i < G_N_ELEMENTS (transformed_clip.corner); i++) - { - transformed_clip.corner[i].width = clip->corner[i].width * scale_x; - transformed_clip.corner[i].height = clip->corner[i].height * scale_y; - } + gsk_gl_render_job_transform_rounded_rect (job, clip, &transformed_clip); if (job->current_clip->is_rectilinear) { @@ -2365,14 +2386,7 @@ gsk_gl_render_job_visit_blurred_inset_shadow_node (GskGLRenderJob *job, { GskRoundedRect node_clip; - gsk_gl_render_job_transform_bounds (job, &node_outline->bounds, &node_clip.bounds); - - for (guint i = 0; i < 4; i ++) - { - node_clip.corner[i].width = node_outline->corner[i].width * scale_x; - node_clip.corner[i].height = node_outline->corner[i].height * scale_y; - } - + gsk_gl_render_job_transform_rounded_rect (job, node_outline, &node_clip); gsk_gl_render_job_push_clip (job, &node_clip); } |