gsk: Fix cross-fade transform handling
authorMatthias Clasen <mclasen@redhat.com>
Mon, 1 May 2023 00:21:47 +0000 (20:21 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 1 May 2023 17:44:55 +0000 (13:44 -0400)
We must reset the modelview transform when
rendering offscreen, or else we end up applying
it twice.

gsk/gl/gskglrenderjob.c

index 01fa4354135efffb1e0fa6cca95a3f4a7cde1e84..fcd140501fabdd4503f1414e8309a25975bdd868 100644 (file)
@@ -2903,8 +2903,12 @@ gsk_gl_render_job_visit_cross_fade_node (GskGLRenderJob      *job,
   offscreen_end.reset_clip = TRUE;
   offscreen_end.bounds = &node->bounds;
 
+  gsk_gl_render_job_set_modelview (job, NULL);
+
   if (!gsk_gl_render_job_visit_node_with_offscreen (job, start_node, &offscreen_start))
     {
+      gsk_gl_render_job_pop_modelview (job);
+
       gsk_gl_render_job_visit_node (job, end_node);
       return;
     }
@@ -2913,12 +2917,18 @@ gsk_gl_render_job_visit_cross_fade_node (GskGLRenderJob      *job,
 
   if (!gsk_gl_render_job_visit_node_with_offscreen (job, end_node, &offscreen_end))
     {
-      float prev_alpha = gsk_gl_render_job_set_alpha (job, job->alpha * progress);
+      float prev_alpha;
+
+      gsk_gl_render_job_pop_modelview (job);
+
+      prev_alpha = gsk_gl_render_job_set_alpha (job, job->alpha * progress);
       gsk_gl_render_job_visit_node (job, start_node);
       gsk_gl_render_job_set_alpha (job, prev_alpha);
       return;
     }
 
+  gsk_gl_render_job_pop_modelview (job);
+
   g_assert (offscreen_end.texture_id);
 
   gsk_gl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, cross_fade));