]> git.draconx.ca Git - upkg.git/commitdiff
uobject: Add initial support for object properties.
authorNick Bowler <nbowler@draconx.ca>
Wed, 23 Mar 2011 12:58:19 +0000 (08:58 -0400)
committerNick Bowler <nbowler@draconx.ca>
Wed, 23 Mar 2011 12:58:19 +0000 (08:58 -0400)
src/engine/palette.c
src/engine/texture.c
src/engine/texture.h
src/uobject/uobject.c

index 65b3e31075e2890e606b7f1d7f8a85d319094300..4bea975072b3a347720e6477a140a42ea7c6ad22 100644 (file)
@@ -52,7 +52,6 @@ static int deserialize(UObject *uo)
                return -1;
        }
 
-       printf("palette opened\n");
        return 0;
 }
 
index f0f0aaa0edab4c6e97cf8d096c24288c076596fb..db6edd02487c6d4a93464a7aa6d2738400b49cc2 100644 (file)
@@ -23,6 +23,7 @@
 #include <uobject/uobject.h>
 #include <uobject/exportable.h>
 #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)
index b76beb26bfa0b701b44cab438a9879363e129c43..ac1ad054e68bb5c3889f9902e85a82b4b33d833f 100644 (file)
@@ -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;
index 7b0a79e4e4a751f2a435582ea1ee934e30afdfbb..15a26b562f4e585849c25530c0913a3ca7a72b5b 100644 (file)
@@ -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);
        }