summaryrefslogblamecommitdiff
path: root/saedit/sae.c
blob: 2b9abb6253b5469cb255f4e310a1a0edb39e8758 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11










                                           

                
                              

                                     

 
                                                                  





                                      


                          



                                            


                         




                                             


                                  


                                                                                                      
 

                                                                 


                                                                                                                                                                                                     


                                                                                   












































































                                                                                                                 
 
/*=======================================*\
|  ____                         ____      |
| /    \         /\            |          |
| \____         /  \           |____      |
|      \       /____\          |          |
| \____/prite /      \nimation |____ditor |
|                                         |
|      Copyleft Vasily_Makarov 2011       |
|                                         |
\*=======================================*/

#include "sae.h"

void kill_timeout(guint tag) {
	if (tag > 0)
		g_source_remove(tag);
}

Frame *frame_new(int index, int offsetX, int offsetY, int delay) {
	Frame *res = g_new0(Frame, 1);
	res->index = index;
	res->offsetX = offsetX;
	res->offsetY = offsetY;
	res->delay = delay;
	return res;
}

Imageset *imageset_new() {
	Imageset *res = g_new0(Imageset, 1);
	res->width = SPRITE_WIDTH_DEFAULT;
	res->height = SPRITE_HEIGHT_DEFAULT;
	return res;
}

SAEInfo *sae_info_new() {
	SAEInfo *res = g_new0(SAEInfo, 1);
	res->ground = sae_info_ground_new();
	res->sprite = frame_new(-1, 0, 0, 0);
	res->imageset = imageset_new();
	return res;
}

GdkPixbuf *sae_info_ground_new() {
	GdkPixbuf *ground = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, GRID_SIZE * 3, GRID_SIZE * 3);
	gdk_pixbuf_fill(ground, 0x00000000);
	return ground;
}

GdkPixbuf* get_sprite_by_index(size_t index, SAEInfo *sae_info) {
	size_t w = sae_info->imageset->spriteset_width/sae_info->imageset->width;
	if (sae_info->imageset->spriteset == NULL) return NULL;
	return gdk_pixbuf_new_subpixbuf(sae_info->imageset->spriteset, index%w*sae_info->imageset->width, index/w*sae_info->imageset->height, sae_info->imageset->width, sae_info->imageset->height);
}

gboolean set_up_animation_by_direction(SAEInfo *sae_info, const gchar *direction) {
	if (sae_info->imageset->spriteset == NULL)
		return FALSE;
	sae_info->animation = NULL;

	GList *list = g_list_find_custom(sae_info->animations,
	                                 xml_attr_new("direction", direction),
	                                 (GCompareFunc)xml_node_compare_with_attr_func);
	if (list == NULL)
		return FALSE;
	int count = 0;
	XMLNode *anode = list->data;
	list = anode->sub_nodes;

	while (list != NULL) {
		XMLNode *node = list->data;

		int offsetX = 0, offsetY = 0,
		    delay = 0,
		    start = -1, end = -1,
		    repeat = 1;

		gchar *ofX_param, *ofY_param;
		ofX_param = xml_node_get_attr_value(node, "offsetX");
		if (ofX_param != NULL)
			sscanf(ofX_param, "%d", &offsetX);
		ofY_param = xml_node_get_attr_value(node, "offsetY");
		if (ofY_param != NULL)
			sscanf(ofY_param, "%d", &offsetY);

		gchar *delay_attr = xml_node_get_attr_value(node, "delay");
		if (delay_attr != NULL)
			sscanf(delay_attr, "%d", &delay);

		if (g_str_equal(node->name, "frame")) {
			gchar *index_attr = xml_node_get_attr_value(node, "index");
			if (index_attr != NULL) {
				sscanf(index_attr, "%d", &start);
				end = start;
			}
		} else if (g_str_equal(node->name, "sequence")) {

			gchar *start_attr = xml_node_get_attr_value(node, "start");
			if (start_attr != NULL)
				sscanf(start_attr, "%d", &start);

			gchar *end_attr = xml_node_get_attr_value(node, "end");
			if (end_attr != NULL)
				sscanf(end_attr, "%d", &end);

			gchar *repeat_attr = xml_node_get_attr_value(node, "repeat");
			if (repeat_attr != NULL)
				sscanf(repeat_attr, "%d", &repeat);
		}

		if (start >= 0) {
			int r = 0, i = 0;
			for (r = 1; r <= repeat; r++) {
				for (i = start; i <= end; i++) {
					Frame *sprite = frame_new(i, offsetX, offsetY, delay);
					sprite->line_number = node->line_number;
					sprite->pixbuf = get_sprite_by_index(i, sae_info);
					count++;
					if (sae_info->animation != NULL)
						sae_info->animation = g_list_append(sae_info->animation, sprite);
					else {
						sae_info->animation = g_list_alloc();
						sae_info->animation->data = sprite;
					}
				}
			}
		}
		list = g_list_next(list);
	}
	if (sae_info->animation == NULL)
		return FALSE;

	return TRUE;
}