gsk: Remove GskRenderNodeIter

This commit is contained in:
Benjamin Otte 2016-12-10 16:59:34 +01:00
parent 6fb46e3943
commit f258af9cce
9 changed files with 34 additions and 351 deletions

View File

@ -63,18 +63,3 @@ GskRenderNodeClass
gsk_render_node_get_type gsk_render_node_get_type
GSK_TYPE_BLEND_MODE GSK_TYPE_BLEND_MODE
</SECTION> </SECTION>
<SECTION>
<FILE>GskRenderNodeIter</FILE>
gsk_render_node_iter_new
gsk_render_node_iter_free
gsk_render_node_iter_init
gsk_render_node_iter_is_valid
gsk_render_node_iter_prev
gsk_render_node_iter_next
gsk_render_node_iter_remove
<SUBSECTION Standard>
GSK_TYPE_RENDER_NODE_ITER
GskRenderNodeIter
gsk_render_node_iter_get_type
</SECTION>

View File

@ -47,7 +47,6 @@ gsk_public_source_h = \
gskenums.h \ gskenums.h \
gskrenderer.h \ gskrenderer.h \
gskrendernode.h \ gskrendernode.h \
gskrendernodeiter.h \
gsktexture.h \ gsktexture.h \
gsktypes.h gsktypes.h
gsk_private_source_h = \ gsk_private_source_h = \
@ -66,7 +65,6 @@ gsk_private_source_h = \
gsk_public_source_c = \ gsk_public_source_c = \
gskrenderer.c \ gskrenderer.c \
gskrendernode.c \ gskrendernode.c \
gskrendernodeiter.c \
gsktexture.c gsktexture.c
gsk_private_source_c = \ gsk_private_source_c = \
$(gsk_private_vulkan_source_c) \ $(gsk_private_vulkan_source_c) \

View File

@ -23,7 +23,6 @@
#include <gsk/gskenums.h> #include <gsk/gskenums.h>
#include <gsk/gskrenderer.h> #include <gsk/gskrenderer.h>
#include <gsk/gskrendernode.h> #include <gsk/gskrendernode.h>
#include <gsk/gskrendernodeiter.h>
#include <gsk/gsktexture.h> #include <gsk/gsktexture.h>
#include <gsk/gsktypes.h> #include <gsk/gsktypes.h>

View File

