1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2014 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci// Running create_test_font generates ./tools/fonts/test_font_index.inc 9cb93a386Sopenharmony_ci// and ./tools/fonts/test_font_<generic name>.inc which are read by 10cb93a386Sopenharmony_ci// ./tools/fonts/TestFontMgr.cpp 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ci#include "include/core/SkFont.h" 13cb93a386Sopenharmony_ci#include "include/core/SkFontMetrics.h" 14cb93a386Sopenharmony_ci#include "include/core/SkFontStyle.h" 15cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 16cb93a386Sopenharmony_ci#include "include/core/SkSpan.h" 17cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 18cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 19cb93a386Sopenharmony_ci#include "include/private/SkTArray.h" 20cb93a386Sopenharmony_ci#include "src/core/SkOSFile.h" 21cb93a386Sopenharmony_ci#include "src/core/SkPathPriv.h" 22cb93a386Sopenharmony_ci#include "src/utils/SkOSPath.h" 23cb93a386Sopenharmony_ci#include "src/utils/SkUTF.h" 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci#include <stdio.h> 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_cinamespace { 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_cistruct NamedFontStyle { 30cb93a386Sopenharmony_ci char const * const fName; 31cb93a386Sopenharmony_ci char const * const fIdentifierName; 32cb93a386Sopenharmony_ci SkFontStyle const fStyle; 33cb93a386Sopenharmony_ci}; 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_cistruct FontDesc { 36cb93a386Sopenharmony_ci NamedFontStyle const fNamedStyle; 37cb93a386Sopenharmony_ci char const * const fFile; 38cb93a386Sopenharmony_ci}; 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_cistruct FontFamilyDesc { 41cb93a386Sopenharmony_ci char const * const fGenericName; 42cb93a386Sopenharmony_ci char const * const fFamilyName; 43cb93a386Sopenharmony_ci char const * const fIdentifierName; 44cb93a386Sopenharmony_ci SkSpan<const FontDesc> const fFonts; 45cb93a386Sopenharmony_ci}; 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci} // namespace 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_cistatic FILE* font_header(const char* family) { 50cb93a386Sopenharmony_ci SkString outPath(SkOSPath::Join(".", "tools")); 51cb93a386Sopenharmony_ci outPath = SkOSPath::Join(outPath.c_str(), "fonts"); 52cb93a386Sopenharmony_ci outPath = SkOSPath::Join(outPath.c_str(), "test_font_"); 53cb93a386Sopenharmony_ci SkString fam(family); 54cb93a386Sopenharmony_ci do { 55cb93a386Sopenharmony_ci int dashIndex = fam.find("-"); 56cb93a386Sopenharmony_ci if (dashIndex < 0) { 57cb93a386Sopenharmony_ci break; 58cb93a386Sopenharmony_ci } 59cb93a386Sopenharmony_ci fam.writable_str()[dashIndex] = '_'; 60cb93a386Sopenharmony_ci } while (true); 61cb93a386Sopenharmony_ci outPath.append(fam); 62cb93a386Sopenharmony_ci outPath.append(".inc"); 63cb93a386Sopenharmony_ci FILE* out = fopen(outPath.c_str(), "w"); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci static const char kHeader[] = 66cb93a386Sopenharmony_ci "/*\n" 67cb93a386Sopenharmony_ci " * Copyright 2015 Google Inc.\n" 68cb93a386Sopenharmony_ci " *\n" 69cb93a386Sopenharmony_ci " * Use of this source code is governed by a BSD-style license that can be\n" 70cb93a386Sopenharmony_ci " * found in the LICENSE file.\n" 71cb93a386Sopenharmony_ci " */\n" 72cb93a386Sopenharmony_ci "\n" 73cb93a386Sopenharmony_ci "// Auto-generated by "; 74cb93a386Sopenharmony_ci fprintf(out, "%s%s\n\n", kHeader, SkOSPath::Basename(__FILE__).c_str()); 75cb93a386Sopenharmony_ci return out; 76cb93a386Sopenharmony_ci} 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_cienum { 79cb93a386Sopenharmony_ci kMaxLineLength = 80, 80cb93a386Sopenharmony_ci}; 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_cistatic ptrdiff_t last_line_length(const SkString& str) { 83cb93a386Sopenharmony_ci const char* first = str.c_str(); 84cb93a386Sopenharmony_ci const char* last = first + str.size(); 85cb93a386Sopenharmony_ci const char* ptr = last; 86cb93a386Sopenharmony_ci while (ptr > first && *--ptr != '\n') 87cb93a386Sopenharmony_ci ; 88cb93a386Sopenharmony_ci return last - ptr - 1; 89cb93a386Sopenharmony_ci} 90cb93a386Sopenharmony_ci 91cb93a386Sopenharmony_cistatic void output_fixed(SkScalar num, int emSize, SkString* out) { 92cb93a386Sopenharmony_ci int hex = (int) (num * 65536 / emSize); 93cb93a386Sopenharmony_ci out->appendf("0x%08x,", hex); 94cb93a386Sopenharmony_ci *out += (int) last_line_length(*out) >= kMaxLineLength ? '\n' : ' '; 95cb93a386Sopenharmony_ci} 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_cistatic void output_scalar(SkScalar num, int emSize, SkString* out) { 98cb93a386Sopenharmony_ci num /= emSize; 99cb93a386Sopenharmony_ci if (num == (int) num) { 100cb93a386Sopenharmony_ci out->appendS32((int) num); 101cb93a386Sopenharmony_ci } else { 102cb93a386Sopenharmony_ci SkString str; 103cb93a386Sopenharmony_ci str.printf("%1.6g", num); 104cb93a386Sopenharmony_ci int width = (int) str.size(); 105cb93a386Sopenharmony_ci const char* cStr = str.c_str(); 106cb93a386Sopenharmony_ci while (cStr[width - 1] == '0') { 107cb93a386Sopenharmony_ci --width; 108cb93a386Sopenharmony_ci } 109cb93a386Sopenharmony_ci str.remove(width, str.size() - width); 110cb93a386Sopenharmony_ci out->appendf("%sf", str.c_str()); 111cb93a386Sopenharmony_ci } 112cb93a386Sopenharmony_ci *out += ','; 113cb93a386Sopenharmony_ci *out += (int) last_line_length(*out) >= kMaxLineLength ? '\n' : ' '; 114cb93a386Sopenharmony_ci} 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_cistatic int output_points(const SkPoint* pts, int emSize, int count, SkString* ptsOut) { 117cb93a386Sopenharmony_ci for (int index = 0; index < count; ++index) { 118cb93a386Sopenharmony_ci output_scalar(pts[index].fX, emSize, ptsOut); 119cb93a386Sopenharmony_ci output_scalar(pts[index].fY, emSize, ptsOut); 120cb93a386Sopenharmony_ci } 121cb93a386Sopenharmony_ci return count; 122cb93a386Sopenharmony_ci} 123cb93a386Sopenharmony_ci 124cb93a386Sopenharmony_cistatic void output_path_data(const SkFont& font, 125cb93a386Sopenharmony_ci int emSize, SkString* ptsOut, SkTDArray<SkPath::Verb>* verbs, 126cb93a386Sopenharmony_ci SkTDArray<unsigned>* charCodes, SkTDArray<SkScalar>* widths) { 127cb93a386Sopenharmony_ci for (SkUnichar index = 0x00; index < 0x7f; ++index) { 128cb93a386Sopenharmony_ci uint16_t glyphID = font.unicharToGlyph(index); 129cb93a386Sopenharmony_ci SkPath path; 130cb93a386Sopenharmony_ci font.getPath(glyphID, &path); 131cb93a386Sopenharmony_ci for (auto [verb, pts, w] : SkPathPriv::Iterate(path)) { 132cb93a386Sopenharmony_ci *verbs->append() = (SkPath::Verb)verb; 133cb93a386Sopenharmony_ci switch (verb) { 134cb93a386Sopenharmony_ci case SkPathVerb::kMove: 135cb93a386Sopenharmony_ci output_points(&pts[0], emSize, 1, ptsOut); 136cb93a386Sopenharmony_ci break; 137cb93a386Sopenharmony_ci case SkPathVerb::kLine: 138cb93a386Sopenharmony_ci output_points(&pts[1], emSize, 1, ptsOut); 139cb93a386Sopenharmony_ci break; 140cb93a386Sopenharmony_ci case SkPathVerb::kQuad: 141cb93a386Sopenharmony_ci output_points(&pts[1], emSize, 2, ptsOut); 142cb93a386Sopenharmony_ci break; 143cb93a386Sopenharmony_ci case SkPathVerb::kCubic: 144cb93a386Sopenharmony_ci output_points(&pts[1], emSize, 3, ptsOut); 145cb93a386Sopenharmony_ci break; 146cb93a386Sopenharmony_ci case SkPathVerb::kClose: 147cb93a386Sopenharmony_ci break; 148cb93a386Sopenharmony_ci default: 149cb93a386Sopenharmony_ci SkDEBUGFAIL("bad verb"); 150cb93a386Sopenharmony_ci SkASSERT(0); 151cb93a386Sopenharmony_ci } 152cb93a386Sopenharmony_ci } 153cb93a386Sopenharmony_ci *verbs->append() = SkPath::kDone_Verb; 154cb93a386Sopenharmony_ci *charCodes->append() = index; 155cb93a386Sopenharmony_ci SkScalar width; 156cb93a386Sopenharmony_ci font.getWidths(&glyphID, 1, &width); 157cb93a386Sopenharmony_ci // SkASSERT(floor(width) == width); // not true for Hiragino Maru Gothic Pro 158cb93a386Sopenharmony_ci *widths->append() = width; 159cb93a386Sopenharmony_ci if (0 == index) { 160cb93a386Sopenharmony_ci index = 0x1f; // skip the rest of the control codes 161cb93a386Sopenharmony_ci } 162cb93a386Sopenharmony_ci } 163cb93a386Sopenharmony_ci} 164cb93a386Sopenharmony_ci 165cb93a386Sopenharmony_cistatic int offset_str_len(unsigned num) { 166cb93a386Sopenharmony_ci if (num == (unsigned) -1) { 167cb93a386Sopenharmony_ci return 10; 168cb93a386Sopenharmony_ci } 169cb93a386Sopenharmony_ci unsigned result = 1; 170cb93a386Sopenharmony_ci unsigned ref = 10; 171cb93a386Sopenharmony_ci while (ref <= num) { 172cb93a386Sopenharmony_ci ++result; 173cb93a386Sopenharmony_ci ref *= 10; 174cb93a386Sopenharmony_ci } 175cb93a386Sopenharmony_ci return result; 176cb93a386Sopenharmony_ci} 177cb93a386Sopenharmony_ci 178cb93a386Sopenharmony_cistatic SkString strip_final(const SkString& str) { 179cb93a386Sopenharmony_ci SkString result(str); 180cb93a386Sopenharmony_ci if (result.endsWith("\n")) { 181cb93a386Sopenharmony_ci result.remove(result.size() - 1, 1); 182cb93a386Sopenharmony_ci } 183cb93a386Sopenharmony_ci if (result.endsWith(" ")) { 184cb93a386Sopenharmony_ci result.remove(result.size() - 1, 1); 185cb93a386Sopenharmony_ci } 186cb93a386Sopenharmony_ci if (result.endsWith(",")) { 187cb93a386Sopenharmony_ci result.remove(result.size() - 1, 1); 188cb93a386Sopenharmony_ci } 189cb93a386Sopenharmony_ci return result; 190cb93a386Sopenharmony_ci} 191cb93a386Sopenharmony_ci 192cb93a386Sopenharmony_cistatic void output_font(sk_sp<SkTypeface> face, const char* identifier, FILE* out) { 193cb93a386Sopenharmony_ci const int emSize = face->getUnitsPerEm() * 2; 194cb93a386Sopenharmony_ci SkFont font; 195cb93a386Sopenharmony_ci font.setEdging(SkFont::Edging::kAntiAlias); 196cb93a386Sopenharmony_ci font.setSize(emSize); 197cb93a386Sopenharmony_ci font.setTypeface(std::move(face)); 198cb93a386Sopenharmony_ci 199cb93a386Sopenharmony_ci SkTDArray<SkPath::Verb> verbs; 200cb93a386Sopenharmony_ci SkTDArray<unsigned> charCodes; 201cb93a386Sopenharmony_ci SkTDArray<SkScalar> widths; 202cb93a386Sopenharmony_ci SkString ptsOut; 203cb93a386Sopenharmony_ci output_path_data(font, emSize, &ptsOut, &verbs, &charCodes, &widths); 204cb93a386Sopenharmony_ci fprintf(out, "const SkScalar %sPoints[] = {\n", identifier); 205cb93a386Sopenharmony_ci ptsOut = strip_final(ptsOut); 206cb93a386Sopenharmony_ci fprintf(out, "%s", ptsOut.c_str()); 207cb93a386Sopenharmony_ci fprintf(out, "\n};\n\n"); 208cb93a386Sopenharmony_ci fprintf(out, "const unsigned char %sVerbs[] = {\n", identifier); 209cb93a386Sopenharmony_ci int verbCount = verbs.count(); 210cb93a386Sopenharmony_ci int outChCount = 0; 211cb93a386Sopenharmony_ci for (int index = 0; index < verbCount;) { 212cb93a386Sopenharmony_ci SkPath::Verb verb = verbs[index]; 213cb93a386Sopenharmony_ci SkASSERT(verb >= SkPath::kMove_Verb && verb <= SkPath::kDone_Verb); 214cb93a386Sopenharmony_ci SkASSERT(SkTFitsIn<uint8_t>(verb)); 215cb93a386Sopenharmony_ci fprintf(out, "%u", verb); 216cb93a386Sopenharmony_ci if (++index < verbCount) { 217cb93a386Sopenharmony_ci outChCount += 3; 218cb93a386Sopenharmony_ci fprintf(out, "%c", ','); 219cb93a386Sopenharmony_ci if (outChCount >= kMaxLineLength) { 220cb93a386Sopenharmony_ci outChCount = 0; 221cb93a386Sopenharmony_ci fprintf(out, "%c", '\n'); 222cb93a386Sopenharmony_ci } else { 223cb93a386Sopenharmony_ci fprintf(out, "%c", ' '); 224cb93a386Sopenharmony_ci } 225cb93a386Sopenharmony_ci } 226cb93a386Sopenharmony_ci } 227cb93a386Sopenharmony_ci fprintf(out, "\n};\n\n"); 228cb93a386Sopenharmony_ci 229cb93a386Sopenharmony_ci // all fonts are now 0x00, 0x20 - 0xFE 230cb93a386Sopenharmony_ci // don't need to generate or output character codes? 231cb93a386Sopenharmony_ci fprintf(out, "const SkUnichar %sCharCodes[] = {\n", identifier); 232cb93a386Sopenharmony_ci int offsetCount = charCodes.count(); 233cb93a386Sopenharmony_ci for (int index = 0; index < offsetCount;) { 234cb93a386Sopenharmony_ci unsigned offset = charCodes[index]; 235cb93a386Sopenharmony_ci fprintf(out, "%u", offset); 236cb93a386Sopenharmony_ci if (++index < offsetCount) { 237cb93a386Sopenharmony_ci outChCount += offset_str_len(offset) + 2; 238cb93a386Sopenharmony_ci fprintf(out, "%c", ','); 239cb93a386Sopenharmony_ci if (outChCount >= kMaxLineLength) { 240cb93a386Sopenharmony_ci outChCount = 0; 241cb93a386Sopenharmony_ci fprintf(out, "%c", '\n'); 242cb93a386Sopenharmony_ci } else { 243cb93a386Sopenharmony_ci fprintf(out, "%c", ' '); 244cb93a386Sopenharmony_ci } 245cb93a386Sopenharmony_ci } 246cb93a386Sopenharmony_ci } 247cb93a386Sopenharmony_ci fprintf(out, "\n};\n\n"); 248cb93a386Sopenharmony_ci 249cb93a386Sopenharmony_ci SkString widthsStr; 250cb93a386Sopenharmony_ci fprintf(out, "const SkFixed %sWidths[] = {\n", identifier); 251cb93a386Sopenharmony_ci for (int index = 0; index < offsetCount; ++index) { 252cb93a386Sopenharmony_ci output_fixed(widths[index], emSize, &widthsStr); 253cb93a386Sopenharmony_ci } 254cb93a386Sopenharmony_ci widthsStr = strip_final(widthsStr); 255cb93a386Sopenharmony_ci fprintf(out, "%s\n};\n\n", widthsStr.c_str()); 256cb93a386Sopenharmony_ci 257cb93a386Sopenharmony_ci fprintf(out, "const size_t %sCharCodesCount = SK_ARRAY_COUNT(%sCharCodes);\n\n", 258cb93a386Sopenharmony_ci identifier, identifier); 259cb93a386Sopenharmony_ci 260cb93a386Sopenharmony_ci SkFontMetrics metrics; 261cb93a386Sopenharmony_ci font.getMetrics(&metrics); 262cb93a386Sopenharmony_ci fprintf(out, "const SkFontMetrics %sMetrics = {\n", identifier); 263cb93a386Sopenharmony_ci SkString metricsStr; 264cb93a386Sopenharmony_ci metricsStr.printf("0x%08x, ", metrics.fFlags); 265cb93a386Sopenharmony_ci output_scalar(metrics.fTop, emSize, &metricsStr); 266cb93a386Sopenharmony_ci output_scalar(metrics.fAscent, emSize, &metricsStr); 267cb93a386Sopenharmony_ci output_scalar(metrics.fDescent, emSize, &metricsStr); 268cb93a386Sopenharmony_ci output_scalar(metrics.fBottom, emSize, &metricsStr); 269cb93a386Sopenharmony_ci output_scalar(metrics.fLeading, emSize, &metricsStr); 270cb93a386Sopenharmony_ci output_scalar(metrics.fAvgCharWidth, emSize, &metricsStr); 271cb93a386Sopenharmony_ci output_scalar(metrics.fMaxCharWidth, emSize, &metricsStr); 272cb93a386Sopenharmony_ci output_scalar(metrics.fXMin, emSize, &metricsStr); 273cb93a386Sopenharmony_ci output_scalar(metrics.fXMax, emSize, &metricsStr); 274cb93a386Sopenharmony_ci output_scalar(metrics.fXHeight, emSize, &metricsStr); 275cb93a386Sopenharmony_ci output_scalar(metrics.fCapHeight, emSize, &metricsStr); 276cb93a386Sopenharmony_ci output_scalar(metrics.fUnderlineThickness, emSize, &metricsStr); 277cb93a386Sopenharmony_ci output_scalar(metrics.fUnderlinePosition, emSize, &metricsStr); 278cb93a386Sopenharmony_ci output_scalar(metrics.fStrikeoutThickness, emSize, &metricsStr); 279cb93a386Sopenharmony_ci output_scalar(metrics.fStrikeoutPosition, emSize, &metricsStr); 280cb93a386Sopenharmony_ci metricsStr = strip_final(metricsStr); 281cb93a386Sopenharmony_ci fprintf(out, "%s\n};\n\n", metricsStr.c_str()); 282cb93a386Sopenharmony_ci} 283cb93a386Sopenharmony_ci 284cb93a386Sopenharmony_cistatic SkString identifier(const FontFamilyDesc& family, const FontDesc& font) { 285cb93a386Sopenharmony_ci SkString id(family.fIdentifierName); 286cb93a386Sopenharmony_ci id.append(font.fNamedStyle.fIdentifierName); 287cb93a386Sopenharmony_ci return id; 288cb93a386Sopenharmony_ci} 289cb93a386Sopenharmony_ci 290cb93a386Sopenharmony_cistatic void generate_fonts(const char* basepath, const SkSpan<const FontFamilyDesc>& families) { 291cb93a386Sopenharmony_ci FILE* out = nullptr; 292cb93a386Sopenharmony_ci for (const FontFamilyDesc& family : families) { 293cb93a386Sopenharmony_ci out = font_header(family.fGenericName); 294cb93a386Sopenharmony_ci for (const FontDesc& font : family.fFonts) { 295cb93a386Sopenharmony_ci SkString filepath(SkOSPath::Join(basepath, font.fFile)); 296cb93a386Sopenharmony_ci SkASSERTF(sk_exists(filepath.c_str()), "The file %s does not exist.", filepath.c_str()); 297cb93a386Sopenharmony_ci sk_sp<SkTypeface> resourceTypeface = SkTypeface::MakeFromFile(filepath.c_str()); 298cb93a386Sopenharmony_ci SkASSERTF(resourceTypeface, "The file %s is not a font.", filepath.c_str()); 299cb93a386Sopenharmony_ci output_font(std::move(resourceTypeface), identifier(family, font).c_str(), out); 300cb93a386Sopenharmony_ci } 301cb93a386Sopenharmony_ci fclose(out); 302cb93a386Sopenharmony_ci } 303cb93a386Sopenharmony_ci} 304cb93a386Sopenharmony_ci 305cb93a386Sopenharmony_cistatic const char* slant_to_string(SkFontStyle::Slant slant) { 306cb93a386Sopenharmony_ci switch (slant) { 307cb93a386Sopenharmony_ci case SkFontStyle::kUpright_Slant: return "SkFontStyle::kUpright_Slant"; 308cb93a386Sopenharmony_ci case SkFontStyle::kItalic_Slant : return "SkFontStyle::kItalic_Slant" ; 309cb93a386Sopenharmony_ci case SkFontStyle::kOblique_Slant: return "SkFontStyle::kOblique_Slant"; 310cb93a386Sopenharmony_ci default: SK_ABORT("Unknown slant"); 311cb93a386Sopenharmony_ci } 312cb93a386Sopenharmony_ci} 313cb93a386Sopenharmony_ci 314cb93a386Sopenharmony_cistatic void generate_index(const SkSpan<const FontFamilyDesc>& families, 315cb93a386Sopenharmony_ci const FontDesc* defaultFont) 316cb93a386Sopenharmony_ci{ 317cb93a386Sopenharmony_ci FILE* out = font_header("index"); 318cb93a386Sopenharmony_ci fprintf(out, "static SkTestFontData gTestFonts[] = {\n"); 319cb93a386Sopenharmony_ci for (const FontFamilyDesc& family : families) { 320cb93a386Sopenharmony_ci for (const FontDesc& font : family.fFonts) { 321cb93a386Sopenharmony_ci SkString identifierStr = identifier(family, font); 322cb93a386Sopenharmony_ci const char* identifier = identifierStr.c_str(); 323cb93a386Sopenharmony_ci const SkFontStyle& style = font.fNamedStyle.fStyle; 324cb93a386Sopenharmony_ci fprintf(out, 325cb93a386Sopenharmony_ci " { %sPoints, %sVerbs,\n" 326cb93a386Sopenharmony_ci " %sCharCodes, %sCharCodesCount, %sWidths,\n" 327cb93a386Sopenharmony_ci " %sMetrics, \"Toy %s\", SkFontStyle(%d,%d,%s)\n" 328cb93a386Sopenharmony_ci " },\n", 329cb93a386Sopenharmony_ci identifier, identifier, 330cb93a386Sopenharmony_ci identifier, identifier, identifier, 331cb93a386Sopenharmony_ci identifier, family.fFamilyName, 332cb93a386Sopenharmony_ci style.weight(), style.width(), slant_to_string(style.slant())); 333cb93a386Sopenharmony_ci } 334cb93a386Sopenharmony_ci } 335cb93a386Sopenharmony_ci fprintf(out, "};\n\n"); 336cb93a386Sopenharmony_ci fprintf(out, 337cb93a386Sopenharmony_ci "struct SubFont {\n" 338cb93a386Sopenharmony_ci " const char* fFamilyName;\n" 339cb93a386Sopenharmony_ci " const char* fStyleName;\n" 340cb93a386Sopenharmony_ci " SkFontStyle fStyle;\n" 341cb93a386Sopenharmony_ci " SkTestFontData& fFont;\n" 342cb93a386Sopenharmony_ci " const char* fFile;\n" 343cb93a386Sopenharmony_ci "};\n\n" 344cb93a386Sopenharmony_ci "const SubFont gSubFonts[] = {\n"); 345cb93a386Sopenharmony_ci int defaultIndex = -1; 346cb93a386Sopenharmony_ci int testFontsIndex = 0; 347cb93a386Sopenharmony_ci for (const FontFamilyDesc& family : families) { 348cb93a386Sopenharmony_ci for (const FontDesc& font : family.fFonts) { 349cb93a386Sopenharmony_ci if (&font == defaultFont) { 350cb93a386Sopenharmony_ci defaultIndex = testFontsIndex; 351cb93a386Sopenharmony_ci } 352cb93a386Sopenharmony_ci const SkFontStyle& style = font.fNamedStyle.fStyle; 353cb93a386Sopenharmony_ci fprintf(out, 354cb93a386Sopenharmony_ci " { \"%s\", \"%s\", SkFontStyle(%d,%d,%s), gTestFonts[%d], \"%s\" },\n", 355cb93a386Sopenharmony_ci family.fGenericName, font.fNamedStyle.fName, 356cb93a386Sopenharmony_ci style.weight(), style.width(), slant_to_string(style.slant()), 357cb93a386Sopenharmony_ci testFontsIndex, font.fFile); 358cb93a386Sopenharmony_ci testFontsIndex++; 359cb93a386Sopenharmony_ci } 360cb93a386Sopenharmony_ci } 361cb93a386Sopenharmony_ci testFontsIndex = 0; 362cb93a386Sopenharmony_ci for (const FontFamilyDesc& family : families) { 363cb93a386Sopenharmony_ci for (const FontDesc& font : family.fFonts) { 364cb93a386Sopenharmony_ci fprintf(out, 365cb93a386Sopenharmony_ci " { \"Toy %s\", \"%s\", SkFontStyle(%d,%d,%s), gTestFonts[%d], \"%s\" },\n", 366cb93a386Sopenharmony_ci family.fFamilyName, font.fNamedStyle.fName, 367cb93a386Sopenharmony_ci font.fNamedStyle.fStyle.weight(), font.fNamedStyle.fStyle.width(), 368cb93a386Sopenharmony_ci slant_to_string(font.fNamedStyle.fStyle.slant()), testFontsIndex, font.fFile); 369cb93a386Sopenharmony_ci testFontsIndex++; 370cb93a386Sopenharmony_ci } 371cb93a386Sopenharmony_ci } 372cb93a386Sopenharmony_ci fprintf(out, "};\n\n"); 373cb93a386Sopenharmony_ci SkASSERT(defaultIndex >= 0); 374cb93a386Sopenharmony_ci fprintf(out, "const size_t gDefaultFontIndex = %d;\n", defaultIndex); 375cb93a386Sopenharmony_ci fclose(out); 376cb93a386Sopenharmony_ci} 377cb93a386Sopenharmony_ci 378cb93a386Sopenharmony_ciint main(int , char * const []) { 379cb93a386Sopenharmony_ci constexpr NamedFontStyle normal = {"Normal", "Normal", SkFontStyle::Normal() }; 380cb93a386Sopenharmony_ci constexpr NamedFontStyle bold = {"Bold", "Bold", SkFontStyle::Bold() }; 381cb93a386Sopenharmony_ci constexpr NamedFontStyle italic = {"Italic", "Italic", SkFontStyle::Italic() }; 382cb93a386Sopenharmony_ci constexpr NamedFontStyle bolditalic = {"Bold Italic", "BoldItalic", SkFontStyle::BoldItalic()}; 383cb93a386Sopenharmony_ci 384cb93a386Sopenharmony_ci static constexpr FontDesc kMonoFonts[] = { 385cb93a386Sopenharmony_ci {normal, "LiberationMono-Regular.ttf"}, 386cb93a386Sopenharmony_ci {bold, "LiberationMono-Bold.ttf"}, 387cb93a386Sopenharmony_ci {italic, "LiberationMono-Italic.ttf"}, 388cb93a386Sopenharmony_ci {bolditalic, "LiberationMono-BoldItalic.ttf"}, 389cb93a386Sopenharmony_ci }; 390cb93a386Sopenharmony_ci 391cb93a386Sopenharmony_ci static constexpr FontDesc kSansFonts[] = { 392cb93a386Sopenharmony_ci {normal, "LiberationSans-Regular.ttf"}, 393cb93a386Sopenharmony_ci {bold, "LiberationSans-Bold.ttf"}, 394cb93a386Sopenharmony_ci {italic, "LiberationSans-Italic.ttf"}, 395cb93a386Sopenharmony_ci {bolditalic, "LiberationSans-BoldItalic.ttf"}, 396cb93a386Sopenharmony_ci }; 397cb93a386Sopenharmony_ci 398cb93a386Sopenharmony_ci static constexpr FontDesc kSerifFonts[] = { 399cb93a386Sopenharmony_ci {normal, "LiberationSerif-Regular.ttf"}, 400cb93a386Sopenharmony_ci {bold, "LiberationSerif-Bold.ttf"}, 401cb93a386Sopenharmony_ci {italic, "LiberationSerif-Italic.ttf"}, 402cb93a386Sopenharmony_ci {bolditalic, "LiberationSerif-BoldItalic.ttf"}, 403cb93a386Sopenharmony_ci }; 404cb93a386Sopenharmony_ci 405cb93a386Sopenharmony_ci static constexpr FontFamilyDesc kFamiliesData[] = { 406cb93a386Sopenharmony_ci {"monospace", "Liberation Mono", "LiberationMono", SkMakeSpan(kMonoFonts)}, 407cb93a386Sopenharmony_ci {"sans-serif", "Liberation Sans", "LiberationSans", SkMakeSpan(kSansFonts)}, 408cb93a386Sopenharmony_ci {"serif", "Liberation Serif", "LiberationSerif", SkMakeSpan(kSerifFonts)}, 409cb93a386Sopenharmony_ci }; 410cb93a386Sopenharmony_ci 411cb93a386Sopenharmony_ci static constexpr SkSpan<const FontFamilyDesc> kFamilies(SkMakeSpan(kFamiliesData)); 412cb93a386Sopenharmony_ci 413cb93a386Sopenharmony_ci#ifdef SK_BUILD_FOR_UNIX 414cb93a386Sopenharmony_ci generate_fonts("/usr/share/fonts/truetype/liberation/", kFamilies); 415cb93a386Sopenharmony_ci#else 416cb93a386Sopenharmony_ci generate_fonts("/Library/Fonts/", kFamilies); 417cb93a386Sopenharmony_ci#endif 418cb93a386Sopenharmony_ci generate_index(kFamilies, &kFamilies[1].fFonts[0]); 419cb93a386Sopenharmony_ci return 0; 420cb93a386Sopenharmony_ci} 421