diff --git a/cogl/cogl-handle.h b/cogl/cogl-handle.h index 576598e5d..de63efb1b 100644 --- a/cogl/cogl-handle.h +++ b/cogl/cogl-handle.h @@ -3,7 +3,7 @@ * * An object oriented GL/GLES Abstraction/Utility Layer * - * Copyright (C) 2008,2009 Intel Corporation. + * Copyright (C) 2010 Intel Corporation. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,142 +16,20 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . + * License along with this library. If not, see + * . * * */ +/* This file is just kept for compatability while we eradicate + * CoglHandle + */ + #ifndef __COGL_HANDLE_H #define __COGL_HANDLE_H -typedef struct _CoglHandleClass -{ - GQuark type; - void *virt_free; -} CoglHandleClass; - -/* All Cogl objects inherit from this base object by adding a member: - * - * CoglHandleObject _parent; - * - * at the top of its main structure. This structure is initialized - * when you call _cogl_#type_name#_handle_new (new_object); - */ -typedef struct _CoglHandleObject -{ - unsigned int ref_count; - CoglHandleClass *klass; -} CoglHandleObject; - -/* Helper macro to encapsulate the common code for COGL reference - counted handles */ - -#ifdef COGL_HANDLE_DEBUG - -#define _COGL_HANDLE_DEBUG_NEW(type_name, obj) \ - COGL_NOTE (HANDLE, "COGL " G_STRINGIFY (type_name) " NEW %p %i", \ - (obj), (obj)->ref_count) - -#define _COGL_HANDLE_DEBUG_REF(type_name, handle) G_STMT_START { \ - CoglHandleObject *__obj = (CoglHandleObject *)handle; \ - COGL_NOTE (HANDLE, "COGL %s REF %p %i", \ - g_quark_to_string ((__obj)->klass->type), \ - (__obj), (__obj)->ref_count); } G_STMT_END - -#define _COGL_HANDLE_DEBUG_UNREF(type_name, handle) G_STMT_START { \ - CoglHandleObject *__obj = (CoglHandleObject *)handle; \ - COGL_NOTE (HANDLE, "COGL %s UNREF %p %i", \ - g_quark_to_string ((__obj)->klass->type), \ - (__obj), (__obj)->ref_count - 1); } G_STMT_END - -#define COGL_HANDLE_DEBUG_FREE(obj) \ - COGL_NOTE (HANDLE, "COGL %s FREE %p", \ - g_quark_to_string ((obj)->klass->type), (obj)) - -#else /* !COGL_HANDLE_DEBUG */ - -#define _COGL_HANDLE_DEBUG_NEW(type_name, obj) -#define _COGL_HANDLE_DEBUG_REF(type_name, obj) -#define _COGL_HANDLE_DEBUG_UNREF(type_name, obj) -#define COGL_HANDLE_DEBUG_FREE(obj) - -#endif /* COGL_HANDLE_DEBUG */ - -#define COGL_HANDLE_DEFINE(TypeName, type_name) \ - \ -static CoglHandleClass _cogl_##type_name##_class; \ - \ -GQuark \ -_cogl_handle_##type_name##_get_type (void) \ -{ \ - static GQuark type = 0; \ - if (!type) \ - type = g_quark_from_static_string ("Cogl"#TypeName); \ - return type; \ -} \ - \ -static CoglHandle \ -_cogl_##type_name##_handle_new (Cogl##TypeName *new_obj) \ -{ \ - CoglHandleObject *obj = (CoglHandleObject *)&new_obj->_parent;\ - obj->ref_count = 1; \ - \ - obj->klass = &_cogl_##type_name##_class; \ - if (!obj->klass->type) \ - { \ - obj->klass->type = _cogl_handle_##type_name##_get_type ();\ - obj->klass->virt_free = _cogl_##type_name##_free; \ - } \ - \ - _COGL_HANDLE_DEBUG_NEW (TypeName, obj); \ - return (CoglHandle) new_obj; \ -} \ - \ -Cogl##TypeName * \ -_cogl_##type_name##_pointer_from_handle (CoglHandle handle) \ -{ \ - return (Cogl##TypeName *) handle; \ -} \ - \ -gboolean \ -cogl_is_##type_name (CoglHandle handle) \ -{ \ - CoglHandleObject *obj = (CoglHandleObject *)handle; \ - \ - if (handle == COGL_INVALID_HANDLE) \ - return FALSE; \ - \ - return (obj->klass->type == \ - _cogl_handle_##type_name##_get_type ()); \ -} \ - \ -CoglHandle G_GNUC_DEPRECATED \ -cogl_##type_name##_ref (CoglHandle handle) \ -{ \ - if (!cogl_is_##type_name (handle)) \ - return COGL_INVALID_HANDLE; \ - \ - _COGL_HANDLE_DEBUG_REF (TypeName, handle); \ - \ - cogl_handle_ref (handle); \ - \ - return handle; \ -} \ - \ -void G_GNUC_DEPRECATED \ -cogl_##type_name##_unref (CoglHandle handle) \ -{ \ - if (!cogl_is_##type_name (handle)) \ - { \ - g_warning (G_STRINGIFY (cogl_##type_name##_unref) \ - ": Ignoring unref of Cogl handle " \ - "due to type mismatch"); \ - return; \ - } \ - \ - _COGL_HANDLE_DEBUG_UNREF (TypeName, handle); \ - \ - cogl_handle_unref (handle); \ -} +#include "cogl-object.h" #endif /* __COGL_HANDLE_H */ + diff --git a/cogl/cogl-object.h b/cogl/cogl-object.h new file mode 100644 index 000000000..bfa660b5e --- /dev/null +++ b/cogl/cogl-object.h @@ -0,0 +1,183 @@ +/* + * Cogl + * + * An object oriented GL/GLES Abstraction/Utility Layer + * + * Copyright (C) 2008,2009 Intel Corporation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * + */ + +#ifndef __COGL_OBJECT_H +#define __COGL_OBJECT_H + +/* For compatability until all components have been converted */ +typedef struct _CoglObjectClass CoglHandleClass; +typedef struct _CoglObject CoglHandleObject; + +typedef struct _CoglObjectClass +{ + GQuark type; + void *virt_free; +} CoglObjectClass; + +/* All Cogl objects inherit from this base object by adding a member: + * + * CoglObject _parent; + * + * at the top of its main structure. This structure is initialized + * when you call _cogl_#type_name#_object_new (new_object); + */ +typedef struct _CoglObject +{ + unsigned int ref_count; + CoglObjectClass *klass; +} CoglObject; + +/* Helper macro to encapsulate the common code for COGL reference + counted objects */ + +#ifdef COGL_OBJECT_DEBUG + +#define _COGL_OBJECT_DEBUG_NEW(type_name, obj) \ + COGL_NOTE (HANDLE, "COGL " G_STRINGIFY (type_name) " NEW %p %i", \ + (obj), (obj)->ref_count) + +#define _COGL_OBJECT_DEBUG_REF(type_name, object) G_STMT_START { \ + CoglObject *__obj = (CoglObject *)object; \ + COGL_NOTE (HANDLE, "COGL %s REF %p %i", \ + g_quark_to_string ((__obj)->klass->type), \ + (__obj), (__obj)->ref_count); } G_STMT_END + +#define _COGL_OBJECT_DEBUG_UNREF(type_name, object) G_STMT_START { \ + CoglObject *__obj = (CoglObject *)object; \ + COGL_NOTE (HANDLE, "COGL %s UNREF %p %i", \ + g_quark_to_string ((__obj)->klass->type), \ + (__obj), (__obj)->ref_count - 1); } G_STMT_END + +#define COGL_OBJECT_DEBUG_FREE(obj) \ + COGL_NOTE (HANDLE, "COGL %s FREE %p", \ + g_quark_to_string ((obj)->klass->type), (obj)) + +#else /* !COGL_OBJECT_DEBUG */ + +#define _COGL_OBJECT_DEBUG_NEW(type_name, obj) +#define _COGL_OBJECT_DEBUG_REF(type_name, obj) +#define _COGL_OBJECT_DEBUG_UNREF(type_name, obj) +#define COGL_OBJECT_DEBUG_FREE(obj) + +#endif /* COGL_OBJECT_DEBUG */ + +/* For temporary compatability */ +#define _COGL_HANDLE_DEBUG_NEW _COGL_OBJECT_DEBUG_NEW +#define _COGL_HANDLE_DEBUG_REF _COGL_OBJECT_DEBUG_REF +#define _COGL_HANDLE_DEBUG_UNREF _COGL_OBJECT_DEBUG_UNREF +#define COGL_HANDLE_DEBUG_FREE COGL_OBJECT_DEBUG_FREE + +#define COGL_OBJECT_DEFINE(TypeName, type_name) \ + \ +static CoglObjectClass _cogl_##type_name##_class; \ + \ +GQuark \ +_cogl_object_##type_name##_get_type (void) \ +{ \ + static GQuark type = 0; \ + if (!type) \ + type = g_quark_from_static_string ("Cogl"#TypeName); \ + return type; \ +} \ + \ +GQuark \ +_cogl_handle_##type_name##_get_type (void) \ +{ \ + return _cogl_object_##type_name##_get_type (); \ +} \ + \ +static Cogl##TypeName * \ +_cogl_##type_name##_object_new (Cogl##TypeName *new_obj) \ +{ \ + CoglObject *obj = (CoglObject *)&new_obj->_parent;\ + obj->ref_count = 1; \ + \ + obj->klass = &_cogl_##type_name##_class; \ + if (!obj->klass->type) \ + { \ + obj->klass->type = _cogl_object_##type_name##_get_type ();\ + obj->klass->virt_free = _cogl_##type_name##_free; \ + } \ + \ + _COGL_OBJECT_DEBUG_NEW (TypeName, obj); \ + return new_obj; \ +} \ + \ +static Cogl##TypeName * \ +_cogl_##type_name##_handle_new (CoglHandle handle) \ +{ \ + return _cogl_##type_name##_object_new (handle); \ +} \ + \ +Cogl##TypeName * \ +_cogl_##type_name##_pointer_from_handle (CoglHandle handle) \ +{ \ + return handle; \ +} \ + \ +gboolean \ +cogl_is_##type_name (CoglHandle object) \ +{ \ + CoglObject *obj = object; \ + \ + if (object == NULL) \ + return FALSE; \ + \ + return (obj->klass->type == \ + _cogl_object_##type_name##_get_type ()); \ +} \ + \ +void * G_GNUC_DEPRECATED \ +cogl_##type_name##_ref (void *object) \ +{ \ + if (!cogl_is_##type_name (object)) \ + return NULL; \ + \ + _COGL_OBJECT_DEBUG_REF (TypeName, object); \ + \ + cogl_handle_ref (object); \ + \ + return object; \ +} \ + \ +void G_GNUC_DEPRECATED \ +cogl_##type_name##_unref (void *object) \ +{ \ + if (!cogl_is_##type_name (object)) \ + { \ + g_warning (G_STRINGIFY (cogl_##type_name##_unref) \ + ": Ignoring unref of Cogl handle " \ + "due to type mismatch"); \ + return; \ + } \ + \ + _COGL_OBJECT_DEBUG_UNREF (TypeName, object); \ + \ + cogl_handle_unref (object); \ +} + +/* For temporary compatability */ +#define COGL_HANDLE_DEFINE COGL_OBJECT_DEFINE + +#endif /* __COGL_OBJECT_H */ + diff --git a/cogl/cogl-types.h b/cogl/cogl-types.h index 547ed129a..61a3eff7b 100644 --- a/cogl/cogl-types.h +++ b/cogl/cogl-types.h @@ -83,6 +83,27 @@ cogl_handle_ref (CoglHandle handle); void cogl_handle_unref (CoglHandle Handle); +/** + * cogl_handle_ref: + * @object: a #CoglObject + * + * Increases the reference count of @handle by 1 + * + * Returns: the @object, with its reference count increased + */ +void * +cogl_object_ref (void *object); + +/** + * cogl_handle_unref: + * @object: a #CoglObject + * + * Drecreases the reference count of @object by 1; if the reference + * count reaches 0, the resources allocated by @object will be freed + */ +void +cogl_object_unref (void *object); + /** * CoglFuncPtr: * diff --git a/cogl/cogl-util.c b/cogl/cogl-util.c index 622b78505..cc28b08e6 100644 --- a/cogl/cogl-util.c +++ b/cogl/cogl-util.c @@ -61,48 +61,67 @@ cogl_util_next_p2 (int a) /* gtypes */ +void * +cogl_object_ref (void *object) +{ + CoglObject *obj = object; + + g_return_val_if_fail (object != NULL, NULL); + + obj->ref_count++; + return object; +} + CoglHandle cogl_handle_ref (CoglHandle handle) { - CoglHandleObject *obj = (CoglHandleObject *)handle; - - g_return_val_if_fail (handle != COGL_INVALID_HANDLE, COGL_INVALID_HANDLE); - - obj->ref_count++; - return handle; + return cogl_object_ref (handle); } void -cogl_handle_unref (CoglHandle handle) +cogl_object_unref (void *object) { - CoglHandleObject *obj = (CoglHandleObject *)handle; + CoglObject *obj = object; - g_return_if_fail (handle != COGL_INVALID_HANDLE); + g_return_if_fail (object != NULL); g_return_if_fail (obj->ref_count > 0); if (--obj->ref_count < 1) { void (*free_func)(void *obj); - COGL_HANDLE_DEBUG_FREE (obj); + COGL_OBJECT_DEBUG_FREE (obj); free_func = obj->klass->virt_free; free_func (obj); } } +void +cogl_handle_unref (CoglHandle handle) +{ + cogl_object_unref (handle); +} + GType -cogl_handle_get_type (void) +cogl_object_get_type (void) { static GType our_type = 0; + /* XXX: We are keeping the "CoglHandle" name for now incase it would + * break bindings to change to "CoglObject" */ if (G_UNLIKELY (our_type == 0)) our_type = g_boxed_type_register_static (g_intern_static_string ("CoglHandle"), - (GBoxedCopyFunc) cogl_handle_ref, - (GBoxedFreeFunc) cogl_handle_unref); + (GBoxedCopyFunc) cogl_object_ref, + (GBoxedFreeFunc) cogl_object_unref); return our_type; } +GType +cogl_handle_get_type (void) +{ + return cogl_object_get_type (); +} /* * CoglFixed */