Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Unified Diff: tools/create_test_font.cpp

Issue 407183003: add portable and canonical font support for DM (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: add atexit; rename to create_... Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/fonts/SkTestScalerContext.cpp ('k') | tools/sk_tool_utils.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/create_test_font.cpp
diff --git a/tools/create_test_font.cpp b/tools/create_test_font.cpp
index b0f70efaee7403938135ecb57cfc4b2ef3730fc0..f6cac0a2e5e0190ebf3a9050349ef65eb6d58258 100644
--- a/tools/create_test_font.cpp
+++ b/tools/create_test_font.cpp
@@ -5,28 +5,156 @@
* found in the LICENSE file.
*/
+// running create_test_font generates ./tools/test_font_data.cpp
+// which is read by ./tools/sk_tool_utils_font.cpp
+
+#include "Resources.h"
+#include "SkOSFile.h"
#include "SkPaint.h"
#include "SkPath.h"
#include "SkStream.h"
#include "SkTArray.h"
#include "SkTSort.h"
#include "SkTypeface.h"
+#include "SkUtils.h"
#include <stdio.h>
+// the folllowing include is generated by running dm with
+// --portableFonts --reportUsedChars
+#include "test_font_data_chars.cpp"
+
+#define DEFAULT_FONT_NAME "Liberation Sans"
+
+static struct FontDesc {
+ const char* fName;
+ SkTypeface::Style fStyle;
+ const char* fFont;
+ const char* fFile;
+ const char* fCharsUsed;
+ int fFontIndex;
+} gFonts[] = {
+ {"Courier New", SkTypeface::kNormal, "Courier New", "Courier New.ttf",
+ gCourierNew},
+ {"Courier New", SkTypeface::kBold, "Courier New", "Courier New Bold.ttf",
+ gCourierNew_Bold},
+ {"Courier New", SkTypeface::kItalic, "Courier New", "Courier New Italic.ttf",
+ gCourierNew_Italic},
+ {"Courier New", SkTypeface::kBoldItalic, "Courier New", "Courier New Bold Italic.ttf",
+ gCourierNew_BoldItalic},
+ {"Helvetica", SkTypeface::kNormal, "Liberation Sans", "LiberationSans-Regular.ttf",
+ gLiberationSans},
+ {"Helvetica", SkTypeface::kBold, "Liberation Sans", "LiberationSans-Bold.ttf",
+ gLiberationSans_Bold},
+ {"Helvetica", SkTypeface::kItalic, "Liberation Sans", "LiberationSans-Italic.ttf",
+ gLiberationSans_Italic},
+ {"Helvetica", SkTypeface::kBoldItalic, "Liberation Sans", "LiberationSans-BoldItalic.ttf",
+ gLiberationSans_BoldItalic},
+ {"Hiragino Maru Gothic Pro", SkTypeface::kNormal, "Hiragino Maru Gothic Pro", "Pro W4.otf",
+ gHiraginoMaruGothicPro},
+ {"Liberation Sans", SkTypeface::kNormal, "Liberation Sans", "LiberationSans-Regular.ttf",
+ gLiberationSans},
+ {"Liberation Sans", SkTypeface::kBold, "Liberation Sans", "LiberationSans-Bold.ttf",
+ gLiberationSans_Bold},
+ {"Liberation Sans", SkTypeface::kItalic, "Liberation Sans", "LiberationSans-Italic.ttf",
+ gLiberationSans_Italic},
+ {"Liberation Sans", SkTypeface::kBoldItalic, "Liberation Sans", "LiberationSans-BoldItalic.ttf",
+ gLiberationSans_BoldItalic},
+ {"monospace", SkTypeface::kNormal, "Courier New", "Courier New.ttf",
+ gCourierNew},
+ {"monospace", SkTypeface::kBold, "Courier New", "Courier New Bold.ttf",
+ gCourierNew_Bold},
+ {"monospace", SkTypeface::kItalic, "Courier New", "Courier New Italic.ttf",
+ gCourierNew_Italic},
+ {"monospace", SkTypeface::kBoldItalic, "Courier New", "Courier New Bold Italic.ttf",
+ gCourierNew_BoldItalic},
+ {"Papyrus", SkTypeface::kNormal, "Papyrus", "Papyrus.ttc",
+ gPapyrus},
+ {"sans-serif", SkTypeface::kNormal, "Liberation Sans", "LiberationSans-Regular.ttf",
+ gLiberationSans},
+ {"sans-serif", SkTypeface::kBold, "Liberation Sans", "LiberationSans-Bold.ttf",
+ gLiberationSans_Bold},
+ {"sans-serif", SkTypeface::kItalic, "Liberation Sans", "LiberationSans-Italic.ttf",
+ gLiberationSans_Italic},
+ {"sans-serif", SkTypeface::kBoldItalic, "Liberation Sans", "LiberationSans-BoldItalic.ttf",
+ gLiberationSans_BoldItalic},
+ {"serif", SkTypeface::kNormal, "Times New Roman", "Times New Roman.ttf",
+ gTimesNewRoman},
+ {"serif", SkTypeface::kBold, "Times New Roman", "Times New Roman Bold.ttf",
+ gTimesNewRoman_Bold},
+ {"serif", SkTypeface::kItalic, "Times New Roman", "Times New Roman Italic.ttf",
+ gTimesNewRoman_Italic},
+ {"serif", SkTypeface::kBoldItalic, "Times New Roman", "Times New Roman Bold Italic.ttf",
+ gTimesNewRoman_BoldItalic},
+ {"Times", SkTypeface::kNormal, "Times New Roman", "Times New Roman.ttf",
+ gTimesNewRoman},
+ {"Times", SkTypeface::kBold, "Times New Roman", "Times New Roman Bold.ttf",
+ gTimesNewRoman_Bold},
+ {"Times", SkTypeface::kItalic, "Times New Roman", "Times New Roman Italic.ttf",
+ gTimesNewRoman_Italic},
+ {"Times", SkTypeface::kBoldItalic, "Times New Roman", "Times New Roman Bold Italic.ttf",
+ gTimesNewRoman_BoldItalic},
+ {"Times New Roman", SkTypeface::kNormal, "Times New Roman", "Times New Roman.ttf",
+ gTimesNewRoman},
+ {"Times New Roman", SkTypeface::kBold, "Times New Roman", "Times New Roman Bold.ttf",
+ gTimesNewRoman_Bold},
+ {"Times New Roman", SkTypeface::kItalic, "Times New Roman", "Times New Roman Italic.ttf",
+ gTimesNewRoman_Italic},
+ {"Times New Roman", SkTypeface::kBoldItalic, "Times New Roman", "Times New Roman Bold Italic.ttf",
+ gTimesNewRoman_BoldItalic},
+ {"Times Roman", SkTypeface::kNormal, "Liberation Sans", "LiberationSans-Regular.ttf",
+ gLiberationSans},
+};
+
+const int gFontsCount = (int) SK_ARRAY_COUNT(gFonts);
+
+const char* gStyleName[] = {
+ "kNormal",
+ "kBold",
+ "kItalic",
+ "kBoldItalic",
+};
+
+const char gHeader[] =
+"/*\n"
+" * Copyright 2014 Google Inc.\n"
+" *\n"
+" * Use of this source code is governed by a BSD-style license that can be\n"
+" * found in the LICENSE file.\n"
+" */\n"
+"\n"
+"// Auto-generated by ";
+
+static FILE* font_header() {
+ SkString outPath(SkOSPath::SkPathJoin(".", "tools"));
+ outPath = SkOSPath::SkPathJoin(outPath.c_str(), "test_font_data.cpp");
+ FILE* out = fopen(outPath.c_str(), "w");
+ fprintf(out, "%s%s\n\n", gHeader, SkOSPath::SkBasename(__FILE__).c_str());
+ return out;
+}
+
enum {
- kEmSize = 4096
+ kMaxLineLength = 80,
};
-static void output_fixed(FILE* out, SkScalar num) {
- SkASSERT(floor(num) == num);
- int hex = (int) num * (65536 / kEmSize);
- fprintf(out, "0x%08x", hex);
+static ptrdiff_t last_line_length(const SkString& str) {
+ const char* first = str.c_str();
+ const char* last = first + str.size();
+ const char* ptr = last;
+ while (ptr > first && *--ptr != '\n')
+ ;
+ return last - ptr - 1;
+}
+
+static void output_fixed(SkScalar num, int emSize, SkString* out) {
+ int hex = (int) (num * 65536 / emSize);
+ out->appendf("0x%08x,", hex);
+ *out += (int) last_line_length(*out) >= kMaxLineLength ? '\n' : ' ';
}
-static void output_scalar(FILE* out, SkScalar num) {
- num /= kEmSize;
+static void output_scalar(SkScalar num, int emSize, SkString* out) {
+ num /= emSize;
if (num == (int) num) {
- fprintf(out, "%d", (int) num);
+ out->appendS32((int) num);
} else {
SkString str;
str.printf("%1.6g", num);
@@ -35,135 +163,288 @@ static void output_scalar(FILE* out, SkScalar num) {
while (cStr[width - 1] == '0') {
--width;
}
- str.resize(width);
- fprintf(out, "%sf", str.c_str());
+ str.remove(width, str.size() - width);
+ out->appendf("%sf", str.c_str());
}
+ *out += ',';
+ *out += (int) last_line_length(*out) >= kMaxLineLength ? '\n' : ' ';
}
-static void output_points(FILE* out, const SkPoint* pts, int count) {
+static int output_points(const SkPoint* pts, int emSize, int count, SkString* ptsOut) {
for (int index = 0; index < count; ++index) {
- SkASSERT(floor(pts[index].fX) == pts[index].fX);
- output_scalar(out, pts[index].fX);
- fprintf(out, ", ");
- SkASSERT(floor(pts[index].fY) == pts[index].fY);
- output_scalar(out, pts[index].fY);
- if (index + 1 < count) {
- fprintf(out, ", ");
- }
+// SkASSERT(floor(pts[index].fX) == pts[index].fX);
+ output_scalar(pts[index].fX, emSize, ptsOut);
+// SkASSERT(floor(pts[index].fY) == pts[index].fY);
+ output_scalar(pts[index].fY, emSize, ptsOut);
}
- fprintf(out, ");\n");
+ return count;
}
-const char header[] =
-"/*\n"
-" * Copyright 2014 Google Inc.\n"
-" *\n"
-" * Use of this source code is governed by a BSD-style license that can be\n"
-" * found in the LICENSE file.\n"
-" */\n"
-"\n"
-"// this was auto-generated by TestFontCreator.cpp\n"
-"\n"
-"#include \"SkPaint.h\"\n"
-"#include \"SkPath.h\"\n"
-"#include \"SkTDArray.h\"\n"
-"\n"
-"namespace sk_tool_utils {\n"
-"\n"
-"SkPaint::FontMetrics create_font(SkTDArray<SkPath*>& pathArray,\n"
-" SkTDArray<SkFixed>& widthArray) {";
-
-int tool_main(int argc, char** argv);
-int tool_main(int argc, char** argv) {
- SkPaint paint;
- paint.setAntiAlias(true);
- paint.setTextAlign(SkPaint::kLeft_Align);
- paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
- paint.setTextSize(kEmSize);
- SkString filename("resources/DroidSans.ttf");
- SkAutoTUnref<SkFILEStream> stream(new SkFILEStream(filename.c_str()));
- if (!stream->isValid()) {
- SkDebugf("Could not find resources/Roboto-Regular.ttf.\n");
- return 1;
- }
- SkTypeface* typeface = SkTypeface::CreateFromStream(stream);
- SkSafeUnref(paint.setTypeface(typeface));
- FILE* out = fopen("./out/sk_tool_utils_font.cpp", "w");
- fprintf(out, "%s\n", header);
- fprintf(out, " SkPath* path;\n");
- for (unsigned short index = 0x20; index < 0x7F; ++index) {
+static void output_path_data(const SkPaint& paint, const char* used,
+ int emSize, SkString* ptsOut, SkTDArray<SkPath::Verb>* verbs,
+ SkTDArray<unsigned>* charCodes, SkTDArray<SkScalar>* widths) {
+ while (*used) {
+ SkUnichar index = SkUTF8_NextUnichar(&used);
SkPath path;
paint.getTextPath((const void*) &index, 2, 0, 0, &path);
SkPath::RawIter iter(path);
- uint8_t verb;
+ SkPath::Verb verb;
SkPoint pts[4];
- fprintf(out, " path = SkNEW(SkPath); //");
- if (index == '\\') {
- fprintf(out, " blackslash\n");
- } else if (index == ' ') {
- fprintf(out, " space\n");
- } else {
- fprintf(out, " %c\n", (char) index);
- }
- fprintf(out, " *pathArray.append() = path;\n");
while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
+ *verbs->append() = verb;
switch (verb) {
case SkPath::kMove_Verb:
- fprintf(out, " path->moveTo(");
- output_points(out, &pts[0], 1);
- continue;
+ output_points(&pts[0], emSize, 1, ptsOut);
+ break;
case SkPath::kLine_Verb:
- fprintf(out, " path->lineTo(");
- output_points(out, &pts[1], 1);
+ output_points(&pts[1], emSize, 1, ptsOut);
break;
case SkPath::kQuad_Verb:
- fprintf(out, " path->quadTo(");
- output_points(out, &pts[1], 2);
+ output_points(&pts[1], emSize, 2, ptsOut);
break;
case SkPath::kCubic_Verb:
- fprintf(out, " path->cubicTo(");
- output_points(out, &pts[1], 3);
+ output_points(&pts[1], emSize, 3, ptsOut);
break;
case SkPath::kClose_Verb:
- fprintf(out, " path->close();\n");
break;
default:
SkDEBUGFAIL("bad verb");
- return 1;
+ SkASSERT(0);
}
}
+ *verbs->append() = SkPath::kDone_Verb;
+ *charCodes->append() = index;
SkScalar width;
SkDEBUGCODE(int charCount =) paint.getTextWidths((const void*) &index, 2, &width);
SkASSERT(charCount == 1);
- fprintf(out, " *widthArray.append() = ");
- output_fixed(out, width);
- fprintf(out, ";\n\n");
+// SkASSERT(floor(width) == width); // not true for Hiragino Maru Gothic Pro
+ *widths->append() = width;
+ }
+}
+
+static int offset_str_len(unsigned num) {
+ if (num == (unsigned) -1) {
+ return 10;
+ }
+ unsigned result = 1;
+ unsigned ref = 10;
+ while (ref <= num) {
+ ++result;
+ ref *= 10;
+ }
+ return result;
+}
+
+static SkString strip_spaces(const SkString& str) {
+ SkString result;
+ int count = (int) str.size();
+ for (int index = 0; index < count; ++index) {
+ char c = str[index];
+ if (c != ' ' && c != '-') {
+ result += c;
+ }
+ }
+ return result;
+}
+
+static SkString strip_final(const SkString& str) {
+ SkString result(str);
+ if (result.endsWith("\n")) {
+ result.remove(result.size() - 1, 1);
+ }
+ if (result.endsWith(" ")) {
+ result.remove(result.size() - 1, 1);
+ }
+ if (result.endsWith(",")) {
+ result.remove(result.size() - 1, 1);
+ }
+ return result;
+}
+
+static void output_font(SkTypeface* face, const char* name, SkTypeface::Style style,
+ const char* used, FILE* out) {
+ int emSize = face->getUnitsPerEm() * 2;
+ SkPaint paint;
+ paint.setAntiAlias(true);
+ paint.setTextAlign(SkPaint::kLeft_Align);
+ paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
+ paint.setTextSize(emSize);
+ SkSafeUnref(paint.setTypeface(face));
+ SkTDArray<SkPath::Verb> verbs;
+ SkTDArray<unsigned> charCodes;
+ SkTDArray<SkScalar> widths;
+ SkString ptsOut;
+ output_path_data(paint, used, emSize, &ptsOut, &verbs, &charCodes, &widths);
+ SkString fontnameStr(name);
+ SkString strippedStr = strip_spaces(fontnameStr);
+ strippedStr.appendf("%s", gStyleName[style]);
+ const char* fontname = strippedStr.c_str();
+ fprintf(out, "const SkScalar %sPoints[] = {\n", fontname);
+ ptsOut = strip_final(ptsOut);
+ fprintf(out, "%s", ptsOut.c_str());
+ fprintf(out, "\n};\n\n");
+ fprintf(out, "const unsigned char %sVerbs[] = {\n", fontname);
+ int verbCount = verbs.count();
+ int outChCount = 0;
+ for (int index = 0; index < verbCount;) {
+ SkPath::Verb verb = verbs[index];
+ SkASSERT(verb >= SkPath::kMove_Verb && verb <= SkPath::kDone_Verb);
+ SkASSERT((unsigned) verb == (unsigned char) verb);
+ fprintf(out, "%u", verb);
+ if (++index < verbCount) {
+ outChCount += 3;
+ fprintf(out, "%c", ',');
+ if (outChCount >= kMaxLineLength) {
+ outChCount = 0;
+ fprintf(out, "%c", '\n');
+ } else {
+ fprintf(out, "%c", ' ');
+ }
+ }
+ }
+ fprintf(out, "\n};\n\n");
+
+ fprintf(out, "const unsigned %sCharCodes[] = {\n", fontname);
+ int offsetCount = charCodes.count();
+ for (int index = 0; index < offsetCount;) {
+ unsigned offset = charCodes[index];
+ fprintf(out, "%u", offset);
+ if (++index < offsetCount) {
+ outChCount += offset_str_len(offset) + 2;
+ fprintf(out, "%c", ',');
+ if (outChCount >= kMaxLineLength) {
+ outChCount = 0;
+ fprintf(out, "%c", '\n');
+ } else {
+ fprintf(out, "%c", ' ');
+ }
+ }
+ }
+ fprintf(out, "\n};\n\n");
+
+ SkString widthsStr;
+ fprintf(out, "const SkFixed %sWidths[] = {\n", fontname);
+ for (int index = 0; index < offsetCount; ++index) {
+ output_fixed(widths[index], emSize, &widthsStr);
}
+ widthsStr = strip_final(widthsStr);
+ fprintf(out, "%s\n};\n\n", widthsStr.c_str());
+
+ fprintf(out, "const int %sCharCodesCount = (int) SK_ARRAY_COUNT(%sCharCodes);\n\n",
+ fontname, fontname);
+
SkPaint::FontMetrics metrics;
paint.getFontMetrics(&metrics);
- fprintf(out, " SkPaint::FontMetrics metrics = {\n");
- fprintf(out, " 0x%08x, ", metrics.fFlags);
- output_scalar(out, metrics.fTop); fprintf(out, ", ");
- output_scalar(out, metrics.fAscent); fprintf(out, ", ");
- output_scalar(out, metrics.fDescent); fprintf(out, ", ");
- output_scalar(out, metrics.fBottom); fprintf(out, ", ");
- output_scalar(out, metrics.fLeading); fprintf(out, ",\n ");
- output_scalar(out, metrics.fAvgCharWidth); fprintf(out, ", ");
- output_scalar(out, metrics.fMaxCharWidth); fprintf(out, ", ");
- output_scalar(out, metrics.fXMin); fprintf(out, ", ");
- output_scalar(out, metrics.fXMax); fprintf(out, ",\n ");
- output_scalar(out, metrics.fXHeight); fprintf(out, ", ");
- output_scalar(out, metrics.fCapHeight); fprintf(out, ", ");
- output_scalar(out, metrics.fUnderlineThickness); fprintf(out, ", ");
- output_scalar(out, metrics.fUnderlinePosition); fprintf(out, "\n };\n");
- fprintf(out, " return metrics;\n");
- fprintf(out, "}\n\n}\n");
- fclose(out);
- return 0;
+ fprintf(out, "const SkPaint::FontMetrics %sMetrics = {\n", fontname);
+ SkString metricsStr;
+ metricsStr.printf("0x%08x, ", metrics.fFlags);
+ output_scalar(metrics.fTop, emSize, &metricsStr);
+ output_scalar(metrics.fAscent, emSize, &metricsStr);
+ output_scalar(metrics.fDescent, emSize, &metricsStr);
+ output_scalar(metrics.fBottom, emSize, &metricsStr);
+ output_scalar(metrics.fLeading, emSize, &metricsStr);
+ output_scalar(metrics.fAvgCharWidth, emSize, &metricsStr);
+ output_scalar(metrics.fMaxCharWidth, emSize, &metricsStr);
+ output_scalar(metrics.fXMin, emSize, &metricsStr);
+ output_scalar(metrics.fXMax, emSize, &metricsStr);
+ output_scalar(metrics.fXHeight, emSize, &metricsStr);
+ output_scalar(metrics.fCapHeight, emSize, &metricsStr);
+ output_scalar(metrics.fUnderlineThickness, emSize, &metricsStr);
+ output_scalar(metrics.fUnderlinePosition, emSize, &metricsStr);
+ metricsStr = strip_final(metricsStr);
+ fprintf(out, "%s\n};\n\n", metricsStr.c_str());
}
-#if !defined SK_BUILD_FOR_IOS
-int main(int argc, char * const argv[]) {
- return tool_main(argc, (char**) argv);
+struct FontWritten {
+ const char* fName;
+ SkTypeface::Style fStyle;
+};
+
+static SkTDArray<FontWritten> gWritten;
+
+static int written_index(const FontDesc& fontDesc) {
+ for (int index = 0; index < gWritten.count(); ++index) {
+ const FontWritten& writ = gWritten[index];
+ if (!strcmp(fontDesc.fFont, writ.fName) && fontDesc.fStyle == writ.fStyle) {
+ return index;
+ }
+ }
+ return -1;
}
+
+static void generate_fonts(FILE* out) {
+ for (int index = 0; index < gFontsCount; ++index) {
+ FontDesc& fontDesc = gFonts[index];
+ int fontIndex = written_index(fontDesc);
+ if (fontIndex >= 0) {
+ fontDesc.fFontIndex = fontIndex;
+ continue;
+ }
+ SkTypeface* systemTypeface = SkTypeface::CreateFromName(fontDesc.fFont, fontDesc.fStyle);
+ SkASSERT(systemTypeface);
+ SkString filepath(GetResourcePath(fontDesc.fFile));
+ SkASSERT(sk_exists(filepath.c_str()));
+ SkTypeface* resourceTypeface = SkTypeface::CreateFromFile(filepath.c_str());
+ SkASSERT(resourceTypeface);
+ output_font(resourceTypeface, fontDesc.fFont, fontDesc.fStyle, fontDesc.fCharsUsed, out);
+ fontDesc.fFontIndex = gWritten.count();
+ FontWritten* writ = gWritten.append();
+ writ->fName = fontDesc.fFont;
+ writ->fStyle = fontDesc.fStyle;
+ }
+}
+
+static void generate_index(const char* defaultName, FILE* out) {
+ int fontCount = gWritten.count();
+ fprintf(out,
+ "static SkTestFontData gTestFonts[] = {\n");
+ int fontIndex;
+ for (fontIndex = 0; fontIndex < fontCount; ++fontIndex) {
+ const FontWritten& writ = gWritten[fontIndex];
+ const char* name = writ.fName;
+ SkString strippedStr = strip_spaces(SkString(name));
+ strippedStr.appendf("%s", gStyleName[writ.fStyle]);
+ const char* strip = strippedStr.c_str();
+ fprintf(out,
+ " { %sPoints, %sVerbs, %sCharCodes,\n"
+ " %sCharCodesCount, %sWidths,\n"
+ " %sMetrics, \"%s\", SkTypeface::%s, NULL\n"
+ " },\n",
+ strip, strip, strip, strip, strip, strip, name, gStyleName[writ.fStyle]);
+ }
+ fprintf(out, "};\n\n");
+ fprintf(out, "const int gTestFontsCount = (int) SK_ARRAY_COUNT(gTestFonts);\n\n");
+ fprintf(out,
+ "struct SubFont {\n"
+ " const char* fName;\n"
+ " SkTypeface::Style fStyle;\n"
+ " SkTestFontData& fFont;\n"
+ " const char* fFile;\n"
+ "};\n\n"
+ "const SubFont gSubFonts[] = {\n");
+ int defaultIndex = -1;
+ for (int subIndex = 0; subIndex < gFontsCount; subIndex++) {
+ const FontDesc& desc = gFonts[subIndex];
+ if (!strcmp(defaultName, desc.fName)) {
+ defaultIndex = subIndex;
+ }
+ fprintf(out,
+ " { \"%s\", SkTypeface::%s, gTestFonts[%d], \"%s\"},\n", desc.fName,
+ gStyleName[desc.fStyle], desc.fFontIndex, desc.fFile);
+ }
+ fprintf(out, "};\n\n");
+ fprintf(out, "const int gSubFontsCount = (int) SK_ARRAY_COUNT(gSubFonts);\n\n");
+ SkASSERT(defaultIndex >= 0);
+ fprintf(out, "const int gDefaultFontIndex = %d;\n", defaultIndex);
+}
+
+int main(int , char * const []) {
+#ifndef SK_BUILD_FOR_MAC
+ #error "use fonts installed on Mac"
#endif
+ FILE* out = font_header();
+ generate_fonts(out);
+ generate_index(DEFAULT_FONT_NAME, out);
+ fclose(out);
+ return 0;
+}
« no previous file with comments | « src/fonts/SkTestScalerContext.cpp ('k') | tools/sk_tool_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698