gsk: Add a private getter for container children
authorMatthias Clasen <mclasen@redhat.com>
Sat, 24 Jul 2021 13:49:09 +0000 (09:49 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 24 Jul 2021 22:48:09 +0000 (18:48 -0400)
No need to get them one-by-one, in our inner loop.

gsk/gskrendernodeimpl.c
gsk/gskrendernodeprivate.h
gsk/ngl/gsknglrenderjob.c

index c7751b8e3aeae5f195986374f914c4c43d7f02e4..ef008f829427b4da6f8ada13323f1a2f8bc66c0f 100644 (file)
@@ -2780,6 +2780,17 @@ gsk_container_node_get_child (const GskRenderNode *node,
   return self->children[idx];
 }
 
+GskRenderNode **
+gsk_container_node_get_children (const GskRenderNode *node,
+                                 guint               *n_children)
+{
+  const GskContainerNode *self = (const GskContainerNode *) node;
+
+  *n_children = self->n_children;
+
+  return self->children;
+}
+
 /*** GSK_TRANSFORM_NODE ***/
 
 /**
index 8fef8e7aa448183a4ba3251fc532563b725973bc..b9e719cdfb1cad8dcf671995e1fd3cf1c4559f80 100644 (file)
@@ -103,6 +103,10 @@ bool            gsk_border_node_get_uniform_color       (const GskRenderNode
 void            gsk_text_node_serialize_glyphs          (GskRenderNode               *self,
                                                          GString                     *str);
 
+GskRenderNode ** gsk_container_node_get_children        (const GskRenderNode *node,
+                                                         guint               *n_children);
+
+
 G_END_DECLS
 
 #endif /* __GSK_RENDER_NODE_PRIVATE_H__ */
index 40e730557fb2e9d20f4e7a5fd78e0809f73e97f1..6f87340624057255c00d7bd46f19742b01dfa472 100644 (file)
@@ -3536,18 +3536,21 @@ gsk_ngl_render_job_visit_node (GskNglRenderJob     *job,
 
     case GSK_CONTAINER_NODE:
       {
-        guint n_children = gsk_container_node_get_n_children (node);
+        GskRenderNode **children;
+        guint n_children;
+
+        children = gsk_container_node_get_children (node, &n_children);
 
         for (guint i = 0; i < n_children; i++)
           {
-            const GskRenderNode *child = gsk_container_node_get_child (node, i);
+            const GskRenderNode *child = children[i];
 
             if (i + 1 < n_children &&
                 job->current_clip->is_fully_contained &&
                 gsk_render_node_get_node_type (child) == GSK_ROUNDED_CLIP_NODE)
               {
                 const GskRenderNode *grandchild = gsk_rounded_clip_node_get_child (child);
-                const GskRenderNode *child2 = gsk_container_node_get_child (node, i + 1);
+                const GskRenderNode *child2 = children[i + 1];
                 if (gsk_render_node_get_node_type (grandchild) == GSK_COLOR_NODE &&
                     gsk_render_node_get_node_type (child2) == GSK_BORDER_NODE &&
                     gsk_border_node_get_uniform_color (child2) &&