diff options
author | davidovski <david@davidovski.xyz> | 2023-07-10 00:29:01 +0100 |
---|---|---|
committer | davidovski <david@davidovski.xyz> | 2023-07-10 00:29:57 +0100 |
commit | b87245927e08887af7746ce0f7a91d3f73af0572 (patch) | |
tree | 0c05b62e5de041e62f5373b747f292b348ce9491 /src/tiledfile.c | |
parent | ab6501461a12894795661914096704451c343344 (diff) |
cleanup project
Diffstat (limited to 'src/tiledfile.c')
-rw-r--r-- | src/tiledfile.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/tiledfile.c b/src/tiledfile.c new file mode 100644 index 0000000..c1ba42e --- /dev/null +++ b/src/tiledfile.c @@ -0,0 +1,80 @@ +#include <raylib.h> +#include <stdlib.h> +#include <stdio.h> + +const int i = 1; +#define is_bigendian() ( (*(char*)&i) == 0 ) + +Texture2D processTilemapTexture(int * tilelayout, int width, int height) { + Color *pixels = (Color*) malloc(width * height * sizeof(Color)); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int tile = tilelayout[y*width + x]; + pixels[y*width + x] = (Color){ + (int) tile, 0, 0, 0 + }; + } + } + + Image checkedIm = { + .data = pixels, + .width = width, + .height = height, + .format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, + .mipmaps = 1 + }; + + Texture2D checked = LoadTextureFromImage(checkedIm); + UnloadImage(checkedIm); + + return checked; +} + +//! read a big endian bytes from file +int readb(char *out, size_t noBytes, FILE *file) { + if (!fread(out, (size_t)1, (size_t) noBytes, file)) + return 1; + + if (is_bigendian()) + return 0; + + int tmp; + // reverse byte order + for(int i = 0; i < noBytes/2; i++) { + tmp = out[i]; + out[i] = out[noBytes-i-1]; + out[noBytes-i-1] = tmp; + } + + return 0; +} + + +Texture2D loadTileMap(char *filename) { + int width, height, tilebytes; + int *tilelayout; + + FILE *file; + + file = fopen(filename, "rb"); + // skip header + fseek(file, 10, SEEK_CUR); + // 4 bytes for int width + readb((char *)&width, 4, file); + // 4 bytes for int height + readb((char *)&height, 4, file); + // 1 byte saying how big each tile is + readb((char *)&tilebytes, 4, file); + printf("tilebytes: %d\n", tilebytes); + + tilelayout = malloc(width*height*tilebytes); + int tile; + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + readb((char *)&tile, tilebytes, file); + tilelayout[y*width + x] = tile; + } + } + return processTilemapTexture(tilelayout, width, height); +} |