aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--zetsubou/main.c86
-rw-r--r--zetsubou/tpl.c531
-rw-r--r--zetsubou/tpl.h19
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_