summaryrefslogtreecommitdiffstats
path: root/src/libnr/nr-object.h
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-01-16 02:36:01 +0000
committermental <mental@users.sourceforge.net>2006-01-16 02:36:01 +0000
commit179fa413b047bede6e32109e2ce82437c5fb8d34 (patch)
treea5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/libnr/nr-object.h
downloadinkscape-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.h157
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
+