From bd2905ffa2690f8da4ff2eee14b914b3c9ec66a9 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Wed, 12 May 2021 19:59:44 +0200 Subject: [PATCH] fixed errors in gif loading --- config.ini | 12 ++++++------ gif.c | 2 ++ main.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- map.map | Bin 57122 -> 20002 bytes test.gif | Bin 0 -> 5435 bytes 5 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 test.gif diff --git a/config.ini b/config.ini index 0a20dcf..dd4cc56 100644 --- a/config.ini +++ b/config.ini @@ -1,9 +1,9 @@ -tile_width = 16 -tile_height = 16 -map_width = 240 -map_height = 238 +tile_width = 8 +tile_height = 8 +map_width = 100 +map_height = 100 screen_width = 320 -screen_height = 224 +screen_height = 240 zoom = 3 -tiles = tiles.png +tiles = test.gif map = map.map \ No newline at end of file diff --git a/gif.c b/gif.c index 042456e..578fd1a 100644 --- a/gif.c +++ b/gif.c @@ -381,6 +381,8 @@ static int process_extension( unsigned char* buffer ) */ unsigned char* LoadPalette(unsigned char *buffer) { + bbb = buffer; + unsigned char header[7]; screen_descriptor_t screen_descriptor; int color_resolution_bits; diff --git a/main.cpp b/main.cpp index e0d5413..09c23ed 100644 --- a/main.cpp +++ b/main.cpp @@ -165,6 +165,13 @@ void UpdateMiniMap() { free(pixels); } +const bool IsGIF(const char* filename) { + const int filename_size = strlen(filename); + if ((filename[filename_size-3]=='g') && (filename[filename_size-2]=='i') && (filename[filename_size-1]=='f') || + (filename[filename_size-3]=='G') && (filename[filename_size-2]=='I') && (filename[filename_size-1]=='F')) return true; + return false; +} + void Init() { LoadConfig(); @@ -188,10 +195,40 @@ void Init() { int c; FILE* f = fopen(GetPath(tiles_filename), "rb"); if (!f) { error = 2; return; } - buffer = stbi_load_from_file(f, &tilemap_width, &tilemap_height, &c, 4); - sdlTilesTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, tilemap_width, tilemap_height); - SDL_UpdateTexture(sdlTilesTexture, NULL, buffer, tilemap_width * sizeof(Uint32)); - SDL_SetTextureBlendMode(sdlTilesTexture, SDL_BLENDMODE_BLEND); + + if (IsGIF(tiles_filename)) { + fseek(f, 0, SEEK_END); + const long fsize = ftell(f); + fseek(f, 0, SEEK_SET); /* same as rewind(f); */ + char *string = (char*)malloc(fsize + 1); + fread(string, 1, fsize, f); + string[fsize] = 0; + unsigned short w, h; + buffer = LoadGif((unsigned char*)string, &w, &h); + tilemap_width = w; tilemap_height = h; + Uint8* palette = LoadPalette((unsigned char*)string); + Uint32 pal[256]; + for (int i=0;i<256;++i) { + pal[i] = 0xFF000000 + (palette[(i*3)]) + (palette[(i*3)+1] << 8) + (palette[(i*3)+2] << 16); + } + free(palette); + free(string); + if (buffer == NULL) { error = 2; return; } + sdlTilesTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, tilemap_width, tilemap_height); + Uint32* pixels = (Uint32*)malloc(w*h*sizeof(Uint32)); + for (int i = 0; i < w*h; i++) { pixels[i] = pal[buffer[i]]; } + SDL_UpdateTexture(sdlTilesTexture, NULL, pixels, w * sizeof(Uint32)); + SDL_SetTextureBlendMode(sdlTilesTexture, SDL_BLENDMODE_BLEND); + free(buffer); + buffer = (Uint8*)malloc(w*h*sizeof(Uint32)); + memcpy(buffer, pixels, w*h*sizeof(Uint32)); + free(pixels); + } else { + buffer = stbi_load_from_file(f, &tilemap_width, &tilemap_height, &c, 4); + sdlTilesTexture = SDL_CreateTexture(sdlRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, tilemap_width, tilemap_height); + SDL_UpdateTexture(sdlTilesTexture, NULL, buffer, tilemap_width * sizeof(Uint32)); + SDL_SetTextureBlendMode(sdlTilesTexture, SDL_BLENDMODE_BLEND); + } fclose(f); const int tmtw = (tilemap_width / tile_width); @@ -216,7 +253,11 @@ void Init() { minitiles[tmx + tmy*tmtw] = 0xFF000000 + b + (g << 8) + (r << 16); } } - stbi_image_free(buffer); + if (IsGIF(tiles_filename)) { + free(buffer); + } else { + stbi_image_free(buffer); + } f = fopen(GetPath(map_filename), "rb"); map = (unsigned char*)calloc(map_width*map_height*2, 1); diff --git a/map.map b/map.map index 00d6b6be5726930ffd07fbc98f767a3b61272be7..5b5dbe4d78895034984015cd980a5f6b113bfa3a 100644 GIT binary patch delta 14 VcmZ3qk9pA?My8aM&4CsQegG=y1s4DS literal 57122 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 literal 0 HcmV?d00001