#include #include #include "tgafiles.h" FILE * newTGA (const char *fileName, short width, short height, origin_t origin) { int i; FILE *filePtr; if ((filePtr = fopen (fileName, "wb")) == NULL) return NULL; fputc(0, filePtr); fputc(0, filePtr); fputc(2, filePtr); /* image type; 2=RGB, 9=RLE compressed RGB */ for (i = 9; i; --i) fputc (0, filePtr); fputc (width & 0xFF, filePtr); fputc (width >> 8, filePtr); fputc (height & 0xFF, filePtr); fputc (height >> 8, filePtr); fputc (24, filePtr); /* pixel size - 24 bit */ /* descriptor byte * bits description * 3-0 0 * 4 must be 0 * 5 screen origin (0=bottom left, 1=top left) * 7-6 00=non-interleaved, 01=two-way interleaved, * 10=four-way interleaved, 11=reserved */ fputc (origin == TGA_ORIGIN_TOP?1<<5:0, filePtr); /* descriptor */ return filePtr; } FILE * openTGA (const char *fileName, short *widthPtr, short *heightPtr) { char compressionFlag; char junk; int i; FILE *filePtr; if ((filePtr = fopen (fileName, "rb")) == NULL) return NULL; fscanf (filePtr, "%c%c%c", &junk, &junk, &compressionFlag); if (compressionFlag != 2) { fclose (filePtr); return NULL; } for (i = 9; i; --i) fgetc (filePtr); fread (widthPtr, 2, 1, filePtr); fread (heightPtr, 2, 1, filePtr); fread (&junk, 2, 1, filePtr); return filePtr; } int writeTGA (FILE *filePtr, BYTE red, BYTE green, BYTE blue) { return fprintf (filePtr, "%c%c%c", blue, green, red); } int readTGA (FILE *filePtr, BYTE *redPtr, BYTE *greenPtr, BYTE *bluePtr) { *bluePtr = fgetc (filePtr); if (feof (filePtr)) return -1; *greenPtr = fgetc (filePtr); if (feof (filePtr)) return -1; *redPtr = fgetc (filePtr); if (feof (filePtr)) return -1; return 1; } int closeTGA (FILE *filePtr) { return fclose (filePtr); }