Class (GI Struct)

Gsk-4.0GskRenderReplaySince 4.22

A facility to replay a Gsk.RenderNode and its children, potentially modifying them.

This is a utility tool to walk a rendernode tree. The most powerful way is to provide a function via Gsk.RenderReplay.set_node_filter to filter each individual node and then run Gsk.RenderReplay.filter_node on the nodes you want to filter.

If you want to just walk the node tree and extract information without any modifications, you can also use Gsk.RenderNode.get_children.

Here is a little example application that redacts text in a node file:

#include <gtk/gtk.h>

static GskRenderNode *
redact_nodes (GskRenderReplay *replay,
GskRenderNode *node,
gpointer user_data)
{
GskRenderNode *result;

if (gsk_render_node_get_node_type (node) == GSK_TEXT_NODE)
{
graphene_rect_t bounds;
const GdkRGBA *color;

gsk_render_node_get_bounds (node, &bounds);
color = gsk_text_node_get_color (node);

result = gsk_color_node_new (color, &bounds);
}
else
{
result = gsk_render_replay_default (replay, node);
}

return result;
}

int
main (int argc, char *argv[])
{
GFile *file;
GBytes *bytes;
GskRenderNode *result, *node;
GskRenderReplay *replay;

gtk_init ();

if (argc != 3)
{
g_print ("usage: %s INFILE OUTFILE\n", argv[0]);
return 0;
}

file = g_file_new_for_commandline_arg (argv[1]);
bytes = g_file_load_bytes (file, NULL, NULL, NULL);
g_object_unref (file);
if (bytes == NULL)
return 1;

node = gsk_render_node_deserialize (bytes, NULL, NULL);
g_bytes_unref (bytes);
if (node == NULL)
return 1;

replay = gsk_render_replay_new ();
gsk_render_replay_set_node_filter (replay, redact_nodes, NULL, NULL);
result = gsk_render_replay_filter_node (replay, node);
gsk_render_replay_free (replay);

if (!gsk_render_node_write_to_file (result, argv[2], NULL))
return 1;

gsk_render_node_unref (result);
gsk_render_node_unref (node);

return 0;
}

4.22

Index
  • Replays the node using the default method.

    The default method calls Gsk.RenderReplay.filter_node on all its child nodes and the filter functions for all its properties. If none of them are changed, it returns the passed in node. Otherwise it constructs a new node with the changed children and properties.

    It may not be possible to construct a new node when any of the callbacks return NULL. In that case, this function will return NULL, too.

    Parameters

    Returns Gsk.RenderNode

    The replayed node

    4.22

  • Sets the function to use as a node filter.

    This is the most complex function to use for replaying nodes. It can either:

    • keep the node and just return it unchanged

    • create a replacement node and return that

    • discard the node by returning NULL

    • call Gsk.RenderReplay.default to have the default handler run for this node, which calls your function on its children

    Parameters

    Returns void

    4.22