summaryrefslogtreecommitdiff
path: root/tools/nitrogfx/gfx.c
diff options
context:
space:
mode:
authorred031000 <rubenru09@aol.com>2020-06-07 16:46:28 +0100
committerred031000 <rubenru09@aol.com>2020-06-07 16:46:28 +0100
commit28bffae5bc2b497329e04dbae842d3b6fe3024d8 (patch)
tree9a0d2efca7696d6c3eb3680b22af2fcf0c8c6f1a /tools/nitrogfx/gfx.c
parentcc67cafa094351a033f295d054380acc63fddd78 (diff)
ncpr palette support
Diffstat (limited to 'tools/nitrogfx/gfx.c')
-rw-r--r--tools/nitrogfx/gfx.c71
1 files changed, 67 insertions, 4 deletions
diff --git a/tools/nitrogfx/gfx.c b/tools/nitrogfx/gfx.c
index bb6ff442..8a10efe2 100644
--- a/tools/nitrogfx/gfx.c
+++ b/tools/nitrogfx/gfx.c
@@ -328,8 +328,8 @@ void ReadNtrPalette(char *path, struct Palette *palette)
unsigned char *data = ReadWholeFile(path, &fileSize);
uint32_t magicNumber = (data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0];
- if (magicNumber != 0x4E434C52) //NCLR
- FATAL_ERROR("Not a valid NCLR palette file. Magic number (%x).\n", magicNumber);
+ if (magicNumber != 0x4E434C52 && magicNumber != 0x4E435052) //NCLR / NCPR
+ FATAL_ERROR("Not a valid NCLR or NCPR palette file. Magic number (%x).\n", magicNumber);
unsigned char *paletteHeader = data + 0x10;
@@ -376,7 +376,7 @@ void WriteGbaPalette(char *path, struct Palette *palette)
fclose(fp);
}
-void WriteNtrPalette(char *path, struct Palette *palette)
+void WriteNtrNCLRPalette(char *path, struct Palette *palette)
{
FILE *fp = fopen(path, "wb");
@@ -387,7 +387,70 @@ void WriteNtrPalette(char *path, struct Palette *palette)
uint32_t extSize = size + 0x18;
//NCLR header
- WriteGenericNtrHeader(fp, "RLCN", extSize);
+ WriteGenericNtrHeader(fp, "RLCN", extSize, true);
+
+ //PLTT header
+ //magic number
+ fputs("TTLP", fp);
+
+ //section size
+ fputc(extSize & 0xFF, fp);
+ fputc((extSize >> 8) & 0xFF, fp);
+ fputc((extSize >> 16) & 0xFF, fp);
+ fputc((extSize >> 24) & 0xFF, fp);
+
+ //bit depth
+ char bitDepth = palette->bitDepth == 4 ? 0x03: 0x04;
+ fputc(bitDepth, fp);
+ fputc(0x00, fp);
+ fputc(0x00, fp);
+ fputc(0x00, fp);
+
+ //padding
+ fputc(0x00, fp);
+ fputc(0x00, fp);
+ fputc(0x00, fp);
+ fputc(0x00, fp);
+
+ //size
+ fputc(size & 0xFF, fp);
+ fputc((size >> 8) & 0xFF, fp);
+ fputc((size >> 16) & 0xFF, fp);
+ fputc((size >> 24) & 0xFF, fp);
+
+ //colours per palette
+ fputc(0x10, fp);
+ fputc(0x00, fp);
+ fputc(0x00, fp);
+ fputc(0x00, fp);
+
+ //palette data
+ for (int i = 0; i < palette->numColors; i++) {
+ unsigned char red = DOWNCONVERT_BIT_DEPTH(palette->colors[i].red);
+ unsigned char green = DOWNCONVERT_BIT_DEPTH(palette->colors[i].green);
+ unsigned char blue = DOWNCONVERT_BIT_DEPTH(palette->colors[i].blue);
+
+ uint16_t paletteEntry = SET_GBA_PAL(red, green, blue);
+
+ fputc(paletteEntry & 0xFF, fp);
+ fputc(paletteEntry >> 8, fp);
+ }
+
+ fclose(fp);
+}
+
+void WriteNtrNCPRPalette(char *path, struct Palette *palette)
+{
+ FILE *fp = fopen(path, "wb");
+
+ if (fp == NULL)
+ FATAL_ERROR("Failed too open \"%s\" for writing.\n", path);
+
+ uint32_t size = palette->numColors * 2;
+ uint32_t extSize = size + 0x10;
+
+ //NCLR header
+ WriteGenericNtrHeader(fp, "RPCN", extSize, false);
//PLTT header
//magic number