From 514790f9d67e6dfffb7f6ed338a53be3eb84faeb Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Thu, 25 Mar 2021 15:05:37 -0400 Subject: tileset: Ensure tile size matches map's --- (limited to 'src') diff --git a/src/map.c b/src/map.c index c2454f0..84b6194 100644 --- a/src/map.c +++ b/src/map.c @@ -396,7 +396,7 @@ _db_tmx_map_el_start(void *pv, const char *name, const char **attr) db_xml_get_string_attr(p, attr, "source", &source, 1); db_dbg(" Tileset: <%s>", source); map->tileset_tail = db_tileset_new(map->game_id, source, - firstgid, map->tileset_tail); + firstgid, map->tw, map->th, map->tileset_tail); if (map->tileset_head == NULL) { map->tileset_head = map->tileset_tail; } @@ -516,8 +516,6 @@ _db_map_render_layer(struct db_map *map, struct db_map_layer *layer, int firstgid; int lastgid; int columns; - int tilewidth; - int tileheight; SDL_Rect tile_rect; SDL_Rect layer_rect; @@ -532,20 +530,18 @@ _db_map_render_layer(struct db_map *map, struct db_map_layer *layer, firstgid = db_tileset_firstgid(tileset); lastgid = firstgid + db_tileset_tilecount(tileset); if (gid >= firstgid && gid < lastgid) { - columns = db_tileset_columns (tileset); - tilewidth = db_tileset_tilewidth (tileset); - tileheight = db_tileset_tileheight(tileset); + columns = db_tileset_columns(tileset); gid -= firstgid; tile_rect.x = gid % columns; tile_rect.y = gid / columns; - tile_rect.w = tilewidth; - tile_rect.h = tileheight; + tile_rect.w = map->tw; + tile_rect.h = map->th; tile_rect.x *= tile_rect.w; tile_rect.y *= tile_rect.h; layer_rect.x = i % map->w; layer_rect.y = i / map->w; - layer_rect.w = tilewidth; - layer_rect.h = tileheight; + layer_rect.w = map->tw; + layer_rect.h = map->th; layer_rect.x *= layer_rect.w; layer_rect.y *= layer_rect.h; db_dbg("Blitting %dx%d tile at (%d,%d) " diff --git a/src/tileset.c b/src/tileset.c index 366c925..f63fa0a 100644 --- a/src/tileset.c +++ b/src/tileset.c @@ -293,6 +293,8 @@ _db_tsx_tileset_start(void *pv, const char *name, const char **attr) { XML_Parser p; struct db_tileset *tileset; + int tw; + int th; db_dbg(" <%s> (tileset)", name); @@ -300,8 +302,14 @@ _db_tsx_tileset_start(void *pv, const char *name, const char **attr) tileset = db_xml_node_peek(p); if (db_xml_check_tag(name, "tileset")) { - db_xml_get_int_attr(p, attr, "tilewidth", &tileset->tw, 1); - db_xml_get_int_attr(p, attr, "tileheight", &tileset->th, 1); + db_xml_get_int_attr(p, attr, "tilewidth", &tw, 1); + db_xml_get_int_attr(p, attr, "tileheight", &th, 1); + if (tw != tileset->tw || th != tileset->th) { + db_err("Tileset has %dx%d tiles, not %dx%d like map", + tw, th, tileset->tw, tileset->th); + XML_StopParser(p, XML_FALSE); + return; + } db_xml_get_int_attr(p, attr, "tilecount", &tileset->tc, 1); db_xml_get_int_attr(p, attr, "columns", &tileset->cols, 1); db_dbg(" Tile size: %dx%d px", @@ -315,7 +323,7 @@ _db_tsx_tileset_start(void *pv, const char *name, const char **attr) struct db_tileset * db_tileset_new(const char *game_id, const char *file, int firstgid, - struct db_tileset *prev) + int tilewidth, int tileheight, struct db_tileset *prev) { struct db_tileset *tileset; XML_Parser p; @@ -331,6 +339,13 @@ db_tileset_new(const char *game_id, const char *file, int firstgid, return NULL; } + tileset->firstgid = firstgid; + tileset->tw = tilewidth; + tileset->th = tileheight; + if (prev != NULL) { + prev->next = tileset; + } + tileset->game_id = strdup(game_id); if (tileset->game_id == NULL) { db_err("Failed to allocate memory"); @@ -404,27 +419,10 @@ db_tileset_new(const char *game_id, const char *file, int firstgid, XML_ParserFree(p); fclose(fp); - tileset->firstgid = firstgid; - if (prev != NULL) { - prev->next = tileset; - } - return tileset; } int -db_tileset_tilewidth(struct db_tileset *tileset) -{ - return tileset->tw; -} - -int -db_tileset_tileheight(struct db_tileset *tileset) -{ - return tileset->th; -} - -int db_tileset_tilecount(struct db_tileset *tileset) { return tileset->tc; diff --git a/src/tileset.h b/src/tileset.h index d350765..79b8bc7 100644 --- a/src/tileset.h +++ b/src/tileset.h @@ -25,9 +25,8 @@ struct db_tileset; struct db_tileset *db_tileset_new(const char *game_id, const char *file, - int firstgid, struct db_tileset *prev); -int db_tileset_tilewidth (struct db_tileset *tileset) __attribute__((__pure__)); -int db_tileset_tileheight(struct db_tileset *tileset) __attribute__((__pure__)); + int firstgid, int tilewidth, int tileheight, + struct db_tileset *prev); int db_tileset_tilecount (struct db_tileset *tileset) __attribute__((__pure__)); int db_tileset_columns (struct db_tileset *tileset) __attribute__((__pure__)); int db_tileset_firstgid (struct db_tileset *tileset) __attribute__((__pure__)); -- cgit v0.9.1