4
* A Low Level GPU Graphics and Utilities API
6
* Copyright (C) 2010 Intel Corporation.
8
* Permission is hereby granted, free of charge, to any person
9
* obtaining a copy of this software and associated documentation
10
* files (the "Software"), to deal in the Software without
11
* restriction, including without limitation the rights to use, copy,
12
* modify, merge, publish, distribute, sublicense, and/or sell copies
13
* of the Software, and to permit persons to whom the Software is
14
* furnished to do so, subject to the following conditions:
16
* The above copyright notice and this permission notice shall be
17
* included in all copies or substantial portions of the Software.
19
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
23
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
24
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31
#ifndef __COGL_GTYPE_PRIVATE_H__
32
#define __COGL_GTYPE_PRIVATE_H__
37
#include <glib-object.h>
39
#include "cogl-object-private.h"
41
/* Move this to public headers? */
42
typedef struct _CoglGtypeObject CoglGtypeObject;
43
typedef struct _CoglGtypeClass CoglGtypeClass;
45
struct _CoglGtypeObject
47
GTypeInstance parent_instance;
52
struct _CoglGtypeClass
54
GTypeClass base_class;
59
#define I_(str) (g_intern_static_string ((str)))
63
#define COGL_GTYPE_DEFINE_BOXED(Name,underscore_name,copy_func,free_func) \
65
cogl_##underscore_name##_get_gtype (void) \
67
static volatile size_t type_volatile = 0; \
68
if (g_once_init_enter (&type_volatile)) \
71
g_boxed_type_register_static (g_intern_static_string (I_("Cogl" # Name)), \
72
(GBoxedCopyFunc)copy_func, \
73
(GBoxedFreeFunc)free_func); \
74
g_once_init_leave (&type_volatile, type); \
76
return type_volatile; \
79
#define COGL_GTYPE_IMPLEMENT_INTERFACE(name) { \
80
const GInterfaceInfo g_implement_interface_info = { \
81
(GInterfaceInitFunc) _cogl_gtype_dummy_iface_init, NULL, NULL \
83
g_type_add_interface_static (fundamental_type_id, \
84
cogl_##name##_get_gtype(), \
85
&g_implement_interface_info); \
88
#define _COGL_GTYPE_DEFINE_BASE_CLASS_BEGIN(Name,name) \
90
cogl_##name##_get_gtype (void) \
92
static volatile gsize type_id__volatile = 0; \
93
if (g_once_init_enter (&type_id__volatile)) \
95
static const GTypeFundamentalInfo finfo = { \
96
(G_TYPE_FLAG_CLASSED | \
97
G_TYPE_FLAG_INSTANTIATABLE | \
98
G_TYPE_FLAG_DERIVABLE | \
99
G_TYPE_FLAG_DEEP_DERIVABLE), \
101
static const GTypeValueTable value_table = { \
102
_cogl_gtype_object_init_value, \
103
_cogl_gtype_object_free_value, \
104
_cogl_gtype_object_copy_value, \
105
_cogl_gtype_object_peek_pointer, \
107
_cogl_gtype_object_collect_value, \
109
_cogl_gtype_object_lcopy_value, \
111
const GTypeInfo node_info = { \
112
sizeof (CoglObjectClass), \
113
(GBaseInitFunc) _cogl_gtype_object_class_base_init, \
114
(GBaseFinalizeFunc) _cogl_gtype_object_class_base_finalize, \
115
(GClassInitFunc) _cogl_gtype_object_class_init, \
116
(GClassFinalizeFunc) NULL, \
118
sizeof (CoglObject), \
120
(GInstanceInitFunc) _cogl_gtype_object_init, \
123
GType fundamental_type_id = \
124
g_type_register_fundamental (g_type_fundamental_next (), \
126
&node_info, &finfo, \
127
G_TYPE_FLAG_ABSTRACT); \
128
g_once_init_leave (&type_id__volatile, \
129
fundamental_type_id);
131
#define _COGL_GTYPE_DEFINE_BASE_CLASS_END() \
133
return type_id__volatile; \
136
#define COGL_GTYPE_DEFINE_BASE_CLASS(Name,name,...) \
137
_COGL_GTYPE_DEFINE_BASE_CLASS_BEGIN(Name,name) \
139
_COGL_GTYPE_DEFINE_BASE_CLASS_END()
141
#define _COGL_GTYPE_DEFINE_INTERFACE_EXTENDED_BEGIN(Name,name) \
143
static void name##_default_init (Name##Interface *klass); \
145
name##_get_gtype (void) \
147
static volatile gsize type_id__volatile = 0; \
148
if (g_once_init_enter (&type_id__volatile)) \
150
GType fundamental_type_id = \
151
g_type_register_static_simple (G_TYPE_INTERFACE, \
152
g_intern_static_string (#Name), \
153
sizeof (Name##Interface), \
154
(GClassInitFunc)name##_default_init, \
156
(GInstanceInitFunc)NULL, \
158
g_type_interface_add_prerequisite (fundamental_type_id, \
159
cogl_object_get_gtype()); \
160
{ /* custom code follows */
162
#define _COGL_GTYPE_DEFINE_INTERFACE_EXTENDED_END() \
163
/* following custom code */ \
165
g_once_init_leave (&type_id__volatile, \
166
fundamental_type_id); \
168
return type_id__volatile; \
169
} /* closes name##_get_type() */
172
#define COGL_GTYPE_DEFINE_INTERFACE(Name,name) \
173
typedef struct _Cogl##Name##Iface Cogl##Name##Iface; \
174
typedef Cogl##Name##Iface Cogl##Name##Interface; \
175
struct _Cogl##Name##Iface \
178
GTypeInterface g_iface; \
180
_COGL_GTYPE_DEFINE_INTERFACE_EXTENDED_BEGIN (Cogl##Name, cogl_##name) \
181
_COGL_GTYPE_DEFINE_INTERFACE_EXTENDED_END () \
183
cogl_##name##_default_init (Cogl##Name##Interface *iface) \
187
#define _COGL_GTYPE_DEFINE_TYPE_EXTENDED_BEGIN(Name,name,parent,flags) \
189
static void name##_init (Name *self); \
190
static void name##_class_init (Name##Class *klass); \
191
static gpointer name##_parent_class = NULL; \
192
static gint Name##_private_offset; \
195
name##_class_intern_init (gpointer klass) \
197
name##_parent_class = g_type_class_peek_parent (klass); \
198
name##_class_init ((Name##Class*) klass); \
201
static inline gpointer \
202
name##_get_instance_private (Name *self) \
204
return (G_STRUCT_MEMBER_P (self, Name ##_private_offset)); \
208
name##_get_gtype (void) \
210
static volatile gsize type_id__volatile = 0; \
211
if (g_once_init_enter (&type_id__volatile)) \
213
GType fundamental_type_id = \
214
g_type_register_static_simple (parent, \
215
g_intern_static_string (#Name), \
216
sizeof (Name##Class), \
217
(GClassInitFunc) name##_class_intern_init, \
219
(GInstanceInitFunc) name##_init, \
220
(GTypeFlags) flags); \
221
{ /* custom code follows */
223
#define _COGL_GTYPE_DEFINE_TYPE_EXTENDED_END() \
224
/* following custom code */ \
226
g_once_init_leave (&type_id__volatile, \
227
fundamental_type_id); \
229
return type_id__volatile; \
230
} /* closes name##_get_type() */
233
#define COGL_GTYPE_DEFINE_CLASS(Name,name,...) \
234
typedef struct _Cogl##Name##Class Cogl##Name##Class; \
235
struct _Cogl##Name##Class { \
236
CoglObjectClass parent_class; \
238
_COGL_GTYPE_DEFINE_TYPE_EXTENDED_BEGIN(Cogl##Name, \
240
cogl_object_get_gtype(), \
243
_COGL_GTYPE_DEFINE_TYPE_EXTENDED_END() \
245
cogl_##name##_init (Cogl##Name *instance) \
249
cogl_##name##_class_init (Cogl##Name##Class *klass) \
253
void _cogl_gtype_object_init_value (GValue *value);
254
void _cogl_gtype_object_free_value (GValue *value);
255
void _cogl_gtype_object_copy_value (const GValue *src,
257
gpointer _cogl_gtype_object_peek_pointer (const GValue *value);
258
gchar *_cogl_gtype_object_collect_value (GValue *value,
259
guint n_collect_values,
260
GTypeCValue *collect_values,
261
guint collect_flags);
262
gchar *_cogl_gtype_object_lcopy_value (const GValue *value,
263
guint n_collect_values,
264
GTypeCValue *collect_values,
265
guint collect_flags);
267
void _cogl_gtype_object_class_base_init (CoglObjectClass *klass);
268
void _cogl_gtype_object_class_base_finalize (CoglObjectClass *klass);
269
void _cogl_gtype_object_class_init (CoglObjectClass *klass);
270
void _cogl_gtype_object_init (CoglObject *object);
272
void cogl_object_value_set_object (GValue *value,
274
gpointer cogl_object_value_get_object (const GValue *value);
276
void _cogl_gtype_dummy_iface_init (gpointer iface);
278
#endif /* __COGL_GTYPE_PRIVATE_H__ */