png2asset: -use_metafile option to load args from <inputfile>.meta #802

- File not found is only a warning, not an error
- metafile args are processed after args and appended to logged output
- Split main arg processing function into a couple smaller ones
This commit is contained in:
bbbbbr
2025-12-01 15:25:39 -08:00
parent 12e4ebe22c
commit e4cee3cfb2
2 changed files with 106 additions and 12 deletions

View File

@@ -7,6 +7,8 @@
#include <fstream>
#include <cstdint>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include "lodepng.h"
#include "mttile.h"
@@ -25,11 +27,23 @@
#include "png_image.h"
#include "tiles.h"
#define ARG_SKIP_NONE 0
#define ARG_AT_INPUT_FILENAME 1
#define ARG_AFTER_INPUT_FILENAME 2
using namespace std;
static string str_remove_path(string str_in);
static void logArguments(int startIndex, int argc, const char* argv[], PNG2AssetArguments* args);
static void initArguments(PNG2AssetArguments* args);
static void showHelp(void);
static int processArguments(int startIndex, int argc, const char* argv[], PNG2AssetArguments* args);
static int handleMetaFileArgs(PNG2AssetArguments* args);
// Strip any leading path and slashes
string str_remove_path(string str_in) {
static string str_remove_path(string str_in) {
size_t slash_pos = str_in.find_last_of('/');
if (slash_pos != str_in.npos)
str_in = str_in.substr(slash_pos, str_in.length() - slash_pos);
@@ -41,7 +55,8 @@ string str_remove_path(string str_in) {
return str_in;
}
int processPNG2AssetArguments(int argc, char* argv[], PNG2AssetArguments* args) {
static void initArguments(PNG2AssetArguments* args) {
//default values for some params
args->spriteSize.width = 0;
@@ -98,9 +113,11 @@ int processPNG2AssetArguments(int argc, char* argv[], PNG2AssetArguments* args)
args->args_for_logging_to_output = "";
args->relative_paths = false;
args->use_metafile = false;
}
if(argc < 2)
{
void showHelp(void) {
printf("usage: png2asset <file>.png [options]\n");
printf("-o <filename> ouput file (if not used then default is <png file>.c)\n");
printf("-c <filename> deprecated, same as -o\n");
@@ -143,21 +160,23 @@ int processPNG2AssetArguments(int argc, char* argv[], PNG2AssetArguments* args)
printf("-transposed export transposed (column-by-column instead of row-by-row)\n");
printf("-rel_paths paths to tilesets are relative to the input file path\n");
return EXIT_SUCCESS;
}
printf("-use_metafile Read extra options from file <inputfile>.meta (file missing not an error)\n");
}
//default params
args->input_filename = argv[1];
args->output_filename = argv[1];
args->output_filename = args->output_filename.substr(0, args->output_filename.size() - 4) + ".c";
static void logArguments(int startIndex, int argc, const char* argv[], PNG2AssetArguments* args) {
// Save all args for logging into output files
for(int i = 1; i < argc; ++i) {
for (int i = startIndex; i < argc; ++i) {
args->args_for_logging_to_output.append(" ").append( str_remove_path((string)argv[i]) );
}
}
static int processArguments(int startIndex, int argc, const char* argv[], PNG2AssetArguments* args) {
//Parse argv
for(int i = 2; i < argc; ++i)
for (int i = startIndex; i < argc; ++i)
{
if(!strcmp(argv[i], "-sw"))
{
@@ -345,11 +364,85 @@ int processPNG2AssetArguments(int argc, char* argv[], PNG2AssetArguments* args)
else if(!strcmp(argv[i], "-rel_paths")) {
args->relative_paths = true;
}
else if(!strcmp(argv[i], "-use_metafile")) {
args->use_metafile = true;
}
else {
printf("Warning: Argument \"%s\" not recognized\n", argv[i]);
}
}
return EXIT_SUCCESS;
}
// Read in and process a set of arguments from a file named <inputfile>.meta
static int handleMetaFileArgs(PNG2AssetArguments* args) {
string fname = args->input_filename + ".meta";
ifstream metaFile(fname);
if ( metaFile )
{
static vector<string> argStrings;
static std::vector<char const*> metafile_argv; // Static for program scope, const to ensure c_str() pointers remain valid
// Read file contents
stringstream metaFileBuffer;
metaFileBuffer << metaFile.rdbuf();
metaFile.close();
// Split strings on spaces/newlines
string argEntry;
argStrings.clear();
while (metaFileBuffer >> argEntry) {
argStrings.push_back(argEntry);
}
// Build argv style array
int metafile_argc = static_cast<int>(argStrings.size());
metafile_argv.clear();
metafile_argv.reserve(metafile_argc + 1); // +1 for null terminator entry (optional with our usage)
for (const auto& s : argStrings) {
metafile_argv.push_back(s.c_str());
}
metafile_argv.push_back(nullptr);
// Append args to logged ones and then process them
logArguments(ARG_SKIP_NONE, metafile_argc, metafile_argv.data(), args);
if (processArguments(ARG_SKIP_NONE, metafile_argc, metafile_argv.data(), args) == EXIT_FAILURE)
return EXIT_FAILURE;
} else {
printf("Warning: -use_metafile specified but no meta file found at: %s\n", fname.c_str());
}
return EXIT_SUCCESS;
}
int processPNG2AssetArguments(int argc, char* argv[], PNG2AssetArguments* args) {
initArguments(args);
if (argc < 2) {
showHelp();
return EXIT_SUCCESS;
}
//default params
args->input_filename = argv[ARG_AT_INPUT_FILENAME];
args->output_filename = argv[ARG_AT_INPUT_FILENAME];
args->output_filename = args->output_filename.substr(0, args->output_filename.size() - 4) + ".c";
logArguments(ARG_AT_INPUT_FILENAME, argc, (const char **)argv, args);
if (processArguments(ARG_AFTER_INPUT_FILENAME, argc, (const char **)argv, args) == EXIT_FAILURE)
return EXIT_FAILURE;
if (args->use_metafile) {
if (handleMetaFileArgs(args) == EXIT_FAILURE)
return EXIT_FAILURE;
}
int slash_pos = (int)args->output_filename.find_last_of('/');
if(slash_pos == -1)
slash_pos = (int)args->output_filename.find_last_of('\\');

View File

@@ -56,6 +56,7 @@ struct PNG2AssetArguments {
bool use_structs;
bool flip_tiles;
bool relative_paths;
bool use_metafile;
int errorCode;
int bank;