diff options
| -rw-r--r-- | zetsubou/main.c | 86 | ||||
| -rw-r--r-- | zetsubou/tpl.c | 531 | ||||
| -rw-r--r-- | zetsubou/tpl.h | 19 |
3 files changed, 582 insertions, 54 deletions
diff --git a/zetsubou/main.c b/zetsubou/main.c index e05dd3a..87b5dad 100644 --- a/zetsubou/main.c +++ b/zetsubou/main.c @@ -10,36 +10,74 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <ctype.h> #include "types.h" #include "tpl.h" +void bad_args(char progname[]) +{ + printf("Invalid usage. Usage:\n\t%s r <file.tpl>\nOr:\n\t%s w <type> <file1.bmp> [file2.bmp...] <out.tpl>\n", progname, progname); + exit(1); +} + int main(int argc, char *argv[]) { - printf("Zetsubou v0.1. Written by SquidMan (Alex Marshall)\nRGB5A3 code was contributed by booto.\n\n"); - if(argc != 2) { - printf("Invalid usage. Usage:\n\t%s <file.tpl>\n", argv[0]); - exit(1); - } - FILE* fp = fopen(argv[1], "rb"); - if(fp == NULL) { - printf("Error opening %s.\n", argv[1]); - exit(1); - } - char *basename = (char*)calloc(strlen(argv[1]) + 1, 1); - int arg1strlen = strlen(argv[1]); - int i; - for(i = 0; (i < arg1strlen) && (argv[1][i] != '.'); i++) basename[i] = argv[1][i]; - fseek(fp, 0, SEEK_END); - u32 tplsize = ftell(fp); - u8* tplbuf = (u8*)malloc(tplsize); - fseek(fp, 0, SEEK_SET); - fread(tplbuf, tplsize, 1, fp); - fclose(fp); - int ret = TPL_ConvertToBMP(tplbuf, tplsize, basename); - if(ret < 0) { - printf("Error converting to BMP.\n"); - exit(1); + printf("Zetsubou v0.1. Written by SquidMan (Alex Marshall)\nRGB5A3 code was contributed by booto.\nBased off of gentpl.\n\n"); + if(argc < 3) + bad_args(argv[0]); + char type = toupper(argv[1][0]); + if(type == 'R') { // Read TPL. + if(argc != 3) + bad_args(argv[0]); + FILE* fp = fopen(argv[2], "rb"); + if(fp == NULL) { + printf("Error opening %s.\n", argv[2]); + exit(1); + } + char *basename = (char*)calloc(strlen(argv[2]) + 1, 1); + int arg1strlen = strlen(argv[2]); + int i; + for(i = 0; (i < arg1strlen) && (argv[2][i] != '.'); i++) basename[i] = argv[2][i]; + fseek(fp, 0, SEEK_END); + u32 tplsize = ftell(fp); + u8* tplbuf = (u8*)malloc(tplsize); + fseek(fp, 0, SEEK_SET); + fread(tplbuf, tplsize, 1, fp); + fclose(fp); + int ret = TPL_ConvertToBMP(tplbuf, tplsize, basename); + if(ret < 0) { + printf("Error converting to BMP.\n"); + exit(1); + } + }else if(type == 'W') { // Write TPL. + if(argc < 5) + bad_args(argv[0]); + char** names = (char**)calloc(sizeof(char*), argc - 4); + int i; + for(i = 0; i < argc - 4; i++) + names[i] = argv[i + 3]; + printf("%d\n", argc); + int format; + char formatstr[256]; + memset(formatstr, 0, 256); + for(i = 0; i < strlen(argv[2]); i++) formatstr[i] = toupper(argv[2][i]); + if(strcmp(formatstr, "I4") == 0) format = TPL_FORMAT_I4; + else if(strcmp(formatstr, "I8") == 0) format = TPL_FORMAT_I8; + else if(strcmp(formatstr, "IA4") == 0) format = TPL_FORMAT_IA4; + else if(strcmp(formatstr, "IA8") == 0) format = TPL_FORMAT_IA8; + else if(strcmp(formatstr, "RGB565") == 0) format = TPL_FORMAT_RGB565; + else if(strcmp(formatstr, "RGB5A3") == 0) format = TPL_FORMAT_RGB5A3; + else if(strcmp(formatstr, "RGBA8") == 0) format = TPL_FORMAT_RGBA8; + else if(strcmp(formatstr, "CI4") == 0) format = TPL_FORMAT_CI4; + else if(strcmp(formatstr, "CI8") == 0) format = TPL_FORMAT_CI8; + else if(strcmp(formatstr, "CI14X2") == 0) format = TPL_FORMAT_CI14X2; + else if(strcmp(formatstr, "CMP") == 0) format = TPL_FORMAT_CMP; + int ret = TPL_ConvertFromBMPs(argc - 4, names, argv[argc - 1], format); + if(ret < 0) { + printf("Error converting BMPs.\n"); + exit(1); + } } return 0; } diff --git a/zetsubou/tpl.c b/zetsubou/tpl.c index cd3c512..af2ef32 100644 --- a/zetsubou/tpl.c +++ b/zetsubou/tpl.c @@ -50,6 +50,46 @@ int TPL_ConvertRGB565ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmap return outsz; } +int TPL_ConvertBitMapToRGB565(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 width, u32 height) +{ + s32 x, y; + s32 x1, y1; + u32 iv; + u8* subbitmapdata = (u8*)calloc(width * height, 4); +// u8* subbitmapdata = bitmapdata; + if(subbitmapdata == NULL) + return -1; + *tplbuf = (u8*)calloc(width * height, 2); + if(*tplbuf == NULL) + return -1; + int i; + u8* writebuf = *tplbuf; + for(iv = height - 1, y = 0; y < height; y++, iv--) + for(x = 0; x < width; x++) + for(i = 0; i < 4; i++) + subbitmapdata[((x + (y * width)) * 4) + i] = bitmapdata[((x + (iv * width)) * 4) + i]; + u32 outsz = width * height * 2; + for(iv = 0, y1 = 0; y1 < height; y1 += 4) { + for(x1 = 0; x1 < width; x1 += 4) { + for(y = y1; y < (y1 + 4); y++) { + for(x = x1; x < (x1 + 4); x++) { + u32 rgba = ((u32*)subbitmapdata)[x + (y * width)]; + u8 r = (rgba >> 0) & 0xFF; + u8 g = (rgba >> 8) & 0xFF; + u8 b = (rgba >> 16) & 0xFF; +// u8 a = (rgba >> 24) & 0xFF; + + u16 newpixel = ((b >> 3) << 11) | ((g >> 2) << 5) | ((r >> 3) << 0); + ((u16*)writebuf)[iv++] = be16(newpixel); + } + } + } + } + printf("Converted to 0x%08x bytes of 0x%08x bytes.\n", iv * 2, outsz); + fflush(stdout); + return outsz; +} + int TPL_ConvertRGBA8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata, u32 width, u32 height) { u32 goodwidth = width; @@ -64,19 +104,6 @@ int TPL_ConvertRGBA8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapd u8 rb[32]; int i = 0; int z = 0; -/* for(y1 = 0; y1 < height; y1 += 4) { - for(x1 = 0; x1 < width; x1 += 4) { - for(y = y1; y < (y1 + 4); y++) { - for(x = x1; x < (x1 + 4); x++) { - u32 oldpixel = *(u32*)(tplbuf + (tplpoint + ((x + (y * width)) * 4))); - oldpixel = be32(oldpixel); - ag[i] = (oldpixel >> 16); - rb[i++] = (oldpixel >> 0); - } - } - } - } -*/ int bmpslot = 0; for(y1 = 0; y1 < height; y1 += 4) { for(x1 = 0; x1 < width; x1 += 4) { @@ -96,17 +123,12 @@ int TPL_ConvertRGBA8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapd height = goodheight; for(i = 0; i < 8; i++) { u32 rgba = (rb[i] << 0) | (ag[8 + i] << 8) | (rb[8 + i] << 16) | (ag[i] << 24); -// u32 rgba = (rb[i] << 24) | (ag[8 + i] << 16) | (rb[8 + i] << 8) | (ag[i] << 0); (*(u32**)bitmapdata)[bmpslot++] = rgba; - printf("%08X\n", rgba); } for(i = 16; i < 24; i++) { u32 rgba = (rb[i] << 0) | (ag[8 + i] << 8) | (rb[8 + i] << 16) | (ag[i] << 24); -// u32 rgba = (rb[i] << 24) | (ag[8 + i] << 16) | (rb[8 + i] << 8) | (ag[i] << 0); (*(u32**)bitmapdata)[bmpslot++] = rgba; - printf("%08X\n", rgba); } - printf("\n"); z = 0; i = 0; } @@ -115,6 +137,56 @@ int TPL_ConvertRGBA8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapd return outsz; } +int TPL_ConvertBitMapToRGBA8(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 width, u32 height) +{ + s32 x, y; + s32 x1, y1; + u32 iv; + u8* subbitmapdata = bitmapdata; + *tplbuf = (u8*)calloc(width * height, 4); + if(*tplbuf == NULL) + return -1; + u32 i; + u8* writebuf = *tplbuf; + u32 outsz = width * height * 4; + i = 0; + int z = 0; + u32 rgba[32]; + u32 la[32]; + u32 lr[32]; + u32 lg[32]; + u32 lb[32]; + for(iv = 0, y1 = 0; y1 < height; y1 += 4) { + for(x1 = 0; x1 < width; x1 += 4) { + for(y = y1; y < (y1 + 4); y++) { + for(x = x1; x < (x1 + 4); x++) { + rgba[z] = ((u32*)subbitmapdata)[x + (y * width)]; + lr[z] = (rgba[z] >> 0) & 0xFF; + lg[z] = (rgba[z] >> 8) & 0xFF; + lb[z] = (rgba[z] >> 16) & 0xFF; + la[z] = (rgba[z] >> 24) & 0xFF; + z++; + } + } + if(z == 16) { // Dump time! + for(i = 0; i < 16; i++) { + writebuf[iv++] = lr[i]; + writebuf[iv++] = la[i]; + } + for(i = 0; i < 16; i++) { + writebuf[iv++] = lb[i]; + writebuf[iv++] = lg[i]; + } + z = 0; + } + } + } + printf("Converted to 0x%08x bytes of 0x%08x bytes.\n", iv, outsz); + fflush(stdout); + return outsz; +} + + int TPL_ConvertRGB5A3ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata, u32 width, u32 height) { s32 x, y; @@ -162,6 +234,67 @@ int TPL_ConvertRGB5A3ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmap return outsz; } +int TPL_ConvertBitMapToRGB5A3(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 width, u32 height) +{ + s32 x, y; + s32 x1, y1; + u32 iv; + u8* subbitmapdata = (u8*)calloc(width * height, 4); + // u8* subbitmapdata = bitmapdata; + if(subbitmapdata == NULL) + return -1; + *tplbuf = (u8*)calloc(width * height, 2); + if(*tplbuf == NULL) + return -1; + int i; + u8* writebuf = *tplbuf; + for(iv = height - 1, y = 0; y < height; y++, iv--) + for(x = 0; x < width; x++) + for(i = 0; i < 4; i++) + subbitmapdata[((x + (y * width)) * 4) + i] = bitmapdata[((x + (iv * width)) * 4) + i]; + u32 outsz = width * height * 2; + for(iv = 0, y1 = 0; y1 < height; y1 += 4) { + for(x1 = 0; x1 < width; x1 += 4) { + for(y = y1; y < (y1 + 4); y++) { + for(x = x1; x < (x1 + 4); x++) { + u32 rgba = ((u32*)subbitmapdata)[x + (y * width)]; + u8 r = (rgba >> 0) & 0xFF; + u8 g = (rgba >> 8) & 0xFF; + u8 b = (rgba >> 16) & 0xFF; + u8 a = (rgba >> 24) & 0xFF; + u16 newpixel = 0; + if(a <= 0xDA) { + // We have enough Alpha to matter. Lets use RGB4A3! + newpixel |= (1 << 15); + r = ((r * 15) / 255) & 0xF; + g = ((g * 15) / 255) & 0xF; + b = ((b * 15) / 255) & 0xF; + a = ((a * 7) / 255) & 0x7; + newpixel |= r << 11; + newpixel |= g << 7; + newpixel |= b << 3; + newpixel |= a << 0; + ((u16*)writebuf)[iv++] = be16(newpixel); + }else{ + // We don't have enough Alpha to matter. Use RGB5. + newpixel &= ~(1 << 15); + r = ((r * 31) / 255) & 0x1F; + g = ((g * 31) / 255) & 0x1F; + b = ((b * 31) / 255) & 0x1F; + newpixel |= r << 10; + newpixel |= g << 5; + newpixel |= b << 0; + ((u16*)writebuf)[iv++] = be16(newpixel); + } + } + } + } + } + printf("Converted to 0x%08x bytes of 0x%08x bytes.\n", iv * 2, outsz); + fflush(stdout); + return outsz; +} + int TPL_ConvertI4ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata, u32 width, u32 height) { s32 x, y; @@ -204,6 +337,46 @@ int TPL_ConvertI4ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata return outsz; } +int TPL_ConvertBitMapToI4(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 width, u32 height) +{ + s32 x, y; + s32 x1, y1; + u32 iv; + u8* subbitmapdata = (u8*)calloc(width * height, 4); + // u8* subbitmapdata = bitmapdata; + if(subbitmapdata == NULL) + return -1; + *tplbuf = (u8*)calloc(width * height / 2, 1); + if(*tplbuf == NULL) + return -1; + int i; + u8* writebuf = *tplbuf; + for(iv = height - 1, y = 0; y < height; y++, iv--) + for(x = 0; x < width; x++) + for(i = 0; i < 4; i++) + subbitmapdata[((x + (y * width)) * 4) + i] = bitmapdata[((x + (iv * width)) * 4) + i]; + u32 outsz = width * height / 2; + for(iv = 0, y1 = 0; y1 < height; y1 += 8) { + for(x1 = 0; x1 < width; x1 += 8) { + for(y = y1; y < (y1 + 8); y++) { + for(x = x1; x < (x1 + 8); x += 2) { + u32 rgba = ((u32*)subbitmapdata)[x + (y * width)]; + u8 i1 = (rgba >> 0) & 0xFF; + rgba = ((u32*)subbitmapdata)[x + 1 + (y * width)]; + u8 i2 = (rgba >> 0) & 0xFF; + + u8 newpixel = (((i1 * 15) / 255) << 4); + newpixel |= (((i2 * 15) / 255) & 0xF); + ((u8*)writebuf)[iv++] = newpixel; + } + } + } + } + printf("Converted to 0x%08x bytes of 0x%08x bytes.\n", iv, outsz); + fflush(stdout); + return outsz; +} + int TPL_ConvertIA4ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata, u32 width, u32 height) { s32 x, y; @@ -221,11 +394,11 @@ int TPL_ConvertIA4ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdat for(x1 = 0; x1 < width; x1 += 8) { for(y = y1; y < (y1 + 4); y++) { for(x = x1; x < (x1 + 8); x++) { - u8 oldpixel = *(u8*)(tplbuf + (tplpoint + ((iv++) * 1))); - u8 b = oldpixel >> 4; - u8 g = oldpixel >> 4; - u8 r = oldpixel >> 4; - u8 a = oldpixel & 0xF; + u8 oldpixel = *(u8*)(tplbuf + (tplpoint + ((iv++)))); + u8 b = ((oldpixel >> 4) * 255) / 15; + u8 g = ((oldpixel >> 4) * 255) / 15; + u8 r = ((oldpixel >> 4) * 255) / 15; + u8 a = ((oldpixel & 0xF) * 255) / 15; u32 rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24); ((u32*)subbitmapdata)[x + (y * width)] = rgba; } @@ -239,6 +412,45 @@ int TPL_ConvertIA4ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdat return outsz; } +int TPL_ConvertBitMapToIA4(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 width, u32 height) +{ + s32 x, y; + s32 x1, y1; + u32 iv; + u8* subbitmapdata = (u8*)calloc(width * height, 4); + // u8* subbitmapdata = bitmapdata; + if(subbitmapdata == NULL) + return -1; + *tplbuf = (u8*)calloc(width * height, 1); + if(*tplbuf == NULL) + return -1; + int i; + u8* writebuf = *tplbuf; + for(iv = height - 1, y = 0; y < height; y++, iv--) + for(x = 0; x < width; x++) + for(i = 0; i < 4; i++) + subbitmapdata[((x + (y * width)) * 4) + i] = bitmapdata[((x + (iv * width)) * 4) + i]; + u32 outsz = width * height; + for(iv = 0, y1 = 0; y1 < height; y1 += 4) { + for(x1 = 0; x1 < width; x1 += 8) { + for(y = y1; y < (y1 + 4); y++) { + for(x = x1; x < (x1 + 8); x++) { + u32 rgba = ((u32*)subbitmapdata)[x + (y * width)]; + u8 i1 = (rgba >> 0) & 0xFF; + u8 a1 = (rgba >> 24) & 0xFF; + + u8 newpixel = (((i1 * 15) / 255) << 4); + newpixel |= (((a1 * 15) / 255) & 0xF); + ((u8*)writebuf)[iv++] = newpixel; + } + } + } + } + printf("Converted to 0x%08x bytes of 0x%08x bytes.\n", iv, outsz); + fflush(stdout); + return outsz; +} + int TPL_ConvertI8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata, u32 width, u32 height) { s32 x, y; @@ -274,6 +486,41 @@ int TPL_ConvertI8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata return outsz; } +int TPL_ConvertBitMapToI8(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 width, u32 height) +{ + s32 x, y; + s32 x1, y1; + u32 iv; + u8* subbitmapdata = (u8*)calloc(width * height, 4); + // u8* subbitmapdata = bitmapdata; + if(subbitmapdata == NULL) + return -1; + *tplbuf = (u8*)calloc(width * height, 1); + if(*tplbuf == NULL) + return -1; + int i; + u8* writebuf = *tplbuf; + for(iv = height - 1, y = 0; y < height; y++, iv--) + for(x = 0; x < width; x++) + for(i = 0; i < 4; i++) + subbitmapdata[((x + (y * width)) * 4) + i] = bitmapdata[((x + (iv * width)) * 4) + i]; + u32 outsz = width * height; + for(iv = 0, y1 = 0; y1 < height; y1 += 4) { + for(x1 = 0; x1 < width; x1 += 8) { + for(y = y1; y < (y1 + 4); y++) { + for(x = x1; x < (x1 + 8); x++) { + u32 rgba = ((u32*)subbitmapdata)[x + (y * width)]; + u8 i1 = (rgba >> 0) & 0xFF; + ((u8*)writebuf)[iv++] = i1; + } + } + } + } + printf("Converted to 0x%08x bytes of 0x%08x bytes.\n", iv, outsz); + fflush(stdout); + return outsz; +} + int TPL_ConvertIA8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata, u32 width, u32 height) { s32 x, y; @@ -309,6 +556,45 @@ int TPL_ConvertIA8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdat return outsz; } +int TPL_ConvertBitMapToIA8(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 width, u32 height) +{ + s32 x, y; + s32 x1, y1; + u32 iv; + u8* subbitmapdata = (u8*)calloc(width * height, 4); + // u8* subbitmapdata = bitmapdata; + if(subbitmapdata == NULL) + return -1; + *tplbuf = (u8*)calloc(width * height, 2); + if(*tplbuf == NULL) + return -1; + int i; + u8* writebuf = *tplbuf; + for(iv = height - 1, y = 0; y < height; y++, iv--) + for(x = 0; x < width; x++) + for(i = 0; i < 4; i++) + subbitmapdata[((x + (y * width)) * 4) + i] = bitmapdata[((x + (iv * width)) * 4) + i]; + u32 outsz = width * height * 2; + for(iv = 0, y1 = 0; y1 < height; y1 += 4) { + for(x1 = 0; x1 < width; x1 += 4) { + for(y = y1; y < (y1 + 4); y++) { + for(x = x1; x < (x1 + 4); x++) { + u32 rgba = ((u32*)subbitmapdata)[x + (y * width)]; + u8 i1 = (rgba >> 0) & 0xFF; + u8 a1 = (rgba >> 24) & 0xFF; + + u16 newpixel = i1 << 8; + newpixel |= a1; + ((u16*)writebuf)[iv++] = newpixel; + } + } + } + } + printf("Converted to 0x%08x bytes of 0x%08x bytes.\n", iv * 2, outsz); + fflush(stdout); + return outsz; +} + int TPL_ConvertToBMP(u8* tplbuf, u32 tplsize, char basename[]) { u32 tplpoint = 0; @@ -320,12 +606,11 @@ int TPL_ConvertToBMP(u8* tplbuf, u32 tplsize, char basename[]) printf("Not a valid TPL file. %08x\n", header[0]); return -1; } -// u32 genstuff[] = {htonl(1), htonl(0xc), htonl(0x14), 0}; if(header[2] != be32(0x0000000c)) { printf("TPL Header is malformed. %08x\n", header[2]); return -1; } - u32 TPLTextures[32][2]; // Who's gonna use more than 32 textures per TPL? Nobody. + u32 TPLTextures[256][2]; // Who's gonna use more than 256 textures per TPL? Nobody. u32 texcount = 0; int i; for(i = 0; i < be32(header[1]); i++) { @@ -477,3 +762,199 @@ int TPL_ConvertToBMP(u8* tplbuf, u32 tplsize, char basename[]) } return 0; } + +int TPL_ConvertFromBMPs(const u32 count, char *bmps[], char outname[], u32 format) +{ + FILE *out = fopen(outname, "wb"); + if(out == NULL) { + printf("Unable to open %s\n", outname); + return -1; + } + printf("%d\n", count); + fflush(stdout); + u32 magic = be32(0x0020af30); + u32 header[] = { magic, be32(count), be32(0xc) }; + fwrite(header, 4, 3, out); + + int i; + for(i = 0; i < count; i++) { + u32 offsets[] = { be32(12 + (8 * count) + (36 * i)), be32(0) }; + fwrite(offsets, 4, 2, out); + } + u8* imagedatas[256]; + u32 imagesizes[256]; + for(i = 0; i < count; i++) { + printf("Handling %d/%d\n", i, count); + FILE* bmpfp = fopen(bmps[i], "rb"); +/* fseek(bmpfp, 38, SEEK_END); + char goodtplheadstartmagic[] = {'T', 'P', 'L', 'M'}; + char tplheadstartmagic[4]; + fread(tplheadstartmagic, 4, 1, bmpfp); + if(memcmp(goodtplheadstartmagic, tplheadstartmagic, 4) != 0) { + printf("Bad TPL Header magic in file %s! %02x%02x%02x%02x\n", \ + bmps[i], \ + tplheadstartmagic[0], tplheadstartmagic[1], \ + tplheadstartmagic[2], tplheadstartmagic[3]); + return -1; + } + TPL_header h; + fread(&h.height, 2, 1, bmpfp); + fread(&h.width, 2, 1, bmpfp); + fread(&h.format, 4, 1, bmpfp); + fread(&h.offs, 4, 1, bmpfp); + fread(&h.wrap_s, 4, 1, bmpfp); + fread(&h.wrap_t, 4, 1, bmpfp); + fread(&h.min, 4, 1, bmpfp); + fread(&h.mag, 4, 1, bmpfp); + fread(&h.lod_bias, 4, 1, bmpfp); + fread(&h.edge_lod, 1, 1, bmpfp); + fread(&h.min_lod, 1, 1, bmpfp); + fread(&h.max_lod, 1, 1, bmpfp); + fread(&h.unpacked, 1, 1, bmpfp);*/ + fseek(bmpfp, 0, SEEK_END); + fseek(bmpfp, 0, SEEK_SET); + TPL_BMPHeader b; + fread(&b.magic, 2, 1, bmpfp); + fread(&b.size, 4, 1, bmpfp); + fread(&b.reserved1, 2, 1, bmpfp); + fread(&b.reserved2, 2, 1, bmpfp); + fread(&b.offset, 4, 1, bmpfp); + TPL_BMPInfoHeaderV3 bi; + fread(&bi.headersize, 4, 1, bmpfp); + if(bi.headersize != 40) { + printf("Bad BMPInfoV3 header size in file %s! 0x%08x 0x%08x\n", \ + bmps[i], \ + bi.headersize, 40); + return -1; + } + fread(&bi.width, 4, 1, bmpfp); + if((bi.width % 4) != 0) { + printf("Width must be a multiple of 4 in file %s! 0x%08x\n", \ + bmps[i], \ + bi.width); + return -1; + } + fread(&bi.height, 4, 1, bmpfp); + if((bi.height % 4) != 0) { + printf("Height must be a multiple of 4 in file %s! 0x%08x\n", \ + bmps[i], \ + bi.height); + return -1; + } + fread(&bi.colorplanes, 2, 1, bmpfp); + if(bi.colorplanes != 1) { + printf("Wrong number of colorplanes in file %s! 0x%08x\n", \ + bmps[i], \ + bi.colorplanes); + return -1; + } + fread(&bi.bpp, 2, 1, bmpfp); + if(bi.bpp != 32) { + printf("This version of Zetsubou only supports RGBA8 in file %s! 0x%08x\n", \ + bmps[i], \ + bi.bpp); + return -1; + } + fread(&bi.compression, 4, 1, bmpfp); + if(bi.compression != 0) { + printf("No support for compression in file %s! 0x%08x\n", \ + bmps[i], \ + bi.compression); + return -1; + } + fread(&bi.bitmapsize, 4, 1, bmpfp); + fread(&bi.hres, 4, 1, bmpfp); + fread(&bi.vres, 4, 1, bmpfp); + fread(&bi.colorpalette, 4, 1, bmpfp); + fread(&bi.importantcolors, 4, 1, bmpfp); + fseek(bmpfp, b.offset, SEEK_SET); + u8* bitmapdata = (u8*)malloc(bi.bitmapsize); + fread(bitmapdata, bi.bitmapsize, 1, bmpfp); + u8* tplbuf; + int ret; + switch(format) { + case TPL_FORMAT_RGB565: + printf("RGB565\n"); + ret = TPL_ConvertBitMapToRGB565(bitmapdata, bi.bitmapsize, &tplbuf, bi.width, bi.height); + break; + case TPL_FORMAT_RGB5A3: + printf("RGB5A3\n"); + ret = TPL_ConvertBitMapToRGB5A3(bitmapdata, bi.bitmapsize, &tplbuf, bi.width, bi.height); + break; + case TPL_FORMAT_RGBA8: + printf("RGBA8\n"); + ret = TPL_ConvertBitMapToRGBA8(bitmapdata, bi.bitmapsize, &tplbuf, bi.width, bi.height); + break; + case TPL_FORMAT_I4: + printf("I4\n"); + ret = TPL_ConvertBitMapToI4(bitmapdata, bi.bitmapsize, &tplbuf, bi.width, bi.height); + break; + case TPL_FORMAT_I8: + printf("I8\n"); + ret = TPL_ConvertBitMapToI8(bitmapdata, bi.bitmapsize, &tplbuf, bi.width, bi.height); + break; + case TPL_FORMAT_IA4: + printf("IA4\n"); + ret = TPL_ConvertBitMapToIA4(bitmapdata, bi.bitmapsize, &tplbuf, bi.width, bi.height); + break; + case TPL_FORMAT_IA8: + printf("IA8\n"); + ret = TPL_ConvertBitMapToIA8(bitmapdata, bi.bitmapsize, &tplbuf, bi.width, bi.height); + break; + default: + printf("Unsupported: %d.\n", format); + ret = -1; + } + if(ret == -1) { + printf("Error converting file.\n"); + return -1; + } + imagedatas[i] = tplbuf; + imagesizes[i] = ret; + TPL_header h; + printf("Nulling h\n"); + fflush(stdout); + memset(&h, 0, sizeof(TPL_header)); + printf("Nulled h\n"); + fflush(stdout); + h.format = be32(format); + h.offs = be32(12 + (8 * count) + (36 * count)); + printf("%dx%d\n", bi.width, bi.height); + h.width = be16(bi.width); + h.height = be16(bi.height); + h.min = be32(TPL_MIN_FILTER_NORMAL); + h.mag = be32(TPL_MAG_FILTER_NORMAL); + fwrite(&h.height, 2, 1, out); + fwrite(&h.width, 2, 1, out); + fwrite(&h.format, 4, 1, out); + fwrite(&h.offs, 4, 1, out); + fwrite(&h.wrap_s, 4, 1, out); + fwrite(&h.wrap_t, 4, 1, out); + fwrite(&h.min, 4, 1, out); + fwrite(&h.mag, 4, 1, out); + fwrite(&h.lod_bias, 4, 1, out); + fwrite(&h.edge_lod, 1, 1, out); + fwrite(&h.min_lod, 1, 1, out); + fwrite(&h.max_lod, 1, 1, out); + fwrite(&h.unpacked, 1, 1, out); + printf("Closing bmpfp\n"); + fflush(stdout); + fflush(out); + fflush(bmpfp); + fclose(bmpfp); + printf("Closed bmpfp\n"); + fflush(stdout); + } + for(i = 0; i < count; i++) { + printf("Writing %d. 0x%08x, 0x%08x\n", i, imagedatas[i], imagesizes[i]); + fflush(stdout); + fwrite(imagedatas[i], imagesizes[i], 1, out); + fflush(out); + free(imagedatas[i]); + } + fclose(out); + return 0; +} + + + diff --git a/zetsubou/tpl.h b/zetsubou/tpl.h index f7c6476..633e60e 100644 --- a/zetsubou/tpl.h +++ b/zetsubou/tpl.h @@ -39,6 +39,14 @@ // CMP (S3TC compressed, 2x2 blocks of 4x4 tiles) #define TPL_FORMAT_CMP 14 +// Normal Min Filter value. (Unknown value) +#define TPL_MIN_FILTER_NORMAL 0x00010000 +// Clamp Min Filter value? (Unknown value) +#define TPL_MIN_FILTER_CLAMP 0x00000001 +// Normal Mag Filter value. (Unknown value) +#define TPL_MAG_FILTER_NORMAL 0x00010000 +// Clamp Mag Filter value? (Unknown value) +#define TPL_MAG_FILTER_CLAMP 0x00000001 typedef struct texthead { @@ -46,15 +54,15 @@ typedef struct texthead u16 width; // Width of the TPL image. u32 format; // Format of the TPL image. (Use #defines pl0x.) u32 offs; // Offset to actual image data. - u32 wrap_s; // Wrap S? - u32 wrap_t; // Wrap T? - u32 min; // Min? - u32 mag; // Mag? + u32 wrap_s; // Wrap S. + u32 wrap_t; // Wrap T. + u32 min; // Min filter. + u32 mag; // Mag filter. f32 lod_bias; // LOD Bias? u8 edge_lod; // Edge LOD? u8 min_lod; // Minimum LOD? u8 max_lod; // Maximum LOD? - u8 unpacked; // Unpacked (Size?) + u8 unpacked; // Unpacked? } TPL_header; typedef struct bmphead @@ -82,5 +90,6 @@ typedef struct bmpv3infohead } TPL_BMPInfoHeaderV3; int TPL_ConvertToBMP(u8* tplbuf, u32 tplsize, char basename[]); +int TPL_ConvertFromBMPs(const u32 count, char *bmps[], char outname[], u32 format); #endif //_TPL_H_ |
