aboutsummaryrefslogtreecommitdiff
path: root/zetsubou/tpl.c
diff options
context:
space:
mode:
authorAlex Marshall <SquidMan72@gmail.com>2009-03-21 01:15:00 -0700
committerAlex Marshall <SquidMan72@gmail.com>2009-03-21 01:15:00 -0700
commit41f312b1a3e703edd56627342fdd358c22890480 (patch)
treeefea223fd1df1395add826c0765af2f6c22649a1 /zetsubou/tpl.c
parent33dbada8f9c9fc97222ee3b0bfa0defc1f554c9f (diff)
Updated Zetsubou a lot. Now has CMP support (waiting on segher's approval), output to PNG (BUGGY. COLOR IS WASHED OUT, BUT WHEN WRITING TO BMP, STILL LOOKS FINE), and probably more stuff.
Diffstat (limited to '')
-rw-r--r--zetsubou/tpl.c557
1 files changed, 425 insertions, 132 deletions
diff --git a/zetsubou/tpl.c b/zetsubou/tpl.c
index af2ef32..af0bff1 100644
--- a/zetsubou/tpl.c
+++ b/zetsubou/tpl.c
@@ -10,6 +10,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <GD.h>
#include "tpl.h"
#include "endian.h"
@@ -23,9 +24,6 @@ int TPL_ConvertRGB565ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmap
*bitmapdata = (u8*)calloc(width * height, 4);
if(*bitmapdata == NULL)
return -1;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
- if(subbitmapdata == NULL)
- return -1;
u32 outsz = width * height * 4;
for(iv = 0, y1 = 0; y1 < height; y1 += 4) {
for(x1 = 0; x1 < width; x1 += 4) {
@@ -38,15 +36,11 @@ int TPL_ConvertRGB565ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmap
u8 r = ((oldpixel >> 0) & 0x1F) << 3;
u8 a = 255;
u32 rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24);
- ((u32*)subbitmapdata)[x + (y * width)] = rgba;
+ (*(u32**)bitmapdata)[x + (y * width)] = rgba;
}
}
}
}
- for(iv = height - 1, y = 0; y < height; y++, iv--)
- for(x = 0; x < width; x++)
- *((*(u32**)bitmapdata) + ((x + (y * width)))) = ((u32*)subbitmapdata)[x + (iv * width)];
- free(subbitmapdata);
return outsz;
}
@@ -55,19 +49,13 @@ int TPL_ConvertBitMapToRGB565(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 w
s32 x, y;
s32 x1, y1;
u32 iv;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
-// u8* subbitmapdata = bitmapdata;
+ 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) {
@@ -196,9 +184,6 @@ int TPL_ConvertRGB5A3ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmap
*bitmapdata = (u8*)calloc(width * height, 4);
if(*bitmapdata == NULL)
return -1;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
- if(subbitmapdata == NULL)
- return -1;
u32 outsz = width * height * 4;
for(iv = 0, y1 = 0; y1 < height; y1 += 4) {
for(x1 = 0; x1 < width; x1 += 4) {
@@ -213,7 +198,7 @@ int TPL_ConvertRGB5A3ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmap
u8 b = (((oldpixel >> 0) & 0x1F) * 255) / 31;
u8 a = 255;
u32 rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24);
- ((u32*)subbitmapdata)[x + (y * width)] = rgba;
+ (*(u32**)bitmapdata)[x + (y * width)] = rgba;
}else{
// RGB4A3
u8 r = (((oldpixel >> 11) & 0xF) * 255) / 15;
@@ -221,16 +206,12 @@ int TPL_ConvertRGB5A3ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmap
u8 b = (((oldpixel >> 3) & 0xF) * 255) / 15;
u8 a = (((oldpixel >> 0) & 0x7) * 255) / 7;
u32 rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24);
- ((u32*)subbitmapdata)[x + (y * width)] = rgba;
+ (*(u32**)bitmapdata)[x + (y * width)] = rgba;
}
}
}
}
}
- for(iv = height - 1, y = 0; y < height; y++, iv--)
- for(x = 0; x < width; x++)
- *((*(u32**)bitmapdata) + ((x + (y * width)))) = ((u32*)subbitmapdata)[x + (iv * width)];
- free(subbitmapdata);
return outsz;
}
@@ -239,19 +220,13 @@ int TPL_ConvertBitMapToRGB5A3(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 w
s32 x, y;
s32 x1, y1;
u32 iv;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
- // u8* subbitmapdata = bitmapdata;
+ 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) {
@@ -304,9 +279,6 @@ int TPL_ConvertI4ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata
*bitmapdata = (u8*)calloc(width * height, 8);
if(*bitmapdata == NULL)
return -1;
- u8* subbitmapdata = (u8*)calloc(width * height, 8);
- if(subbitmapdata == NULL)
- return -1;
u32 outsz = width * height * 4;
for(iv = 0, y1 = 0; y1 < height; y1 += 8) {
for(x1 = 0; x1 < width; x1 += 8) {
@@ -318,22 +290,18 @@ int TPL_ConvertI4ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata
u8 r = (oldpixel >> 4) * 255 / 15;
u8 a = 255;
u32 rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24);
- ((u32*)subbitmapdata)[x + (y * width)] = rgba;
+ (*(u32**)bitmapdata)[x + (y * width)] = rgba;
b = (oldpixel & 0xF) * 255 / 15;
g = (oldpixel & 0xF) * 255 / 15;
r = (oldpixel & 0xF) * 255 / 15;
a = 255;
rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24);
- ((u32*)subbitmapdata)[x + 1 + (y * width)] = rgba;
+ (*(u32**)bitmapdata)[x + 1 + (y * width)] = rgba;
iv++;
}
}
}
}
- for(iv = height - 1, y = 0; y < height; y++, iv--)
- for(x = 0; x < width; x++)
- *((*(u32**)bitmapdata) + ((x + (y * width)))) = ((u32*)subbitmapdata)[x + (iv * width)];
- free(subbitmapdata);
return outsz;
}
@@ -342,19 +310,13 @@ int TPL_ConvertBitMapToI4(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 width
s32 x, y;
s32 x1, y1;
u32 iv;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
- // u8* subbitmapdata = bitmapdata;
+ 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) {
@@ -386,9 +348,6 @@ int TPL_ConvertIA4ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdat
*bitmapdata = (u8*)calloc(width * height, 4);
if(*bitmapdata == NULL)
return -1;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
- if(subbitmapdata == NULL)
- return -1;
u32 outsz = width * height * 4;
for(iv = 0, y1 = 0; y1 < height; y1 += 4) {
for(x1 = 0; x1 < width; x1 += 8) {
@@ -400,15 +359,11 @@ int TPL_ConvertIA4ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdat
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;
+ (*(u32**)bitmapdata)[x + (y * width)] = rgba;
}
}
}
}
- for(iv = height - 1, y = 0; y < height; y++, iv--)
- for(x = 0; x < width; x++)
- *((*(u32**)bitmapdata) + ((x + (y * width)))) = ((u32*)subbitmapdata)[x + (iv * width)];
- free(subbitmapdata);
return outsz;
}
@@ -417,19 +372,13 @@ int TPL_ConvertBitMapToIA4(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 widt
s32 x, y;
s32 x1, y1;
u32 iv;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
- // u8* subbitmapdata = bitmapdata;
+ 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) {
@@ -460,9 +409,6 @@ int TPL_ConvertI8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata
*bitmapdata = (u8*)calloc(width * height, 4);
if(*bitmapdata == NULL)
return -1;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
- if(subbitmapdata == NULL)
- return -1;
u32 outsz = width * height * 4;
for(iv = 0, y1 = 0; y1 < height; y1 += 4) {
for(x1 = 0; x1 < width; x1 += 8) {
@@ -474,15 +420,11 @@ int TPL_ConvertI8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata
u8 r = oldpixel;
u8 a = 255;
u32 rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24);
- ((u32*)subbitmapdata)[x + (y * width)] = rgba;
+ (*(u32**)bitmapdata)[x + (y * width)] = rgba;
}
}
}
}
- for(iv = height - 1, y = 0; y < height; y++, iv--)
- for(x = 0; x < width; x++)
- *((*(u32**)bitmapdata) + ((x + (y * width)))) = ((u32*)subbitmapdata)[x + (iv * width)];
- free(subbitmapdata);
return outsz;
}
@@ -491,19 +433,13 @@ int TPL_ConvertBitMapToI8(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 width
s32 x, y;
s32 x1, y1;
u32 iv;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
- // u8* subbitmapdata = bitmapdata;
+ 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) {
@@ -530,9 +466,6 @@ int TPL_ConvertIA8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdat
*bitmapdata = (u8*)calloc(width * height, 4);
if(*bitmapdata == NULL)
return -1;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
- if(subbitmapdata == NULL)
- return -1;
u32 outsz = width * height * 4;
for(iv = 0, y1 = 0; y1 < height; y1 += 4) {
for(x1 = 0; x1 < width; x1 += 4) {
@@ -544,15 +477,11 @@ int TPL_ConvertIA8ToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdat
u8 r = oldpixel >> 8;
u8 a = oldpixel & 0xFF;
u32 rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24);
- ((u32*)subbitmapdata)[x + (y * width)] = rgba;
+ (*(u32**)bitmapdata)[x + (y * width)] = rgba;
}
}
}
}
- for(iv = height - 1, y = 0; y < height; y++, iv--)
- for(x = 0; x < width; x++)
- *((*(u32**)bitmapdata) + ((x + (y * width)))) = ((u32*)subbitmapdata)[x + (iv * width)];
- free(subbitmapdata);
return outsz;
}
@@ -561,19 +490,13 @@ int TPL_ConvertBitMapToIA8(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 widt
s32 x, y;
s32 x1, y1;
u32 iv;
- u8* subbitmapdata = (u8*)calloc(width * height, 4);
- // u8* subbitmapdata = bitmapdata;
+ 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) {
@@ -595,6 +518,386 @@ int TPL_ConvertBitMapToIA8(u8* bitmapdata, u32 bitmapsize, u8** tplbuf, u32 widt
return outsz;
}
+#define round_up(x,n) (-(-(x) & -(n)))
+
+static u16 avg(u16 w0, u16 w1, u16 c0, u16 c1)
+{
+ u16 a0, a1;
+ u16 a, c;
+
+ a0 = c0 >> 11;
+ a1 = c1 >> 11;
+ a = (w0*a0 + w1*a1) / (w0 + w1);
+ c = a << 11;
+
+ a0 = (c0 >> 5) & 63;
+ a1 = (c1 >> 5) & 63;
+ a = (w0*a0 + w1*a1) / (w0 + w1);
+ c |= a << 5;
+
+ a0 = c0 & 31;
+ a1 = c1 & 31;
+ a = (w0*a0 + w1*a1) / (w0 + w1);
+ c |= a;
+
+ return c;
+}
+
+int TPL_ConvertCMPToBitMap(u8* tplbuf, u32 tplsize, u32 tplpoint, u8** bitmapdata, u32 width, u32 height)
+{
+ s32 x, y;
+ u32 iv = 0;
+ //tplpoint -= width;
+ *bitmapdata = (u8*)calloc(width * height, 4);
+ if(*bitmapdata == NULL)
+ return -1;
+ u32 outsz = width * height * 4;
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++) {
+ u8 pix[3];
+ u16 raw;
+ u16 c[4];
+ int x0, x1, x2, y0, y1, y2, off;
+ int ww = round_up(width, 8);
+ int ix;
+ u32 px;
+
+ x0 = x & 3;
+ x1 = (x >> 2) & 1;
+ x2 = x >> 3;
+ y0 = y & 3;
+ y1 = (y >> 2) & 1;
+ y2 = y >> 3;
+ off = (8 * x1) + (16 * y1) + (32 * x2) + (4 * ww * y2);
+
+ c[0] = be16(*(u16*)(tplbuf + tplpoint + off));
+ c[1] = be16(*(u16*)(tplbuf + tplpoint + off + 2));
+ if (c[0] > c[1]) {
+ c[2] = avg(2, 1, c[0], c[1]);
+ c[3] = avg(1, 2, c[0], c[1]);
+ } else {
+ c[2] = avg(1, 1, c[0], c[1]);
+ c[3] = 0;
+ }
+
+ px = be32(*(u32*)(tplbuf + tplpoint + off + 4));
+ ix = x0 + (4 * y0);
+ raw = c[(px >> (30 - (2 * ix))) & 3];
+
+ pix[0] = (raw >> 8) & 0xf8;
+ pix[1] = (raw >> 3) & 0xf8;
+ pix[2] = (raw << 3) & 0xf8;
+
+ u32 rgba = (pix[0] << 0) | (pix[1] << 8) | (pix[2] << 16) | (255 << 24);
+ (*(u32**)bitmapdata)[iv++] = rgba;
+ }
+ return outsz;
+}
+
+int TPL_ConvertToGD(u8* tplbuf, u32 tplsize, char basename[], u32 format)
+{
+ char formatstr[4];
+ switch(format) {
+ case 0: // BMP
+ return TPL_ConvertToBMP(tplbuf, tplsize, basename);
+ case 1: // PNG
+ strcpy(formatstr, "png");
+ break;
+ default:
+ printf("Unknown output format %d.\n", format);
+ return -1;
+ }
+ u32 tplpoint = 0;
+ u32 header[3];
+ u32 goodmagic = be32(0x0020af30);
+ memcpy(header, tplbuf + tplpoint, 12);
+ tplpoint += 12;
+ if(memcmp(&(header[0]), &goodmagic, 4) != 0) {
+ printf("Not a valid TPL file. %08x\n", header[0]);
+ return -1;
+ }
+ if(header[2] != be32(0x0000000c)) {
+ printf("TPL Header is malformed. %08x\n", header[2]);
+ return -1;
+ }
+ 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++) {
+ memcpy(TPLTextures[i], tplbuf + tplpoint, 8);
+ tplpoint += 8;
+ texcount++;
+ }
+ char *outname = (char*)malloc(strlen(basename) + 3);
+ for(i = 0; i < texcount; i++) {
+ printf("Converting file %d.\n", i);
+ memset(outname, 0, strlen(basename) + 6);
+ sprintf(outname, "%s%02x.%s", basename, i, formatstr);
+ printf("Output to %s.\n", outname);
+ tplpoint = be32(TPLTextures[i][0]);
+ TPL_header h;
+ memcpy(&h.height, tplbuf + tplpoint, 2);
+ tplpoint += 2;
+ memcpy(&h.width, tplbuf + tplpoint, 2);
+ tplpoint += 2;
+ memcpy(&h.format, tplbuf + tplpoint, 4);
+ tplpoint += 4;
+ memcpy(&h.offs, tplbuf + tplpoint, 4);
+ tplpoint += 4;
+ memcpy(&h.wrap_s, tplbuf + tplpoint, 4);
+ tplpoint += 4;
+ memcpy(&h.wrap_t, tplbuf + tplpoint, 4);
+ tplpoint += 4;
+ memcpy(&h.min, tplbuf + tplpoint, 4);
+ tplpoint += 4;
+ memcpy(&h.mag, tplbuf + tplpoint, 4);
+ tplpoint += 4;
+ memcpy(&h.lod_bias, tplbuf + tplpoint, 4);
+ tplpoint += 4;
+ memcpy(&h.edge_lod, tplbuf + tplpoint, 1);
+ tplpoint++;
+ memcpy(&h.min_lod, tplbuf + tplpoint, 1);
+ tplpoint++;
+ memcpy(&h.max_lod, tplbuf + tplpoint, 1);
+ tplpoint++;
+ memcpy(&h.unpacked, tplbuf + tplpoint, 1);
+ tplpoint++;
+ /* if((be16(h.width) % 4) != 0) {
+ printf("TPL width is not a multiple of four! BAD! %d\n", be16(h.width));
+ return -1;
+ }
+ if((be16(h.height) % 4) != 0) {
+ printf("TPL height is not a multiple of four! BAD! %d\n", be16(h.height));
+ return -1;
+ }*/
+ printf("Dimensions: %dx%d\n", be16(h.width), be16(h.height));
+ gdImagePtr im = gdImageCreateTrueColor(be16(h.width), be16(h.height));
+ gdImageAlphaBlending(im, 0);
+ gdImageSaveAlpha(im, 1);
+ FILE *fileout = fopen(outname, "wb");
+ tplpoint = be32(h.offs);
+ int ret = 0;
+ u8* bitmapdata;
+ printf("Format: ");
+ switch(be32(h.format)) {
+ case TPL_FORMAT_RGB565:
+ printf("RGB565\n");
+ ret = TPL_ConvertRGB565ToBitMap(tplbuf, tplsize, tplpoint, &bitmapdata, be16(h.width), be16(h.height));
+ break;
+ case TPL_FORMAT_RGB5A3:
+ printf("RGB5A3\n");
+ ret = TPL_ConvertRGB5A3ToBitMap(tplbuf, tplsize, tplpoint, &bitmapdata, be16(h.width), be16(h.height));
+ break;
+ case TPL_FORMAT_RGBA8:
+ printf("RGBA8\n");
+ ret = TPL_ConvertRGBA8ToBitMap(tplbuf, tplsize, tplpoint, &bitmapdata, be16(h.width), be16(h.height));
+ break;
+ case TPL_FORMAT_I4:
+ printf("I4\n");
+ ret = TPL_ConvertI4ToBitMap(tplbuf, tplsize, tplpoint, &bitmapdata, be16(h.width), be16(h.height));
+ break;
+ case TPL_FORMAT_I8:
+ printf("I8\n");
+ ret = TPL_ConvertI8ToBitMap(tplbuf, tplsize, tplpoint, &bitmapdata, be16(h.width), be16(h.height));
+ break;
+ case TPL_FORMAT_IA4:
+ printf("IA4\n");
+ ret = TPL_ConvertIA4ToBitMap(tplbuf, tplsize, tplpoint, &bitmapdata, be16(h.width), be16(h.height));
+ break;
+ case TPL_FORMAT_IA8:
+ printf("IA8\n");
+ ret = TPL_ConvertIA8ToBitMap(tplbuf, tplsize, tplpoint, &bitmapdata, be16(h.width), be16(h.height));
+ break;
+ default:
+ printf("Unsupported: %d.\n", be32(h.format));
+ ret = -1;
+ }
+ if(ret == -1) {
+ printf("Error converting file.\n");
+ return -1;
+ }
+ int x, y;
+ for(y = 0; y < be16(h.height); y++) {
+ for(x = 0; x < be16(h.width); x++) {
+ u32 rgba = ((u32*)bitmapdata)[x + (y * be16(h.width))];
+ rgba = be32(rgba);
+ u8 r = (rgba >> 0) & 0xFF;
+ u8 g = (rgba >> 8) & 0xFF;
+ u8 b = (rgba >> 16) & 0xFF;
+ u8 a = 254 - 2*((rgba >> 24) & 0xFF);
+ if(a == 254) a++;
+ int clr = gdTrueColorAlpha(r, g, b, a);
+ gdImageSetPixel(im, x, y, clr);
+ }
+ }
+ gdImagePng(im, fileout);
+ fclose(fileout);
+ memset(outname, 0, strlen(basename) + 6);
+ sprintf(outname, "%s%02x.%s", basename, i, "met");
+ FILE* tplmeta = fopen(outname, "wb");
+ char tplheadstartmagic[] = {'T', 'P', 'L', 'M'};
+ fwrite(tplheadstartmagic, 4, 1, tplmeta);
+ fwrite(&h.height, 2, 1, tplmeta);
+ fwrite(&h.width, 2, 1, tplmeta);
+ fwrite(&h.format, 4, 1, tplmeta);
+ fwrite(&h.offs, 4, 1, tplmeta);
+ fwrite(&h.wrap_s, 4, 1, tplmeta);
+ fwrite(&h.wrap_t, 4, 1, tplmeta);
+ fwrite(&h.min, 4, 1, tplmeta);
+ fwrite(&h.mag, 4, 1, tplmeta);
+ fwrite(&h.lod_bias, 4, 1, tplmeta);
+ fwrite(&h.edge_lod, 1, 1, tplmeta);
+ fwrite(&h.min_lod, 1, 1, tplmeta);
+ fwrite(&h.max_lod, 1, 1, tplmeta);
+ fwrite(&h.unpacked, 1, 1, tplmeta);
+ fclose(tplmeta);
+ }
+ return 0;
+}
+
+int TPL_ConvertFromGDs(const u32 count, char *gds[], char outname[], u32 format, u32 typeformat)
+{
+ switch(typeformat) {
+ case 0: // BMP
+ return TPL_ConvertFromBMPs(count, gds, outname, format);
+ case 1: // PNG
+ break;
+ }
+ FILE *out = fopen(outname, "wb");
+ if(out == NULL) {
+ printf("Unable to open %s\n", outname);
+ return -1;
+ }
+ 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 + 1, count);
+ FILE* gdfp = fopen(gds[i], "rb");
+ gdImagePtr im;
+ switch(typeformat) {
+ case 0: // BMP
+ return TPL_ConvertFromBMPs(count, gds, outname, format);
+ case 1: // PNG
+ im = gdImageCreateFromPng(gdfp);
+ break;
+ }
+ gdImageAlphaBlending(im, 0);
+ gdImageSaveAlpha(im, 1);
+ fclose(gdfp);
+ u32 width = gdImageSX(im);
+ u32 height = gdImageSY(im);
+ u32 bitmapsize = width * height * 4;
+ u8* bitmapdata = (u8*)malloc(width * height * 4);
+ memset(bitmapdata, 0, width * height * 4);
+ u8* tplbuf;
+ u32 iv, x, y, z;
+ for(y = 0; y < height; y++) {
+ for(x = 0; x < width; x++) {
+ u32 p;
+ if(x >= width || y >= height)
+ p = 0;
+ else
+ p = gdImageGetPixel(im, x, y);
+ u8 a = 254 - 2*((u8)gdImageAlpha(im, p));
+ if(a == 254) a++;
+ u8 r = (u8)gdImageRed(im, p);
+ u8 g = (u8)gdImageGreen(im, p);
+ u8 b = (u8)gdImageBlue(im, p);
+ u32 rgba = (r << 0) | (g << 8) | (b << 16) | (a << 24);
+ rgba = be32(rgba);
+ ((u32*)bitmapdata)[x + (y * width)] = rgba;
+ }
+ }
+ int ret;
+ switch(format) {
+ case TPL_FORMAT_RGB565:
+ printf("RGB565\n");
+ ret = TPL_ConvertBitMapToRGB565(bitmapdata, bitmapsize, &tplbuf, width, height);
+ break;
+ case TPL_FORMAT_RGB5A3:
+ printf("RGB5A3\n");
+ ret = TPL_ConvertBitMapToRGB5A3(bitmapdata, bitmapsize, &tplbuf, width, height);
+ break;
+ case TPL_FORMAT_RGBA8:
+ printf("RGBA8\n");
+ ret = TPL_ConvertBitMapToRGBA8(bitmapdata, bitmapsize, &tplbuf, width, height);
+ break;
+ case TPL_FORMAT_I4:
+ printf("I4\n");
+ ret = TPL_ConvertBitMapToI4(bitmapdata, bitmapsize, &tplbuf, width, height);
+ break;
+ case TPL_FORMAT_I8:
+ printf("I8\n");
+ ret = TPL_ConvertBitMapToI8(bitmapdata, bitmapsize, &tplbuf, width, height);
+ break;
+ case TPL_FORMAT_IA4:
+ printf("IA4\n");
+ ret = TPL_ConvertBitMapToIA4(bitmapdata, bitmapsize, &tplbuf, width, height);
+ break;
+ case TPL_FORMAT_IA8:
+ printf("IA8\n");
+ ret = TPL_ConvertBitMapToIA8(bitmapdata, bitmapsize, &tplbuf, width, height);
+ break;
+ case TPL_FORMAT_CMP:
+ printf("CMP\n");
+ printf("CMP is not supported as a writable format.\nPlease choose a different format.\n");
+ return -1;
+ 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;
+ fflush(stdout);
+ memset(&h, 0, sizeof(TPL_header));
+ fflush(stdout);
+ h.format = be32(format);
+ h.offs = be32(12 + (8 * count) + (36 * count));
+ printf("Dimensions: %dx%d\n", width, height);
+ h.width = be16(width);
+ h.height = be16(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);
+ fflush(out);
+ }
+ for(i = 0; i < count; i++) {
+ fflush(stdout);
+ fwrite(imagedatas[i], imagesizes[i], 1, out);
+ fflush(out);
+ free(imagedatas[i]);
+ }
+ fclose(out);
+ return 0;
+}
+
int TPL_ConvertToBMP(u8* tplbuf, u32 tplsize, char basename[])
{
u32 tplpoint = 0;
@@ -621,7 +924,7 @@ int TPL_ConvertToBMP(u8* tplbuf, u32 tplsize, char basename[])
char *outname = (char*)malloc(strlen(basename) + 3);
for(i = 0; i < texcount; i++) {
printf("Converting file %d.\n", i);
- memset(outname, 0, strlen(basename) + 3);
+ memset(outname, 0, strlen(basename) + 6);
sprintf(outname, "%s%02x.bmp", basename, i);
printf("Output to %s.\n", outname);
tplpoint = be32(TPLTextures[i][0]);
@@ -652,14 +955,14 @@ int TPL_ConvertToBMP(u8* tplbuf, u32 tplsize, char basename[])
tplpoint++;
memcpy(&h.unpacked, tplbuf + tplpoint, 1);
tplpoint++;
- if((be16(h.width) % 4) != 0) {
- printf("TPL width is not a multiple of four! BAD!\n");
+/* if((be16(h.width) % 4) != 0) {
+ printf("TPL width is not a multiple of four! BAD! %d\n", be16(h.width));
return -1;
}
if((be16(h.height) % 4) != 0) {
- printf("TPL height is not a multiple of four! BAD!\n");
+ printf("TPL height is not a multiple of four! BAD! %d\n", be16(h.height));
return -1;
- }
+ }*/
printf("Dimensions: %dx%d\n", be16(h.width), be16(h.height));
TPL_BMPHeader b;
memset(&b, 0, sizeof(TPL_BMPHeader));
@@ -714,6 +1017,10 @@ int TPL_ConvertToBMP(u8* tplbuf, u32 tplsize, char basename[])
printf("IA8\n");
ret = TPL_ConvertIA8ToBitMap(tplbuf, tplsize, tplpoint, &bitmapdata, bi.width, bi.height);
break;
+ case TPL_FORMAT_CMP:
+ printf("CMP\n");
+ ret = TPL_ConvertCMPToBitMap(tplbuf, tplsize, tplpoint, &bitmapdata, bi.width, bi.height);
+ break;
default:
printf("Unsupported: %d.\n", be32(h.format));
ret = -1;
@@ -722,6 +1029,12 @@ int TPL_ConvertToBMP(u8* tplbuf, u32 tplsize, char basename[])
printf("Error converting file.\n");
return -1;
}
+ u8* subbitmapdata = (u8*)malloc(ret);
+ u32 iv, x, y;
+ for(iv = bi.height - 1, y = 0; y < bi.height; y++, iv--)
+ for(x = 0; x < bi.width; x++)
+ ((u32*)subbitmapdata)[x + (y * bi.width)] = ((u32*)bitmapdata)[x + (iv * bi.width)];
+ free(bitmapdata);
bi.bitmapsize = ret;
b.size = b.offset + bi.bitmapsize + 38;
FILE* out = fopen(outname, "wb");
@@ -742,7 +1055,7 @@ int TPL_ConvertToBMP(u8* tplbuf, u32 tplsize, char basename[])
fwrite(&(bi.vres), 4, 1, out);
fwrite(&(bi.colorpalette), 4, 1, out);
fwrite(&(bi.importantcolors), 4, 1, out);
- fwrite(bitmapdata, bi.bitmapsize, 1, out);
+ fwrite(subbitmapdata, bi.bitmapsize, 1, out);
char tplheadstartmagic[] = {'T', 'P', 'L', 'M'};
fwrite(tplheadstartmagic, 4, 1, out);
fwrite(&h.height, 2, 1, out);
@@ -770,7 +1083,6 @@ int TPL_ConvertFromBMPs(const u32 count, char *bmps[], char outname[], u32 forma
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) };
@@ -784,33 +1096,8 @@ int TPL_ConvertFromBMPs(const u32 count, char *bmps[], char outname[], u32 forma
u8* imagedatas[256];
u32 imagesizes[256];
for(i = 0; i < count; i++) {
- printf("Handling %d/%d\n", i, count);
+ printf("Handling %d/%d\n", i + 1, 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;
@@ -869,8 +1156,15 @@ int TPL_ConvertFromBMPs(const u32 count, char *bmps[], char outname[], u32 forma
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* subbitmapdata = (u8*)malloc(bi.bitmapsize);
+ fread(subbitmapdata, bi.bitmapsize, 1, bmpfp);
u8* tplbuf;
+ u32 iv, x, y, z;
+ for(iv = bi.height - 1, y = 0; y < bi.height; y++, iv--)
+ for(x = 0; x < bi.width; x++)
+ for(z = 0; z < 4; z++)
+ bitmapdata[((x + (y * bi.width)) * 4) + z] = subbitmapdata[((x + (iv * bi.width)) * 4) + z];
+ free(subbitmapdata);
int ret;
switch(format) {
case TPL_FORMAT_RGB565:
@@ -901,6 +1195,10 @@ int TPL_ConvertFromBMPs(const u32 count, char *bmps[], char outname[], u32 forma
printf("IA8\n");
ret = TPL_ConvertBitMapToIA8(bitmapdata, bi.bitmapsize, &tplbuf, bi.width, bi.height);
break;
+ case TPL_FORMAT_CMP:
+ printf("CMP\n");
+ printf("CMP is not supported as a writable format.\nPlease choose a different format.\n");
+ return -1;
default:
printf("Unsupported: %d.\n", format);
ret = -1;
@@ -912,14 +1210,12 @@ int TPL_ConvertFromBMPs(const u32 count, char *bmps[], char outname[], u32 forma
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);
+ printf("Dimensions: %dx%d\n", bi.width, bi.height);
h.width = be16(bi.width);
h.height = be16(bi.height);
h.min = be32(TPL_MIN_FILTER_NORMAL);
@@ -937,16 +1233,13 @@ int TPL_ConvertFromBMPs(const u32 count, char *bmps[], char outname[], u32 forma
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);