summaryrefslogtreecommitdiff
path: root/gsk/gskrendernodeprivate.h
blob: 8077e73eeb5acc2c5b431cd33d8f36cef112ba74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#ifndef __GSK_RENDER_NODE_PRIVATE_H__
#define __GSK_RENDER_NODE_PRIVATE_H__

#include "gskrendernode.h"
#include "gskrenderer.h"
#include <cairo.h>

G_BEGIN_DECLS

#define GSK_RENDER_NODE_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST ((klass), GSK_TYPE_RENDER_NODE, GskRenderNodeClass))
#define GSK_IS_RENDER_NODE_CLASS(klass)         (G_TYPE_CHECK_CLASS_TYPE ((klass), GSK_TYPE_RENDER_NODE))
#define GSK_RENDER_NODE_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS ((obj), GSK_TYPE_RENDER_NODE, GskRenderNodeClass))

struct _GskRenderNode
{
  GTypeInstance parent_instance;

  volatile int ref_count;

  /* Back pointer to the renderer that created the node */
  GskRenderer *renderer;

  /* The graph */
  GskRenderNode *parent;
  GskRenderNode *first_child;
  GskRenderNode *last_child;
  GskRenderNode *prev_sibling;
  GskRenderNode *next_sibling;

  int n_children;

  /* Use for debugging */
  char *name;

  /* Tag updated when adding/removing children */
  gint64 age;

  /* The contents of the node as a Cairo surface */
  cairo_surface_t *surface;

  /* The contents of the node as a GL surface */
  int texture_id;

  /* Paint opacity */
  double opacity;

  /* Blend mode */
  GskBlendMode blend_mode;

  /* Scaling filters */
  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;

  /* Transformations applied to the node */
  graphene_matrix_t transform;

  graphene_point3d_t anchor_point;

  /* Bit fields; leave at the end */
  gboolean is_mutable : 1;
  gboolean hidden : 1;
  gboolean opaque : 1;
  gboolean transform_set : 1;
  gboolean needs_world_matrix_update : 1;
};

struct _GskRenderNodeClass
{
  GTypeClass parent_class;

  void (* finalize) (GskRenderNode *node);
};

GskRenderNode *gsk_render_node_new (GskRenderer *renderer);

void gsk_render_node_make_immutable (GskRenderNode *node);

void gsk_render_node_get_bounds (GskRenderNode   *node,
                                 graphene_rect_t *frame);
void gsk_render_node_get_transform (GskRenderNode     *node,
                                    graphene_matrix_t *mv);
double gsk_render_node_get_opacity (GskRenderNode *node);

cairo_surface_t *gsk_render_node_get_surface (GskRenderNode *node);

int gsk_render_node_get_texture (GskRenderNode *node);

gboolean gsk_render_node_has_surface (GskRenderNode *node);
gboolean gsk_render_node_has_texture (GskRenderNode *node);

GskRenderNode *gsk_render_node_get_toplevel (GskRenderNode *node);

void gsk_render_node_update_world_matrix (GskRenderNode *node,
                                          gboolean       force);

void gsk_render_node_get_world_matrix (GskRenderNode     *node,
                                       graphene_matrix_t *mv);

int gsk_render_node_get_size (GskRenderNode *root);

G_END_DECLS

#endif /* __GSK_RENDER_NODE_PRIVATE_H__ */