| #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, "r"); |
| |
| 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 |