gl renderer: Use simple offset for selected offset node children
authorTimm Bäder <mail@baedert.org>
Tue, 1 May 2018 06:19:48 +0000 (08:19 +0200)
committerTimm Bäder <mail@baedert.org>
Tue, 1 May 2018 13:13:11 +0000 (15:13 +0200)
gsk/gl/gskglrenderer.c

index 2a11cb53a5beec91864777bb980d88affd34ddbb..eca829a18c2c0876424904c8b89d952190ab06a9 100644 (file)
@@ -625,21 +625,40 @@ render_offset_node (GskGLRenderer   *self,
                     RenderOpBuilder *builder)
 {
   GskRenderNode *child = gsk_offset_node_get_child (node);
-  graphene_matrix_t prev_mv;
-  graphene_matrix_t transform, transformed_mv;
+  const guint child_type = gsk_render_node_get_node_type (child);
+  const float dx = gsk_offset_node_get_x_offset (node);
+  const float dy = gsk_offset_node_get_y_offset (node);
 
-  graphene_matrix_init_translate (&transform,
-                                  &GRAPHENE_POINT3D_INIT(
-                                      gsk_offset_node_get_x_offset (node),
-                                      gsk_offset_node_get_y_offset (node),
-                                      1.0
-                                  ));
-  graphene_matrix_multiply (&transform, &builder->current_modelview, &transformed_mv);
-  prev_mv = ops_set_modelview (builder, &transformed_mv);
+  /* TODO: We do this only for selected node type we know handle
+   *       builder->dx/dy correctly. That should be "all nodes" eventually.
+   */
+  switch (child_type)
+    {
+    case GSK_TEXT_NODE:
+    case GSK_TEXTURE_NODE:
+    case GSK_COLOR_NODE:
+      {
+        ops_offset (builder, dx, dy);
+        gsk_gl_renderer_add_render_ops (self, child, builder);
+        ops_offset (builder, - dx, - dy);
+      }
+    break;
 
-  gsk_gl_renderer_add_render_ops (self, child, builder);
+    default:
+      {
+        graphene_matrix_t prev_mv;
+        graphene_matrix_t transform, transformed_mv;
 
-  ops_set_modelview (builder, &prev_mv);
+        graphene_matrix_init_translate (&transform,
+                                        &GRAPHENE_POINT3D_INIT(dx, dy, 1.0));
+        graphene_matrix_multiply (&transform, &builder->current_modelview, &transformed_mv);
+        prev_mv = ops_set_modelview (builder, &transformed_mv);
+
+        gsk_gl_renderer_add_render_ops (self, child, builder);
+
+        ops_set_modelview (builder, &prev_mv);
+      }
+    }
 }
 
 static inline void