diff options
author | Timm Bäder <mail@baedert.org> | 2020-05-24 08:31:55 +0200 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2020-05-24 15:59:05 +0200 |
commit | 094788f1a37e090ffab3ffb37c380dae764e2252 (patch) | |
tree | d6c80868a457b791b50e6daafe9f19016fbfd00a /gsk | |
parent | 23e68c09886a3823353c4d8bc67fd59b43d2ea34 (diff) | |
download | gtk+-094788f1a37e090ffab3ffb37c380dae764e2252.tar.gz |
gl renderer: Refactor render_clipped_child
Diffstat (limited to 'gsk')
-rw-r--r-- | gsk/gl/gskglrenderer.c | 78 |
1 files changed, 40 insertions, 38 deletions
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 592796287f..8212ca30fd 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -1164,52 +1164,54 @@ render_clipped_child (GskGLRenderer *self, ops_transform_bounds_modelview (builder, clip, &transformed_clip); + if (builder->clip_is_rectilinear) + { + /* Simple case: */ + graphene_rect_intersection (&transformed_clip, + &builder->current_clip->bounds, + &intersection); + + gsk_rounded_rect_init_from_rect (&child_clip, &intersection, 0.0f); + + ops_push_clip (builder, &child_clip); + gsk_gl_renderer_add_render_ops (self, child, builder); + ops_pop_clip (builder); + return; + } + /* Intersection might end up having rounded corners again */ - if (!gsk_rounded_rect_is_rectilinear (builder->current_clip)) + if (!rounded_inner_rect_contains_rect (builder->current_clip, + &transformed_clip)) { - if (!rounded_inner_rect_contains_rect (builder->current_clip, - &transformed_clip)) - { - /* well fuck */ - const float scale = ops_get_scale (builder); - gboolean is_offscreen; - TextureRegion region; - GskRoundedRect scaled_clip; - - memset (&scaled_clip, 0, sizeof (GskRoundedRect)); - - scaled_clip.bounds.origin.x = clip->origin.x * scale; - scaled_clip.bounds.origin.y = clip->origin.y * scale; - scaled_clip.bounds.size.width = clip->size.width * scale; - scaled_clip.bounds.size.height = clip->size.height * scale; - - ops_push_clip (builder, &scaled_clip); - if (!add_offscreen_ops (self, builder, &child->bounds, - child, - ®ion, &is_offscreen, - RESET_OPACITY | FORCE_OFFSCREEN)) - g_assert_not_reached (); - ops_pop_clip (builder); + /* well fuck */ + const float scale = ops_get_scale (builder); + gboolean is_offscreen; + TextureRegion region; + GskRoundedRect scaled_clip; + memset (&scaled_clip, 0, sizeof (GskRoundedRect)); - ops_set_program (builder, &self->programs->blit_program); - ops_set_texture (builder, region.texture_id); + scaled_clip.bounds.origin.x = clip->origin.x * scale; + scaled_clip.bounds.origin.y = clip->origin.y * scale; + scaled_clip.bounds.size.width = clip->size.width * scale; + scaled_clip.bounds.size.height = clip->size.height * scale; - load_offscreen_vertex_data (ops_draw (builder, NULL), child, builder); - return; - } - } + ops_push_clip (builder, &scaled_clip); + if (!add_offscreen_ops (self, builder, &child->bounds, + child, + ®ion, &is_offscreen, + RESET_OPACITY | FORCE_OFFSCREEN)) + g_assert_not_reached (); + ops_pop_clip (builder); - /* Simple case: */ - graphene_rect_intersection (&transformed_clip, - &builder->current_clip->bounds, - &intersection); - gsk_rounded_rect_init_from_rect (&child_clip, &intersection, 0.0f); + ops_set_program (builder, &self->programs->blit_program); + ops_set_texture (builder, region.texture_id); + + load_offscreen_vertex_data (ops_draw (builder, NULL), child, builder); + return; + } - ops_push_clip (builder, &child_clip); - gsk_gl_renderer_add_render_ops (self, child, builder); - ops_pop_clip (builder); } static inline void |