| Index: tools/create_test_font.cpp
|
| diff --git a/tools/create_test_font.cpp b/tools/create_test_font.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b0f70efaee7403938135ecb57cfc4b2ef3730fc0
|
| --- /dev/null
|
| +++ b/tools/create_test_font.cpp
|
| @@ -0,0 +1,169 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#include "SkPaint.h"
|
| +#include "SkPath.h"
|
| +#include "SkStream.h"
|
| +#include "SkTArray.h"
|
| +#include "SkTSort.h"
|
| +#include "SkTypeface.h"
|
| +#include <stdio.h>
|
| +
|
| +enum {
|
| + kEmSize = 4096
|
| +};
|
| +
|
| +static void output_fixed(FILE* out, SkScalar num) {
|
| + SkASSERT(floor(num) == num);
|
| + int hex = (int) num * (65536 / kEmSize);
|
| + fprintf(out, "0x%08x", hex);
|
| +}
|
| +
|
| +static void output_scalar(FILE* out, SkScalar num) {
|
| + num /= kEmSize;
|
| + if (num == (int) num) {
|
| + fprintf(out, "%d", (int) num);
|
| + } else {
|
| + SkString str;
|
| + str.printf("%1.6g", num);
|
| + int width = (int) str.size();
|
| + const char* cStr = str.c_str();
|
| + while (cStr[width - 1] == '0') {
|
| + --width;
|
| + }
|
| + str.resize(width);
|
| + fprintf(out, "%sf", str.c_str());
|
| + }
|
| +}
|
| +
|
| +static void output_points(FILE* out, const SkPoint* pts, int count) {
|
| + 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, ", ");
|
| + }
|
| + }
|
| + fprintf(out, ");\n");
|
| +}
|
| +
|
| +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) {
|
| + SkPath path;
|
| + paint.getTextPath((const void*) &index, 2, 0, 0, &path);
|
| + SkPath::RawIter iter(path);
|
| + uint8_t 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) {
|
| + switch (verb) {
|
| + case SkPath::kMove_Verb:
|
| + fprintf(out, " path->moveTo(");
|
| + output_points(out, &pts[0], 1);
|
| + continue;
|
| + case SkPath::kLine_Verb:
|
| + fprintf(out, " path->lineTo(");
|
| + output_points(out, &pts[1], 1);
|
| + break;
|
| + case SkPath::kQuad_Verb:
|
| + fprintf(out, " path->quadTo(");
|
| + output_points(out, &pts[1], 2);
|
| + break;
|
| + case SkPath::kCubic_Verb:
|
| + fprintf(out, " path->cubicTo(");
|
| + output_points(out, &pts[1], 3);
|
| + break;
|
| + case SkPath::kClose_Verb:
|
| + fprintf(out, " path->close();\n");
|
| + break;
|
| + default:
|
| + SkDEBUGFAIL("bad verb");
|
| + return 1;
|
| + }
|
| + }
|
| + 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");
|
| + }
|
| + 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;
|
| +}
|
| +
|
| +#if !defined SK_BUILD_FOR_IOS
|
| +int main(int argc, char * const argv[]) {
|
| + return tool_main(argc, (char**) argv);
|
| +}
|
| +#endif
|
|
|