blob: cf11350bb88c701375cbd7e022d154ebf292d4af [file] [log] [blame]
reed@google.comaf0fa6a2013-03-28 13:39:35 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Klein88544fb2019-03-20 10:50:33 -05008#include "CommonFlags.h"
reed@google.comaf0fa6a2013-03-28 13:39:35 +00009#include "SkCanvas.h"
Mike Reed9cd2a5c2019-01-22 15:17:59 -050010#include "SkFontMetrics.h"
reed@google.comaf0fa6a2013-03-28 13:39:35 +000011#include "SkFontMgr.h"
Mike Reed7d1eb332018-12-04 17:35:56 -050012#include "SkFontPriv.h"
reed@google.comaf0fa6a2013-03-28 13:39:35 +000013#include "SkGraphics.h"
Mike Klein88544fb2019-03-20 10:50:33 -050014#include "SkPath.h"
reed@google.comaf0fa6a2013-03-28 13:39:35 +000015#include "SkTypeface.h"
Mike Kleinea3f0142019-03-20 11:12:10 -050016#include "ToolUtils.h"
Mike Klein88544fb2019-03-20 10:50:33 -050017#include "gm.h"
reed@google.comaf0fa6a2013-03-28 13:39:35 +000018
19// limit this just so we don't take too long to draw
20#define MAX_FAMILIES 30
21
22static SkScalar drawString(SkCanvas* canvas, const SkString& text, SkScalar x,
Mike Reed560d5b32018-12-16 16:36:48 -050023 SkScalar y, const SkFont& font) {
Hal Canary89a644b2019-01-07 09:36:09 -050024 canvas->drawString(text, x, y, font, SkPaint());
Mike Reed560d5b32018-12-16 16:36:48 -050025 return x + font.measureText(text.c_str(), text.size(), kUTF8_SkTextEncoding);
reed@google.comaf0fa6a2013-03-28 13:39:35 +000026}
27
djsollen0d393a92014-08-27 07:03:13 -070028static SkScalar drawCharacter(SkCanvas* canvas, uint32_t character, SkScalar x,
Mike Reed560d5b32018-12-16 16:36:48 -050029 SkScalar y, const SkFont& origFont, SkFontMgr* fm,
bungemanc9232dc2014-11-10 13:29:33 -080030 const char* fontName, const char* bcp47[], int bcp47Count,
djsollen0d393a92014-08-27 07:03:13 -070031 const SkFontStyle& fontStyle) {
Mike Reed560d5b32018-12-16 16:36:48 -050032 SkFont font = origFont;
djsollen0d393a92014-08-27 07:03:13 -070033 // find typeface containing the requested character and draw it
34 SkString ch;
35 ch.appendUnichar(character);
bungeman13b9c952016-05-12 10:09:30 -070036 sk_sp<SkTypeface> typeface(fm->matchFamilyStyleCharacter(fontName, fontStyle,
37 bcp47, bcp47Count, character));
Mike Reed560d5b32018-12-16 16:36:48 -050038 font.setTypeface(typeface);
39 x = drawString(canvas, ch, x, y, font) + 20;
djsollen0d393a92014-08-27 07:03:13 -070040
halcanary96fcdcc2015-08-27 07:41:13 -070041 if (nullptr == typeface) {
djsollen0d393a92014-08-27 07:03:13 -070042 return x;
43 }
44
45 // repeat the process, but this time use the family name of the typeface
46 // from the first pass. This emulates the behavior in Blink where it
47 // it expects to get the same glyph when following this pattern.
48 SkString familyName;
49 typeface->getFamilyName(&familyName);
Mike Reed560d5b32018-12-16 16:36:48 -050050 font.setTypeface(fm->legacyMakeTypeface(familyName.c_str(), typeface->fontStyle()));
51 return drawString(canvas, ch, x, y, font) + 20;
djsollen0d393a92014-08-27 07:03:13 -070052}
53
bungemanc9232dc2014-11-10 13:29:33 -080054static const char* zh = "zh";
55static const char* ja = "ja";
56
reed@google.comaf0fa6a2013-03-28 13:39:35 +000057class FontMgrGM : public skiagm::GM {
58public:
Mike Klein8073e792017-11-13 18:10:54 -050059 FontMgrGM() {
Ben Wagner3546ff12017-01-03 13:32:36 -050060 SkGraphics::SetFontCacheLimit(16 * 1024 * 1024);
61
62 fName.set("fontmgr_iter");
Mike Klein8073e792017-11-13 18:10:54 -050063 fFM = SkFontMgr::RefDefault();
Ben Wagner3546ff12017-01-03 13:32:36 -050064 }
reed@google.comaf0fa6a2013-03-28 13:39:35 +000065
66protected:
mtklein36352bf2015-03-25 18:17:31 -070067 SkString onShortName() override {
bungeman@google.combfc6cc42013-08-21 15:20:43 +000068 return fName;
reed@google.comaf0fa6a2013-03-28 13:39:35 +000069 }
70
mtklein36352bf2015-03-25 18:17:31 -070071 SkISize onISize() override {
djsollen0d393a92014-08-27 07:03:13 -070072 return SkISize::Make(1536, 768);
reed@google.comaf0fa6a2013-03-28 13:39:35 +000073 }
74
mtklein36352bf2015-03-25 18:17:31 -070075 void onDraw(SkCanvas* canvas) override {
reed@google.comaf0fa6a2013-03-28 13:39:35 +000076 SkScalar y = 20;
Mike Reed560d5b32018-12-16 16:36:48 -050077 SkFont font;
78 font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
79 font.setSubpixel(true);
80 font.setSize(17);
skia.committer@gmail.com6acd09e2013-03-29 07:01:22 +000081
Hal Canarycefc4312016-11-04 16:26:16 -040082 SkFontMgr* fm = fFM.get();
reed@google.comaf0fa6a2013-03-28 13:39:35 +000083 int count = SkMin32(fm->countFamilies(), MAX_FAMILIES);
84
85 for (int i = 0; i < count; ++i) {
bungemanc64239a2015-04-29 08:15:31 -070086 SkString familyName;
87 fm->getFamilyName(i, &familyName);
Mike Reed560d5b32018-12-16 16:36:48 -050088 font.setTypeface(nullptr);
89 (void)drawString(canvas, familyName, 20, y, font);
skia.committer@gmail.com6acd09e2013-03-29 07:01:22 +000090
reed@google.comaf0fa6a2013-03-28 13:39:35 +000091 SkScalar x = 220;
reed@google.com964988f2013-03-29 14:57:22 +000092
Hal Canarycefc4312016-11-04 16:26:16 -040093 sk_sp<SkFontStyleSet> set(fm->createStyleSet(i));
reed@google.comaf0fa6a2013-03-28 13:39:35 +000094 for (int j = 0; j < set->count(); ++j) {
95 SkString sname;
96 SkFontStyle fs;
97 set->getStyle(j, &fs, &sname);
bungemanb4bb7d82016-04-27 10:21:04 -070098 sname.appendf(" [%d %d %d]", fs.weight(), fs.width(), fs.slant());
skia.committer@gmail.com6acd09e2013-03-29 07:01:22 +000099
Mike Reed560d5b32018-12-16 16:36:48 -0500100 font.setTypeface(sk_sp<SkTypeface>(set->createTypeface(j)));
101 x = drawString(canvas, sname, x, y, font) + 20;
djsollen0d393a92014-08-27 07:03:13 -0700102
103 // check to see that we get different glyphs in japanese and chinese
Mike Reed560d5b32018-12-16 16:36:48 -0500104 x = drawCharacter(canvas, 0x5203, x, y, font, fm, familyName.c_str(), &zh, 1, fs);
105 x = drawCharacter(canvas, 0x5203, x, y, font, fm, familyName.c_str(), &ja, 1, fs);
djsollen0d393a92014-08-27 07:03:13 -0700106 // check that emoji characters are found
Mike Reed560d5b32018-12-16 16:36:48 -0500107 x = drawCharacter(canvas, 0x1f601, x, y, font, fm, familyName.c_str(), nullptr,0, fs);
skia.committer@gmail.com6acd09e2013-03-29 07:01:22 +0000108 }
reed@google.comaf0fa6a2013-03-28 13:39:35 +0000109 y += 24;
110 }
111 }
112
reed@google.comaf0fa6a2013-03-28 13:39:35 +0000113private:
Hal Canarycefc4312016-11-04 16:26:16 -0400114 sk_sp<SkFontMgr> fFM;
bungeman@google.combfc6cc42013-08-21 15:20:43 +0000115 SkString fName;
reed@google.comaf0fa6a2013-03-28 13:39:35 +0000116 typedef GM INHERITED;
117};
118
reed@google.com964988f2013-03-29 14:57:22 +0000119class FontMgrMatchGM : public skiagm::GM {
Hal Canarycefc4312016-11-04 16:26:16 -0400120 sk_sp<SkFontMgr> fFM;
reed@google.com964988f2013-03-29 14:57:22 +0000121
122public:
123 FontMgrMatchGM() : fFM(SkFontMgr::RefDefault()) {
124 SkGraphics::SetFontCacheLimit(16 * 1024 * 1024);
125 }
skia.committer@gmail.comd55846d2013-03-30 07:01:27 +0000126
reed@google.com964988f2013-03-29 14:57:22 +0000127protected:
mtklein36352bf2015-03-25 18:17:31 -0700128 SkString onShortName() override {
Mike Kleinbea1f942019-03-08 11:11:55 -0600129 return SkString("fontmgr_match");
reed@google.com964988f2013-03-29 14:57:22 +0000130 }
skia.committer@gmail.comd55846d2013-03-30 07:01:27 +0000131
mtklein36352bf2015-03-25 18:17:31 -0700132 SkISize onISize() override {
reed@google.com964988f2013-03-29 14:57:22 +0000133 return SkISize::Make(640, 1024);
134 }
135
Mike Reed560d5b32018-12-16 16:36:48 -0500136 void iterateFamily(SkCanvas* canvas, const SkFont& font, SkFontStyleSet* fset) {
137 SkFont f(font);
reed@google.com964988f2013-03-29 14:57:22 +0000138 SkScalar y = 0;
139
140 for (int j = 0; j < fset->count(); ++j) {
141 SkString sname;
142 SkFontStyle fs;
143 fset->getStyle(j, &fs, &sname);
144
145 sname.appendf(" [%d %d]", fs.weight(), fs.width());
146
Mike Reed560d5b32018-12-16 16:36:48 -0500147 f.setTypeface(sk_sp<SkTypeface>(fset->createTypeface(j)));
148 (void)drawString(canvas, sname, 0, y, f);
reed@google.com964988f2013-03-29 14:57:22 +0000149 y += 24;
150 }
151 }
152
Mike Reed560d5b32018-12-16 16:36:48 -0500153 void exploreFamily(SkCanvas* canvas, const SkFont& font, SkFontStyleSet* fset) {
154 SkFont f(font);
reed@google.com964988f2013-03-29 14:57:22 +0000155 SkScalar y = 0;
156
157 for (int weight = 100; weight <= 900; weight += 200) {
158 for (int width = 1; width <= 9; width += 2) {
159 SkFontStyle fs(weight, width, SkFontStyle::kUpright_Slant);
bungeman13b9c952016-05-12 10:09:30 -0700160 sk_sp<SkTypeface> face(fset->matchStyle(fs));
reed@google.com964988f2013-03-29 14:57:22 +0000161 if (face) {
162 SkString str;
163 str.printf("request [%d %d]", fs.weight(), fs.width());
Mike Reed560d5b32018-12-16 16:36:48 -0500164 f.setTypeface(std::move(face));
165 (void)drawString(canvas, str, 0, y, f);
reed@google.com964988f2013-03-29 14:57:22 +0000166 y += 24;
167 }
168 }
169 }
170 }
skia.committer@gmail.comd55846d2013-03-30 07:01:27 +0000171
Chris Dalton50e24d72019-02-07 16:20:09 -0700172 DrawResult onDraw(SkCanvas* canvas, SkString* errorMsg) override {
Mike Reed560d5b32018-12-16 16:36:48 -0500173 SkFont font;
174 font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
175 font.setSubpixel(true);
176 font.setSize(17);
reed@google.com964988f2013-03-29 14:57:22 +0000177
mtkleindbfd7ab2016-09-01 11:24:54 -0700178 const char* gNames[] = {
Ben Wagner83c6b962018-07-10 19:40:15 -0400179 "Helvetica Neue", "Arial", "sans"
reed@google.com964988f2013-03-29 14:57:22 +0000180 };
181
Hal Canarycefc4312016-11-04 16:26:16 -0400182 sk_sp<SkFontStyleSet> fset;
skia.committer@gmail.comd55846d2013-03-30 07:01:27 +0000183 for (size_t i = 0; i < SK_ARRAY_COUNT(gNames); ++i) {
bungeman@google.com9fc5c682013-11-12 15:25:29 +0000184 fset.reset(fFM->matchFamily(gNames[i]));
185 if (fset->count() > 0) {
reed@google.com964988f2013-03-29 14:57:22 +0000186 break;
187 }
188 }
halcanary96fcdcc2015-08-27 07:41:13 -0700189 if (nullptr == fset.get()) {
Chris Dalton50e24d72019-02-07 16:20:09 -0700190 *errorMsg = "No SkFontStyleSet";
191 return DrawResult::kFail;
reed@google.com964988f2013-03-29 14:57:22 +0000192 }
reed@google.com964988f2013-03-29 14:57:22 +0000193
194 canvas->translate(20, 40);
Mike Reed560d5b32018-12-16 16:36:48 -0500195 this->exploreFamily(canvas, font, fset.get());
reed@google.com964988f2013-03-29 14:57:22 +0000196 canvas->translate(150, 0);
Mike Reed560d5b32018-12-16 16:36:48 -0500197 this->iterateFamily(canvas, font, fset.get());
Chris Dalton50e24d72019-02-07 16:20:09 -0700198 return DrawResult::kOk;
reed@google.com964988f2013-03-29 14:57:22 +0000199 }
skia.committer@gmail.comd55846d2013-03-30 07:01:27 +0000200
reed@google.com964988f2013-03-29 14:57:22 +0000201private:
202 typedef GM INHERITED;
203};
204
reeda0c814c2014-10-22 13:20:58 -0700205class FontMgrBoundsGM : public skiagm::GM {
206public:
reed8893e5f2014-12-15 13:27:26 -0800207 FontMgrBoundsGM(double scale, double skew)
208 : fScaleX(SkDoubleToScalar(scale))
209 , fSkewX(SkDoubleToScalar(skew))
210 {
reeda0c814c2014-10-22 13:20:58 -0700211 fName.set("fontmgr_bounds");
reed8893e5f2014-12-15 13:27:26 -0800212 if (scale != 1 || skew != 0) {
213 fName.appendf("_%g_%g", scale, skew);
214 }
Ben Wagner3546ff12017-01-03 13:32:36 -0500215 fFM = SkFontMgr::RefDefault();
reeda0c814c2014-10-22 13:20:58 -0700216 }
217
Mike Reed7d1eb332018-12-04 17:35:56 -0500218 static void show_bounds(SkCanvas* canvas, const SkFont& font, SkScalar x, SkScalar y,
Ben Wagner219f3622017-07-17 15:32:25 -0400219 SkColor boundsColor)
220 {
Mike Reed7d1eb332018-12-04 17:35:56 -0500221 SkRect fontBounds = SkFontPriv::GetFontBounds(font).makeOffset(x, y);
222
223 SkPaint boundsPaint;
224 boundsPaint.setAntiAlias(true);
Ben Wagner219f3622017-07-17 15:32:25 -0400225 boundsPaint.setColor(boundsColor);
Ben Wagner97182cc2018-02-15 10:20:04 -0500226 boundsPaint.setStyle(SkPaint::kStroke_Style);
Ben Wagner219f3622017-07-17 15:32:25 -0400227 canvas->drawRect(fontBounds, boundsPaint);
reeda0c814c2014-10-22 13:20:58 -0700228
Mike Reedcb6f53e2018-11-06 12:44:54 -0500229 SkFontMetrics fm;
Mike Reed7d1eb332018-12-04 17:35:56 -0500230 font.getMetrics(&fm);
Ben Wagner219f3622017-07-17 15:32:25 -0400231 SkPaint metricsPaint(boundsPaint);
232 metricsPaint.setStyle(SkPaint::kFill_Style);
Mike Reed9407e242019-02-15 16:13:57 -0500233 metricsPaint.setAlphaf(0.25f);
Mike Reedb5784ac2018-11-12 09:35:15 -0500234 if ((fm.fFlags & SkFontMetrics::kUnderlinePositionIsValid_Flag) &&
Ben Wagner9ca55f22019-02-12 15:04:17 -0500235 (fm.fFlags & SkFontMetrics::kUnderlineThicknessIsValid_Flag))
Ben Wagner219f3622017-07-17 15:32:25 -0400236 {
237 SkRect underline{ fontBounds.fLeft, fm.fUnderlinePosition+y,
238 fontBounds.fRight, fm.fUnderlinePosition+y + fm.fUnderlineThickness };
239 canvas->drawRect(underline, metricsPaint);
reeda0c814c2014-10-22 13:20:58 -0700240 }
tfarinaaa458fb2015-01-05 17:18:51 -0800241
Mike Reedb5784ac2018-11-12 09:35:15 -0500242 if ((fm.fFlags & SkFontMetrics::kStrikeoutPositionIsValid_Flag) &&
Ben Wagner9ca55f22019-02-12 15:04:17 -0500243 (fm.fFlags & SkFontMetrics::kStrikeoutThicknessIsValid_Flag))
Ben Wagner219f3622017-07-17 15:32:25 -0400244 {
245 SkRect strikeout{ fontBounds.fLeft, fm.fStrikeoutPosition+y - fm.fStrikeoutThickness,
246 fontBounds.fRight, fm.fStrikeoutPosition+y };
247 canvas->drawRect(strikeout, metricsPaint);
248 }
249
250 SkGlyphID left = 0, right = 0, top = 0, bottom = 0;
251 {
Herb Derby087fad72019-01-22 14:45:16 -0500252 int numGlyphs = font.getTypefaceOrDefault()->countGlyphs();
Ben Wagner219f3622017-07-17 15:32:25 -0400253 SkRect min = {0, 0, 0, 0};
Ben Wagner219f3622017-07-17 15:32:25 -0400254 for (int i = 0; i < numGlyphs; ++i) {
255 SkGlyphID glyphId = i;
256 SkRect cur;
Mike Reed7d1eb332018-12-04 17:35:56 -0500257 font.getBounds(&glyphId, 1, &cur, nullptr);
Ben Wagner219f3622017-07-17 15:32:25 -0400258 if (cur.fLeft < min.fLeft ) { min.fLeft = cur.fLeft; left = i; }
259 if (cur.fTop < min.fTop ) { min.fTop = cur.fTop ; top = i; }
260 if (min.fRight < cur.fRight ) { min.fRight = cur.fRight; right = i; }
261 if (min.fBottom < cur.fBottom) { min.fBottom = cur.fBottom; bottom = i; }
262 }
263 }
264 SkGlyphID str[] = { left, right, top, bottom };
Ben Wagner17bca9a2018-06-22 15:27:52 -0400265 SkPoint location[] = {
266 {fontBounds.left(), fontBounds.centerY()},
267 {fontBounds.right(), fontBounds.centerY()},
268 {fontBounds.centerX(), fontBounds.top()},
269 {fontBounds.centerX(), fontBounds.bottom()}
270 };
271
Mike Reed7d1eb332018-12-04 17:35:56 -0500272 SkFont labelFont;
273 labelFont.setEdging(SkFont::Edging::kAntiAlias);
Mike Kleinea3f0142019-03-20 11:12:10 -0500274 labelFont.setTypeface(ToolUtils::create_portable_typeface());
Mike Reed7d1eb332018-12-04 17:35:56 -0500275
Ben Wagner17bca9a2018-06-22 15:27:52 -0400276 if (FLAGS_veryVerbose) {
277 SkString name;
Herb Derby087fad72019-01-22 14:45:16 -0500278 font.getTypefaceOrDefault()->getFamilyName(&name);
Hal Canary89a644b2019-01-07 09:36:09 -0500279 canvas->drawString(name, fontBounds.fLeft, fontBounds.fBottom, labelFont, SkPaint());
Ben Wagner17bca9a2018-06-22 15:27:52 -0400280 }
Ben Wagner219f3622017-07-17 15:32:25 -0400281 for (size_t i = 0; i < SK_ARRAY_COUNT(str); ++i) {
Ben Wagner97182cc2018-02-15 10:20:04 -0500282 SkPath path;
Mike Reed7d1eb332018-12-04 17:35:56 -0500283 font.getPath(str[i], &path);
284 path.offset(x, y);
Ben Wagner97182cc2018-02-15 10:20:04 -0500285 SkPaint::Style style = path.isEmpty() ? SkPaint::kFill_Style : SkPaint::kStroke_Style;
Mike Reed7d1eb332018-12-04 17:35:56 -0500286 SkPaint glyphPaint;
Ben Wagner97182cc2018-02-15 10:20:04 -0500287 glyphPaint.setStyle(style);
Mike Reed7d1eb332018-12-04 17:35:56 -0500288 canvas->drawSimpleText(&str[i], sizeof(str[0]), kGlyphID_SkTextEncoding, x, y, font, glyphPaint);
Ben Wagner17bca9a2018-06-22 15:27:52 -0400289
290 if (FLAGS_veryVerbose) {
291 SkString glyphStr;
292 glyphStr.appendS32(str[i]);
Hal Canary89a644b2019-01-07 09:36:09 -0500293 canvas->drawString(glyphStr, location[i].fX, location[i].fY, labelFont, SkPaint());
Ben Wagner17bca9a2018-06-22 15:27:52 -0400294 }
295
Ben Wagner219f3622017-07-17 15:32:25 -0400296 }
Ben Wagner17bca9a2018-06-22 15:27:52 -0400297
reeda0c814c2014-10-22 13:20:58 -0700298 }
299
300protected:
mtklein36352bf2015-03-25 18:17:31 -0700301 SkString onShortName() override {
reeda0c814c2014-10-22 13:20:58 -0700302 return fName;
303 }
tfarinaaa458fb2015-01-05 17:18:51 -0800304
mtklein36352bf2015-03-25 18:17:31 -0700305 SkISize onISize() override {
reeda0c814c2014-10-22 13:20:58 -0700306 return SkISize::Make(1024, 850);
307 }
tfarinaaa458fb2015-01-05 17:18:51 -0800308
mtklein36352bf2015-03-25 18:17:31 -0700309 void onDraw(SkCanvas* canvas) override {
Mike Reed7d1eb332018-12-04 17:35:56 -0500310 SkFont font;
311 font.setEdging(SkFont::Edging::kAntiAlias);
312 font.setSubpixel(true);
313 font.setSize(100);
314 font.setScaleX(fScaleX);
315 font.setSkewX(fSkewX);
reeda0c814c2014-10-22 13:20:58 -0700316
317 const SkColor boundsColors[2] = { SK_ColorRED, SK_ColorBLUE };
halcanary9d524f22016-03-29 09:03:52 -0700318
Hal Canarycefc4312016-11-04 16:26:16 -0400319 SkFontMgr* fm = fFM.get();
reeda0c814c2014-10-22 13:20:58 -0700320 int count = SkMin32(fm->countFamilies(), 32);
321
322 int index = 0;
323 SkScalar x = 0, y = 0;
324
Ben Wagner219f3622017-07-17 15:32:25 -0400325 canvas->translate(10, 120);
reeda0c814c2014-10-22 13:20:58 -0700326
327 for (int i = 0; i < count; ++i) {
Hal Canarycefc4312016-11-04 16:26:16 -0400328 sk_sp<SkFontStyleSet> set(fm->createStyleSet(i));
Ben Wagner219f3622017-07-17 15:32:25 -0400329 for (int j = 0; j < set->count() && j < 3; ++j) {
Mike Reed7d1eb332018-12-04 17:35:56 -0500330 font.setTypeface(sk_sp<SkTypeface>(set->createTypeface(j)));
Ben Wagner2112df02017-07-24 11:04:21 -0400331 // Fonts with lots of glyphs are interesting, but can take a long time to find
332 // the glyphs which make up the maximum extent.
Herb Derby087fad72019-01-22 14:45:16 -0500333 if (font.getTypefaceOrDefault() && font.getTypefaceOrDefault()->countGlyphs() < 1000) {
Mike Reed7d1eb332018-12-04 17:35:56 -0500334 SkRect fontBounds = SkFontPriv::GetFontBounds(font);
Ben Wagner219f3622017-07-17 15:32:25 -0400335 x -= fontBounds.fLeft;
Mike Reed7d1eb332018-12-04 17:35:56 -0500336 show_bounds(canvas, font, x, y, boundsColors[index & 1]);
Ben Wagner219f3622017-07-17 15:32:25 -0400337 x += fontBounds.fRight + 20;
reeda0c814c2014-10-22 13:20:58 -0700338 index += 1;
Ben Wagner219f3622017-07-17 15:32:25 -0400339 if (x > 900) {
reeda0c814c2014-10-22 13:20:58 -0700340 x = 0;
341 y += 160;
342 }
Ben Wagner219f3622017-07-17 15:32:25 -0400343 if (y >= 700) {
reeda0c814c2014-10-22 13:20:58 -0700344 return;
345 }
346 }
347 }
348 }
349 }
mtklein1c402922015-01-23 11:07:07 -0800350
reeda0c814c2014-10-22 13:20:58 -0700351private:
Hal Canarycefc4312016-11-04 16:26:16 -0400352 sk_sp<SkFontMgr> fFM;
reeda0c814c2014-10-22 13:20:58 -0700353 SkString fName;
reed8893e5f2014-12-15 13:27:26 -0800354 SkScalar fScaleX, fSkewX;
reeda0c814c2014-10-22 13:20:58 -0700355 typedef GM INHERITED;
356};
357
reed@google.comaf0fa6a2013-03-28 13:39:35 +0000358//////////////////////////////////////////////////////////////////////////////
359
halcanary385fe4d2015-08-26 13:07:48 -0700360DEF_GM(return new FontMgrGM;)
361DEF_GM(return new FontMgrMatchGM;)
362DEF_GM(return new FontMgrBoundsGM(1.0, 0);)
363DEF_GM(return new FontMgrBoundsGM(0.75, 0);)
364DEF_GM(return new FontMgrBoundsGM(1.0, -0.25);)