summaryrefslogtreecommitdiffstats
path: root/src/tileset.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tileset.c')
-rw-r--r--src/tileset.c69
1 files changed, 43 insertions, 26 deletions
diff --git a/src/tileset.c b/src/tileset.c
index f63fa0a..afe0bde 100644
--- a/src/tileset.c
+++ b/src/tileset.c
@@ -422,32 +422,8 @@ db_tileset_new(const char *game_id, const char *file, int firstgid,
return tileset;
}
-int
-db_tileset_tilecount(struct db_tileset *tileset)
-{
- return tileset->tc;
-}
-
-int
-db_tileset_columns(struct db_tileset *tileset)
-{
- return tileset->cols;
-}
-
-int
-db_tileset_firstgid(struct db_tileset *tileset)
-{
- return tileset->firstgid;
-}
-
-struct db_tileset *
-db_tileset_next(struct db_tileset *tileset)
-{
- return tileset->next;
-}
-
-SDL_Texture *
-db_tileset_texture(struct db_tileset *tileset, SDL_Renderer *renderer)
+static SDL_Texture *
+_db_tileset_texture(struct db_tileset *tileset, SDL_Renderer *renderer)
{
if (tileset->texture == NULL) {
tileset->texture = SDL_CreateTextureFromSurface(renderer,
@@ -455,3 +431,44 @@ db_tileset_texture(struct db_tileset *tileset, SDL_Renderer *renderer)
}
return tileset->texture;
}
+
+int
+db_tile_render(struct db_tileset *tileset, SDL_Renderer *renderer, int gid,
+ SDL_Rect *dstrect)
+{
+ SDL_bool tile_found;
+ SDL_Rect srcrect;
+
+ tile_found = SDL_FALSE;
+ for (; tileset != NULL; tileset = tileset->next) {
+ if (gid >= tileset->firstgid &&
+ gid < tileset->firstgid + tileset->tc) {
+ gid -= tileset->firstgid;
+ srcrect.x = tileset->tw * (gid % tileset->cols);
+ srcrect.y = tileset->th * (gid / tileset->cols);
+ srcrect.w = tileset->tw;
+ srcrect.h = tileset->th;
+ db_dbg("Blitting %dx%d tile at (%d,%d) onto %dx%d area "
+ "at (%d,%d)...",
+ srcrect.w, srcrect.h,
+ srcrect.x, srcrect.y,
+ dstrect->w, dstrect->h,
+ dstrect->x, dstrect->y);
+ if (SDL_RenderCopy(renderer, _db_tileset_texture(
+ tileset, renderer),
+ &srcrect, dstrect)
+ != 0) {
+ db_err("Failed to copy texture (%s)",
+ SDL_GetError());
+ return -1;
+ }
+ tile_found = SDL_TRUE;
+ break;
+ }
+ }
+ if (!tile_found) {
+ db_warn("Tile with gid 0x%8.8x not found", gid);
+ return 0;
+ }
+ return 1;
+}