diff options
Diffstat (limited to 'saedit/imageset.c')
-rw-r--r-- | saedit/imageset.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/saedit/imageset.c b/saedit/imageset.c new file mode 100644 index 0000000..9ae2ea0 --- /dev/null +++ b/saedit/imageset.c @@ -0,0 +1,130 @@ +#include "imageset.h" +#include <string.h> + +struct _Imageset { + gchar *name; + gint width, height; + gint offsetX, offsetY; + + GdkPixbuf *pixbuf; +}; + +Imageset * +imageset_new ( + const XMLNode *node, + const gchar *cdf_filename +) { + Imageset *imgset; + gchar *src, *filename; + GError *err = NULL; + gboolean fail = FALSE; + + g_return_val_if_fail (g_strcmp0 (node->name, "imageset") == 0, NULL); + + imgset = (Imageset *) g_new0 (Imageset, 1); + + imgset->name = xml_node_get_attr_value (node, "name"); + if (imgset->name == NULL) { + /* TODO: report error */ + fail = TRUE; + } + + src = xml_node_get_attr_value (node, "src"); + if (src == NULL) { + /* TODO: report error */ + fail = TRUE; + } else { + gchar *delim = strchr (src, '|'); + if (delim != NULL) + *delim = 0; + /* TODO: process palettes? */ + } + + imgset->width = xml_node_get_int_attr_value (node, "width", -1); + imgset->height = xml_node_get_int_attr_value (node, "height", -1); + if (imgset->width <= 0 || imgset->height <= 0) { + /* TODO: report error */ + fail = TRUE; + } + + imgset->offsetX = xml_node_get_int_attr_value (node, "offsetX", 0); + imgset->offsetY = xml_node_get_int_attr_value (node, "offsetY", 0); + + filename = g_strconcat (cdf_filename, "/", src, NULL); + imgset->pixbuf = gdk_pixbuf_new_from_file (filename, &err); + + if (imgset->pixbuf == NULL) { + /* TODO handle err and report error */ + fail = TRUE; + } + + if (fail) { + imageset_free (imgset); + return NULL; + } + + return imgset; +} + +gint +imageset_compare_by_name ( + const Imageset *first, + const Imageset *second +) { + return g_strcmp0 (first->name, second->name); +} + +GdkPixbuf * +imageset_get_sprite_by_index ( + const Imageset *imageset, + gint index +) { + gint w = gdk_pixbuf_get_width (imageset->pixbuf); + w /= imageset->width; + + g_return_val_if_fail (index >= 0, NULL); + + return gdk_pixbuf_new_subpixbuf ( + imageset->pixbuf, + (index % w) * imageset->width, + (index / w) * imageset->height, + imageset->width, + imageset->height + ); +} + +void +imageset_free (Imageset *imgset) { + g_free (imgset->name); + if (imgset->pixbuf != NULL) + g_object_unref (imgset->pixbuf); + g_free (imgset); +} + +gboolean +imageset_name_equals ( + const Imageset *imageset, + const gchar *name +) { + return g_strcmp0 (imageset->name, name) == 0; +} + +void +imageset_get_offset ( + const Imageset *imageset, + gint *offsetX, + gint *offsetY +) { + *offsetX = imageset->offsetX; + *offsetY = imageset->offsetY; +} + +void +imageset_get_size ( + const Imageset *imageset, + gint *width, + gint *height +) { + *width = imageset->width; + *height = imageset->height; +} |