2015-01-24 03:37:10 +01:00
|
|
|
#include "cbmd.h"
|
|
|
|
|
|
|
|
#include "lz11.h"
|
|
|
|
|
2015-09-21 00:39:39 +02:00
|
|
|
#include <stdlib.h>
|
2015-01-24 03:37:10 +01:00
|
|
|
#include <string.h>
|
|
|
|
|
2017-02-18 23:17:30 +01:00
|
|
|
#define CBMD_MAGIC "CBMD"
|
|
|
|
|
2015-01-24 03:37:10 +01:00
|
|
|
typedef struct {
|
2017-02-18 08:47:03 +01:00
|
|
|
char magic[4];
|
|
|
|
u32 zero;
|
|
|
|
u32 cgfxOffsets[CBMD_NUM_CGFXS];
|
|
|
|
u8 padding[0x44];
|
|
|
|
u32 cwavOffset;
|
2015-01-24 03:37:10 +01:00
|
|
|
} CBMDHeader;
|
|
|
|
|
2017-02-18 08:47:03 +01:00
|
|
|
static void* cbmd_build_data(u32* size, CBMD cbmd, bool bnr) {
|
2015-01-24 03:37:10 +01:00
|
|
|
CBMDHeader header;
|
2017-02-18 08:47:03 +01:00
|
|
|
memset(&header, 0, sizeof(header));
|
2015-01-24 03:37:10 +01:00
|
|
|
|
2017-02-18 23:17:30 +01:00
|
|
|
memcpy(header.magic, CBMD_MAGIC, sizeof(header.magic));
|
2017-02-18 08:47:03 +01:00
|
|
|
|
|
|
|
u32 outputSize = sizeof(CBMDHeader);
|
2015-01-24 03:37:10 +01:00
|
|
|
|
2017-02-18 08:47:03 +01:00
|
|
|
void* compressedCGFXs[14] = {NULL};
|
|
|
|
u32 compressedCGFXSizes[14] = {0};
|
|
|
|
for(u32 i = 0; i < CBMD_NUM_CGFXS; i++) {
|
2015-01-24 03:37:10 +01:00
|
|
|
if(cbmd.cgfxs[i] != NULL) {
|
2017-02-18 08:47:03 +01:00
|
|
|
header.cgfxOffsets[i] = outputSize;
|
|
|
|
|
|
|
|
compressedCGFXs[i] = lz11_compress(&compressedCGFXSizes[i], cbmd.cgfxs[i], cbmd.cgfxSizes[i]);
|
|
|
|
outputSize += compressedCGFXSizes[i];
|
2015-01-24 03:37:10 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(bnr) {
|
2017-02-18 08:47:03 +01:00
|
|
|
outputSize = (outputSize + 0xF) & ~0xF;
|
2015-01-24 03:37:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if(cbmd.cwav != NULL) {
|
2017-02-18 08:47:03 +01:00
|
|
|
header.cwavOffset = outputSize;
|
|
|
|
|
|
|
|
outputSize += cbmd.cwavSize;
|
2015-01-24 03:37:10 +01:00
|
|
|
}
|
|
|
|
|
2017-02-18 08:47:03 +01:00
|
|
|
void* output = calloc(outputSize, sizeof(u8));
|
|
|
|
if(output == NULL) {
|
|
|
|
for(u32 i = 0; i < CBMD_NUM_CGFXS; i++) {
|
|
|
|
if(cbmd.cgfxs[i] != NULL) {
|
|
|
|
free(compressedCGFXs[i]);
|
|
|
|
}
|
|
|
|
}
|
2015-01-24 03:37:10 +01:00
|
|
|
|
2017-02-18 08:47:03 +01:00
|
|
|
printf("ERROR: Could not allocate memory for CBMD data.\n");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy(output, &header, sizeof(header));
|
2015-01-24 03:37:10 +01:00
|
|
|
|
2017-02-18 08:47:03 +01:00
|
|
|
for(u32 i = 0; i < CBMD_NUM_CGFXS; i++) {
|
2015-01-24 03:37:10 +01:00
|
|
|
if(compressedCGFXs[i] != NULL) {
|
2017-02-18 08:47:03 +01:00
|
|
|
memcpy(&((u8*) output)[header.cgfxOffsets[i]], compressedCGFXs[i], compressedCGFXSizes[i]);
|
2015-01-24 03:37:10 +01:00
|
|
|
free(compressedCGFXs[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(cbmd.cwav != NULL) {
|
2017-02-18 08:47:03 +01:00
|
|
|
memcpy(&((u8*) output)[header.cwavOffset], cbmd.cwav, cbmd.cwavSize);
|
2015-01-24 03:37:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if(size != NULL) {
|
2017-02-18 08:47:03 +01:00
|
|
|
*size = outputSize;
|
2015-01-24 03:37:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return output;
|
|
|
|
}
|
|
|
|
|
2017-02-18 08:47:03 +01:00
|
|
|
void* cbmd_build(u32* size, CBMD cbmd) {
|
|
|
|
return cbmd_build_data(size, cbmd, false);
|
2015-01-24 03:37:10 +01:00
|
|
|
}
|
|
|
|
|
2017-02-18 08:47:03 +01:00
|
|
|
void* bnr_build(u32* size, CBMD cbmd) {
|
|
|
|
return cbmd_build_data(size, cbmd, true);
|
2015-01-24 03:37:10 +01:00
|
|
|
}
|