blob: acdeeb1a4661923569b07479a00b16361cb44b79 [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