]> git.draconx.ca Git - upkg.git/commitdiff
Use GObject properties for stuff since it makes much more sense.
authorNick Bowler <nbowler@draconx.ca>
Thu, 11 Jun 2009 22:04:50 +0000 (18:04 -0400)
committerNick Bowler <nbowler@draconx.ca>
Thu, 11 Jun 2009 22:04:50 +0000 (18:04 -0400)
src/engine/texture.c
src/engine/texture.h
src/uobject.c

index 1b64590bfb062b2c82000c9d00479c9b6eb4f445..e9ea07d66ee9f4826b8a7dfc578083d7e0519925 100644 (file)
 #define TEXTURE_GET_PRIV(o) \
        G_TYPE_INSTANCE_GET_PRIVATE(o, ENGINE_TEXTURE_TYPE, struct texture_priv)
 
+enum {
+       PROP_0,
+       PROP_USIZE,
+       PROP_VSIZE,
+};
+
 struct texture_priv {
        unsigned type;
 
@@ -34,16 +40,6 @@ static int deserialize(UObject *o, struct upkg_file *f)
 
        U_OBJECT_CLASS(engine_texture_parent_class)->deserialize(o, f);
 
-       val = u_object_get_property(o, "USize");
-       if (!(val && G_VALUE_HOLDS(val, G_TYPE_ULONG)))
-               return -1;
-       t->usize = g_value_get_ulong(val);
-
-       val = u_object_get_property(o, "USize");
-       if (!(val && G_VALUE_HOLDS(val, G_TYPE_ULONG)))
-               return -1;
-       t->vsize = g_value_get_ulong(val);
-
        printf("Texture size: %lux%lu\n", t->usize, t->vsize);
 
        return 0;
@@ -54,17 +50,68 @@ void texture_register(GTypeModule *m)
        engine_texture_register_type(m);
 }
 
-static void engine_texture_init(EngineTexture *m)
+static void
+set_property(GObject *o, guint id, const GValue *val, GParamSpec *spec)
+{
+       EngineTexture *t = ENGINE_TEXTURE(o);
+
+       switch (id) {
+       case PROP_USIZE:
+               t->usize = g_value_get_uint(val);
+               break;
+       case PROP_VSIZE:
+               t->vsize = g_value_get_uint(val);
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID(o, id, spec);
+       }
+}
+
+static void
+get_property(GObject *o, guint id, GValue *val, GParamSpec *spec)
+{
+       EngineTexture *t = ENGINE_TEXTURE(o);
+
+       switch (id) {
+       case PROP_USIZE:
+               g_value_set_boolean(val, t->usize);
+               break;
+       case PROP_VSIZE:
+               g_value_set_boolean(val, t->vsize);
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID(o, id, spec);
+       }
+}
+
+static void engine_texture_init(EngineTexture *t)
 {
+       t->usize = t->vsize = 0;
 }
 
 static void engine_texture_class_init(EngineTextureClass *class)
 {
        UObjectClass *uo = U_OBJECT_CLASS(class);
+       GObjectClass *go = G_OBJECT_CLASS(class);
 
        g_type_class_add_private(class, sizeof (struct texture_priv));
 
        uo->deserialize = deserialize;
+       go->set_property = set_property;
+       go->get_property = get_property;
+
+       g_object_class_install_property(go, PROP_USIZE,
+               g_param_spec_uint("USize",
+                       "USize",
+                       "Width of the texture.",
+                       0, 2048, 0,
+                       G_PARAM_READWRITE));
+       g_object_class_install_property(go, PROP_VSIZE,
+               g_param_spec_uint("VSize",
+                       "VSize",
+                       "Height of the texture.",
+                       0, 2048, 0,
+                       G_PARAM_READWRITE));
 }
 
 static void engine_texture_class_finalize(EngineTextureClass *class)
