From: Nick Bowler Date: Thu, 11 Jun 2009 22:04:50 +0000 (-0400) Subject: Use GObject properties for stuff since it makes much more sense. X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/commitdiff_plain/5944f3d64f5675df6eb8bd82ab45cc5ad31504a7 Use GObject properties for stuff since it makes much more sense. --- diff --git a/src/engine/texture.c b/src/engine/texture.c index 1b64590..e9ea07d 100644 --- a/src/engine/texture.c +++ b/src/engine/texture.c @@ -10,6 +10,12 @@ #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) diff --git a/src/engine/texture.h b/src/engine/texture.h index cfb53f5..e6834bc 100644 --- a/src/engine/texture.h +++ b/src/engine/texture.h @@ -20,7 +20,7 @@ typedef struct EngineTextureClass EngineTextureClass; struct EngineTexture { UObject parent; - unsigned long usize, vsize; + unsigned int usize, vsize; }; struct EngineTextureClass { diff --git a/src/uobject.c b/src/uobject.c index 111088f..a52a3ef 100644 --- a/src/uobject.c +++ b/src/uobject.c @@ -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);