gsk: Introduce GskRenderNodeClass

This is modeled after GtkCssValueClass. So far it doesn't do anything.
This commit is contained in:
Benjamin Otte 2016-12-11 03:57:42 +01:00
parent 3af4fba895
commit f16d523cb2
4 changed files with 41 additions and 20 deletions

View File

@ -676,6 +676,11 @@ gsk_renderer_render (GskRenderer *renderer,
g_clear_pointer (&priv->root_node, gsk_render_node_unref); g_clear_pointer (&priv->root_node, gsk_render_node_unref);
} }
static const GskRenderNodeClass GSK_CONTAINER_NODE_CLASS = {
GSK_CONTAINER_NODE,
"GskContainerNode"
};
/** /**
* gsk_renderer_create_render_node: * gsk_renderer_create_render_node:
* @renderer: a #GskRenderer * @renderer: a #GskRenderer
@ -691,7 +696,7 @@ gsk_renderer_create_render_node (GskRenderer *renderer)
{ {
g_return_val_if_fail (GSK_IS_RENDERER (renderer), NULL); g_return_val_if_fail (GSK_IS_RENDERER (renderer), NULL);
return gsk_render_node_new (GSK_CONTAINER_NODE); return gsk_render_node_new (&GSK_CONTAINER_NODE_CLASS);
} }
/*< private > /*< private >

View File

@ -86,20 +86,21 @@ gsk_render_node_finalize (GskRenderNode *self)
/*< private > /*< private >
* gsk_render_node_new: * gsk_render_node_new:
* @type: type of the new node * @node_class: class structure for this node
* *
* Returns: (transfer full): the newly created #GskRenderNode * Returns: (transfer full): the newly created #GskRenderNode
*/ */
GskRenderNode * GskRenderNode *
gsk_render_node_new (GskRenderNodeType type) gsk_render_node_new (const GskRenderNodeClass *node_class)
{ {
GskRenderNode *self; GskRenderNode *self;
g_return_val_if_fail (type != GSK_NOT_A_RENDER_NODE, NULL); g_return_val_if_fail (node_class != NULL, NULL);
g_return_val_if_fail (node_class->node_type != GSK_NOT_A_RENDER_NODE, NULL);
self = g_slice_new0 (GskRenderNode); self = g_slice_new0 (GskRenderNode);
self->type = type; self->node_class = node_class;
self->ref_count = 1; self->ref_count = 1;
@ -173,7 +174,7 @@ gsk_render_node_get_node_type (GskRenderNode *node)
{ {
g_return_val_if_fail (GSK_IS_RENDER_NODE (node), GSK_NOT_A_RENDER_NODE); g_return_val_if_fail (GSK_IS_RENDER_NODE (node), GSK_NOT_A_RENDER_NODE);
return node->type; return node->node_class->node_type;
} }
/** /**
@ -393,8 +394,7 @@ GskRenderNode *
gsk_render_node_append_child (GskRenderNode *node, gsk_render_node_append_child (GskRenderNode *node,
GskRenderNode *child) GskRenderNode *child)
{ {
g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL); g_return_val_if_fail (GSK_IS_RENDER_NODE_TYPE (node, GSK_CONTAINER_NODE), NULL);
g_return_val_if_fail (node->type == GSK_CONTAINER_NODE, NULL);
g_return_val_if_fail (GSK_IS_RENDER_NODE (child), node); g_return_val_if_fail (GSK_IS_RENDER_NODE (child), node);
g_return_val_if_fail (node->is_mutable, node); g_return_val_if_fail (node->is_mutable, node);
@ -494,9 +494,8 @@ void
gsk_render_node_set_bounds (GskRenderNode *node, gsk_render_node_set_bounds (GskRenderNode *node,
const graphene_rect_t *bounds) const graphene_rect_t *bounds)
{ {
g_return_if_fail (GSK_IS_RENDER_NODE (node)); g_return_if_fail (GSK_IS_RENDER_NODE_TYPE (node, GSK_CONTAINER_NODE));
g_return_if_fail (node->is_mutable); g_return_if_fail (node->is_mutable);
g_return_if_fail (node->type == GSK_CONTAINER_NODE);
if (bounds == NULL) if (bounds == NULL)
graphene_rect_init_from_rect (&node->bounds, graphene_rect_zero ()); graphene_rect_init_from_rect (&node->bounds, graphene_rect_zero ());

View File

@ -24,11 +24,15 @@
/*** GSK_TEXTURE_NODE ***/ /*** GSK_TEXTURE_NODE ***/
static const GskRenderNodeClass GSK_TEXTURE_NODE_CLASS = {
GSK_TEXTURE_NODE,
"GskTextureNode"
};
GskTexture * GskTexture *
gsk_texture_node_get_texture (GskRenderNode *node) gsk_texture_node_get_texture (GskRenderNode *node)
{ {
g_return_val_if_fail (GSK_IS_RENDER_NODE (node), 0); g_return_val_if_fail (GSK_IS_RENDER_NODE_TYPE (node, GSK_TEXTURE_NODE), 0);
g_return_val_if_fail (node->type == GSK_TEXTURE_NODE, 0);
return node->texture; return node->texture;
} }
@ -54,7 +58,7 @@ gsk_texture_node_new (GskTexture *texture,
g_return_val_if_fail (GSK_IS_TEXTURE (texture), NULL); g_return_val_if_fail (GSK_IS_TEXTURE (texture), NULL);
g_return_val_if_fail (bounds != NULL, NULL); g_return_val_if_fail (bounds != NULL, NULL);
node = gsk_render_node_new (GSK_TEXTURE_NODE); node = gsk_render_node_new (&GSK_TEXTURE_NODE_CLASS);
node->texture = gsk_texture_ref (texture); node->texture = gsk_texture_ref (texture);
graphene_rect_init_from_rect (&node->bounds, bounds); graphene_rect_init_from_rect (&node->bounds, bounds);
@ -64,6 +68,11 @@ gsk_texture_node_new (GskTexture *texture,
/*** GSK_CAIRO_NODE ***/ /*** GSK_CAIRO_NODE ***/
static const GskRenderNodeClass GSK_CAIRO_NODE_CLASS = {
GSK_CAIRO_NODE,
"GskCairoNode"
};
/*< private > /*< private >
* gsk_cairo_node_get_surface: * gsk_cairo_node_get_surface:
* @node: a #GskRenderNode * @node: a #GskRenderNode
@ -75,8 +84,7 @@ gsk_texture_node_new (GskTexture *texture,
cairo_surface_t * cairo_surface_t *
gsk_cairo_node_get_surface (GskRenderNode *node) gsk_cairo_node_get_surface (GskRenderNode *node)
{ {
g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL); g_return_val_if_fail (GSK_IS_RENDER_NODE_TYPE (node, GSK_CAIRO_NODE), NULL);
g_return_val_if_fail (node->type == GSK_CAIRO_NODE, NULL);
return node->surface; return node->surface;
} }
@ -100,7 +108,7 @@ gsk_cairo_node_new (const graphene_rect_t *bounds)
g_return_val_if_fail (bounds != NULL, NULL); g_return_val_if_fail (bounds != NULL, NULL);
node = gsk_render_node_new (GSK_CAIRO_NODE); node = gsk_render_node_new (&GSK_CAIRO_NODE_CLASS);
graphene_rect_init_from_rect (&node->bounds, bounds); graphene_rect_init_from_rect (&node->bounds, bounds);
@ -129,8 +137,7 @@ gsk_cairo_node_get_draw_context (GskRenderNode *node,
int width, height; int width, height;
cairo_t *res; cairo_t *res;
g_return_val_if_fail (GSK_IS_RENDER_NODE (node), NULL); g_return_val_if_fail (GSK_IS_RENDER_NODE_TYPE (node, GSK_CAIRO_NODE), NULL);
g_return_val_if_fail (node->type == GSK_CAIRO_NODE, NULL);
g_return_val_if_fail (node->is_mutable, NULL); g_return_val_if_fail (node->is_mutable, NULL);
g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), NULL); g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), NULL);

View File

@ -6,9 +6,13 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef struct _GskRenderNodeClass GskRenderNodeClass;
#define GSK_IS_RENDER_NODE_TYPE(node,type) (GSK_IS_RENDER_NODE (node) && (node)->node_class->node_type == (type))
struct _GskRenderNode struct _GskRenderNode
{ {
GskRenderNodeType type; const GskRenderNodeClass *node_class;
volatile int ref_count; volatile int ref_count;
@ -59,7 +63,13 @@ struct _GskRenderNode
gboolean needs_world_matrix_update : 1; gboolean needs_world_matrix_update : 1;
}; };
GskRenderNode *gsk_render_node_new (GskRenderNodeType type); struct _GskRenderNodeClass
{
GskRenderNodeType node_type;
const char *type_name;
};
GskRenderNode *gsk_render_node_new (const GskRenderNodeClass *node_class);
void gsk_render_node_make_immutable (GskRenderNode *node); void gsk_render_node_make_immutable (GskRenderNode *node);