gsk: Remove gsk_render_node_set_bounds()

gsk_render_node_get_bounds() still exists and is computed via vfunc
call:
- containers dynamically compute the bounds from their children
- surface and texture nodes get bounds passed on construction
This commit is contained in:
Benjamin Otte 2016-12-12 06:29:04 +01:00
parent 4d376c80f3
commit 3eb7c4719b
7 changed files with 78 additions and 63 deletions

View File

@ -36,7 +36,6 @@ gsk_render_node_get_previous_sibling
gsk_render_node_append_child
gsk_render_node_get_n_children
gsk_render_node_contains
gsk_render_node_set_bounds
gsk_render_node_set_transform
gsk_render_node_set_opacity
GskBlendMode

View File

@ -104,8 +104,6 @@ gsk_render_node_new (const GskRenderNodeClass *node_class)
self->ref_count = 1;
graphene_rect_init_from_rect (&self->bounds, graphene_rect_zero ());
graphene_matrix_init_identity (&self->transform);
self->opacity = 1.0;
@ -479,36 +477,13 @@ gsk_render_node_get_n_children (GskRenderNode *node)
return node->n_children;
}
/**
* gsk_render_node_set_bounds:
* @node: a #GskRenderNode
* @bounds: (nullable): the boundaries of @node
*
* Sets the boundaries of @node, which describe the geometry of the
* render node, and are used to clip the surface associated to it
* when rendering.
*
* Since: 3.90
*/
void
gsk_render_node_set_bounds (GskRenderNode *node,
const graphene_rect_t *bounds)
{
g_return_if_fail (GSK_IS_RENDER_NODE_TYPE (node, GSK_CONTAINER_NODE));
g_return_if_fail (node->is_mutable);
if (bounds == NULL)
graphene_rect_init_from_rect (&node->bounds, graphene_rect_zero ());
else
graphene_rect_init_from_rect (&node->bounds, bounds);
}
/**
* gsk_render_node_get_bounds:
* @node: a #GskRenderNode
* @bounds: (out caller-allocates): return location for the boundaries
*
* Retrieves the boundaries set using gsk_render_node_set_bounds().
* Retrieves the boundaries of the @node. The node will not draw outside
* of its boundaries.
*
* Since: 3.90
*/
@ -519,7 +494,7 @@ gsk_render_node_get_bounds (GskRenderNode *node,
g_return_if_fail (GSK_IS_RENDER_NODE (node));
g_return_if_fail (bounds != NULL);
*bounds = node->bounds;
node->node_class->get_bounds (node, bounds);
}
/**

View File

@ -79,9 +79,6 @@ gboolean gsk_render_node_contains (GskRenderNode *
GskRenderNode *descendant);
GDK_AVAILABLE_IN_3_90
void gsk_render_node_set_bounds (GskRenderNode *node,
const graphene_rect_t *bounds);
GDK_AVAILABLE_IN_3_90
void gsk_render_node_set_transform (GskRenderNode *node,
const graphene_matrix_t *transform);
GDK_AVAILABLE_IN_3_90

View File

@ -31,6 +31,7 @@ struct _GskTextureNode
GskRenderNode render_node;
GskTexture *texture;
graphene_rect_t bounds;
};
static void
@ -46,12 +47,22 @@ gsk_texture_node_make_immutable (GskRenderNode *node)
{
}
static void
gsk_texture_node_get_bounds (GskRenderNode *node,
graphene_rect_t *bounds)
{
GskTextureNode *self = (GskTextureNode *) node;
graphene_rect_init_from_rect (bounds, &self->bounds);
}
static const GskRenderNodeClass GSK_TEXTURE_NODE_CLASS = {
GSK_TEXTURE_NODE,
sizeof (GskTextureNode),
"GskTextureNode",
gsk_texture_node_finalize,
gsk_texture_node_make_immutable
gsk_texture_node_make_immutable,
gsk_texture_node_get_bounds
};
GskTexture *
@ -81,18 +92,16 @@ gsk_texture_node_new (GskTexture *texture,
const graphene_rect_t *bounds)
{
GskTextureNode *self;
GskRenderNode *node;
g_return_val_if_fail (GSK_IS_TEXTURE (texture), NULL);
g_return_val_if_fail (bounds != NULL, NULL);
node = gsk_render_node_new (&GSK_TEXTURE_NODE_CLASS);
self = (GskTextureNode *) node;
self = (GskTextureNode *) gsk_render_node_new (&GSK_TEXTURE_NODE_CLASS);
self->texture = gsk_texture_ref (texture);
graphene_rect_init_from_rect (&node->bounds, bounds);
graphene_rect_init_from_rect (&self->bounds, bounds);
return node;
return &self->render_node;
}
/*** GSK_CAIRO_NODE ***/
@ -104,6 +113,7 @@ struct _GskCairoNode
GskRenderNode render_node;
cairo_surface_t *surface;
graphene_rect_t bounds;
};
static void
@ -120,12 +130,22 @@ gsk_cairo_node_make_immutable (GskRenderNode *node)
{
}
static void
gsk_cairo_node_get_bounds (GskRenderNode *node,
graphene_rect_t *bounds)
{
GskCairoNode *self = (GskCairoNode *) node;
graphene_rect_init_from_rect (bounds, &self->bounds);
}
static const GskRenderNodeClass GSK_CAIRO_NODE_CLASS = {
GSK_CAIRO_NODE,
sizeof (GskCairoNode),
"GskCairoNode",
gsk_cairo_node_finalize,
gsk_cairo_node_make_immutable
gsk_cairo_node_make_immutable,
gsk_cairo_node_get_bounds
};
/*< private >
@ -161,15 +181,15 @@ gsk_cairo_node_get_surface (GskRenderNode *node)
GskRenderNode *
gsk_cairo_node_new (const graphene_rect_t *bounds)
{
GskRenderNode *node;
GskCairoNode *self;
g_return_val_if_fail (bounds != NULL, NULL);
node = gsk_render_node_new (&GSK_CAIRO_NODE_CLASS);
self = (GskCairoNode *) gsk_render_node_new (&GSK_CAIRO_NODE_CLASS);
graphene_rect_init_from_rect (&node->bounds, bounds);
graphene_rect_init_from_rect (&self->bounds, bounds);
return node;
return &self->render_node;
}
/**
@ -199,8 +219,8 @@ gsk_cairo_node_get_draw_context (GskRenderNode *node,
g_return_val_if_fail (node->is_mutable, NULL);
g_return_val_if_fail (renderer == NULL || GSK_IS_RENDERER (renderer), NULL);
width = ceilf (node->bounds.size.width);
height = ceilf (node->bounds.size.height);
width = ceilf (self->bounds.size.width);
height = ceilf (self->bounds.size.height);
if (width <= 0 || height <= 0)
{
@ -214,14 +234,14 @@ gsk_cairo_node_get_draw_context (GskRenderNode *node,
{
self->surface = gsk_renderer_create_cairo_surface (renderer,
CAIRO_FORMAT_ARGB32,
ceilf (node->bounds.size.width),
ceilf (node->bounds.size.height));
ceilf (self->bounds.size.width),
ceilf (self->bounds.size.height));
}
else
{
self->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
ceilf (node->bounds.size.width),
ceilf (node->bounds.size.height));
ceilf (self->bounds.size.width),
ceilf (self->bounds.size.height));
}
res = cairo_create (self->surface);
}
@ -230,11 +250,11 @@ gsk_cairo_node_get_draw_context (GskRenderNode *node,
res = cairo_create (self->surface);
}
cairo_translate (res, -node->bounds.origin.x, -node->bounds.origin.y);
cairo_translate (res, -self->bounds.origin.x, -self->bounds.origin.y);
cairo_rectangle (res,
node->bounds.origin.x, node->bounds.origin.y,
node->bounds.size.width, node->bounds.size.height);
self->bounds.origin.x, self->bounds.origin.y,
self->bounds.size.width, self->bounds.size.height);
cairo_clip (res);
if (GSK_DEBUG_CHECK (SURFACE))
@ -245,8 +265,8 @@ gsk_cairo_node_get_draw_context (GskRenderNode *node,
{
cairo_save (res);
cairo_rectangle (res,
node->bounds.origin.x + 1, node->bounds.origin.y + 1,
node->bounds.size.width - 2, node->bounds.size.height - 2);
self->bounds.origin.x + 1, self->bounds.origin.y + 1,
self->bounds.size.width - 2, self->bounds.size.height - 2);
cairo_set_line_width (res, 2);
cairo_set_source_rgb (res, 1, 0, 0);
cairo_stroke (res);
@ -277,12 +297,41 @@ gsk_container_node_make_immutable (GskRenderNode *node)
}
}
static void
gsk_container_node_get_bounds (GskRenderNode *node,
graphene_rect_t *bounds)
{
GskRenderNode *child;
child = gsk_render_node_get_first_child (node);
if (child == NULL)
{
graphene_rect_init_from_rect (bounds, graphene_rect_zero());
return;
}
gsk_render_node_get_bounds (child, bounds);
for (child = gsk_render_node_get_next_sibling (child);
child;
child = gsk_render_node_get_next_sibling (child))
{
graphene_rect_t child_bounds, union_bounds;
gsk_render_node_get_bounds (child, &child_bounds);
graphene_rect_union (bounds, &child_bounds, &union_bounds);
graphene_rect_init_from_rect (bounds, &union_bounds);
}
}
static const GskRenderNodeClass GSK_CONTAINER_NODE_CLASS = {
GSK_CONTAINER_NODE,
sizeof (GskRenderNode),
"GskContainerNode",
gsk_container_node_finalize,
gsk_container_node_make_immutable
gsk_container_node_make_immutable,
gsk_container_node_get_bounds
};
/**

View File

@ -41,9 +41,6 @@ struct _GskRenderNode
GskScalingFilter min_filter;
GskScalingFilter mag_filter;
/* Clip rectangle */
graphene_rect_t bounds;
/* Transformations relative to the root of the scene */
graphene_matrix_t world_matrix;
@ -63,6 +60,8 @@ struct _GskRenderNodeClass
const char *type_name;
void (* finalize) (GskRenderNode *node);
void (* make_immutable) (GskRenderNode *node);
void (* get_bounds) (GskRenderNode *node,
graphene_rect_t *bounds);
};
GskRenderNode *gsk_render_node_new (const GskRenderNodeClass *node_class);