index cfb53f5a0b1171f6290f6d5f1df9f7ff2e4687a6..e6834bc8c6f086e17533cba2fb563d1d1ec6d4f9 100644 (file)
@@ -20,7 +20,7 @@ typedef struct EngineTextureClass EngineTextureClass;
 struct EngineTexture {
        UObject parent;
 
-       unsigned long usize, vsize;
+       unsigned int usize, vsize;
 };
 
 struct EngineTextureClass {
index 111088fbfc19a2bc2f154bb89bd384de9b8b2213..a52a3ef511843921b538e8736e6552981d89780c 100644 (file)
@@ -7,7 +7,6 @@
 #include "uobject.h"
 #include "upkg.h"
 #include "pack.h"
-#include "avl.h"
 
 #define U_OBJECT_GET_PRIV(o) \
        G_TYPE_INSTANCE_GET_PRIVATE(o, U_OBJECT_TYPE, struct uobject_priv)
@@ -39,24 +38,10 @@ struct uobject_priv {
        struct upkg_file *f;
        size_t base, len;
 
-       struct avl_table *properties;
-
        unsigned char buf[2048];
        unsigned long nbuf;
 };
 
-/* AVL tree functions. */
-static int propcmp(const void *_a, const void *_b, void *_data)
-{
-       const struct uobject_property *a = _a, *b = _b;
-       return strcmp(a->name, b->name);
-}
-
-static void propfree(void *item, void *data)
-{
-       free(item);
-}
-
 static unsigned long
 get_real_size(unsigned long *real, unsigned size, unsigned char *buf, size_t n)
 {
@@ -113,14 +98,14 @@ decode_property(UObject *o, const char *name, struct upkg_file *f, unsigned long
                        return 0;
                g_value_init(&val, G_TYPE_UCHAR);
                g_value_set_uchar(&val, priv->buf[len]);
-               u_object_set_property(o, name, &val);
+               g_object_set_property(G_OBJECT(o), name, &val);
                break;
        case PROPERTY_INTEGER:
                if (priv->nbuf-len < 4)
                        return 0;
                g_value_init(&val, G_TYPE_ULONG);
                g_value_set_ulong(&val, unpack_32_le(priv->buf+len));
-               u_object_set_property(o, name, &val);
+               g_object_set_property(G_OBJECT(o), name, &val);
                break;
        default:
                fprintf(stderr, "Unhandled property type %x\n", (unsigned)type);
@@ -199,70 +184,13 @@ int u_object_deserialize(GObject *obj, struct upkg_file *f)
 static void u_object_init(UObject *o)
 {
        struct uobject_priv *priv = U_OBJECT_GET_PRIV(o);
-       priv->properties = NULL;
-}
-
-void u_object_set_property(UObject *o, const char *name, const GValue *val)
-{
-       struct uobject_priv *priv = U_OBJECT_GET_PRIV(o);
-       struct uobject_property *prop, search = { .name = name };
-       void **p;
-
-       if (!priv->properties) {
-               priv->properties = avl_create(propcmp, NULL, NULL);
-               g_return_if_fail(priv->properties != NULL);
-       }
-
-       prop = avl_find(priv->properties, &search);
-       if (prop) {
-               g_value_unset(&prop->val);
-               g_value_init(&prop->val, G_VALUE_TYPE(val));
-               g_value_copy(val, &prop->val);
-               return;
-       }
-
-       prop = malloc(sizeof *prop);
-       g_return_if_fail(prop != NULL);
-
-       *prop = (struct uobject_property) { .name = name };
-       g_value_init(&prop->val, G_VALUE_TYPE(val));
-       g_value_copy(val, &prop->val);
-
-       g_return_if_fail(avl_probe(priv->properties, prop) != NULL);
-}
-
-const GValue *u_object_get_property(UObject *o, const char *name)
-{
-       struct uobject_priv *priv = U_OBJECT_GET_PRIV(o);
-       struct uobject_property *prop, search = { .name = name };
-
-       if (!priv->properties)
-               return NULL;
-
-       prop = avl_find(priv->properties, &search);
-       if (!prop)
-               return NULL;
-       return &prop->val;
-}
-
-static void u_object_finalize(GObject *o)
-{
-       struct uobject_priv *priv = U_OBJECT_GET_PRIV(o);
-
-       if (priv->properties) {
-               avl_destroy(priv->properties, propfree);
-               priv->properties = NULL;
-       }
 }
 
 static void u_object_class_init(UObjectClass *class)
 {
-       GObjectClass *go = G_OBJECT_CLASS(class);
+       g_type_class_add_private(class, sizeof (struct uobject_priv));
 
        class->deserialize = deserialize;
-
-       g_type_class_add_private(class, sizeof (struct uobject_priv));
-       go->finalize = u_object_finalize;
 }
 
 G_DEFINE_TYPE(UObject, u_object, G_TYPE_OBJECT);