First init.
This commit is contained in:
179
libraries/mcu-renderer/tools/fontconv/main.cpp
Normal file
179
libraries/mcu-renderer/tools/fontconv/main.cpp
Normal file
@@ -0,0 +1,179 @@
|
||||
/*
|
||||
* MCU renderer fontconv
|
||||
* Main module
|
||||
*
|
||||
* (C) 2023 Gissio
|
||||
*
|
||||
* License: MIT
|
||||
*/
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <set>
|
||||
|
||||
#include "encode.h"
|
||||
#include "export.h"
|
||||
#include "import_bdf.h"
|
||||
#include "import_freetype.h"
|
||||
#include "utils.h"
|
||||
|
||||
#define DEFAULT_POINT_SIZE 12
|
||||
#define DEFAULT_BITS_PER_PIXEL 4
|
||||
|
||||
using namespace std;
|
||||
|
||||
void printHelp(void)
|
||||
{
|
||||
cout << "fontconv [options] input-file output-file\n"
|
||||
<< "-h Display this help.\n"
|
||||
<< "-p <size> Set point size for rasterizing fonts (default: " << DEFAULT_POINT_SIZE << ").\n"
|
||||
<< "-b <size> Set bits per pixel (default: " << DEFAULT_BITS_PER_PIXEL << ").\n"
|
||||
<< "-s <subset> Specify a subset of Unicode characters to convert.\n"
|
||||
<< "-c <size> Override the font cap height.\n"
|
||||
<< "-a <size> Override the font ascent (baseline to top of line).\n"
|
||||
<< "-d <size> Override the font descent (bottom of line to baseline).\n"
|
||||
<< "-n <name> Override the C-language font variable name.\n"
|
||||
<< "\n"
|
||||
<< "example:\n"
|
||||
<< " -s 32-255 select Unicode characters 32 to 255.\n"
|
||||
<< " -s 0x2e,0x30-0x39 select space and digit characters.\n";
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
// Parse command line
|
||||
|
||||
vector<string> args(argv + 1, argv + argc);
|
||||
|
||||
string charcodes;
|
||||
uint32_t pointSize = DEFAULT_POINT_SIZE;
|
||||
uint32_t pixelBitNum = DEFAULT_BITS_PER_PIXEL;
|
||||
int32_t overrideCapHeight = INT_MIN;
|
||||
int32_t overrideAscent = INT_MIN;
|
||||
int32_t overrideDescent = INT_MIN;
|
||||
string variableName;
|
||||
string inputFilename;
|
||||
string outputFilename;
|
||||
|
||||
for (uint32_t i = 0; i < args.size(); i++)
|
||||
{
|
||||
if (args[i].compare("-h") == 0)
|
||||
printHelp();
|
||||
else if (args[i].compare("-p") == 0)
|
||||
{
|
||||
i++;
|
||||
|
||||
if (i < args.size())
|
||||
{
|
||||
int32_t value = stoi(args[i]);
|
||||
|
||||
if ((value >= 1) && (value <= 512))
|
||||
pointSize = value;
|
||||
}
|
||||
}
|
||||
else if (args[i].compare("-b") == 0)
|
||||
{
|
||||
i++;
|
||||
|
||||
if (i < args.size())
|
||||
{
|
||||
int32_t value = stoi(args[i]);
|
||||
|
||||
if ((value >= 1) &&
|
||||
(value <= 8))
|
||||
pixelBitNum = value;
|
||||
}
|
||||
}
|
||||
else if (args[i].compare("-s") == 0)
|
||||
{
|
||||
i++;
|
||||
|
||||
if (i < args.size())
|
||||
charcodes = args[i];
|
||||
}
|
||||
else if (args[i].compare("-c") == 0)
|
||||
{
|
||||
i++;
|
||||
|
||||
if (i < args.size())
|
||||
overrideCapHeight = stoi(args[i]);
|
||||
}
|
||||
else if (args[i].compare("-a") == 0)
|
||||
{
|
||||
i++;
|
||||
|
||||
if (i < args.size())
|
||||
overrideAscent = stoi(args[i]);
|
||||
}
|
||||
else if (args[i].compare("-d") == 0)
|
||||
{
|
||||
i++;
|
||||
|
||||
if (i < args.size())
|
||||
overrideDescent = stoi(args[i]);
|
||||
}
|
||||
else if (args[i].compare("-n") == 0)
|
||||
{
|
||||
i++;
|
||||
|
||||
if (i < args.size())
|
||||
variableName = args[i];
|
||||
}
|
||||
else if (inputFilename == "")
|
||||
inputFilename = args[i];
|
||||
else if (outputFilename == "")
|
||||
outputFilename = args[i];
|
||||
else
|
||||
printHelp();
|
||||
}
|
||||
|
||||
if ((inputFilename == "") || (outputFilename == ""))
|
||||
printHelp();
|
||||
|
||||
// Process font
|
||||
|
||||
try
|
||||
{
|
||||
Font font;
|
||||
|
||||
set<Charcode> charcodeSet = parseCharcodes(charcodes);
|
||||
|
||||
if (to_lower(inputFilename).ends_with(".bdf"))
|
||||
{
|
||||
font = loadBDFFont(inputFilename,
|
||||
charcodeSet);
|
||||
|
||||
pixelBitNum = 1;
|
||||
}
|
||||
else
|
||||
font = loadFreeTypeFont(inputFilename,
|
||||
charcodeSet,
|
||||
pointSize);
|
||||
|
||||
if (overrideCapHeight != INT_MIN)
|
||||
font.capHeight = overrideCapHeight;
|
||||
if (overrideAscent != INT_MIN)
|
||||
font.ascent = overrideAscent;
|
||||
if (overrideDescent != INT_MIN)
|
||||
font.descent = overrideDescent;
|
||||
|
||||
BitWriter encodedFont;
|
||||
encodeFont(font,
|
||||
pixelBitNum,
|
||||
encodedFont);
|
||||
|
||||
exportFont(font,
|
||||
variableName,
|
||||
charcodes,
|
||||
encodedFont.data,
|
||||
outputFilename);
|
||||
}
|
||||
catch (runtime_error &e)
|
||||
{
|
||||
cerr << "error: " << e.what() << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user