dumped fonts
This commit is contained in:
+195
-202
@@ -9,25 +9,18 @@
|
||||
#include "convert_png.h"
|
||||
#include "jasc_pal.h"
|
||||
#include "lz.h"
|
||||
#include "font.h"
|
||||
|
||||
void ConvertToPng(char *imageFilePath, char *outputFilePath, char *paletteFilePath, bool isObject, int width)
|
||||
struct CommandHandler
|
||||
{
|
||||
const char *inputFileExtension;
|
||||
const char *outputFileExtension;
|
||||
void(*function)(char *inputPath, char *outputPath, int argc, char **argv);
|
||||
};
|
||||
|
||||
void ConvertGbaToPng(char *inputPath, char *outputPath, int width, int bitDepth, char *paletteFilePath, bool hasTransparency)
|
||||
{
|
||||
struct Image image;
|
||||
int bitDepth = 0;
|
||||
|
||||
char *extension = GetFileExtension(imageFilePath);
|
||||
|
||||
if (extension == NULL)
|
||||
FATAL_ERROR("\"%s\" has no file extension.\n", imageFilePath);
|
||||
|
||||
if (strcmp(extension, "1bpp") == 0)
|
||||
bitDepth = 1;
|
||||
else if (strcmp(extension, "4bpp") == 0)
|
||||
bitDepth = 4;
|
||||
else if (strcmp(extension, "8bpp") == 0)
|
||||
bitDepth = 8;
|
||||
else
|
||||
FATAL_ERROR("Unexpected file extension \"%s\". Expected \"1bpp\", \"4bpp\", or \"8bpp\".\n", extension);
|
||||
|
||||
if (paletteFilePath != NULL) {
|
||||
ReadGbaPalette(paletteFilePath, &image.palette);
|
||||
@@ -36,249 +29,249 @@ void ConvertToPng(char *imageFilePath, char *outputFilePath, char *paletteFilePa
|
||||
image.hasPalette = false;
|
||||
}
|
||||
|
||||
ReadImage(imageFilePath, width, bitDepth, &image, !image.hasPalette);
|
||||
ReadImage(inputPath, width, bitDepth, &image, !image.hasPalette);
|
||||
|
||||
image.isObject = isObject;
|
||||
image.hasTransparency = hasTransparency;
|
||||
|
||||
if (outputFilePath == NULL) {
|
||||
ChangeFileExtension(imageFilePath, "png");
|
||||
outputFilePath = imageFilePath;
|
||||
}
|
||||
|
||||
WritePng(outputFilePath, &image);
|
||||
WritePng(outputPath, &image);
|
||||
|
||||
FreeImage(&image);
|
||||
}
|
||||
|
||||
void ConvertFromPng(char *imageFilePath, char *outputFilePath, int numTiles, int bitDepth)
|
||||
void ConvertPngToGba(char *inputPath, char *outputPath, int numTiles, int bitDepth)
|
||||
{
|
||||
struct Image image;
|
||||
|
||||
image.bitDepth = bitDepth;
|
||||
|
||||
ExpectFileExtension(imageFilePath, "png");
|
||||
ReadPng(inputPath, &image);
|
||||
|
||||
ReadPng(imageFilePath, &image);
|
||||
|
||||
if (outputFilePath == NULL) {
|
||||
char newExtension[5];
|
||||
snprintf(newExtension, 5, "%dbpp", bitDepth);
|
||||
ChangeFileExtension(imageFilePath, newExtension);
|
||||
outputFilePath = imageFilePath;
|
||||
}
|
||||
|
||||
WriteImage(outputFilePath, numTiles, bitDepth, &image, !image.hasPalette);
|
||||
WriteImage(outputPath, numTiles, bitDepth, &image, !image.hasPalette);
|
||||
|
||||
FreeImage(&image);
|
||||
}
|
||||
|
||||
void ConvertToJascPalette(char *paletteFilePath)
|
||||
void HandleGbaToPngCommand(char *inputPath, char *outputPath, int argc, char **argv)
|
||||
{
|
||||
char *inputFileExtension = GetFileExtension(inputPath);
|
||||
int bitDepth = inputFileExtension[0] - '0';
|
||||
char *paletteFilePath;
|
||||
bool hasPalette = false;
|
||||
bool hasTransparency = false;
|
||||
int width = 1;
|
||||
|
||||
for (int i = 3; i < argc; i++) {
|
||||
char *option = argv[i];
|
||||
|
||||
if (strcmp(option, "-palette") == 0) {
|
||||
if (i + 1 >= argc)
|
||||
FATAL_ERROR("No palette file path following \"-palette\".\n");
|
||||
|
||||
i++;
|
||||
|
||||
paletteFilePath = argv[i];
|
||||
|
||||
hasPalette = true;
|
||||
} else if (strcmp(option, "-object") == 0) {
|
||||
hasTransparency = true;
|
||||
} else if (strcmp(option, "-width") == 0) {
|
||||
if (i + 1 >= argc)
|
||||
FATAL_ERROR("No width following \"-width\".\n");
|
||||
|
||||
i++;
|
||||
|
||||
if (!ParseNumber(argv[i], NULL, 10, &width))
|
||||
FATAL_ERROR("Failed to parse width.\n");
|
||||
|
||||
if (width < 1)
|
||||
FATAL_ERROR("Width must be positive.\n");
|
||||
} else {
|
||||
FATAL_ERROR("Unrecognized option \"%s\".\n", option);
|
||||
}
|
||||
}
|
||||
|
||||
ConvertGbaToPng(inputPath, outputPath, width, bitDepth, hasPalette ? paletteFilePath : NULL, hasTransparency);
|
||||
}
|
||||
|
||||
void HandlePngToGbaCommand(char *inputPath, char *outputPath, int argc, char **argv)
|
||||
{
|
||||
char *outputFileExtension = GetFileExtension(outputPath);
|
||||
int bitDepth = outputFileExtension[0] - '0';
|
||||
int numTiles = 0;
|
||||
|
||||
for (int i = 3; i < argc; i++) {
|
||||
char *option = argv[i];
|
||||
|
||||
if (strcmp(option, "-num_tiles") == 0) {
|
||||
if (i + 1 >= argc)
|
||||
FATAL_ERROR("No number of tiles following \"-num_tiles\".\n");
|
||||
|
||||
i++;
|
||||
|
||||
if (!ParseNumber(argv[i], NULL, 10, &numTiles))
|
||||
FATAL_ERROR("Failed to parse number of tiles.\n");
|
||||
|
||||
if (numTiles < 1)
|
||||
FATAL_ERROR("Number of tiles must be positive.\n");
|
||||
} else {
|
||||
FATAL_ERROR("Unrecognized option \"%s\".\n", option);
|
||||
}
|
||||
}
|
||||
|
||||
ConvertPngToGba(inputPath, outputPath, numTiles, bitDepth);
|
||||
}
|
||||
|
||||
void HandleGbaToJascPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
struct Palette palette;
|
||||
|
||||
ExpectFileExtension(paletteFilePath, "gbapal");
|
||||
|
||||
ReadGbaPalette(paletteFilePath, &palette);
|
||||
|
||||
ChangeFileExtension(paletteFilePath, "pal");
|
||||
|
||||
WriteJascPalette(paletteFilePath, &palette);
|
||||
ReadGbaPalette(inputPath, &palette);
|
||||
WriteJascPalette(outputPath, &palette);
|
||||
}
|
||||
|
||||
void ConvertFromJascPalette(char *paletteFilePath)
|
||||
void HandleJascToGbaPaletteCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
struct Palette palette;
|
||||
|
||||
ExpectFileExtension(paletteFilePath, "pal");
|
||||
|
||||
ReadJascPalette(paletteFilePath, &palette);
|
||||
|
||||
ChangeFileExtension(paletteFilePath, "gbapal");
|
||||
|
||||
WriteGbaPalette(paletteFilePath, &palette);
|
||||
ReadJascPalette(inputPath, &palette);
|
||||
WriteGbaPalette(outputPath, &palette);
|
||||
}
|
||||
|
||||
void LZCompressFile(char *path)
|
||||
void HandleLatinFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
struct Image image;
|
||||
|
||||
ReadLatinFont(inputPath, &image);
|
||||
WritePng(outputPath, &image);
|
||||
|
||||
FreeImage(&image);
|
||||
}
|
||||
|
||||
void HandlePngToLatinFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
struct Image image;
|
||||
|
||||
image.bitDepth = 2;
|
||||
|
||||
ReadPng(inputPath, &image);
|
||||
WriteLatinFont(outputPath, &image);
|
||||
|
||||
FreeImage(&image);
|
||||
}
|
||||
|
||||
void HandleHalfwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
struct Image image;
|
||||
|
||||
ReadHalfwidthJapaneseFont(inputPath, &image);
|
||||
WritePng(outputPath, &image);
|
||||
|
||||
FreeImage(&image);
|
||||
}
|
||||
|
||||
void HandlePngToHalfwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
struct Image image;
|
||||
|
||||
image.bitDepth = 2;
|
||||
|
||||
ReadPng(inputPath, &image);
|
||||
WriteHalfwidthJapaneseFont(outputPath, &image);
|
||||
|
||||
FreeImage(&image);
|
||||
}
|
||||
|
||||
void HandleFullwidthJapaneseFontToPngCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
struct Image image;
|
||||
|
||||
ReadFullwidthJapaneseFont(inputPath, &image);
|
||||
WritePng(outputPath, &image);
|
||||
|
||||
FreeImage(&image);
|
||||
}
|
||||
|
||||
void HandlePngToFullwidthJapaneseFontCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
struct Image image;
|
||||
|
||||
image.bitDepth = 2;
|
||||
|
||||
ReadPng(inputPath, &image);
|
||||
WriteFullwidthJapaneseFont(outputPath, &image);
|
||||
|
||||
FreeImage(&image);
|
||||
}
|
||||
|
||||
void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
int fileSize;
|
||||
unsigned char *buffer = ReadWholeFile(path, &fileSize);
|
||||
unsigned char *buffer = ReadWholeFile(inputPath, &fileSize);
|
||||
|
||||
int compressedSize;
|
||||
unsigned char *compressedData = LZCompress(buffer, fileSize, &compressedSize);
|
||||
|
||||
free(buffer);
|
||||
|
||||
AddFileExtension(path, "lz");
|
||||
|
||||
WriteWholeFile(path, compressedData, compressedSize);
|
||||
WriteWholeFile(outputPath, compressedData, compressedSize);
|
||||
|
||||
free(compressedData);
|
||||
}
|
||||
|
||||
void LZDecompressFile(char *path)
|
||||
void HandleLZDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED)
|
||||
{
|
||||
ExpectFileExtension(path, "lz");
|
||||
|
||||
int fileSize;
|
||||
unsigned char *buffer = ReadWholeFile(path, &fileSize);
|
||||
unsigned char *buffer = ReadWholeFile(inputPath, &fileSize);
|
||||
|
||||
int uncompressedSize;
|
||||
unsigned char *uncompressedData = LZDecompress(buffer, fileSize, &uncompressedSize);
|
||||
|
||||
free(buffer);
|
||||
|
||||
RemoveFileExtension(path);
|
||||
|
||||
WriteWholeFile(path, uncompressedData, uncompressedSize);
|
||||
WriteWholeFile(outputPath, uncompressedData, uncompressedSize);
|
||||
|
||||
free(uncompressedData);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
if (argc < 2)
|
||||
FATAL_ERROR("No args.\n");
|
||||
if (argc < 3)
|
||||
FATAL_ERROR("Usage: gbagfx INPUT_PATH OUTPUT_PATH [options...]\n");
|
||||
|
||||
char *command = argv[1];
|
||||
struct CommandHandler handlers[] =
|
||||
{
|
||||
{ "1bpp", "png", HandleGbaToPngCommand },
|
||||
{ "4bpp", "png", HandleGbaToPngCommand },
|
||||
{ "8bpp", "png", HandleGbaToPngCommand },
|
||||
{ "png", "1bpp", HandlePngToGbaCommand },
|
||||
{ "png", "4bpp", HandlePngToGbaCommand },
|
||||
{ "png", "8bpp", HandlePngToGbaCommand },
|
||||
{ "gbapal", "pal", HandleGbaToJascPaletteCommand },
|
||||
{ "pal", "gbapal", HandleJascToGbaPaletteCommand },
|
||||
{ "latfont", "png", HandleLatinFontToPngCommand },
|
||||
{ "png", "latfont", HandlePngToLatinFontCommand },
|
||||
{ "hwjpnfont", "png", HandleHalfwidthJapaneseFontToPngCommand },
|
||||
{ "png", "hwjpnfont", HandlePngToHalfwidthJapaneseFontCommand },
|
||||
{ "fwjpnfont", "png", HandleFullwidthJapaneseFontToPngCommand },
|
||||
{ "png", "fwjpnfont", HandlePngToFullwidthJapaneseFontCommand },
|
||||
{ NULL, "lz", HandleLZCompressCommand },
|
||||
{ "lz", NULL, HandleLZDecompressCommand },
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
if (strcmp(command, "png") == 0) {
|
||||
if (argc < 3)
|
||||
FATAL_ERROR("No image file path arg.\n");
|
||||
char *inputPath = argv[1];
|
||||
char *outputPath = argv[2];
|
||||
|
||||
CHECK_PATH_LENGTH(argv[2]);
|
||||
for (int i = 0; handlers[i].function != NULL; i++) {
|
||||
char *inputFileExtension = GetFileExtension(inputPath);
|
||||
char *outputFileExtension = GetFileExtension(outputPath);
|
||||
|
||||
char imageFilePath[GBAGFX_MAX_PATH + 1];
|
||||
strcpy(imageFilePath, argv[2]);
|
||||
|
||||
char *outputFilePath = NULL;
|
||||
char paletteFilePath[GBAGFX_MAX_PATH + 1];
|
||||
bool hasPalette = false;
|
||||
bool isObject = false;
|
||||
int width = 1;
|
||||
|
||||
for (int i = 3; i < argc; i++) {
|
||||
char *option = argv[i];
|
||||
|
||||
if (strcmp(option, "-output") == 0) {
|
||||
if (i + 1 >= argc)
|
||||
FATAL_ERROR("No output file path following \"-output\".\n");
|
||||
|
||||
i++;
|
||||
|
||||
outputFilePath = argv[i];
|
||||
} else if (strcmp(option, "-palette") == 0) {
|
||||
if (i + 1 >= argc)
|
||||
FATAL_ERROR("No palette file path following \"-palette\".\n");
|
||||
|
||||
i++;
|
||||
|
||||
CHECK_PATH_LENGTH(argv[i]);
|
||||
|
||||
strcpy(paletteFilePath, argv[i]);
|
||||
|
||||
hasPalette = true;
|
||||
} else if (strcmp(option, "-object") == 0) {
|
||||
isObject = true;
|
||||
} else if (strcmp(option, "-width") == 0) {
|
||||
if (i + 1 >= argc)
|
||||
FATAL_ERROR("No width following \"-width\".\n");
|
||||
|
||||
i++;
|
||||
|
||||
if (!ParseNumber(argv[i], NULL, 10, &width))
|
||||
FATAL_ERROR("Failed to parse width.\n");
|
||||
|
||||
if (width < 1)
|
||||
FATAL_ERROR("Width must be positive.\n");
|
||||
} else {
|
||||
FATAL_ERROR("Unrecognized option \"%s\".\n", option);
|
||||
}
|
||||
if ((handlers[i].inputFileExtension == NULL || strcmp(handlers[i].inputFileExtension, inputFileExtension) == 0)
|
||||
&& (handlers[i].outputFileExtension == NULL || strcmp(handlers[i].outputFileExtension, outputFileExtension) == 0)) {
|
||||
handlers[i].function(inputPath, outputPath, argc, argv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ConvertToPng(imageFilePath, outputFilePath, hasPalette ? paletteFilePath : NULL, isObject, width);
|
||||
} else if (strcmp(command, "1bpp") == 0 || strcmp(command, "4bpp") == 0 || strcmp(command, "8bpp") == 0) {
|
||||
if (argc < 3)
|
||||
FATAL_ERROR("No image file path arg.\n");
|
||||
|
||||
CHECK_PATH_LENGTH(argv[2]);
|
||||
|
||||
char imageFilePath[GBAGFX_MAX_PATH + 1];
|
||||
strcpy(imageFilePath, argv[2]);
|
||||
|
||||
char *outputFilePath = NULL;
|
||||
int numTiles = 0;
|
||||
int bitDepth = command[0] - '0';
|
||||
|
||||
for (int i = 3; i < argc; i++) {
|
||||
char *option = argv[i];
|
||||
|
||||
if (strcmp(option, "-output") == 0) {
|
||||
if (i + 1 >= argc)
|
||||
FATAL_ERROR("No output file path following \"-output\".\n");
|
||||
|
||||
i++;
|
||||
|
||||
outputFilePath = argv[i];
|
||||
} else if (strcmp(option, "-num_tiles") == 0) {
|
||||
if (i + 1 >= argc)
|
||||
FATAL_ERROR("No number of tiles following \"-num_tiles\".\n");
|
||||
|
||||
i++;
|
||||
|
||||
if (!ParseNumber(argv[i], NULL, 10, &numTiles))
|
||||
FATAL_ERROR("Failed to parse number of tiles.\n");
|
||||
|
||||
if (numTiles < 1)
|
||||
FATAL_ERROR("Number of tiles must be positive.\n");
|
||||
} else {
|
||||
FATAL_ERROR("Unrecognized option \"%s\".\n", option);
|
||||
}
|
||||
}
|
||||
|
||||
ConvertFromPng(imageFilePath, outputFilePath, numTiles, bitDepth);
|
||||
} else if (strcmp(command, "pal") == 0) {
|
||||
if (argc < 3)
|
||||
FATAL_ERROR("No palette file path arg.\n");
|
||||
|
||||
CHECK_PATH_LENGTH(argv[2]);
|
||||
|
||||
char paletteFilePath[GBAGFX_MAX_PATH + 1];
|
||||
strcpy(paletteFilePath, argv[2]);
|
||||
|
||||
ConvertToJascPalette(paletteFilePath);
|
||||
} else if (strcmp(command, "gbapal") == 0) {
|
||||
if (argc < 3)
|
||||
FATAL_ERROR("No palette file path arg.\n");
|
||||
|
||||
CHECK_PATH_LENGTH(argv[2]);
|
||||
|
||||
char paletteFilePath[GBAGFX_MAX_PATH + 1];
|
||||
strcpy(paletteFilePath, argv[2]);
|
||||
|
||||
ConvertFromJascPalette(paletteFilePath);
|
||||
} else if (strcmp(command, "lz") == 0) {
|
||||
if (argc < 3)
|
||||
FATAL_ERROR("No file path arg.\n");
|
||||
|
||||
CHECK_PATH_LENGTH(argv[2]);
|
||||
|
||||
char path[GBAGFX_MAX_PATH + 1];
|
||||
strcpy(path, argv[2]);
|
||||
|
||||
LZCompressFile(path);
|
||||
} else if (strcmp(command, "unlz") == 0) {
|
||||
if (argc < 3)
|
||||
FATAL_ERROR("No file path arg.\n");
|
||||
|
||||
CHECK_PATH_LENGTH(argv[2]);
|
||||
|
||||
char path[GBAGFX_MAX_PATH + 1];
|
||||
strcpy(path, argv[2]);
|
||||
|
||||
LZDecompressFile(path);
|
||||
} else {
|
||||
FATAL_ERROR("Unrecognized command \"%s\".\n", command);
|
||||
}
|
||||
|
||||
return 0;
|
||||
FATAL_ERROR("Don't know how to convert \"%s\" to \"%s\".\n", inputPath, outputPath);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user