From f8b626c27a45abf36ee0f3d65e8ef5d19b6ede98 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 23 Mar 2011 08:58:19 -0400 Subject: [PATCH] uobject: Add initial support for object properties. --- src/engine/palette.c | 1 - src/engine/texture.c | 14 ++++++++++++++ src/engine/texture.h | 2 ++ src/uobject/uobject.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/engine/palette.c b/src/engine/palette.c index 65b3e31..4bea975 100644 --- a/src/engine/palette.c +++ b/src/engine/palette.c @@ -52,7 +52,6 @@ static int deserialize(UObject *uo) return -1; } - printf("palette opened\n"); return 0; } diff --git a/src/engine/texture.c b/src/engine/texture.c index f0f0aaa..db6edd0 100644 --- a/src/engine/texture.c +++ b/src/engine/texture.c @@ -23,6 +23,7 @@ #include #include #include "texture.h" +#include "palette.h" #include "upkg.h" #define TEXTURE_GET_PRIV(o) \ @@ -36,6 +37,7 @@ enum { PROP_VCLAMP, PROP_UBITS, PROP_VBITS, + PROP_PALETTE, }; struct texture_priv { @@ -93,6 +95,9 @@ set_property(GObject *o, guint id, const GValue *val, GParamSpec *spec) case PROP_VBITS: t->vbits = g_value_get_uint(val); break; + case PROP_PALETTE: + t->palette = g_value_get_object(val); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(o, id, spec); } @@ -122,6 +127,9 @@ get_property(GObject *o, guint id, GValue *val, GParamSpec *spec) case PROP_VBITS: g_value_set_uint(val, t->vbits); break; + case PROP_PALETTE: + g_value_set_object(val, t->palette); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(o, id, spec); } @@ -179,6 +187,12 @@ static void engine_texture_class_init(EngineTextureClass *class) "???", 0, 64, 0, G_PARAM_READWRITE)); + g_object_class_install_property(go, PROP_PALETTE, + g_param_spec_object("Palette", + "Palette", + "Palette reference for the texture.", + ENGINE_PALETTE_TYPE, + G_PARAM_READWRITE)); } static void engine_texture_class_finalize(EngineTextureClass *class) diff --git a/src/engine/texture.h b/src/engine/texture.h index b76beb2..ac1ad05 100644 --- a/src/engine/texture.h +++ b/src/engine/texture.h @@ -38,6 +38,8 @@ typedef struct EngineTextureClass EngineTextureClass; struct EngineTexture { UObject parent; + UObject *palette; + unsigned int usize, vsize; unsigned int uclamp, vclamp; unsigned int ubits, vbits; diff --git a/src/uobject/uobject.c b/src/uobject/uobject.c index 7b0a79e..15a26b5 100644 --- a/src/uobject/uobject.c +++ b/src/uobject/uobject.c @@ -87,6 +87,34 @@ get_real_size(unsigned long *real, unsigned size, unsigned char *buf, size_t n) return 0; } +static int decode_object_property(UObject *uo, GValue *val, unsigned long len) +{ + struct u_object_priv *priv = U_OBJECT_GET_PRIV(uo); + GObject *obj = NULL; + long index; + int rc; + + rc = upkg_decode_index(&index, priv->buf+len, priv->nbuf-len); + if (rc == 0 || index == 0) + return -1; + + if (index < 0) { + fprintf(stderr, "Imports not supported yet.\n"); + } else { + obj = u_object_new_from_package(uo->pkg, index-1); + } + + g_value_init(val, U_OBJECT_TYPE); + g_value_take_object(val, obj); + return 0; +} + +/* + * XXX: I must have been smoking the happy plant when I started property + * decoding. The tracking of various sizes in these functions makes no + * sense at all. + */ + static unsigned long decode_property(UObject *o, const char *name, struct upkg_file *f, unsigned long len) { @@ -123,6 +151,12 @@ decode_property(UObject *o, const char *name, struct upkg_file *f, unsigned long g_value_set_ulong(&val, unpack_32_le(priv->buf+len)); g_object_set_property(G_OBJECT(o), name, &val); break; + case PROPERTY_OBJECT: + rc = decode_object_property(o, &val, len); + if (rc != 0) + return 0; + g_object_set_property(G_OBJECT(o), name, &val); + break; default: fprintf(stderr, "Unhandled property type %x\n", (unsigned)type); } -- 2.43.2