summaryrefslogtreecommitdiff
path: root/cogl/cogl-gtype.c
blob: 314d8e41f3e1083b7d992b87c6066b4bbd9a511a (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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include "cogl-gtype-private.h"

#include <gobject/gvaluecollector.h>

void
_cogl_gtype_object_init_value (GValue *value)
{
  value->data[0].v_pointer = NULL;
}

void
_cogl_gtype_object_free_value (GValue *value)
{
  if (value->data[0].v_pointer != NULL)
    cogl_object_unref (value->data[0].v_pointer);
}

void
_cogl_gtype_object_copy_value (const GValue *src,
                               GValue       *dst)
{
  if (src->data[0].v_pointer != NULL)
    dst->data[0].v_pointer = cogl_object_ref (src->data[0].v_pointer);
  else
    dst->data[0].v_pointer = NULL;
}

gpointer
_cogl_gtype_object_peek_pointer (const GValue *value)
{
  return value->data[0].v_pointer;
}

gchar *
_cogl_gtype_object_collect_value (GValue      *value,
                                  guint        n_collect_values,
                                  GTypeCValue *collect_values,
                                  guint        collect_flags)
{
  CoglObject *object;

  object = collect_values[0].v_pointer;

  if (object == NULL)
    {
      value->data[0].v_pointer = NULL;
      return NULL;
    }

  if (object->klass == NULL)
    return g_strconcat ("invalid unclassed CoglObject pointer for "
                        "value type '",
                        G_VALUE_TYPE_NAME (value),
                        "'",
                        NULL);

  value->data[0].v_pointer = cogl_object_ref (object);

  return NULL;
}

gchar *
_cogl_gtype_object_lcopy_value (const GValue *value,
                                guint         n_collect_values,
                                GTypeCValue  *collect_values,
                                guint         collect_flags)
{
  CoglObject **object_p = collect_values[0].v_pointer;

  if (object_p == NULL)
    return g_strconcat ("value location for '",
                        G_VALUE_TYPE_NAME (value),
                        "' passed as NULL",
                        NULL);

  if (value->data[0].v_pointer == NULL)
    *object_p = NULL;
  else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
    *object_p = value->data[0].v_pointer;
  else
    *object_p = cogl_object_ref (value->data[0].v_pointer);

  return NULL;
}

void
_cogl_gtype_object_class_base_init (CoglObjectClass *klass)
{
}

void
_cogl_gtype_object_class_base_finalize (CoglObjectClass *klass)
{
}

void
_cogl_gtype_object_class_init (CoglObjectClass *klass)
{
}

void
_cogl_gtype_object_init (CoglObject *object)
{
}

void
_cogl_gtype_dummy_iface_init (gpointer iface)
{
}

/**
 * cogl_object_value_set_object:
 * @value: a #GValue initialized with %COGL_GTYPE_TYPE_OBJECT
 * @object: (type Cogl.GtypeObject) (allow-none): a #CoglGtypeObject, or %NULL
 *
 * Sets the contents of a #GValue initialized with %COGL_GTYPE_TYPE_OBJECT.
 *
 */
void
cogl_object_value_set_object (GValue   *value,
                              gpointer  object)
{
  CoglObject *old_object;

  old_object = value->data[0].v_pointer;

  if (object != NULL)
    {
      /* take over ownership */
      value->data[0].v_pointer = object;
    }
  else
    value->data[0].v_pointer = NULL;

  if (old_object != NULL)
    cogl_object_unref (old_object);
}

/**
 * cogl_object_value_get_object:
 * @value: a #GValue initialized with %COGL_GTYPE_TYPE_OBJECT
 *
 * Retrieves a pointer to the #CoglGtypeObject contained inside
 * the passed #GValue.
 *
 * Return value: (transfer none) (type Cogl.GtypeObject): a pointer to
 *   a #CoglGtypeObject, or %NULL
 */
gpointer
cogl_object_value_get_object (const GValue *value)
{
  return value->data[0].v_pointer;
}