diff options
| author | MenTaLguY <mental@rydia.net> | 2006-01-16 02:36:01 +0000 |
|---|---|---|
| committer | mental <mental@users.sourceforge.net> | 2006-01-16 02:36:01 +0000 |
| commit | 179fa413b047bede6e32109e2ce82437c5fb8d34 (patch) | |
| tree | a5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/libnr/nr-object.h | |
| download | inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip | |
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/libnr/nr-object.h')
| -rw-r--r-- | src/libnr/nr-object.h | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/libnr/nr-object.h b/src/libnr/nr-object.h new file mode 100644 index 000000000..f39814b0d --- /dev/null +++ b/src/libnr/nr-object.h @@ -0,0 +1,157 @@ +#ifndef __NR_OBJECT_H__ +#define __NR_OBJECT_H__ + +/* + * RGBA display list system for inkscape + * + * Authors: + * Lauris Kaplinski <lauris@kaplinski.com> + * MenTaLguY <mental@rydia.net> + * + * This code is in public domain + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <glib/gtypes.h> +#include "gc-managed.h" +#include "gc-finalized.h" +#include "gc-anchored.h" + +typedef guint32 NRType; + +struct NRObject; +struct NRObjectClass; + +#define NR_TYPE_OBJECT (nr_object_get_type ()) +#define NR_OBJECT(o) (NR_CHECK_INSTANCE_CAST ((o), NR_TYPE_OBJECT, NRObject)) +#define NR_IS_OBJECT(o) (NR_CHECK_INSTANCE_TYPE ((o), NR_TYPE_OBJECT)) + +#define NR_TYPE_ACTIVE_OBJECT (nr_active_object_get_type ()) +#define NR_ACTIVE_OBJECT(o) (NR_CHECK_INSTANCE_CAST ((o), NR_TYPE_ACTIVE_OBJECT, NRActiveObject)) +#define NR_IS_ACTIVE_OBJECT(o) (NR_CHECK_INSTANCE_TYPE ((o), NR_TYPE_ACTIVE_OBJECT)) + +#define nr_return_if_fail(expr) if (!(expr) && nr_emit_fail_warning (__FILE__, __LINE__, "?", #expr)) return +#define nr_return_val_if_fail(expr,val) if (!(expr) && nr_emit_fail_warning (__FILE__, __LINE__, "?", #expr)) return (val) + +unsigned int nr_emit_fail_warning (const gchar *file, unsigned int line, const gchar *method, const gchar *expr); + +#ifndef NR_DISABLE_CAST_CHECKS +#define NR_CHECK_INSTANCE_CAST(ip, tc, ct) ((ct *) nr_object_check_instance_cast (ip, tc)) +#else +#define NR_CHECK_INSTANCE_CAST(ip, tc, ct) ((ct *) ip) +#endif + +#define NR_CHECK_INSTANCE_TYPE(ip, tc) nr_object_check_instance_type (ip, tc) +#define NR_OBJECT_GET_CLASS(ip) (((NRObject *) ip)->klass) + +NRType nr_type_is_a (NRType type, NRType test); + +void const *nr_object_check_instance_cast(void const *ip, NRType tc); +unsigned int nr_object_check_instance_type(void const *ip, NRType tc); + +NRType nr_object_register_type (NRType parent, + gchar const *name, + unsigned int csize, + unsigned int isize, + void (* cinit) (NRObjectClass *), + void (* iinit) (NRObject *)); + +/* NRObject */ + +class NRObject : public Inkscape::GC::Managed<>, + public Inkscape::GC::Finalized, + public Inkscape::GC::Anchored +{ +public: + NRObjectClass *klass; + + static NRObject *alloc(NRType type); + + template <typename T> + static void invoke_ctor(NRObject *object) { + new (object) T(); + } + + /* these can go away eventually */ + NRObject *reference() { + return Inkscape::GC::anchor(this); + } + NRObject *unreference() { + Inkscape::GC::release(this); + return NULL; + } + +protected: + NRObject() {} + +private: + NRObject(NRObject const &); // no copy + void operator=(NRObject const &); // no assign + + void *operator new(size_t size, void *placement) { return placement; } +}; + +struct NRObjectClass { + NRType type; + NRObjectClass *parent; + + gchar *name; + unsigned int csize; + unsigned int isize; + void (* cinit) (NRObjectClass *); + void (* iinit) (NRObject *); + void (* finalize) (NRObject *object); + void (*cpp_ctor)(NRObject *object); +}; + +NRType nr_object_get_type (void); + +/* Dynamic lifecycle */ + +inline NRObject *nr_object_new (NRType type) { + return NRObject::alloc(type); +} + +inline NRObject *nr_object_ref (NRObject *object) { + return object->reference(); +} +inline NRObject *nr_object_unref (NRObject *object) { + return object->unreference(); +} + +/* NRActiveObject */ + +struct NRObjectEventVector { + void (* dispose) (NRObject *object, void *data); +}; + +struct NRObjectListener { + const NRObjectEventVector *vector; + unsigned int size; + void *data; +}; + +struct NRObjectCallbackBlock { + unsigned int size; + unsigned int length; + NRObjectListener listeners[1]; +}; + +struct NRActiveObject : public NRObject { + NRActiveObject() : callbacks(NULL) {} + NRObjectCallbackBlock *callbacks; +}; + +struct NRActiveObjectClass : public NRObjectClass { +}; + +NRType nr_active_object_get_type (void); + +void nr_active_object_add_listener (NRActiveObject *object, const NRObjectEventVector *vector, unsigned int size, void *data); +void nr_active_object_remove_listener_by_data (NRActiveObject *object, void *data); + +#endif + |
