blob: 32ed66e96e76fac8b238e016f8bb75125afd6faf [file] [log] [blame]
#ifdef TESTING
#else
#include "font.h"
#include "font_arguments.hpp"
#include "include/core/SkData.h"
#include "include/core/SkFontMgr.h"
#include "include/core/SkStream.h"
#include "include/core/SkTypeface.h"
#include <vector>
static std::vector<char> readFile(const char path[])
{
FILE* fp = fopen(path, "rb");
if (fp == nullptr)
{
fclose(fp);
std::ostringstream errorStream;
errorStream << "Failed to open file " << path;
throw std::invalid_argument(errorStream.str());
}
fseek(fp, 0, SEEK_END);
size_t length = ftell(fp);
fseek(fp, 0, SEEK_SET);
std::vector<char> data;
data.resize(length);
if (fread(data.data(), 1, length, fp) != length)
{
fclose(fp);
std::ostringstream errorStream;
errorStream << "Failed to read file into bytes array " << path;
throw std::invalid_argument(errorStream.str());
}
fclose(fp);
return data;
}
static void writeFile(const char path[], const void* bytes, size_t length)
{
FILE* pFile = fopen(path, "wb");
fwrite(bytes, sizeof(char), length, pFile);
fclose(pFile);
}
static std::vector<char> build_default_charset()
{
std::vector<char> charset;
for (int i = 32; i < 127; ++i)
{
charset.push_back(i);
}
return charset;
}
int main(int argc, const char* argv[])
{
try
{
FontArguments args(argc, argv);
sk_sp<SkTypeface> typeface;
auto src = readFile(args.source().c_str());
auto srcData = SkData::MakeWithCopy(src.data(), src.size());
typeface = SkTypeface::MakeFromData(srcData);
if (!typeface)
{
fprintf(stderr, "Failed to convert file to SkTypeface\n");
return 1;
}
std::vector<char> charset;
auto charsetFile = args.charset();
if (charsetFile.size() > 0)
{
charset = readFile(args.charset().c_str());
}
else
{
charset = build_default_charset();
}
RiveFont font;
font.load(typeface, charset.data(), charset.size());
auto dst = font.encode();
writeFile(args.destination().c_str(), dst->data(), dst->size());
}
catch (const args::Completion& e)
{
return 0;
}
catch (const args::Help&)
{
return 0;
}
catch (const args::ParseError& e)
{
return 1;
}
catch (args::ValidationError e)
{
return 1;
}
return 0;
}
#endif