1 | #ifndef __GSK_RENDER_NODE_PRIVATE_H__ |
2 | #define __GSK_RENDER_NODE_PRIVATE_H__ |
3 | |
4 | #include "gskrendernode.h" |
5 | #include <cairo.h> |
6 | |
7 | G_BEGIN_DECLS |
8 | |
9 | typedef 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 | |
18 | extern 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 | |
23 | struct _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 | |
34 | struct _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 | */ |
66 | typedef 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 | |
83 | void gsk_render_node_init_types (void); |
84 | |
85 | GType gsk_render_node_type_register_static (const char *node_name, |
86 | const GskRenderNodeTypeInfo *node_info); |
87 | |
88 | gpointer gsk_render_node_alloc (GskRenderNodeType node_type); |
89 | |
90 | gboolean gsk_render_node_can_diff (const GskRenderNode *node1, |
91 | const GskRenderNode *node2) G_GNUC_PURE; |
92 | void gsk_render_node_diff (GskRenderNode *node1, |
93 | GskRenderNode *node2, |
94 | cairo_region_t *region); |
95 | void gsk_render_node_diff_impossible (GskRenderNode *node1, |
96 | GskRenderNode *node2, |
97 | cairo_region_t *region); |
98 | void gsk_container_node_diff_with (GskRenderNode *container, |
99 | GskRenderNode *other, |
100 | cairo_region_t *region); |
101 | |
102 | bool gsk_border_node_get_uniform (const GskRenderNode *self); |
103 | bool gsk_border_node_get_uniform_color (const GskRenderNode *self); |
104 | |
105 | void gsk_text_node_serialize_glyphs (GskRenderNode *self, |
106 | GString *str); |
107 | |
108 | GskRenderNode ** gsk_container_node_get_children (const GskRenderNode *node, |
109 | guint *n_children); |
110 | |
111 | void gsk_transform_node_get_translate (const GskRenderNode *node, |
112 | float *dx, |
113 | float *dy); |
114 | gboolean gsk_render_node_prefers_high_depth (const GskRenderNode *node); |
115 | |
116 | |
117 | G_END_DECLS |
118 | |
119 | #endif /* __GSK_RENDER_NODE_PRIVATE_H__ */ |
120 | |