img2tim/tim.cpp

99 lines
2.1 KiB
C++

#include "tim.h"
int tim::ExportFile(const char* fileName, tim::PARAM *param) {
FILE *fp;
if (!(fp = fopen(fileName, "wb"))) {
return(-1);
}
tim::HEADER fileHead={{0}};
tim::CLUT_HEAD clutHead={0};
tim::IMG_HEAD imgHead={0};
// Prepare header
fileHead.id.id = 0x10;
fileHead.id.ver = 0;
fileHead.flags.pmode = param->format;
// Prepare CLUT data block if image is 8-bit or less and that the pointer to the CLUT data is not NULL
if ((param->format <= 1) && (param->clutData != NULL)) {
fileHead.flags.clut = 1;
clutHead.cw = param->clutWidth;
clutHead.ch = param->clutHeight;
clutHead.cx = param->clutXoffs;
clutHead.cy = param->clutYoffs;
clutHead.len = ((2*param->clutWidth)*param->clutHeight);
clutHead.len += sizeof(clutHead);
}
// Prepare image data block
imgHead.w = param->imgWidth;
imgHead.h = param->imgHeight;
imgHead.x = param->imgXoffs;
imgHead.y = param->imgYoffs;
// Calculate final size of image based on its color depth
switch(param->format) {
case 0: // 4-bit with 16-color CLUT
imgHead.len = param->imgWidth/2;
imgHead.w /= 4;
break;
case 1: // 8-bit with 256-color CLUT
imgHead.len = param->imgWidth;
imgHead.w /= 2;
break;
case 2: // 16-bit RGB5I1
imgHead.len = param->imgWidth*2;
break;
case 3: // 24-bit RGB8
imgHead.len = (param->imgWidth*3);
imgHead.w = ceil(imgHead.w*1.5f);
break;
}
// Calculate size of image data block
imgHead.len *= param->imgHeight;
imgHead.len += sizeof(imgHead);
// Write the header
fwrite(&fileHead, 1, sizeof(fileHead), fp);
// Write the CLUT data block
if ((param->format <= 1) && (param->clutData != NULL)) {
fwrite(&clutHead, 1, sizeof(clutHead), fp);
fwrite(param->clutData, 1, clutHead.len-sizeof(clutHead), fp);
}
// Write the image data block
fwrite(&imgHead, 1, sizeof(imgHead), fp);
fwrite(param->imgData, 1, imgHead.len-sizeof(imgHead), fp);
// Close and return
fclose(fp);
return(0);
}
void tim::FreeParam(tim::PARAM *param) {
if (param->imgData != NULL) {
free(param->imgData);
param->imgData = NULL;
}
if (param->clutData != NULL) {
free(param->clutData);
param->clutData = NULL;
}
}