1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2012 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontStyle.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontTypes.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDebug.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTemplates.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkAutoMalloc.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkEndian.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkFontStream.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h"
26*c8dee2aaSAndroid Build Coastguard Worker
27*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
28*c8dee2aaSAndroid Build Coastguard Worker #include <cstring>
29*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
30*c8dee2aaSAndroid Build Coastguard Worker #include <string>
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard Worker //#define DUMP_TABLES
35*c8dee2aaSAndroid Build Coastguard Worker //#define DUMP_TTC_TABLES
36*c8dee2aaSAndroid Build Coastguard Worker
37*c8dee2aaSAndroid Build Coastguard Worker #define kFontTableTag_head SkSetFourByteTag('h', 'e', 'a', 'd')
38*c8dee2aaSAndroid Build Coastguard Worker #define kFontTableTag_hhea SkSetFourByteTag('h', 'h', 'e', 'a')
39*c8dee2aaSAndroid Build Coastguard Worker #define kFontTableTag_maxp SkSetFourByteTag('m', 'a', 'x', 'p')
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Worker static const struct TagSize {
42*c8dee2aaSAndroid Build Coastguard Worker SkFontTableTag fTag;
43*c8dee2aaSAndroid Build Coastguard Worker size_t fSize;
44*c8dee2aaSAndroid Build Coastguard Worker } gKnownTableSizes[] = {
45*c8dee2aaSAndroid Build Coastguard Worker { kFontTableTag_head, 54 },
46*c8dee2aaSAndroid Build Coastguard Worker { kFontTableTag_hhea, 36 },
47*c8dee2aaSAndroid Build Coastguard Worker };
48*c8dee2aaSAndroid Build Coastguard Worker
49*c8dee2aaSAndroid Build Coastguard Worker // Test that getUnitsPerEm() agrees with a direct lookup in the 'head' table
50*c8dee2aaSAndroid Build Coastguard Worker // (if that table is available).
test_unitsPerEm(skiatest::Reporter * reporter,const sk_sp<SkTypeface> & face)51*c8dee2aaSAndroid Build Coastguard Worker static void test_unitsPerEm(skiatest::Reporter* reporter, const sk_sp<SkTypeface>& face) {
52*c8dee2aaSAndroid Build Coastguard Worker int nativeUPEM = face->getUnitsPerEm();
53*c8dee2aaSAndroid Build Coastguard Worker
54*c8dee2aaSAndroid Build Coastguard Worker int tableUPEM = -1;
55*c8dee2aaSAndroid Build Coastguard Worker size_t size = face->getTableSize(kFontTableTag_head);
56*c8dee2aaSAndroid Build Coastguard Worker if (size) {
57*c8dee2aaSAndroid Build Coastguard Worker // unitsPerEm is at offset 18 into the 'head' table.
58*c8dee2aaSAndroid Build Coastguard Worker uint16_t rawUPEM;
59*c8dee2aaSAndroid Build Coastguard Worker face->getTableData(kFontTableTag_head, 18, sizeof(rawUPEM), &rawUPEM);
60*c8dee2aaSAndroid Build Coastguard Worker tableUPEM = SkEndian_SwapBE16(rawUPEM);
61*c8dee2aaSAndroid Build Coastguard Worker }
62*c8dee2aaSAndroid Build Coastguard Worker
63*c8dee2aaSAndroid Build Coastguard Worker if (tableUPEM >= 0) {
64*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, tableUPEM == nativeUPEM);
65*c8dee2aaSAndroid Build Coastguard Worker }
66*c8dee2aaSAndroid Build Coastguard Worker }
67*c8dee2aaSAndroid Build Coastguard Worker
68*c8dee2aaSAndroid Build Coastguard Worker // Test that countGlyphs() agrees with a direct lookup in the 'maxp' table
69*c8dee2aaSAndroid Build Coastguard Worker // (if that table is available).
test_countGlyphs(skiatest::Reporter * reporter,const sk_sp<SkTypeface> & face)70*c8dee2aaSAndroid Build Coastguard Worker static void test_countGlyphs(skiatest::Reporter* reporter, const sk_sp<SkTypeface>& face) {
71*c8dee2aaSAndroid Build Coastguard Worker int nativeGlyphs = face->countGlyphs();
72*c8dee2aaSAndroid Build Coastguard Worker
73*c8dee2aaSAndroid Build Coastguard Worker int tableGlyphs = -1;
74*c8dee2aaSAndroid Build Coastguard Worker size_t size = face->getTableSize(kFontTableTag_maxp);
75*c8dee2aaSAndroid Build Coastguard Worker if (size) {
76*c8dee2aaSAndroid Build Coastguard Worker // glyphs is at offset 4 into the 'maxp' table.
77*c8dee2aaSAndroid Build Coastguard Worker uint16_t rawGlyphs;
78*c8dee2aaSAndroid Build Coastguard Worker face->getTableData(kFontTableTag_maxp, 4, sizeof(rawGlyphs), &rawGlyphs);
79*c8dee2aaSAndroid Build Coastguard Worker tableGlyphs = SkEndian_SwapBE16(rawGlyphs);
80*c8dee2aaSAndroid Build Coastguard Worker }
81*c8dee2aaSAndroid Build Coastguard Worker
82*c8dee2aaSAndroid Build Coastguard Worker if (tableGlyphs >= 0) {
83*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, tableGlyphs == nativeGlyphs);
84*c8dee2aaSAndroid Build Coastguard Worker }
85*c8dee2aaSAndroid Build Coastguard Worker }
86*c8dee2aaSAndroid Build Coastguard Worker
test_fontstream(skiatest::Reporter * reporter,SkStream * stream,int ttcIndex)87*c8dee2aaSAndroid Build Coastguard Worker static void test_fontstream(skiatest::Reporter* reporter, SkStream* stream, int ttcIndex) {
88*c8dee2aaSAndroid Build Coastguard Worker int n = SkFontStream::GetTableTags(stream, ttcIndex, nullptr);
89*c8dee2aaSAndroid Build Coastguard Worker AutoTArray<SkFontTableTag> array(n);
90*c8dee2aaSAndroid Build Coastguard Worker
91*c8dee2aaSAndroid Build Coastguard Worker int n2 = SkFontStream::GetTableTags(stream, ttcIndex, array.get());
92*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, n == n2);
93*c8dee2aaSAndroid Build Coastguard Worker
94*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < n; ++i) {
95*c8dee2aaSAndroid Build Coastguard Worker #ifdef DUMP_TTC_TABLES
96*c8dee2aaSAndroid Build Coastguard Worker SkString str;
97*c8dee2aaSAndroid Build Coastguard Worker SkFontTableTag t = array[i];
98*c8dee2aaSAndroid Build Coastguard Worker str.appendUnichar((t >> 24) & 0xFF);
99*c8dee2aaSAndroid Build Coastguard Worker str.appendUnichar((t >> 16) & 0xFF);
100*c8dee2aaSAndroid Build Coastguard Worker str.appendUnichar((t >> 8) & 0xFF);
101*c8dee2aaSAndroid Build Coastguard Worker str.appendUnichar((t >> 0) & 0xFF);
102*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("[%d:%d] '%s'\n", ttcIndex, i, str.c_str());
103*c8dee2aaSAndroid Build Coastguard Worker #endif
104*c8dee2aaSAndroid Build Coastguard Worker size_t size = SkFontStream::GetTableSize(stream, ttcIndex, array[i]);
105*c8dee2aaSAndroid Build Coastguard Worker for (size_t j = 0; j < std::size(gKnownTableSizes); ++j) {
106*c8dee2aaSAndroid Build Coastguard Worker if (gKnownTableSizes[j].fTag == array[i]) {
107*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, gKnownTableSizes[j].fSize == size);
108*c8dee2aaSAndroid Build Coastguard Worker }
109*c8dee2aaSAndroid Build Coastguard Worker }
110*c8dee2aaSAndroid Build Coastguard Worker }
111*c8dee2aaSAndroid Build Coastguard Worker }
112*c8dee2aaSAndroid Build Coastguard Worker
test_fontstream(skiatest::Reporter * reporter)113*c8dee2aaSAndroid Build Coastguard Worker static void test_fontstream(skiatest::Reporter* reporter) {
114*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkStreamAsset> stream(GetResourceAsStream("fonts/test.ttc"));
115*c8dee2aaSAndroid Build Coastguard Worker if (!stream) {
116*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Skipping FontHostTest::test_fontstream\n");
117*c8dee2aaSAndroid Build Coastguard Worker return;
118*c8dee2aaSAndroid Build Coastguard Worker }
119*c8dee2aaSAndroid Build Coastguard Worker
120*c8dee2aaSAndroid Build Coastguard Worker int count = SkFontStream::CountTTCEntries(stream.get());
121*c8dee2aaSAndroid Build Coastguard Worker #ifdef DUMP_TTC_TABLES
122*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("CountTTCEntries %d\n", count);
123*c8dee2aaSAndroid Build Coastguard Worker #endif
124*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < count; ++i) {
125*c8dee2aaSAndroid Build Coastguard Worker test_fontstream(reporter, stream.get(), i);
126*c8dee2aaSAndroid Build Coastguard Worker }
127*c8dee2aaSAndroid Build Coastguard Worker }
128*c8dee2aaSAndroid Build Coastguard Worker
129*c8dee2aaSAndroid Build Coastguard Worker // Exercise this rare cmap format (platform 3, encoding 0)
test_symbolfont(skiatest::Reporter * reporter)130*c8dee2aaSAndroid Build Coastguard Worker static void test_symbolfont(skiatest::Reporter* reporter) {
131*c8dee2aaSAndroid Build Coastguard Worker auto tf = ToolUtils::CreateTypefaceFromResource("fonts/SpiderSymbol.ttf");
132*c8dee2aaSAndroid Build Coastguard Worker if (tf) {
133*c8dee2aaSAndroid Build Coastguard Worker SkUnichar c = 0xf021;
134*c8dee2aaSAndroid Build Coastguard Worker uint16_t g = SkFont(tf).unicharToGlyph(c);
135*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, g == 3);
136*c8dee2aaSAndroid Build Coastguard Worker } else {
137*c8dee2aaSAndroid Build Coastguard Worker // not all platforms support data fonts, so we just note that failure
138*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Skipping FontHostTest::test_symbolfont\n");
139*c8dee2aaSAndroid Build Coastguard Worker }
140*c8dee2aaSAndroid Build Coastguard Worker }
141*c8dee2aaSAndroid Build Coastguard Worker
test_tables(skiatest::Reporter * reporter,const sk_sp<SkTypeface> & face)142*c8dee2aaSAndroid Build Coastguard Worker static void test_tables(skiatest::Reporter* reporter, const sk_sp<SkTypeface>& face) {
143*c8dee2aaSAndroid Build Coastguard Worker if ((false)) { // avoid bit rot, suppress warning
144*c8dee2aaSAndroid Build Coastguard Worker SkTypefaceID typefaceID = face->uniqueID();
145*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, typefaceID);
146*c8dee2aaSAndroid Build Coastguard Worker }
147*c8dee2aaSAndroid Build Coastguard Worker
148*c8dee2aaSAndroid Build Coastguard Worker int count = face->countTables();
149*c8dee2aaSAndroid Build Coastguard Worker
150*c8dee2aaSAndroid Build Coastguard Worker AutoTMalloc<SkFontTableTag> storage(count);
151*c8dee2aaSAndroid Build Coastguard Worker SkFontTableTag* tags = storage.get();
152*c8dee2aaSAndroid Build Coastguard Worker
153*c8dee2aaSAndroid Build Coastguard Worker int count2 = face->getTableTags(tags);
154*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, count2 == count);
155*c8dee2aaSAndroid Build Coastguard Worker
156*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < count; ++i) {
157*c8dee2aaSAndroid Build Coastguard Worker size_t size = face->getTableSize(tags[i]);
158*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, size > 0);
159*c8dee2aaSAndroid Build Coastguard Worker
160*c8dee2aaSAndroid Build Coastguard Worker #ifdef DUMP_TABLES
161*c8dee2aaSAndroid Build Coastguard Worker char name[5];
162*c8dee2aaSAndroid Build Coastguard Worker name[0] = (tags[i] >> 24) & 0xFF;
163*c8dee2aaSAndroid Build Coastguard Worker name[1] = (tags[i] >> 16) & 0xFF;
164*c8dee2aaSAndroid Build Coastguard Worker name[2] = (tags[i] >> 8) & 0xFF;
165*c8dee2aaSAndroid Build Coastguard Worker name[3] = (tags[i] >> 0) & 0xFF;
166*c8dee2aaSAndroid Build Coastguard Worker name[4] = 0;
167*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%s %d\n", name, size);
168*c8dee2aaSAndroid Build Coastguard Worker #endif
169*c8dee2aaSAndroid Build Coastguard Worker
170*c8dee2aaSAndroid Build Coastguard Worker for (size_t j = 0; j < std::size(gKnownTableSizes); ++j) {
171*c8dee2aaSAndroid Build Coastguard Worker if (gKnownTableSizes[j].fTag == tags[i]) {
172*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, gKnownTableSizes[j].fSize == size);
173*c8dee2aaSAndroid Build Coastguard Worker }
174*c8dee2aaSAndroid Build Coastguard Worker }
175*c8dee2aaSAndroid Build Coastguard Worker
176*c8dee2aaSAndroid Build Coastguard Worker // do we get the same size from GetTableData and GetTableSize
177*c8dee2aaSAndroid Build Coastguard Worker {
178*c8dee2aaSAndroid Build Coastguard Worker SkAutoMalloc data(size);
179*c8dee2aaSAndroid Build Coastguard Worker size_t size2 = face->getTableData(tags[i], 0, size, data.get());
180*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, size2 == size);
181*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> data2 = face->copyTableData(tags[i]);
182*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, size == data2->size());
183*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !memcmp(data.get(), data2->data(), size));
184*c8dee2aaSAndroid Build Coastguard Worker }
185*c8dee2aaSAndroid Build Coastguard Worker }
186*c8dee2aaSAndroid Build Coastguard Worker }
187*c8dee2aaSAndroid Build Coastguard Worker
test_tables(skiatest::Reporter * reporter)188*c8dee2aaSAndroid Build Coastguard Worker static void test_tables(skiatest::Reporter* reporter) {
189*c8dee2aaSAndroid Build Coastguard Worker static const char* const gNames[] = {
190*c8dee2aaSAndroid Build Coastguard Worker nullptr, // default font
191*c8dee2aaSAndroid Build Coastguard Worker "Helvetica", "Arial",
192*c8dee2aaSAndroid Build Coastguard Worker "Times", "Times New Roman",
193*c8dee2aaSAndroid Build Coastguard Worker "Courier", "Courier New",
194*c8dee2aaSAndroid Build Coastguard Worker "Terminal", "MS Sans Serif",
195*c8dee2aaSAndroid Build Coastguard Worker "Hiragino Mincho ProN", "MS PGothic",
196*c8dee2aaSAndroid Build Coastguard Worker };
197*c8dee2aaSAndroid Build Coastguard Worker
198*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(gNames); ++i) {
199*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkTypeface> face(ToolUtils::CreateTestTypeface(gNames[i], SkFontStyle()));
200*c8dee2aaSAndroid Build Coastguard Worker if (face) {
201*c8dee2aaSAndroid Build Coastguard Worker #ifdef DUMP_TABLES
202*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%s\n", gNames[i]);
203*c8dee2aaSAndroid Build Coastguard Worker #endif
204*c8dee2aaSAndroid Build Coastguard Worker test_tables(reporter, face);
205*c8dee2aaSAndroid Build Coastguard Worker test_unitsPerEm(reporter, face);
206*c8dee2aaSAndroid Build Coastguard Worker test_countGlyphs(reporter, face);
207*c8dee2aaSAndroid Build Coastguard Worker }
208*c8dee2aaSAndroid Build Coastguard Worker }
209*c8dee2aaSAndroid Build Coastguard Worker }
210*c8dee2aaSAndroid Build Coastguard Worker
211*c8dee2aaSAndroid Build Coastguard Worker /*
212*c8dee2aaSAndroid Build Coastguard Worker * Verifies that the advance values returned by various methods match.
213*c8dee2aaSAndroid Build Coastguard Worker */
test_advances(skiatest::Reporter * reporter)214*c8dee2aaSAndroid Build Coastguard Worker static void test_advances(skiatest::Reporter* reporter) {
215*c8dee2aaSAndroid Build Coastguard Worker static const char* const faces[] = {
216*c8dee2aaSAndroid Build Coastguard Worker nullptr, // default font
217*c8dee2aaSAndroid Build Coastguard Worker "Arial", "Times", "Times New Roman", "Helvetica", "Courier",
218*c8dee2aaSAndroid Build Coastguard Worker "Courier New", "Verdana", "monospace",
219*c8dee2aaSAndroid Build Coastguard Worker };
220*c8dee2aaSAndroid Build Coastguard Worker
221*c8dee2aaSAndroid Build Coastguard Worker static const struct {
222*c8dee2aaSAndroid Build Coastguard Worker SkFontHinting hinting;
223*c8dee2aaSAndroid Build Coastguard Worker bool linear;
224*c8dee2aaSAndroid Build Coastguard Worker bool subpixel;
225*c8dee2aaSAndroid Build Coastguard Worker } settings[] = {
226*c8dee2aaSAndroid Build Coastguard Worker { SkFontHinting::kNone, false, false },
227*c8dee2aaSAndroid Build Coastguard Worker { SkFontHinting::kNone, true, false },
228*c8dee2aaSAndroid Build Coastguard Worker { SkFontHinting::kNone, false, true },
229*c8dee2aaSAndroid Build Coastguard Worker { SkFontHinting::kSlight, false, false },
230*c8dee2aaSAndroid Build Coastguard Worker { SkFontHinting::kSlight, true, false },
231*c8dee2aaSAndroid Build Coastguard Worker { SkFontHinting::kSlight, false, true },
232*c8dee2aaSAndroid Build Coastguard Worker { SkFontHinting::kNormal, false, false },
233*c8dee2aaSAndroid Build Coastguard Worker { SkFontHinting::kNormal, true, false },
234*c8dee2aaSAndroid Build Coastguard Worker { SkFontHinting::kNormal, false, true },
235*c8dee2aaSAndroid Build Coastguard Worker };
236*c8dee2aaSAndroid Build Coastguard Worker
237*c8dee2aaSAndroid Build Coastguard Worker static const struct {
238*c8dee2aaSAndroid Build Coastguard Worker SkScalar fScaleX;
239*c8dee2aaSAndroid Build Coastguard Worker SkScalar fSkewX;
240*c8dee2aaSAndroid Build Coastguard Worker } gScaleRec[] = {
241*c8dee2aaSAndroid Build Coastguard Worker { SK_Scalar1, 0 },
242*c8dee2aaSAndroid Build Coastguard Worker { SK_Scalar1/2, 0 },
243*c8dee2aaSAndroid Build Coastguard Worker // these two exercise obliquing (skew)
244*c8dee2aaSAndroid Build Coastguard Worker { SK_Scalar1, -SK_Scalar1/4 },
245*c8dee2aaSAndroid Build Coastguard Worker { SK_Scalar1/2, -SK_Scalar1/4 },
246*c8dee2aaSAndroid Build Coastguard Worker };
247*c8dee2aaSAndroid Build Coastguard Worker
248*c8dee2aaSAndroid Build Coastguard Worker SkFont font;
249*c8dee2aaSAndroid Build Coastguard Worker char const * const txt = "long.text.with.lots.of.dots.";
250*c8dee2aaSAndroid Build Coastguard Worker size_t textLen = strlen(txt);
251*c8dee2aaSAndroid Build Coastguard Worker
252*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(faces); i++) {
253*c8dee2aaSAndroid Build Coastguard Worker font.setTypeface(ToolUtils::CreateTestTypeface(faces[i], SkFontStyle()));
254*c8dee2aaSAndroid Build Coastguard Worker
255*c8dee2aaSAndroid Build Coastguard Worker for (size_t j = 0; j < std::size(settings); j++) {
256*c8dee2aaSAndroid Build Coastguard Worker font.setHinting(settings[j].hinting);
257*c8dee2aaSAndroid Build Coastguard Worker font.setLinearMetrics(settings[j].linear);
258*c8dee2aaSAndroid Build Coastguard Worker font.setSubpixel(settings[j].subpixel);
259*c8dee2aaSAndroid Build Coastguard Worker
260*c8dee2aaSAndroid Build Coastguard Worker for (size_t k = 0; k < std::size(gScaleRec); ++k) {
261*c8dee2aaSAndroid Build Coastguard Worker font.setScaleX(gScaleRec[k].fScaleX);
262*c8dee2aaSAndroid Build Coastguard Worker font.setSkewX(gScaleRec[k].fSkewX);
263*c8dee2aaSAndroid Build Coastguard Worker
264*c8dee2aaSAndroid Build Coastguard Worker SkRect bounds;
265*c8dee2aaSAndroid Build Coastguard Worker
266*c8dee2aaSAndroid Build Coastguard Worker SkScalar width1 = font.measureText(txt, textLen, SkTextEncoding::kUTF8);
267*c8dee2aaSAndroid Build Coastguard Worker
268*c8dee2aaSAndroid Build Coastguard Worker // Requesting the bounds forces a generateMetrics call.
269*c8dee2aaSAndroid Build Coastguard Worker SkScalar width2 = font.measureText(txt, textLen, SkTextEncoding::kUTF8, &bounds);
270*c8dee2aaSAndroid Build Coastguard Worker
271*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, width1 == width2);
272*c8dee2aaSAndroid Build Coastguard Worker }
273*c8dee2aaSAndroid Build Coastguard Worker }
274*c8dee2aaSAndroid Build Coastguard Worker }
275*c8dee2aaSAndroid Build Coastguard Worker }
276*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(FontHost,reporter)277*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(FontHost, reporter) {
278*c8dee2aaSAndroid Build Coastguard Worker test_tables(reporter);
279*c8dee2aaSAndroid Build Coastguard Worker test_fontstream(reporter);
280*c8dee2aaSAndroid Build Coastguard Worker test_advances(reporter);
281*c8dee2aaSAndroid Build Coastguard Worker test_symbolfont(reporter);
282*c8dee2aaSAndroid Build Coastguard Worker }
283*c8dee2aaSAndroid Build Coastguard Worker
284*c8dee2aaSAndroid Build Coastguard Worker // need tests for SkStrSearch
285