Merge branch 'wip/otte/for-main' into 'main'

rendernode: Remove instance_init() function

See merge request GNOME/gtk!5785
This commit is contained in:
Benjamin Otte
2023-04-03 18:14:51 +00:00
3 changed files with 466 additions and 504 deletions

View File

@@ -148,7 +148,7 @@ static gboolean
gsk_render_node_real_can_diff (const GskRenderNode *node1,
const GskRenderNode *node2)
{
return FALSE;
return TRUE;
}
static void
@@ -156,6 +156,7 @@ gsk_render_node_real_diff (GskRenderNode *node1,
GskRenderNode *node2,
cairo_region_t *region)
{
gsk_render_node_diff_impossible (node1, node2, region);
}
static void
@@ -229,50 +230,6 @@ gsk_render_node_get_type (void)
return render_node_type__volatile;
}
typedef struct
{
GskRenderNodeType node_type;
void (* finalize) (GskRenderNode *node);
void (* draw) (GskRenderNode *node,
cairo_t *cr);
gboolean (* can_diff) (const GskRenderNode *node1,
const GskRenderNode *node2);
void (* diff) (GskRenderNode *node1,
GskRenderNode *node2,
cairo_region_t *region);
} RenderNodeClassData;
static void
gsk_render_node_generic_class_init (gpointer g_class,
gpointer class_data)
{
GskRenderNodeClass *node_class = g_class;
RenderNodeClassData *node_data = class_data;
/* Mandatory */
node_class->node_type = node_data->node_type;
/* Optional */
if (node_data->finalize != NULL)
node_class->finalize = node_data->finalize;
if (node_data->can_diff != NULL)
node_class->can_diff = node_data->can_diff;
/* Mandatory */
node_class->draw = node_data->draw;
node_class->diff = node_data->diff;
g_free (node_data);
}
static gboolean
gsk_render_node_can_diff_true (const GskRenderNode *node1,
const GskRenderNode *node2)
{
return TRUE;
}
/*< private >
* gsk_render_node_type_register_static:
* @node_name: the name of the node
@@ -284,35 +241,20 @@ gsk_render_node_can_diff_true (const GskRenderNode *node1,
* Returns: the newly registered GType
*/
GType
gsk_render_node_type_register_static (const char *node_name,
const GskRenderNodeTypeInfo *node_info)
gsk_render_node_type_register_static (const char *node_name,
gsize instance_size,
GClassInitFunc class_init)
{
GTypeInfo info;
info.class_size = sizeof (GskRenderNodeClass);
info.base_init = NULL;
info.base_finalize = NULL;
info.class_init = gsk_render_node_generic_class_init;
info.class_init = class_init;
info.class_finalize = NULL;
/* Avoid having a class_init() and a class struct for every GskRenderNode,
* by passing the various virtual functions and class data when initializing
* the base class
*/
info.class_data = g_new (RenderNodeClassData, 1);
((RenderNodeClassData *) info.class_data)->node_type = node_info->node_type;
((RenderNodeClassData *) info.class_data)->finalize = node_info->finalize;
((RenderNodeClassData *) info.class_data)->draw = node_info->draw;
((RenderNodeClassData *) info.class_data)->can_diff = node_info->can_diff != NULL
? node_info->can_diff
: gsk_render_node_can_diff_true;
((RenderNodeClassData *) info.class_data)->diff = node_info->diff != NULL
? node_info->diff
: gsk_render_node_diff_impossible;
info.instance_size = node_info->instance_size;
info.instance_size = instance_size;
info.n_preallocs = 0;
info.instance_init = (GInstanceInitFunc) node_info->instance_init;
info.instance_init = NULL;
info.value_table = NULL;
return g_type_register_static (GSK_TYPE_RENDER_NODE, node_name, &info, 0);

File diff suppressed because it is too large Load Diff

View File

@@ -47,43 +47,11 @@ struct _GskRenderNodeClass
cairo_region_t *region);
};
/*< private >
* GskRenderNodeTypeInfo:
* @node_type: the render node type in the `GskRenderNodeType` enumeration
* @instance_size: the size of the render node instance
* @instance_init: (nullable): the instance initialization function
* @finalize: (nullable): the instance finalization function; must chain up to the
* implementation of the parent class
* @draw: the function called by gsk_render_node_draw()
* @can_diff: (nullable): the function called by gsk_render_node_can_diff(); if
* unset, gsk_render_node_can_diff_true() will be used
* @diff: (nullable): the function called by gsk_render_node_diff(); if unset,
* gsk_render_node_diff_impossible() will be used
*
* A struction that contains the type information for a `GskRenderNode` subclass,
* to be used by gsk_render_node_type_register_static().
*/
typedef struct
{
GskRenderNodeType node_type;
gsize instance_size;
void (* instance_init) (GskRenderNode *node);
void (* finalize) (GskRenderNode *node);
void (* draw) (GskRenderNode *node,
cairo_t *cr);
gboolean (* can_diff) (const GskRenderNode *node1,
const GskRenderNode *node2);
void (* diff) (GskRenderNode *node1,
GskRenderNode *node2,
cairo_region_t *region);
} GskRenderNodeTypeInfo;
void gsk_render_node_init_types (void);
GType gsk_render_node_type_register_static (const char *node_name,
const GskRenderNodeTypeInfo *node_info);
gsize instance_size,
GClassInitFunc class_init);
gpointer gsk_render_node_alloc (GskRenderNodeType node_type);