15fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark/*
25fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark * Copyright 2014 Google Inc.
35fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark *
45fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark * Use of this source code is governed by a BSD-style license that can be
55fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark * found in the LICENSE file.
65fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark */
75fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
8992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark// running create_test_font generates ./tools/test_font_data.cpp
9992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark// which is read by ./tools/sk_tool_utils_font.cpp
10992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
11992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#include "Resources.h"
12992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#include "SkOSFile.h"
135fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkPaint.h"
145fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkPath.h"
155fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkStream.h"
165fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkTArray.h"
175fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkTSort.h"
185fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include "SkTypeface.h"
19992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#include "SkUtils.h"
205fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#include <stdio.h>
215fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
22992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark// the folllowing include is generated by running dm with
23992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark//   --portableFonts --reportUsedChars
24992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#include "test_font_data_chars.cpp"
25992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
26992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#define DEFAULT_FONT_NAME "Liberation Sans"
27992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
28992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic struct FontDesc {
29992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    const char* fName;
30992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkTypeface::Style fStyle;
31992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    const char* fFont;
32992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    const char* fFile;
33992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    const char* fCharsUsed;
34992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    int fFontIndex;
35992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark} gFonts[] = {
36992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Courier New", SkTypeface::kNormal, "Courier New",     "Courier New.ttf",
37992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gCourierNew},
38992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Courier New", SkTypeface::kBold,   "Courier New",     "Courier New Bold.ttf",
39992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gCourierNew_Bold},
40992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Courier New", SkTypeface::kItalic, "Courier New",     "Courier New Italic.ttf",
41992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gCourierNew_Italic},
42992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Courier New", SkTypeface::kBoldItalic, "Courier New", "Courier New Bold Italic.ttf",
43992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gCourierNew_BoldItalic},
44992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Helvetica",   SkTypeface::kNormal, "Liberation Sans", "LiberationSans-Regular.ttf",
45992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans},
46992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Helvetica",  SkTypeface::kBold,    "Liberation Sans", "LiberationSans-Bold.ttf",
47992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans_Bold},
48992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Helvetica",  SkTypeface::kItalic,  "Liberation Sans", "LiberationSans-Italic.ttf",
49992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans_Italic},
50992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Helvetica",  SkTypeface::kBoldItalic, "Liberation Sans", "LiberationSans-BoldItalic.ttf",
51992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans_BoldItalic},
52992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Hiragino Maru Gothic Pro", SkTypeface::kNormal, "Hiragino Maru Gothic Pro", "Pro W4.otf",
53992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gHiraginoMaruGothicPro},
54992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Liberation Sans", SkTypeface::kNormal, "Liberation Sans", "LiberationSans-Regular.ttf",
55992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans},
56992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Liberation Sans", SkTypeface::kBold,   "Liberation Sans", "LiberationSans-Bold.ttf",
57992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans_Bold},
58992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Liberation Sans", SkTypeface::kItalic, "Liberation Sans", "LiberationSans-Italic.ttf",
59992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans_Italic},
60992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Liberation Sans", SkTypeface::kBoldItalic, "Liberation Sans", "LiberationSans-BoldItalic.ttf",
61992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans_BoldItalic},
62992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"monospace",   SkTypeface::kNormal, "Courier New",     "Courier New.ttf",
63992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gCourierNew},
64992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"monospace",   SkTypeface::kBold,   "Courier New",     "Courier New Bold.ttf",
65992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gCourierNew_Bold},
66992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"monospace",   SkTypeface::kItalic, "Courier New",     "Courier New Italic.ttf",
67992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gCourierNew_Italic},
68992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"monospace",   SkTypeface::kBoldItalic, "Courier New", "Courier New Bold Italic.ttf",
69992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gCourierNew_BoldItalic},
70992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Papyrus",     SkTypeface::kNormal, "Papyrus",         "Papyrus.ttc",
71992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gPapyrus},
72992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"sans-serif",  SkTypeface::kNormal, "Liberation Sans", "LiberationSans-Regular.ttf",
73992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans},
74992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"sans-serif",  SkTypeface::kBold,   "Liberation Sans", "LiberationSans-Bold.ttf",
75992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans_Bold},
76992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"sans-serif",  SkTypeface::kItalic, "Liberation Sans", "LiberationSans-Italic.ttf",
77992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans_Italic},
78992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"sans-serif", SkTypeface::kBoldItalic, "Liberation Sans", "LiberationSans-BoldItalic.ttf",
79992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans_BoldItalic},
80992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"serif",       SkTypeface::kNormal, "Times New Roman", "Times New Roman.ttf",
81992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman},
82992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"serif",       SkTypeface::kBold,   "Times New Roman", "Times New Roman Bold.ttf",
83992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman_Bold},
84992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"serif",       SkTypeface::kItalic, "Times New Roman", "Times New Roman Italic.ttf",
85992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman_Italic},
86992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"serif",   SkTypeface::kBoldItalic, "Times New Roman", "Times New Roman Bold Italic.ttf",
87992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman_BoldItalic},
88992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Times",       SkTypeface::kNormal, "Times New Roman", "Times New Roman.ttf",
89992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman},
90992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Times",       SkTypeface::kBold,   "Times New Roman", "Times New Roman Bold.ttf",
91992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman_Bold},
92992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Times",       SkTypeface::kItalic, "Times New Roman", "Times New Roman Italic.ttf",
93992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman_Italic},
94992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Times",   SkTypeface::kBoldItalic, "Times New Roman", "Times New Roman Bold Italic.ttf",
95992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman_BoldItalic},
96992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Times New Roman", SkTypeface::kNormal, "Times New Roman", "Times New Roman.ttf",
97992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman},
98992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Times New Roman", SkTypeface::kBold,   "Times New Roman", "Times New Roman Bold.ttf",
99992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman_Bold},
100992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Times New Roman", SkTypeface::kItalic, "Times New Roman", "Times New Roman Italic.ttf",
101992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman_Italic},
102992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Times New Roman", SkTypeface::kBoldItalic, "Times New Roman", "Times New Roman Bold Italic.ttf",
103992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gTimesNewRoman_BoldItalic},
104992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    {"Times Roman", SkTypeface::kNormal, "Liberation Sans", "LiberationSans-Regular.ttf",
105992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            gLiberationSans},
106992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark};
107992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
108992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkconst int gFontsCount = (int) SK_ARRAY_COUNT(gFonts);
109992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
110992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkconst char* gStyleName[] = {
111992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    "kNormal",
112992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    "kBold",
113992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    "kItalic",
114992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    "kBoldItalic",
115992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark};
116992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
117992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkconst char gHeader[] =
118992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark"/*\n"
119992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark" * Copyright 2014 Google Inc.\n"
120992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark" *\n"
121992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark" * Use of this source code is governed by a BSD-style license that can be\n"
122992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark" * found in the LICENSE file.\n"
123992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark" */\n"
124992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark"\n"
125992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark"// Auto-generated by ";
126992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
127992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic FILE* font_header() {
128992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkString outPath(SkOSPath::SkPathJoin(".", "tools"));
129992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    outPath = SkOSPath::SkPathJoin(outPath.c_str(), "test_font_data.cpp");
130992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    FILE* out = fopen(outPath.c_str(), "w");
131992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "%s%s\n\n", gHeader, SkOSPath::SkBasename(__FILE__).c_str());
132992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return out;
133992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
134992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
1355fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclarkenum {
136992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    kMaxLineLength = 80,
1375fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark};
1385fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
139992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic ptrdiff_t last_line_length(const SkString& str) {
140992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    const char* first = str.c_str();
141992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    const char* last = first + str.size();
142992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    const char* ptr = last;
143992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    while (ptr > first && *--ptr != '\n')
144992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        ;
145992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return last - ptr - 1;
146992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
147992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
148992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic void output_fixed(SkScalar num, int emSize, SkString* out) {
149992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    int hex = (int) (num * 65536 / emSize);
150992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    out->appendf("0x%08x,", hex);
151992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    *out += (int) last_line_length(*out) >= kMaxLineLength ? '\n' : ' ';
1525fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark}
1535fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
154992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic void output_scalar(SkScalar num, int emSize, SkString* out) {
155992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    num /= emSize;
1565fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    if (num == (int) num) {
157992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark       out->appendS32((int) num);
1585fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    } else {
1595fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkString str;
1605fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        str.printf("%1.6g", num);
1615fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        int width = (int) str.size();
1625fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        const char* cStr = str.c_str();
1635fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        while (cStr[width - 1] == '0') {
1645fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            --width;
1655fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        }
166992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        str.remove(width, str.size() - width);
167992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        out->appendf("%sf", str.c_str());
1685fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
169992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    *out += ',';
170992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    *out += (int) last_line_length(*out) >= kMaxLineLength ? '\n' : ' ';
1715fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark}
1725fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
173992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic int output_points(const SkPoint* pts, int emSize, int count, SkString* ptsOut) {
1745fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    for (int index = 0; index < count; ++index) {
175992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark//        SkASSERT(floor(pts[index].fX) == pts[index].fX);
176992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        output_scalar(pts[index].fX, emSize, ptsOut);
177992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark//        SkASSERT(floor(pts[index].fY) == pts[index].fY);
178992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        output_scalar(pts[index].fY, emSize, ptsOut);
1795fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
180992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return count;
1815fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark}
1825fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
183992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic void output_path_data(const SkPaint& paint, const char* used,
184992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        int emSize, SkString* ptsOut, SkTDArray<SkPath::Verb>* verbs,
185992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkTDArray<unsigned>* charCodes, SkTDArray<SkScalar>* widths) {
186992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark   while (*used) {
187992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkUnichar index = SkUTF8_NextUnichar(&used);
1885fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkPath path;
1895fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        paint.getTextPath((const void*) &index, 2, 0, 0, &path);
1905fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkPath::RawIter iter(path);
191992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkPath::Verb verb;
1925fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkPoint pts[4];
1935fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
194992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            *verbs->append() = verb;
1955fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            switch (verb) {
1965fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                case SkPath::kMove_Verb:
197992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    output_points(&pts[0], emSize, 1, ptsOut);
198992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    break;
1995fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                case SkPath::kLine_Verb:
200992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    output_points(&pts[1], emSize, 1, ptsOut);
2015fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                    break;
2025fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                case SkPath::kQuad_Verb:
203992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    output_points(&pts[1], emSize, 2, ptsOut);
2045fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                    break;
2055fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                case SkPath::kCubic_Verb:
206992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    output_points(&pts[1], emSize, 3, ptsOut);
2075fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                    break;
2085fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                case SkPath::kClose_Verb:
2095fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                    break;
2105fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                default:
2115fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark                    SkDEBUGFAIL("bad verb");
212992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                    SkASSERT(0);
2135fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark            }
2145fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        }
215992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        *verbs->append() = SkPath::kDone_Verb;
216992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        *charCodes->append() = index;
2175fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkScalar width;
2185fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkDEBUGCODE(int charCount =) paint.getTextWidths((const void*) &index, 2, &width);
2195fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark        SkASSERT(charCount == 1);
220992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark//        SkASSERT(floor(width) == width);  // not true for Hiragino Maru Gothic Pro
221992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        *widths->append() = width;
222992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
223992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
224992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
225992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic int offset_str_len(unsigned num) {
226992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    if (num == (unsigned) -1) {
227992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        return 10;
228992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
229992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    unsigned result = 1;
230992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    unsigned ref = 10;
231992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    while (ref <= num) {
232992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        ++result;
233992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        ref *= 10;
234992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
235992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return result;
236992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
237992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
238992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic SkString strip_spaces(const SkString& str) {
239992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkString result;
240992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    int count = (int) str.size();
241992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (int index = 0; index < count; ++index) {
242992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        char c = str[index];
243992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        if (c != ' ' && c != '-') {
244992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            result += c;
245992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        }
246992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
247992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return result;
248992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
249992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
250992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic SkString strip_final(const SkString& str) {
251992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkString result(str);
252992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    if (result.endsWith("\n")) {
253992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        result.remove(result.size() - 1, 1);
254992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
255992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    if (result.endsWith(" ")) {
256992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        result.remove(result.size() - 1, 1);
257992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
258992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    if (result.endsWith(",")) {
259992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        result.remove(result.size() - 1, 1);
260992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
261992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return result;
262992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
263992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
264992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic void output_font(SkTypeface* face, const char* name, SkTypeface::Style style,
265992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        const char* used, FILE* out) {
266992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    int emSize = face->getUnitsPerEm() * 2;
267992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkPaint paint;
268992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    paint.setAntiAlias(true);
269992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    paint.setTextAlign(SkPaint::kLeft_Align);
270992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
271992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    paint.setTextSize(emSize);
272992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkSafeUnref(paint.setTypeface(face));
273992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkTDArray<SkPath::Verb> verbs;
274992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkTDArray<unsigned> charCodes;
275992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkTDArray<SkScalar> widths;
276992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkString ptsOut;
277992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_path_data(paint, used, emSize, &ptsOut, &verbs, &charCodes, &widths);
278992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkString fontnameStr(name);
279992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkString strippedStr = strip_spaces(fontnameStr);
280992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    strippedStr.appendf("%s", gStyleName[style]);
281992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    const char* fontname = strippedStr.c_str();
282992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "const SkScalar %sPoints[] = {\n", fontname);
283992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    ptsOut = strip_final(ptsOut);
284992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "%s", ptsOut.c_str());
285992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "\n};\n\n");
286992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "const unsigned char %sVerbs[] = {\n", fontname);
287992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    int verbCount = verbs.count();
288992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    int outChCount = 0;
289992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (int index = 0; index < verbCount;) {
290992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkPath::Verb verb = verbs[index];
291992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkASSERT(verb >= SkPath::kMove_Verb && verb <= SkPath::kDone_Verb);
292992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkASSERT((unsigned) verb == (unsigned char) verb);
293992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        fprintf(out, "%u", verb);
294992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        if (++index < verbCount) {
295992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            outChCount += 3;
296992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            fprintf(out, "%c", ',');
297992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            if (outChCount >= kMaxLineLength) {
298992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                outChCount = 0;
299992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                fprintf(out, "%c", '\n');
300992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            } else {
301992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                fprintf(out, "%c", ' ');
302992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            }
303992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        }
304992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
305992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "\n};\n\n");
306992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
307992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "const unsigned %sCharCodes[] = {\n", fontname);
308992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    int offsetCount = charCodes.count();
309992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (int index = 0; index < offsetCount;) {
310992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        unsigned offset = charCodes[index];
311992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        fprintf(out, "%u", offset);
312992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        if (++index < offsetCount) {
313992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            outChCount += offset_str_len(offset) + 2;
314992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            fprintf(out, "%c", ',');
315992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            if (outChCount >= kMaxLineLength) {
316992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                outChCount = 0;
317992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                fprintf(out, "%c", '\n');
318992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            } else {
319992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                fprintf(out, "%c", ' ');
320992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            }
321992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        }
322992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
323992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "\n};\n\n");
324992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
325992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkString widthsStr;
326992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "const SkFixed %sWidths[] = {\n", fontname);
327992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (int index = 0; index < offsetCount; ++index) {
328992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        output_fixed(widths[index], emSize, &widthsStr);
3295fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    }
330992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    widthsStr = strip_final(widthsStr);
331992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "%s\n};\n\n", widthsStr.c_str());
332992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
333992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "const int %sCharCodesCount = (int) SK_ARRAY_COUNT(%sCharCodes);\n\n",
334992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            fontname, fontname);
335992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
3365fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    SkPaint::FontMetrics metrics;
3375fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark    paint.getFontMetrics(&metrics);
338992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "const SkPaint::FontMetrics %sMetrics = {\n", fontname);
339992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkString metricsStr;
340992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    metricsStr.printf("0x%08x, ", metrics.fFlags);
341992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fTop, emSize, &metricsStr);
342992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fAscent, emSize, &metricsStr);
343992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fDescent, emSize, &metricsStr);
344992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fBottom, emSize, &metricsStr);
345992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fLeading, emSize, &metricsStr);
346992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fAvgCharWidth, emSize, &metricsStr);
347992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fMaxCharWidth, emSize, &metricsStr);
348992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fXMin, emSize, &metricsStr);
349992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fXMax, emSize, &metricsStr);
350992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fXHeight, emSize, &metricsStr);
351992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fCapHeight, emSize, &metricsStr);
352992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fUnderlineThickness, emSize, &metricsStr);
353992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    output_scalar(metrics.fUnderlinePosition, emSize, &metricsStr);
354992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    metricsStr = strip_final(metricsStr);
355992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "%s\n};\n\n", metricsStr.c_str());
3565fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark}
3575fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark
358992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstruct FontWritten {
359992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    const char* fName;
360992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkTypeface::Style fStyle;
361992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark};
362992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
363992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic SkTDArray<FontWritten> gWritten;
364992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
365992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic int written_index(const FontDesc& fontDesc) {
366992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (int index = 0; index < gWritten.count(); ++index) {
367992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        const FontWritten& writ = gWritten[index];
368992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        if (!strcmp(fontDesc.fFont, writ.fName) && fontDesc.fStyle == writ.fStyle) {
369992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            return index;
370992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        }
371992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
372992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return -1;
3735fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark}
374992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
375992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic void generate_fonts(FILE* out) {
376992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (int index = 0; index < gFontsCount; ++index) {
377992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        FontDesc& fontDesc = gFonts[index];
378992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        int fontIndex = written_index(fontDesc);
379992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        if (fontIndex >= 0) {
380992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            fontDesc.fFontIndex = fontIndex;
381992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            continue;
382992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        }
383992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkTypeface* systemTypeface = SkTypeface::CreateFromName(fontDesc.fFont, fontDesc.fStyle);
384992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkASSERT(systemTypeface);
385992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkString filepath(GetResourcePath(fontDesc.fFile));
386992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkASSERT(sk_exists(filepath.c_str()));
387992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkTypeface* resourceTypeface = SkTypeface::CreateFromFile(filepath.c_str());
388992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkASSERT(resourceTypeface);
389992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        output_font(resourceTypeface, fontDesc.fFont, fontDesc.fStyle, fontDesc.fCharsUsed, out);
390992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        fontDesc.fFontIndex = gWritten.count();
391992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        FontWritten* writ = gWritten.append();
392992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        writ->fName = fontDesc.fFont;
393992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        writ->fStyle = fontDesc.fStyle;
394992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
395992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
396992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
397992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkstatic void generate_index(const char* defaultName, FILE* out) {
398992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    int fontCount = gWritten.count();
399992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out,
400992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            "static SkTestFontData gTestFonts[] = {\n");
401992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    int fontIndex;
402992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (fontIndex = 0; fontIndex < fontCount; ++fontIndex) {
403992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        const FontWritten& writ = gWritten[fontIndex];
404992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        const char* name = writ.fName;
405992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        SkString strippedStr = strip_spaces(SkString(name));
406992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        strippedStr.appendf("%s", gStyleName[writ.fStyle]);
407992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        const char* strip = strippedStr.c_str();
408992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        fprintf(out,
409992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "    {    %sPoints, %sVerbs, %sCharCodes,\n"
410992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "         %sCharCodesCount, %sWidths,\n"
411992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "         %sMetrics, \"%s\", SkTypeface::%s, NULL\n"
412992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "    },\n",
413992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                strip, strip, strip, strip, strip, strip, name, gStyleName[writ.fStyle]);
414992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
415992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "};\n\n");
416992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "const int gTestFontsCount = (int) SK_ARRAY_COUNT(gTestFonts);\n\n");
417992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out,
418992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "struct SubFont {\n"
419992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "    const char* fName;\n"
420992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "    SkTypeface::Style fStyle;\n"
421992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "    SkTestFontData& fFont;\n"
422992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "    const char* fFile;\n"
423992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "};\n\n"
424992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "const SubFont gSubFonts[] = {\n");
425992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    int defaultIndex = -1;
426992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    for (int subIndex = 0; subIndex < gFontsCount; subIndex++) {
427992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        const FontDesc& desc = gFonts[subIndex];
428992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        if (!strcmp(defaultName, desc.fName)) {
429992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark            defaultIndex = subIndex;
430992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        }
431992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        fprintf(out,
432992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                "    { \"%s\", SkTypeface::%s, gTestFonts[%d], \"%s\"},\n", desc.fName,
433992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                gStyleName[desc.fStyle], desc.fFontIndex, desc.fFile);
434992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
435992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "};\n\n");
436992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "const int gSubFontsCount = (int) SK_ARRAY_COUNT(gSubFonts);\n\n");
437992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    SkASSERT(defaultIndex >= 0);
438992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fprintf(out, "const int gDefaultFontIndex = %d;\n", defaultIndex);
439992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
440992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark
441992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clarkint main(int , char * const []) {
442992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#ifndef SK_BUILD_FOR_MAC
443992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    #error "use fonts installed on Mac"
4445fb6bd4b7e8d00b7f2543ca10ec9022b32632f29caryclark#endif
445992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    FILE* out = font_header();
446992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    generate_fonts(out);
447992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    generate_index(DEFAULT_FONT_NAME, out);
448992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    fclose(out);
449992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    return 0;
450992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark}
451