@ -4,7 +4,6 @@
#include "gskdebugprivate.h" #include "gskdebugprivate.h"
#include "gskrendererprivate.h" #include "gskrendererprivate.h"
#include "gskrendernodeiter.h"
#include "gskrendernodeprivate.h" #include "gskrendernodeprivate.h"
#include "gsktextureprivate.h" #include "gsktextureprivate.h"
@ -52,7 +51,6 @@ gsk_cairo_renderer_render_node (GskCairoRenderer *self,
GskRenderNode *node, GskRenderNode *node,
cairo_t *cr) cairo_t *cr)
{ {
GskRenderNodeIter iter;
GskRenderNode *child; GskRenderNode *child;
gboolean pop_group = FALSE; gboolean pop_group = FALSE;
graphene_matrix_t mvp; graphene_matrix_t mvp;
@ -136,10 +134,13 @@ out:
GSK_NOTE (CAIRO, g_print ("Drawing %d children of node [%p]\n", GSK_NOTE (CAIRO, g_print ("Drawing %d children of node [%p]\n",
gsk_render_node_get_n_children (node), gsk_render_node_get_n_children (node),
node)); node));
gsk_render_node_iter_init (&iter, node); for (child = gsk_render_node_get_first_child (node);
while (gsk_render_node_iter_next (&iter, &child)) child != NULL;
child = gsk_render_node_get_next_sibling (child))
{
gsk_cairo_renderer_render_node (self, child, cr); gsk_cairo_renderer_render_node (self, child, cr);
} }
}
if (pop_group) if (pop_group)
{ {

View File

@ -9,7 +9,6 @@
#include "gskprofilerprivate.h" #include "gskprofilerprivate.h"
#include "gskrendererprivate.h" #include "gskrendererprivate.h"
#include "gskrendernodeprivate.h" #include "gskrendernodeprivate.h"
#include "gskrendernodeiter.h"
#include "gskshaderbuilderprivate.h" #include "gskshaderbuilderprivate.h"
#include "gsktextureprivate.h" #include "gsktextureprivate.h"
@ -627,7 +626,6 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self,
RenderItem *parent) RenderItem *parent)
{ {
graphene_rect_t viewport; graphene_rect_t viewport;
GskRenderNodeIter iter;
graphene_matrix_t mv; graphene_matrix_t mv;
graphene_rect_t bounds; graphene_rect_t bounds;
GskRenderNode *child; GskRenderNode *child;
@ -789,10 +787,13 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self,
render_items = item.children; render_items = item.children;
out: out:
gsk_render_node_iter_init (&iter, node); for (child = gsk_render_node_get_first_child (node);
while (gsk_render_node_iter_next (&iter, &child)) child != NULL;
child = gsk_render_node_get_next_sibling (child))
{
gsk_gl_renderer_add_render_item (self, projection, render_items, child, ritem); gsk_gl_renderer_add_render_item (self, projection, render_items, child, ritem);
} }
}
static gboolean static gboolean
gsk_gl_renderer_validate_tree (GskGLRenderer *self, gsk_gl_renderer_validate_tree (GskGLRenderer *self,

View File

@ -44,7 +44,6 @@
#include "gskrendernodeprivate.h" #include "gskrendernodeprivate.h"
#include "gskdebugprivate.h" #include "gskdebugprivate.h"
#include "gskrendernodeiter.h"
#include "gskrendererprivate.h" #include "gskrendererprivate.h"
#include "gsktexture.h" #include "gsktexture.h"
@ -69,17 +68,14 @@ G_DEFINE_BOXED_TYPE (GskRenderNode, gsk_render_node,
static void static void
gsk_render_node_finalize (GskRenderNode *self) gsk_render_node_finalize (GskRenderNode *self)
{ {
GskRenderNodeIter iter;
self->is_mutable = TRUE; self->is_mutable = TRUE;
g_clear_pointer (&self->surface, cairo_surface_destroy); g_clear_pointer (&self->surface, cairo_surface_destroy);
g_clear_pointer (&self->texture, gsk_texture_unref); g_clear_pointer (&self->texture, gsk_texture_unref);
g_clear_pointer (&self->name, g_free); g_clear_pointer (&self->name, g_free);
gsk_render_node_iter_init (&iter, self); while (self->first_child)
while (gsk_render_node_iter_next (&iter, NULL)) gsk_render_node_remove_child (self, self->first_child);
gsk_render_node_iter_remove (&iter);
g_slice_free (GskRenderNode, self); g_slice_free (GskRenderNode, self);
} }
@ -697,17 +693,14 @@ gsk_render_node_remove_child (GskRenderNode *node,
GskRenderNode * GskRenderNode *
gsk_render_node_remove_all_children (GskRenderNode *node) gsk_render_node_remove_all_children (GskRenderNode *node)
{ {
GskRenderNodeIter iter;
g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL); g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL);
g_return_val_if_fail (node->is_mutable, node); g_return_val_if_fail (node->is_mutable, node);
if (node->n_children == 0) if (node->n_children == 0)
return node; return node;
gsk_render_node_iter_init (&iter, node); while (node->first_child != NULL)
while (gsk_render_node_iter_next (&iter, NULL)) gsk_render_node_remove_child (node, node->first_child);
gsk_render_node_iter_remove (&iter);
g_assert (node->n_children == 0); g_assert (node->n_children == 0);
g_assert (node->first_child == NULL); g_assert (node->first_child == NULL);
@ -967,7 +960,6 @@ void
gsk_render_node_update_world_matrix (GskRenderNode *node, gsk_render_node_update_world_matrix (GskRenderNode *node,
gboolean force) gboolean force)
{ {
GskRenderNodeIter iter;
GskRenderNode *child; GskRenderNode *child;
if (force || node->needs_world_matrix_update) if (force || node->needs_world_matrix_update)
@ -1000,10 +992,13 @@ gsk_render_node_update_world_matrix (GskRenderNode *node,
node->needs_world_matrix_update = FALSE; node->needs_world_matrix_update = FALSE;
} }
gsk_render_node_iter_init (&iter, node); for (child = gsk_render_node_get_first_child (node);
while (gsk_render_node_iter_next (&iter, &child)) child != NULL;
child = gsk_render_node_get_next_sibling (child))
{
gsk_render_node_update_world_matrix (child, TRUE); gsk_render_node_update_world_matrix (child, TRUE);
} }
}
gboolean gboolean
gsk_render_node_has_surface (GskRenderNode *node) gsk_render_node_has_surface (GskRenderNode *node)
@ -1289,7 +1284,6 @@ gsk_render_node_get_draw_context (GskRenderNode *node,
void void
gsk_render_node_make_immutable (GskRenderNode *node) gsk_render_node_make_immutable (GskRenderNode *node)
{ {
GskRenderNodeIter iter;
GskRenderNode *child; GskRenderNode *child;
if (!node->is_mutable) if (!node->is_mutable)
@ -1297,10 +1291,13 @@ gsk_render_node_make_immutable (GskRenderNode *node)
node->is_mutable = FALSE; node->is_mutable = FALSE;
gsk_render_node_iter_init (&iter, node); for (child = gsk_render_node_get_first_child (node);
while (gsk_render_node_iter_next (&iter, &child)) child != NULL;
child = gsk_render_node_get_next_sibling (child))
{
gsk_render_node_make_immutable (child); gsk_render_node_make_immutable (child);
} }
}
/*< private > /*< private >
* gsk_render_node_get_size: * gsk_render_node_get_size:
@ -1313,16 +1310,18 @@ gsk_render_node_make_immutable (GskRenderNode *node)
int int
gsk_render_node_get_size (GskRenderNode *root) gsk_render_node_get_size (GskRenderNode *root)
{ {
GskRenderNodeIter iter;
GskRenderNode *child; GskRenderNode *child;
int res; int res;
g_return_val_if_fail (GSK_IS_RENDER_NODE (root), 0); g_return_val_if_fail (GSK_IS_RENDER_NODE (root), 0);
res = 1; res = 1;
gsk_render_node_iter_init (&iter, root); for (child = gsk_render_node_get_first_child (root);
while (gsk_render_node_iter_next (&iter, &child)) child != NULL;
child = gsk_render_node_get_next_sibling (child))
{
res += gsk_render_node_get_size (child); res += gsk_render_node_get_size (child);
}
return res; return res;
} }

View File

@ -1,254 +0,0 @@
/* GSK - The GTK Scene Kit
*
* Copyright 2016 Endless
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* SECTION:GskRenderNodeIter
* @Title: GskRenderNodeIter
* @Short_description: Iterator helper for render nodes
*
* TODO
*/
#include "config.h"
#include "gskrendernodeiter.h"
#include "gskrendernodeprivate.h"
typedef struct {
GskRenderNode *root;
GskRenderNode *current;
gint64 age;
gpointer reserved1;
gpointer reserved2;
} RealIter;
#define REAL_ITER(iter) ((RealIter *) (iter))
/**
* gsk_render_node_iter_new: (constructor)
*
* Allocates a new #GskRenderNodeIter.
*
* Returns: (transfer full): the newly allocated #GskRenderNodeIter
*
* Since: 3.90
*/
GskRenderNodeIter *
gsk_render_node_iter_new (void)
{
return g_slice_new (GskRenderNodeIter);
}
/*< private >
* gsk_render_node_iter_copy:
* @src: a #GskRenderNodeIter
*
* Copies a #GskRenderNodeIter.
*
* Returns: (transfer full): a #GskRenderNodeIter
*/
static GskRenderNodeIter *
gsk_render_node_iter_copy (GskRenderNodeIter *src)
{
return g_slice_dup (GskRenderNodeIter, src);
}
/**
* gsk_render_node_iter_free:
* @iter: a #GskRenderNodeIter
*
* Frees the resources allocated by gsk_render_node_iter_new().
*
* Since: 3.90
*/
void
gsk_render_node_iter_free (GskRenderNodeIter *iter)
{
g_slice_free (GskRenderNodeIter, iter);
}
G_DEFINE_BOXED_TYPE (GskRenderNodeIter, gsk_render_node_iter,
gsk_render_node_iter_copy,
gsk_render_node_iter_free)
/**
* gsk_render_node_iter_init:
* @iter: a #GskRenderNodeIter
* @node: a #GskRenderNode
*
* Initializes a #GskRenderNodeIter for iterating over the
* children of @node.
*
* It's safe to call this function multiple times on the same
* #GskRenderNodeIter instance.
*
* Since: 3.90
*/
void
gsk_render_node_iter_init (GskRenderNodeIter *iter,
GskRenderNode *node)
{
RealIter *riter = REAL_ITER (iter);
g_return_if_fail (iter != NULL);
g_return_if_fail (GSK_IS_RENDER_NODE (node));
riter->root = node;
riter->age = node->age;
riter->current = NULL;
}
/**
* gsk_render_node_iter_is_valid:
* @iter: a #GskRenderNodeIter
*
* Checks whether a #GskRenderNodeIter is associated to a #GskRenderNode,
* or whether the associated node was modified while iterating.
*
* Returns: %TRUE if the iterator is still valid.
*
* Since: 3.90
*/
gboolean
gsk_render_node_iter_is_valid (GskRenderNodeIter *iter)
{
RealIter *riter = REAL_ITER (iter);
g_return_val_if_fail (iter != NULL, FALSE);
if (riter->root == NULL)
return FALSE;
return riter->root->age == riter->age;
}
/**
* gsk_render_node_iter_next:
* @iter: a #GskRenderNodeIter
* @child: (out) (transfer none): return location for a #GskRenderNode
*
* Advances the @iter and retrieves the next child of the root #GskRenderNode
* used to initialize the #GskRenderNodeIter.
*
* If the iterator could advance, this function returns %TRUE and sets the
* @child argument with the child #GskRenderNode.
*
* If the iterator could not advance, this function returns %FALSE and the
* contents of the @child argument are undefined.
*
* Returns: %TRUE if the iterator could advance, and %FALSE otherwise
*
* Since: 3.90
*/
gboolean
gsk_render_node_iter_next (GskRenderNodeIter *iter,
GskRenderNode **child)
{
RealIter *riter = REAL_ITER (iter);
g_return_val_if_fail (riter != NULL, FALSE);
g_return_val_if_fail (riter->root != NULL, FALSE);
g_return_val_if_fail (riter->root->age == riter->age, FALSE);
if (riter->current == NULL)
riter->current = riter->root->first_child;
else
riter->current = riter->current->next_sibling;
if (child != NULL)
*child = riter->current;
return riter->current != NULL;
}
/**
* gsk_render_node_iter_prev:
* @iter: a #GskRenderNodeIter
* @child: (out) (transfer none): return location for a #GskRenderNode
*
* Advances the @iter and retrieves the previous child of the root
* #GskRenderNode used to initialize the #GskRenderNodeIter.
*
* If the iterator could advance, this function returns %TRUE and sets the
* @child argument with the child #GskRenderNode.
*
* If the iterator could not advance, this function returns %FALSE and the
* contents of the @child argument are undefined.
*
* Returns: %TRUE if the iterator could advance, and %FALSE otherwise
*
* Since: 3.90
*/
gboolean
gsk_render_node_iter_prev (GskRenderNodeIter *iter,
GskRenderNode **child)
{
RealIter *riter = REAL_ITER (iter);
g_return_val_if_fail (riter != NULL, FALSE);
g_return_val_if_fail (riter->root != NULL, FALSE);
g_return_val_if_fail (riter->root->age == riter->age, FALSE);
if (riter->current == NULL)
riter->current = riter->root->last_child;
else
riter->current = riter->current->prev_sibling;
if (child != NULL)
*child = riter->current;
return riter->current != NULL;
}
/**
* gsk_render_node_iter_remove:
* @iter: a #GskRenderNodeIter
*
* Removes the child #GskRenderNode currently being visited by
* the iterator.
*
* Calling this function on an invalid #GskRenderNodeIter results
* in undefined behavior.
*
* Since: 3.90
*/
void
gsk_render_node_iter_remove (GskRenderNodeIter *iter)
{
RealIter *riter = REAL_ITER (iter);
GskRenderNode *tmp;
g_return_if_fail (riter != NULL);
g_return_if_fail (riter->root != NULL);
g_return_if_fail (riter->root->age == riter->age);
g_return_if_fail (riter->current != NULL);
tmp = riter->current;
if (tmp != NULL)
{
riter->current = tmp->prev_sibling;
gsk_render_node_remove_child (riter->root, tmp);
riter->age += 1;
/* Safety net */
g_assert (riter->age == riter->root->age);
}
}

View File

@ -1,45 +0,0 @@
#ifndef __GSK_RENDER_NODE_ITER_H__
#define __GSK_RENDER_NODE_ITER_H__
#include <gsk/gskrendernode.h>
G_BEGIN_DECLS
#define GSK_TYPE_RENDER_NODE_ITER (gsk_render_node_iter_get_type())
typedef struct _GskRenderNodeIter GskRenderNodeIter;
struct _GskRenderNodeIter
{
/*< private >*/
gpointer dummy1;
gpointer dummy2;
gint64 dummy3;
gpointer dummy4;
gpointer dummy5;
};
GDK_AVAILABLE_IN_3_90
GType gsk_render_node_iter_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_3_90
GskRenderNodeIter * gsk_render_node_iter_new (void);
GDK_AVAILABLE_IN_3_90
void gsk_render_node_iter_free (GskRenderNodeIter *iter);
GDK_AVAILABLE_IN_3_90
void gsk_render_node_iter_init (GskRenderNodeIter *iter,
GskRenderNode *node);
GDK_AVAILABLE_IN_3_90
gboolean gsk_render_node_iter_is_valid (GskRenderNodeIter *iter);
GDK_AVAILABLE_IN_3_90
gboolean gsk_render_node_iter_prev (GskRenderNodeIter *iter,
GskRenderNode **child);
GDK_AVAILABLE_IN_3_90
gboolean gsk_render_node_iter_next (GskRenderNodeIter *iter,
GskRenderNode **child);
GDK_AVAILABLE_IN_3_90
void gsk_render_node_iter_remove (GskRenderNodeIter *iter);
G_END_DECLS
#endif /* GSK_RENDER_NODE_ITER_H */

View File

@ -5,7 +5,6 @@
#include "gskdebugprivate.h" #include "gskdebugprivate.h"
#include "gskprivate.h" #include "gskprivate.h"
#include "gskrendererprivate.h" #include "gskrendererprivate.h"
#include "gskrendernodeiter.h"
#include "gskrendernodeprivate.h" #include "gskrendernodeprivate.h"
#include "gsktextureprivate.h" #include "gsktextureprivate.h"
#include "gskvulkanbufferprivate.h" #include "gskvulkanbufferprivate.h"