blob: c9f11a3f900580521e3e2fe0f1792bf52dcc3764 [file] [log] [blame]
scroggo@google.com3cb969f2012-07-27 20:39:19 +00001/*
2 * Copyright 2012 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 Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
9#include "include/core/SkBlurTypes.h"
10#include "include/core/SkCanvas.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040011#include "include/core/SkFont.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkFontStyle.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040013#include "include/core/SkFontTypes.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "include/core/SkMaskFilter.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040015#include "include/core/SkPaint.h"
16#include "include/core/SkPoint.h"
17#include "include/core/SkRefCnt.h"
18#include "include/core/SkScalar.h"
19#include "include/core/SkSize.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050020#include "include/core/SkString.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050021#include "include/core/SkTextBlob.h"
22#include "include/core/SkTypeface.h"
23#include "include/core/SkTypes.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040024#include "include/private/SkTemplates.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050025#include "tools/Resources.h"
Ben Wagner7fde8e12019-05-01 17:28:53 -040026
27#include <string.h>
28#include <utility>
scroggo@google.com3cb969f2012-07-27 20:39:19 +000029
Mike Reed088b74e2018-12-24 14:52:46 -050030static void getGlyphPositions(const SkFont& font, const uint16_t glyphs[],
reed@google.com35fe7372013-10-30 15:07:03 +000031 int count, SkScalar x, SkScalar y, SkPoint pos[]) {
reed@google.com35fe7372013-10-30 15:07:03 +000032 SkAutoSTMalloc<128, SkScalar> widthStorage(count);
33 SkScalar* widths = widthStorage.get();
Mike Reed088b74e2018-12-24 14:52:46 -050034 font.getWidths(glyphs, count, widths);
skia.committer@gmail.com7ed98df2013-10-31 07:01:53 +000035
reed@google.com35fe7372013-10-30 15:07:03 +000036 for (int i = 0; i < count; ++i) {
37 pos[i].set(x, y);
38 x += widths[i];
39 }
40}
41
42static void applyKerning(SkPoint pos[], const int32_t adjustments[], int count,
Mike Reed088b74e2018-12-24 14:52:46 -050043 const SkFont& font) {
Herb Derby087fad72019-01-22 14:45:16 -050044 SkScalar scale = font.getSize() / font.getTypefaceOrDefault()->getUnitsPerEm();
reed@google.com35fe7372013-10-30 15:07:03 +000045
46 SkScalar globalAdj = 0;
47 for (int i = 0; i < count - 1; ++i) {
48 globalAdj += adjustments[i] * scale;
49 pos[i + 1].fX += globalAdj;
50 }
51}
52
53static void drawKernText(SkCanvas* canvas, const void* text, size_t len,
Mike Reed088b74e2018-12-24 14:52:46 -050054 SkScalar x, SkScalar y, const SkFont& font, const SkPaint& paint) {
Herb Derby087fad72019-01-22 14:45:16 -050055 SkTypeface* face = font.getTypefaceOrDefault();
reed@google.com35fe7372013-10-30 15:07:03 +000056 if (!face) {
Ben Wagner51e15a62019-05-07 15:38:46 -040057 canvas->drawSimpleText(text, len, SkTextEncoding::kUTF8, x, y, font, paint);
reed@google.com35fe7372013-10-30 15:07:03 +000058 return;
59 }
60
61 SkAutoSTMalloc<128, uint16_t> glyphStorage(len);
62 uint16_t* glyphs = glyphStorage.get();
Ben Wagner51e15a62019-05-07 15:38:46 -040063 int glyphCount = font.textToGlyphs(text, len, SkTextEncoding::kUTF8, glyphs, len);
reed@google.com35fe7372013-10-30 15:07:03 +000064 if (glyphCount < 1) {
65 return;
66 }
67
68 SkAutoSTMalloc<128, int32_t> adjustmentStorage(glyphCount - 1);
69 int32_t* adjustments = adjustmentStorage.get();
70 if (!face->getKerningPairAdjustments(glyphs, glyphCount, adjustments)) {
Ben Wagner51e15a62019-05-07 15:38:46 -040071 canvas->drawSimpleText(text, len, SkTextEncoding::kUTF8, x, y, font, paint);
reed@google.com35fe7372013-10-30 15:07:03 +000072 return;
73 }
74
reed@google.com35fe7372013-10-30 15:07:03 +000075
Mike Reed088b74e2018-12-24 14:52:46 -050076 SkTextBlobBuilder builder;
77 auto rec = builder.allocRunPos(font, glyphCount);
78 memcpy(rec.glyphs, glyphs, glyphCount * sizeof(SkGlyphID));
Mike Reed22451cc2019-01-01 15:40:28 -050079 getGlyphPositions(font, glyphs, glyphCount, x, y, rec.points());
80 applyKerning(rec.points(), adjustments, glyphCount, font);
reed@google.com35fe7372013-10-30 15:07:03 +000081
Mike Reed088b74e2018-12-24 14:52:46 -050082 canvas->drawTextBlob(builder.make(), 0, 0, paint);
reed@google.com35fe7372013-10-30 15:07:03 +000083}
84
Mike Kleincb9fc412017-11-14 10:45:32 -050085static constexpr SkFontStyle gStyles[] = {
86 SkFontStyle::Normal(),
87 SkFontStyle::Bold(),
88 SkFontStyle::Italic(),
89 SkFontStyle::BoldItalic(),
reed@google.com92abe482013-02-26 16:57:16 +000090};
scroggo@google.com3cb969f2012-07-27 20:39:19 +000091
Mike Kleincb9fc412017-11-14 10:45:32 -050092constexpr int gStylesCount = SK_ARRAY_COUNT(gStyles);
reed@google.com92abe482013-02-26 16:57:16 +000093
94class TypefaceStylesGM : public skiagm::GM {
Mike Kleincb9fc412017-11-14 10:45:32 -050095 sk_sp<SkTypeface> fFaces[gStylesCount];
reed@google.com35fe7372013-10-30 15:07:03 +000096 bool fApplyKerning;
skia.committer@gmail.com12eea2b2013-02-27 07:10:10 +000097
reed@google.com92abe482013-02-26 16:57:16 +000098public:
Ben Wagner83c6b962018-07-10 19:40:15 -040099 TypefaceStylesGM(bool applyKerning) : fApplyKerning(applyKerning) {}
skia.committer@gmail.com12eea2b2013-02-27 07:10:10 +0000100
reed@google.com92abe482013-02-26 16:57:16 +0000101protected:
kkinnunenb4a797f2015-05-21 06:15:28 -0700102 void onOnceBeforeDraw() override {
Mike Kleincb9fc412017-11-14 10:45:32 -0500103 for (int i = 0; i < gStylesCount; i++) {
104 fFaces[i] = SkTypeface::MakeFromName(nullptr, gStyles[i]);
kkinnunenb4a797f2015-05-21 06:15:28 -0700105 }
106 }
107
mtklein36352bf2015-03-25 18:17:31 -0700108 SkString onShortName() override {
reed@google.com35fe7372013-10-30 15:07:03 +0000109 SkString name("typefacestyles");
110 if (fApplyKerning) {
111 name.append("_kerning");
112 }
113 return name;
reed@google.com92abe482013-02-26 16:57:16 +0000114 }
skia.committer@gmail.com12eea2b2013-02-27 07:10:10 +0000115
mtklein36352bf2015-03-25 18:17:31 -0700116 SkISize onISize() override {
reed@google.com92abe482013-02-26 16:57:16 +0000117 return SkISize::Make(640, 480);
118 }
skia.committer@gmail.com12eea2b2013-02-27 07:10:10 +0000119
mtklein36352bf2015-03-25 18:17:31 -0700120 void onDraw(SkCanvas* canvas) override {
Mike Reed088b74e2018-12-24 14:52:46 -0500121 SkFont font;
122 font.setSize(30);
skia.committer@gmail.com12eea2b2013-02-27 07:10:10 +0000123
reed@google.com35fe7372013-10-30 15:07:03 +0000124 const char* text = fApplyKerning ? "Type AWAY" : "Hamburgefons";
reed@google.com92abe482013-02-26 16:57:16 +0000125 const size_t textLen = strlen(text);
skia.committer@gmail.com12eea2b2013-02-27 07:10:10 +0000126
reed@google.com92abe482013-02-26 16:57:16 +0000127 SkScalar x = SkIntToScalar(10);
Mike Reed088b74e2018-12-24 14:52:46 -0500128 SkScalar dy = font.getMetrics(nullptr);
reed@google.com92abe482013-02-26 16:57:16 +0000129 SkScalar y = dy;
skia.committer@gmail.com12eea2b2013-02-27 07:10:10 +0000130
reed@google.com35fe7372013-10-30 15:07:03 +0000131 if (fApplyKerning) {
Mike Reed088b74e2018-12-24 14:52:46 -0500132 font.setSubpixel(true);
reed@google.com35fe7372013-10-30 15:07:03 +0000133 } else {
Mike Reed088b74e2018-12-24 14:52:46 -0500134 font.setLinearMetrics(true);
reed@google.com35fe7372013-10-30 15:07:03 +0000135 }
Mike Reed088b74e2018-12-24 14:52:46 -0500136
137 SkPaint paint;
Mike Kleincb9fc412017-11-14 10:45:32 -0500138 for (int i = 0; i < gStylesCount; i++) {
Mike Reed088b74e2018-12-24 14:52:46 -0500139 font.setTypeface(fFaces[i]);
Ben Wagner51e15a62019-05-07 15:38:46 -0400140 canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, x, y, font, paint);
reed@google.com35fe7372013-10-30 15:07:03 +0000141 if (fApplyKerning) {
Mike Reed088b74e2018-12-24 14:52:46 -0500142 drawKernText(canvas, text, textLen, x + 240, y, font, paint);
reed@google.com35fe7372013-10-30 15:07:03 +0000143 }
reed@google.com92abe482013-02-26 16:57:16 +0000144 y += dy;
145 }
146 }
skia.committer@gmail.com12eea2b2013-02-27 07:10:10 +0000147
reed@google.com92abe482013-02-26 16:57:16 +0000148private:
149 typedef skiagm::GM INHERITED;
150};
skia.committer@gmail.com12eea2b2013-02-27 07:10:10 +0000151
halcanary4ecf0d42016-09-20 13:11:01 -0700152DEF_GM( return new TypefaceStylesGM(false); )
153DEF_GM( return new TypefaceStylesGM(true); )
bungeman61457a62016-07-06 11:55:05 -0700154
halcanary4ecf0d42016-09-20 13:11:01 -0700155////////////////////////////////////////////////////////////////////////////////
bungeman61457a62016-07-06 11:55:05 -0700156
halcanary4ecf0d42016-09-20 13:11:01 -0700157static void draw_typeface_rendering_gm(SkCanvas* canvas, sk_sp<SkTypeface> face,
158 char character = 'A') {
Ben Wagnere3f1b592018-05-10 15:24:20 -0400159 struct AliasType {
Ben Wagner86c9c952019-02-22 11:34:49 -0500160 SkFont::Edging edging;
Ben Wagnere3f1b592018-05-10 15:24:20 -0400161 bool inLayer;
162 } constexpr aliasTypes[] {
bungemanf382b482016-07-13 14:00:39 -0700163#ifndef SK_BUILD_FOR_IOS
Ben Wagnere3f1b592018-05-10 15:24:20 -0400164 // This gm crashes on iOS when drawing an embedded bitmap when requesting aliased rendering.
165 // The crash looks like
166 // libTrueTypeScaler.dylib`<redacted> + 80
167 // stop reason = EXC_BAD_ACCESS (code=EXC_ARM_DA_ALIGN, address=...)
168 // -> 0x330b19d0 <+80>: strd r2, r3, [r5, #36]
169 // 0x330b19d4 <+84>: movs r3, #0x0
170 // 0x330b19d6 <+86>: add r2, sp, #0x28
171 // 0x330b19d8 <+88>: ldr r0, [r4, #0x4]
172 // Disable testing embedded bitmaps on iOS for now.
173 // See https://bug.skia.org/5530 .
Ben Wagner86c9c952019-02-22 11:34:49 -0500174 { SkFont::Edging::kAlias , false },
bungemanf382b482016-07-13 14:00:39 -0700175#endif
Ben Wagner86c9c952019-02-22 11:34:49 -0500176 { SkFont::Edging::kAntiAlias , false },
177 { SkFont::Edging::kSubpixelAntiAlias, false },
178 { SkFont::Edging::kAntiAlias , true },
179 { SkFont::Edging::kSubpixelAntiAlias, true },
Mike Reed91919132019-01-02 12:21:01 -0500180 };
181
Ben Wagnere3f1b592018-05-10 15:24:20 -0400182 // The hintgasp.ttf is designed for the following sizes to be different.
183 // GASP_DOGRAY 0x0002 0<=ppem<=10
184 // GASP_SYMMETRIC_SMOOTHING 0x0008 0<=ppem<=10
185 // GASP_GRIDFIT 0x0001 11<=ppem<=12
186 // GASP_SYMMETRIC_GRIDFIT 0x0004 11<=ppem<=12
187 // GASP_DOGRAY|GASP_GRIDFIT 0x0003 13<=ppem<=14
188 // GASP_SYMMETRIC_SMOOTHING|GASP_SYMMETRIC_GRIDFIT 0x000C 13<=ppem<=14
189 // (neither) 0x0000 15<=ppem
190 // Odd sizes have embedded bitmaps.
191 constexpr SkScalar textSizes[] = { 9, 10, 11, 12, 13, 14, 15, 16 };
bungeman61457a62016-07-06 11:55:05 -0700192
Mike Reed9edbf422018-11-07 19:54:33 -0500193 constexpr SkFontHinting hintingTypes[] = {
Ben Wagner5785e4a2019-05-07 16:50:29 -0400194 SkFontHinting::kNone,
195 SkFontHinting::kSlight,
196 SkFontHinting::kNormal,
197 SkFontHinting::kFull
Mike Reed9edbf422018-11-07 19:54:33 -0500198 };
bungeman61457a62016-07-06 11:55:05 -0700199
Ben Wagnere3f1b592018-05-10 15:24:20 -0400200 struct SubpixelType {
201 bool requested;
202 SkVector offset;
203 } constexpr subpixelTypes[] = {
204 { false, { 0.00, 0.00 } },
205 { true , { 0.00, 0.00 } },
206 { true , { 0.25, 0.00 } },
207 { true , { 0.25, 0.25 } },
208 };
bungeman61457a62016-07-06 11:55:05 -0700209
Ben Wagnere3f1b592018-05-10 15:24:20 -0400210 constexpr bool rotateABitTypes[] = { false, true };
bungeman61457a62016-07-06 11:55:05 -0700211
Ben Wagnere3f1b592018-05-10 15:24:20 -0400212 SkScalar y = 0; // The baseline of the previous output
213 {
bungeman61457a62016-07-06 11:55:05 -0700214 SkPaint paint;
Mike Reed91919132019-01-02 12:21:01 -0500215
216 SkFont font(face);
217 font.setEmbeddedBitmaps(true);
bungeman5dba3012016-07-12 06:55:25 -0700218
bungeman61457a62016-07-06 11:55:05 -0700219 SkScalar x = 0;
220 SkScalar xMax = x;
221 SkScalar xBase = 0;
bungeman61457a62016-07-06 11:55:05 -0700222 for (const SubpixelType subpixel : subpixelTypes) {
223 y = 0;
Mike Reed91919132019-01-02 12:21:01 -0500224 font.setSubpixel(subpixel.requested);
bungeman61457a62016-07-06 11:55:05 -0700225
226 for (const AliasType& alias : aliasTypes) {
Ben Wagner86c9c952019-02-22 11:34:49 -0500227 font.setEdging(alias.edging);
bungeman61457a62016-07-06 11:55:05 -0700228 SkAutoCanvasRestore acr(canvas, false);
229 if (alias.inLayer) {
230 canvas->saveLayer(nullptr, &paint);
231 }
232
233 for (const SkScalar& textSize : textSizes) {
234 x = xBase + 5;
Mike Reed91919132019-01-02 12:21:01 -0500235 font.setSize(textSize);
bungeman61457a62016-07-06 11:55:05 -0700236
Mike Reed91919132019-01-02 12:21:01 -0500237 SkScalar dy = SkScalarCeilToScalar(font.getMetrics(nullptr));
bungeman61457a62016-07-06 11:55:05 -0700238 y += dy;
Mike Reed9edbf422018-11-07 19:54:33 -0500239 for (const SkFontHinting& hinting : hintingTypes) {
Mike Reed91919132019-01-02 12:21:01 -0500240 font.setHinting(hinting);
bungeman61457a62016-07-06 11:55:05 -0700241
242 for (const bool& rotateABit : rotateABitTypes) {
243 SkAutoCanvasRestore acr(canvas, true);
244 if (rotateABit) {
bungeman7438bfc2016-07-12 15:01:19 -0700245 canvas->rotate(2, x + subpixel.offset.x(),
246 y + subpixel.offset.y());
bungeman61457a62016-07-06 11:55:05 -0700247 }
Ben Wagner51e15a62019-05-07 15:38:46 -0400248 canvas->drawSimpleText(&character, 1, SkTextEncoding::kUTF8,
Mike Reed91919132019-01-02 12:21:01 -0500249 x + subpixel.offset.x(),
250 y + subpixel.offset.y(), font, paint);
bungeman61457a62016-07-06 11:55:05 -0700251
halcanary4ecf0d42016-09-20 13:11:01 -0700252 SkScalar dx = SkScalarCeilToScalar(
Ben Wagner51e15a62019-05-07 15:38:46 -0400253 font.measureText(&character, 1, SkTextEncoding::kUTF8)) + 5;
bungeman61457a62016-07-06 11:55:05 -0700254 x += dx;
255 xMax = SkTMax(x, xMax);
256 }
257 }
258 }
259 y += 10;
260 }
261 xBase = xMax;
262 }
Ben Wagnere3f1b592018-05-10 15:24:20 -0400263 }
264
265 constexpr struct StyleTests {
266 SkPaint::Style style;
267 SkScalar strokeWidth;
268 } styleTypes[] = {
269 { SkPaint::kFill_Style, 0.0f},
270 { SkPaint::kStroke_Style, 0.0f},
271 { SkPaint::kStroke_Style, 0.5f},
272 { SkPaint::kStrokeAndFill_Style, 1.0f},
273 };
274
275 constexpr bool fakeBoldTypes[] = { false, true };
276
277 {
278 SkPaint paint;
Mike Reed91919132019-01-02 12:21:01 -0500279
280 SkFont font(face, 16);
Ben Wagnere3f1b592018-05-10 15:24:20 -0400281
282 SkScalar x = 0;
283 for (const bool& fakeBold : fakeBoldTypes) {
Mike Reed91919132019-01-02 12:21:01 -0500284 SkScalar dy = SkScalarCeilToScalar(font.getMetrics(nullptr));
Ben Wagnere3f1b592018-05-10 15:24:20 -0400285 y += dy;
286 x = 5;
287
Mike Reed91919132019-01-02 12:21:01 -0500288 font.setEmbolden(fakeBold);
Ben Wagnere3f1b592018-05-10 15:24:20 -0400289 for (const AliasType& alias : aliasTypes) {
Ben Wagner86c9c952019-02-22 11:34:49 -0500290 font.setEdging(alias.edging);
Ben Wagnere3f1b592018-05-10 15:24:20 -0400291 SkAutoCanvasRestore acr(canvas, false);
292 if (alias.inLayer) {
293 canvas->saveLayer(nullptr, &paint);
294 }
295 for (const StyleTests& style : styleTypes) {
296 paint.setStyle(style.style);
297 paint.setStrokeWidth(style.strokeWidth);
Ben Wagner51e15a62019-05-07 15:38:46 -0400298 canvas->drawSimpleText(&character, 1, SkTextEncoding::kUTF8, x, y, font, paint);
Ben Wagnere3f1b592018-05-10 15:24:20 -0400299
Mike Reed91919132019-01-02 12:21:01 -0500300 SkScalar dx = SkScalarCeilToScalar(font.measureText(&character, 1,
Ben Wagner51e15a62019-05-07 15:38:46 -0400301 SkTextEncoding::kUTF8)) + 5;
Ben Wagnere3f1b592018-05-10 15:24:20 -0400302 x += dx;
303 }
304 }
305 y += 10;
306 }
307 }
308
309 constexpr struct MaskTests {
310 SkBlurStyle style;
311 SkScalar sigma;
312 } maskTypes[] = {
313 { SkBlurStyle::kNormal_SkBlurStyle, 0.0f},
314 { SkBlurStyle::kSolid_SkBlurStyle, 0.0f},
315 { SkBlurStyle::kOuter_SkBlurStyle, 0.0f},
316 { SkBlurStyle::kInner_SkBlurStyle, 0.0f},
317
318 { SkBlurStyle::kNormal_SkBlurStyle, 0.5f},
319 { SkBlurStyle::kSolid_SkBlurStyle, 0.5f},
320 { SkBlurStyle::kOuter_SkBlurStyle, 0.5f},
321 { SkBlurStyle::kInner_SkBlurStyle, 0.5f},
322
323 { SkBlurStyle::kNormal_SkBlurStyle, 2.0f},
324 { SkBlurStyle::kSolid_SkBlurStyle, 2.0f},
325 { SkBlurStyle::kOuter_SkBlurStyle, 2.0f},
326 { SkBlurStyle::kInner_SkBlurStyle, 2.0f},
327 };
328
329 {
330 SkPaint paint;
Mike Reed91919132019-01-02 12:21:01 -0500331
332 SkFont font(face, 16);
Ben Wagnere3f1b592018-05-10 15:24:20 -0400333
334 SkScalar x = 0;
335 {
336 for (const AliasType& alias : aliasTypes) {
Mike Reed91919132019-01-02 12:21:01 -0500337 SkScalar dy = SkScalarCeilToScalar(font.getMetrics(nullptr));
Ben Wagnere3f1b592018-05-10 15:24:20 -0400338 y += dy;
339 x = 5;
340
Ben Wagner86c9c952019-02-22 11:34:49 -0500341 font.setEdging(alias.edging);
Ben Wagnere3f1b592018-05-10 15:24:20 -0400342 SkAutoCanvasRestore acr(canvas, false);
343 if (alias.inLayer) {
344 canvas->saveLayer(nullptr, &paint);
345 }
346 for (const MaskTests& mask : maskTypes) {
347 paint.setMaskFilter(SkMaskFilter::MakeBlur(mask.style, mask.sigma));
Ben Wagner51e15a62019-05-07 15:38:46 -0400348 canvas->drawSimpleText(&character, 1, SkTextEncoding::kUTF8, x, y, font, paint);
Ben Wagnere3f1b592018-05-10 15:24:20 -0400349
Mike Reed91919132019-01-02 12:21:01 -0500350 SkScalar dx = SkScalarCeilToScalar(font.measureText(&character, 1,
Ben Wagner51e15a62019-05-07 15:38:46 -0400351 SkTextEncoding::kUTF8)) + 5;
Ben Wagnere3f1b592018-05-10 15:24:20 -0400352 x += dx;
353 }
354 paint.setMaskFilter(nullptr);
355 }
356 y += 10;
357 }
358 }
halcanary4ecf0d42016-09-20 13:11:01 -0700359}
360
Mike Kleinbea1f942019-03-08 11:11:55 -0600361DEF_SIMPLE_GM(typefacerendering, canvas, 640, 840) {
Hal Canary53e5e7d2017-12-08 14:25:14 -0500362 if (sk_sp<SkTypeface> face = MakeResourceAsTypeface("fonts/hintgasp.ttf")) {
halcanary4ecf0d42016-09-20 13:11:01 -0700363 draw_typeface_rendering_gm(canvas, std::move(face));
bungeman61457a62016-07-06 11:55:05 -0700364 }
halcanary4ecf0d42016-09-20 13:11:01 -0700365}
bungeman61457a62016-07-06 11:55:05 -0700366
halcanary4ecf0d42016-09-20 13:11:01 -0700367// Type1 fonts don't currently work in Skia on Windows.
368#ifndef SK_BUILD_FOR_WIN
bungeman61457a62016-07-06 11:55:05 -0700369
Mike Kleinbea1f942019-03-08 11:11:55 -0600370DEF_SIMPLE_GM(typefacerendering_pfa, canvas, 640, 840) {
halcanary4ecf0d42016-09-20 13:11:01 -0700371 if (sk_sp<SkTypeface> face = MakeResourceAsTypeface("fonts/Roboto2-Regular.pfa")) {
372 // This subsetted typeface doesn't have the character 'A'.
373 draw_typeface_rendering_gm(canvas, std::move(face), 'O');
374 }
375}
reed@google.com92abe482013-02-26 16:57:16 +0000376
Mike Kleinbea1f942019-03-08 11:11:55 -0600377DEF_SIMPLE_GM(typefacerendering_pfb, canvas, 640, 840) {
halcanary4ecf0d42016-09-20 13:11:01 -0700378 if (sk_sp<SkTypeface> face = MakeResourceAsTypeface("fonts/Roboto2-Regular.pfb")) {
379 draw_typeface_rendering_gm(canvas, std::move(face), 'O');
380 }
381}
382
383#endif