View File

@ -111,7 +111,6 @@ gtk_snapshot_init (GtkSnapshot *snapshot,
snapshot->renderer = renderer;
snapshot->clip_region = clip;
snapshot->root = gsk_container_node_new ();
gsk_render_node_set_bounds (snapshot->root, &GRAPHENE_RECT_INIT (extents.x, extents.y, extents.width, extents.height));
if (name)
{
@ -176,14 +175,12 @@ gtk_snapshot_push_node (GtkSnapshot *snapshot,
*/
void
gtk_snapshot_push (GtkSnapshot *snapshot,
const graphene_rect_t *bounds,
const char *name,
...)
{
GskRenderNode *node;
node = gsk_container_node_new ();
gsk_render_node_set_bounds (node, bounds);
if (name)
{

View File

@ -41,9 +41,8 @@ GskRenderer * gtk_snapshot_get_renderer (const GtkSnapshot
GDK_AVAILABLE_IN_3_90
void gtk_snapshot_push (GtkSnapshot *snapshot,
const graphene_rect_t *bounds,
const char *name,
...) G_GNUC_PRINTF(3, 4);
...) G_GNUC_PRINTF(2, 3);
GDK_AVAILABLE_IN_3_90
void gtk_snapshot_push_node (GtkSnapshot *snapshot,
GskRenderNode *node);