#include "imageset.h" #include 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; }