From a6eedf71b5d37cb5d9baa25f75df9e315760cf8b Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: May 02 2022 07:54:36 +0000 Subject: fix endianess --- diff --git a/img.ldr.tga.inc.c b/img.ldr.tga.inc.c index 0cd26b4..cab8a00 100644 --- a/img.ldr.tga.inc.c +++ b/img.ldr.tga.inc.c @@ -5,54 +5,60 @@ typedef struct { unsigned char idLength; unsigned char colormapType; unsigned char imageType; - unsigned short colormapIndex; - unsigned short colormapLength; + unsigned char colormapIndex[2]; + unsigned char colormapLength[2]; unsigned char colormapSize; - unsigned short xOrigin; - unsigned short yOrigin; - unsigned short width; - unsigned short height; + unsigned char xOrigin[2]; + unsigned char yOrigin[2]; + unsigned char width[2]; + unsigned char height[2]; unsigned char pixelSize; unsigned char attributes; } TgaHeader; #pragma pack(pop) +unsigned short getLEU16(unsigned char *c) + { return c[0] | ((unsigned short)c[1] << 8); } +void setLEU16(unsigned char *c, unsigned short i) + { c[0] = i; c[1] = i >> 8; } + + int imageLoadTga(const char *path, int *outWidth, int *outHeight, unsigned char **pixels) { *outWidth = *outHeight = 0; *pixels = NULL; - FILE *f = fopen(path, "rb"); - if (!f) { + FILE *f = fopen(path, "rb"); + if (!f) { fprintf(stderr, "Cannot open for read: %s\n", path); fflush(stderr); return FALSE; } - TgaHeader header = {}; - fread(&header, sizeof(header), 1, f); // todo: endianess + TgaHeader header = {}; + fread(&header, sizeof(header), 1, f); // todo: endianess - //printf("%d %d %d %d %d\n", header.imageType, header.width, header.height, header.colormapType, header.pixelSize); + //printf("%d %d %d %d %d\n", header.imageType, header.width, header.height, header.colormapType, header.pixelSize); - if ( header.imageType != 2 - || !header.width - || !header.height - || header.colormapType - || (header.pixelSize != 24 && header.pixelSize != 32) + if ( header.imageType != 2 + || !header.width + || !header.height + || header.colormapType + || (header.pixelSize != 24 && header.pixelSize != 32) ) { fprintf(stderr, "Unsupported format. Only uncompressed 24 or 32 bits TGA are supported: %s\n", path); fflush(stderr); return FALSE; - } + } fseek(f, header.idLength, SEEK_CUR); - *outWidth = header.width; - *outHeight = header.height; - int rowSize = *outWidth*4; - int size = *outHeight*rowSize; + int w = *outWidth = getLEU16(header.width); + int h = *outHeight = getLEU16(header.height); + int rowSize = w*4; + int size = h*rowSize; *pixels = (unsigned char*)calloc(1, size); unsigned char *row = *pixels + size; - for(unsigned short r = header.height; r; --r, row -= rowSize) { + for(unsigned short r = h; r; --r, row -= rowSize) { for(unsigned char *c = row - rowSize; c < row; c += 4) { c[2] = fgetc(f); c[1] = fgetc(f); @@ -60,33 +66,33 @@ int imageLoadTga(const char *path, int *outWidth, int *outHeight, unsigned char c[3] = header.pixelSize == 32 ? fgetc(f) : 255; } } - fclose(f); + fclose(f); - return TRUE; + return TRUE; } int imageSaveTga(const char *path, int width, int height, const unsigned char *pixels) { - if (width <= 0 || height <= 0 || !pixels) return FALSE; + if (width <= 0 || height <= 0 || width > 0xffff || height > 0xffff || !pixels) return FALSE; - FILE *f = fopen(path, "wb"); - if (!f) { + FILE *f = fopen(path, "wb"); + if (!f) { fprintf(stderr, "Cannot open file for write: %s\n", path); fflush(stderr); return FALSE; } - TgaHeader header = {}; - header.imageType = 2; - header.width = width; - header.height = height; - header.pixelSize = 32; - fwrite(&header, sizeof(header), 1, f); // todo: endianess + TgaHeader header = {}; + header.imageType = 2; + setLEU16(header.width, width); + setLEU16(header.height, height); + header.pixelSize = 32; + fwrite(&header, sizeof(header), 1, f); // todo: endianess int rowSize = width*4; int size = height*rowSize; const unsigned char *row = pixels + size; - for(unsigned short r = header.height; r; --r, row -= rowSize) { + for(unsigned short r = height; r; --r, row -= rowSize) { for(const unsigned char *c = row - rowSize; c < row; c += 4) { fputc(c[2], f); fputc(c[1], f); @@ -94,8 +100,8 @@ int imageSaveTga(const char *path, int width, int height, const unsigned char *p fputc(c[3], f); } } - fclose(f); + fclose(f); - return TRUE; + return TRUE; }