1#ifndef __GSK_RENDER_NODE_PRIVATE_H__
2#define __GSK_RENDER_NODE_PRIVATE_H__
3
4#include "gskrendernode.h"
5#include <cairo.h>
6
7G_BEGIN_DECLS
8
9typedef struct _GskRenderNodeClass GskRenderNodeClass;
10
11/* Keep this in sync with the GskRenderNodeType enumeration.
12 *
13 * We don't add an "n-types" value to avoid having to handle
14 * it in every single switch.
15 */
16#define GSK_RENDER_NODE_TYPE_N_TYPES (GSK_GL_SHADER_NODE + 1)
17
18extern GType gsk_render_node_types[];
19
20#define GSK_IS_RENDER_NODE_TYPE(node,type) \
21 (G_TYPE_INSTANCE_GET_CLASS ((node), GSK_TYPE_RENDER_NODE, GskRenderNodeClass)->node_type == (type))
22
23struct _GskRenderNode
24{
25 GTypeInstance parent_instance;
26
27 gatomicrefcount ref_count;
28
29 graphene_rect_t bounds;
30
31 guint prefers_high_depth : 1;
32};
33
34struct _GskRenderNodeClass
35{
36 GTypeClass parent_class;
37
38 GskRenderNodeType node_type;
39
40 void (* finalize) (GskRenderNode *node);
41 void (* draw) (GskRenderNode *node,
42 cairo_t *cr);
43 gboolean (* can_diff) (const GskRenderNode *node1,
44 const GskRenderNode *node2);
45 void (* diff) (GskRenderNode *node1,
46 GskRenderNode *node2,
47 cairo_region_t *region);
48};
49
50/*< private >
51 * GskRenderNodeTypeInfo:
52 * @node_type: the render node type in the `GskRenderNodeType` enumeration
53 * @instance_size: the size of the render node instance
54 * @instance_init: (nullable): the instance initialization function
55 * @finalize: (nullable): the instance finalization function; must chain up to the
56 * implementation of the parent class
57 * @draw: the function called by gsk_render_node_draw()
58 * @can_diff: (nullable): the function called by gsk_render_node_can_diff(); if
59 * unset, gsk_render_node_can_diff_true() will be used
60 * @diff: (nullable): the function called by gsk_render_node_diff(); if unset,
61 * gsk_render_node_diff_impossible() will be used
62 *
63 * A struction that contains the type information for a `GskRenderNode` subclass,
64 * to be used by gsk_render_node_type_register_static().
65 */
66typedef struct
67{
68 GskRenderNodeType node_type;
69
70 gsize instance_size;
71
72 void (* instance_init) (GskRenderNode *node);
73 void (* finalize) (GskRenderNode *node);
74 void (* draw) (GskRenderNode *node,
75 cairo_t *cr);
76 gboolean (* can_diff) (const GskRenderNode *node1,
77 const GskRenderNode *node2);
78 void (* diff) (GskRenderNode *node1,
79 GskRenderNode *node2,
80 cairo_region_t *region);
81} GskRenderNodeTypeInfo;
82
83void gsk_render_node_init_types (void);
84
85GType gsk_render_node_type_register_static (const char *node_name,
86 const GskRenderNodeTypeInfo *node_info);
87
88gpointer gsk_render_node_alloc (GskRenderNodeType node_type);
89
90gboolean gsk_render_node_can_diff (const GskRenderNode *node1,
91 const GskRenderNode *node2) G_GNUC_PURE;
92void gsk_render_node_diff (GskRenderNode *node1,
93 GskRenderNode *node2,
94 cairo_region_t *region);
95void gsk_render_node_diff_impossible (GskRenderNode *node1,
96 GskRenderNode *node2,
97 cairo_region_t *region);
98void gsk_container_node_diff_with (GskRenderNode *container,
99 GskRenderNode *other,
100 cairo_region_t *region);
101
102bool gsk_border_node_get_uniform (const GskRenderNode *self);
103bool gsk_border_node_get_uniform_color (const GskRenderNode *self);
104
105void gsk_text_node_serialize_glyphs (GskRenderNode *self,
106 GString *str);
107
108GskRenderNode ** gsk_container_node_get_children (const GskRenderNode *node,
109 guint *n_children);
110
111void gsk_transform_node_get_translate (const GskRenderNode *node,
112 float *dx,
113 float *dy);
114gboolean gsk_render_node_prefers_high_depth (const GskRenderNode *node);
115
116
117G_END_DECLS
118
119#endif /* __GSK_RENDER_NODE_PRIVATE_H__ */
120

source code of gtk/gsk/gskrendernodeprivate.h