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