From 833b3d56704730776e528b89013e9419fd128eba Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Sun, 17 Feb 2013 01:56:08 -0500 Subject: Allocate maps & tilesets before their start elems. --- diff --git a/src/main.c b/src/main.c index c867f65..0727d5b 100644 --- a/src/main.c +++ b/src/main.c @@ -9,12 +9,16 @@ main(void) { struct map *map; struct image *img; + struct tileset *ts; SDL_Rect imgrect, surfacerect; init(); map = map_get("data/forest1.simple.tmx"); - printf("Map dimensions: %dx%d\n", map->width, map->height); + debug("Map dimensions: %dx%d", map->width, map->height); + for (ts = map->tilesets_head; ts != NULL; ts = ts->next) { + debug("Tilesheet name: %s", ts->name); + } img = img_png_get("../forest-6-layer-test_ground.png"); img_png_free(img); diff --git a/src/resources/map.c b/src/resources/map.c index 6e5606b..e0c48c0 100644 --- a/src/resources/map.c +++ b/src/resources/map.c @@ -16,7 +16,7 @@ static void XMLCALL tmx_map_end(void *, const char *); static void XMLCALL tmx_map_el_start(void *, const char *, const char **); static void XMLCALL tmx_tileset_start(void *, const char *, const char **); static void XMLCALL tmx_tileset_end(void *, const char *); -static void XMLCALL tmx_ext_ts_end(void *, const char *); +static void XMLCALL tmx_tilesheetemb_end(void *, const char *); static void XMLCALL tmx_tileset_el_start(void *, const char *, const char **); static void XMLCALL tmx_image_end(void *, const char *); static void XMLCALL tmx_unused_start(void *, const char *, const char **); @@ -40,6 +40,11 @@ map_get(const char *path) return map; } + map = resource_alloc(path, sizeof(*map)); + if (map == NULL) { + return NULL; + } + p = XML_ParserCreate(NULL); if (p == NULL) { warn("Failed to create TMX parser"); @@ -80,7 +85,6 @@ map_get(const char *path) return NULL; } - map = (struct map *) xml_node_pop(p); XML_ParserFree(p); fclose(tmx_fp); @@ -128,6 +132,11 @@ tileset_get(const char *path) return ts; } + ts = resource_alloc(path, sizeof(*ts)); + if (ts == NULL) { + return NULL; + } + p = XML_ParserCreate(NULL); if (p == NULL) { warn("Failed to create TSX parser"); @@ -168,7 +177,6 @@ tileset_get(const char *path) return NULL; } - ts = (struct tileset *) xml_node_pop(p); XML_ParserFree(p); fclose(tmx_fp); @@ -187,11 +195,7 @@ tmx_map_start(void *pv, const char *name, const char **attr) debug("<%s> (map)", name); if (xml_check_tag(name, "map")) { - m = resource_alloc("", sizeof(*m)); - if (m == NULL) { - XML_StopParser(p, XML_FALSE); - return; - } + m = xml_node_peek(p); xml_get_int_attr(p, attr, "width", &m->width, 1); xml_get_int_attr(p, attr, "height", &m->height, 1); xml_get_int_attr(p, attr, "tilewidth", &m->tilewidth, 1); @@ -207,14 +211,11 @@ static void XMLCALL tmx_map_end(void *pv, const char *name) { XML_Parser p = (XML_Parser) pv; - struct map *m; debug(" (map)", name); if (xml_check_tag(name, "map")) { - /* A hack to expose the map back to map_get(). */ - m = xml_node_pop(p); - xml_node_push(p, m, tmx_invalid_start, tmx_invalid_end, NULL); + xml_node_pop(p); } else { xml_unexpected_end_tag(p, name, "map"); } @@ -239,15 +240,23 @@ tmx_map_el_start(void *pv, const char *name, const char **attr) /* External tilesheet. */ ts = tileset_get(source); free(source); - xml_node_push(p, ts, tmx_invalid_start, tmx_ext_ts_end, - NULL); + xml_node_push(p, ts, tmx_invalid_start, + tmx_tilesheetemb_end, NULL); } else { - /* Pass through. */ - tmx_tileset_start(pv, name, attr); - ts = (struct tileset *) xml_node_peek(p); + /* Embedded tilesheet. */ + ts = resource_alloc("internal", sizeof(*ts)); + if (ts == NULL) { + return; + } + xml_get_string_attr(p, attr, "name", &ts->name, 1); + xml_get_int_attr(p, attr, "tilewidth", &ts->tilewidth, + 1); + xml_get_int_attr(p, attr, "tileheight", &ts->tileheight, + 1); + xml_node_push(p, ts, tmx_tileset_el_start, + tmx_tilesheetemb_end, NULL); } xml_get_int_attr(p, attr, "firstgid", &ts->firstgid, 1); - xml_get_string_attr(p, attr, "name", &ts->name, 1); } else { xml_unexpected_start_tag(p, name, "properties, tileset, layer, or objectgroup"); @@ -263,7 +272,7 @@ tmx_tileset_start(void *pv, const char *name, const char **attr) debug("<%s> (tileset)", name); if (xml_check_tag(name, "tileset")) { - ts = resource_alloc("", sizeof(*ts)); + ts = xml_node_peek(p); xml_get_string_attr(p, attr, "name", &ts->name, 1); xml_get_int_attr(p, attr, "tilewidth", &ts->tilewidth, 1); xml_get_int_attr(p, attr, "tileheight", &ts->tileheight, 1); @@ -278,27 +287,23 @@ static void XMLCALL tmx_tileset_end(void *pv, const char *name) { XML_Parser p = (XML_Parser) pv; - struct tileset *ts; - debug(" (tileset)", name); + debug(" (external tileset)", name); if (xml_check_tag(name, "tileset")) { - ts = (struct tileset *) xml_node_pop(p); - /* XXX?? */ - resource_use((struct resource *) ts); - resource_add(&ts_res, "", (struct resource *) ts); + xml_node_pop(p); } else { xml_unexpected_end_tag(p, name, "tileset"); } } static void XMLCALL -tmx_ext_ts_end(void *pv, const char *name) +tmx_tilesheetemb_end(void *pv, const char *name) { XML_Parser p = (XML_Parser) pv; struct tileset *ts; - debug(" (tileset link)", name); + debug(" (tileset)", name); if (xml_check_tag(name, "tileset")) { ts = (struct tileset *) xml_node_pop(p); @@ -319,7 +324,7 @@ tmx_tileset_el_start(void *pv, const char *name, const char **attr) if (xml_check_tag(name, "image")) { xml_get_string_attr(p, attr, "source", &source, 0); - img = NULL; /*img_png_get(source);*/ + img = img_png_get(source); free(source); xml_node_push(p, img, tmx_invalid_start, tmx_image_end, NULL); } else { -- cgit v0.9.1