1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 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 "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorSpace.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontStyle.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h" 25*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurfaceProps.h" 26*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTextBlob.h" 27*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h" 28*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 29*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h" 30*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/SkSurfaceGanesh.h" 31*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) 32*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Surface.h" 33*c8dee2aaSAndroid Build Coastguard Worker #endif 34*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTemplates.h" 35*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h" 36*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 37*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker #include <string.h> 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private; 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker class DFTextGM : public skiagm::GM { 44*c8dee2aaSAndroid Build Coastguard Worker public: DFTextGM()45*c8dee2aaSAndroid Build Coastguard Worker DFTextGM() { 46*c8dee2aaSAndroid Build Coastguard Worker this->setBGColor(0xFFFFFFFF); 47*c8dee2aaSAndroid Build Coastguard Worker } 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker protected: onOnceBeforeDraw()50*c8dee2aaSAndroid Build Coastguard Worker void onOnceBeforeDraw() override { fEmojiSample = ToolUtils::EmojiSample(); } 51*c8dee2aaSAndroid Build Coastguard Worker getName() const52*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("dftext"); } 53*c8dee2aaSAndroid Build Coastguard Worker getISize()54*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(1024, 768); } 55*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * inputCanvas)56*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* inputCanvas) override { 57*c8dee2aaSAndroid Build Coastguard Worker SkScalar textSizes[] = { 9.0f, 9.0f*2.0f, 9.0f*5.0f, 9.0f*2.0f*5.0f }; 58*c8dee2aaSAndroid Build Coastguard Worker SkScalar scales[] = { 2.0f*5.0f, 5.0f, 2.0f, 1.0f }; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker // set up offscreen rendering with distance field text 61*c8dee2aaSAndroid Build Coastguard Worker auto ctx = inputCanvas->recordingContext(); 62*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) 63*c8dee2aaSAndroid Build Coastguard Worker auto recorder = inputCanvas->recorder(); 64*c8dee2aaSAndroid Build Coastguard Worker #endif 65*c8dee2aaSAndroid Build Coastguard Worker SkISize size = this->getISize(); 66*c8dee2aaSAndroid Build Coastguard Worker if (!inputCanvas->getBaseLayerSize().isEmpty()) { 67*c8dee2aaSAndroid Build Coastguard Worker size = inputCanvas->getBaseLayerSize(); 68*c8dee2aaSAndroid Build Coastguard Worker } 69*c8dee2aaSAndroid Build Coastguard Worker SkImageInfo info = SkImageInfo::MakeN32(size.width(), size.height(), kPremul_SkAlphaType, 70*c8dee2aaSAndroid Build Coastguard Worker inputCanvas->imageInfo().refColorSpace()); 71*c8dee2aaSAndroid Build Coastguard Worker SkSurfaceProps inputProps; 72*c8dee2aaSAndroid Build Coastguard Worker inputCanvas->getProps(&inputProps); 73*c8dee2aaSAndroid Build Coastguard Worker SkSurfaceProps props(SkSurfaceProps::kUseDeviceIndependentFonts_Flag | inputProps.flags(), 74*c8dee2aaSAndroid Build Coastguard Worker inputProps.pixelGeometry()); 75*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface; 76*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE) 77*c8dee2aaSAndroid Build Coastguard Worker if (recorder) { 78*c8dee2aaSAndroid Build Coastguard Worker surface = SkSurfaces::RenderTarget(recorder, info, skgpu::Mipmapped::kNo, &props); 79*c8dee2aaSAndroid Build Coastguard Worker } else 80*c8dee2aaSAndroid Build Coastguard Worker #endif 81*c8dee2aaSAndroid Build Coastguard Worker { 82*c8dee2aaSAndroid Build Coastguard Worker surface = SkSurfaces::RenderTarget(ctx, skgpu::Budgeted::kNo, info, 0, &props); 83*c8dee2aaSAndroid Build Coastguard Worker } 84*c8dee2aaSAndroid Build Coastguard Worker SkCanvas* canvas = surface ? surface->getCanvas() : inputCanvas; 85*c8dee2aaSAndroid Build Coastguard Worker // init our new canvas with the old canvas's matrix 86*c8dee2aaSAndroid Build Coastguard Worker canvas->setMatrix(inputCanvas->getLocalToDeviceAs3x3()); 87*c8dee2aaSAndroid Build Coastguard Worker // apply global scale to test glyph positioning 88*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(1.05f, 1.05f); 89*c8dee2aaSAndroid Build Coastguard Worker canvas->clear(0xffffffff); 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 92*c8dee2aaSAndroid Build Coastguard Worker paint.setAntiAlias(true); 93*c8dee2aaSAndroid Build Coastguard Worker 94*c8dee2aaSAndroid Build Coastguard Worker SkFont font(ToolUtils::CreatePortableTypeface("serif", SkFontStyle())); 95*c8dee2aaSAndroid Build Coastguard Worker font.setSubpixel(true); 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker const char* text = "Hamburgefons"; 98*c8dee2aaSAndroid Build Coastguard Worker const size_t textLen = strlen(text); 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker // check scaling up 101*c8dee2aaSAndroid Build Coastguard Worker SkScalar x = SkIntToScalar(0); 102*c8dee2aaSAndroid Build Coastguard Worker SkScalar y = SkIntToScalar(78); 103*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(textSizes); ++i) { 104*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true); 105*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(x, y); 106*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(scales[i], scales[i]); 107*c8dee2aaSAndroid Build Coastguard Worker font.setSize(textSizes[i]); 108*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 0, 0, font, paint); 109*c8dee2aaSAndroid Build Coastguard Worker y += font.getMetrics(nullptr)*scales[i]; 110*c8dee2aaSAndroid Build Coastguard Worker } 111*c8dee2aaSAndroid Build Coastguard Worker 112*c8dee2aaSAndroid Build Coastguard Worker // check rotation 113*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < 5; ++i) { 114*c8dee2aaSAndroid Build Coastguard Worker SkScalar rotX = SkIntToScalar(10); 115*c8dee2aaSAndroid Build Coastguard Worker SkScalar rotY = y; 116*c8dee2aaSAndroid Build Coastguard Worker 117*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true); 118*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(SkIntToScalar(10 + i * 200), -80); 119*c8dee2aaSAndroid Build Coastguard Worker canvas->rotate(SkIntToScalar(i * 5), rotX, rotY); 120*c8dee2aaSAndroid Build Coastguard Worker for (int ps = 6; ps <= 32; ps += 3) { 121*c8dee2aaSAndroid Build Coastguard Worker font.setSize(SkIntToScalar(ps)); 122*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, rotX, rotY, font, paint); 123*c8dee2aaSAndroid Build Coastguard Worker rotY += font.getMetrics(nullptr); 124*c8dee2aaSAndroid Build Coastguard Worker } 125*c8dee2aaSAndroid Build Coastguard Worker } 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker // check scaling down 128*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(SkFont::Edging::kSubpixelAntiAlias); 129*c8dee2aaSAndroid Build Coastguard Worker x = SkIntToScalar(680); 130*c8dee2aaSAndroid Build Coastguard Worker y = SkIntToScalar(20); 131*c8dee2aaSAndroid Build Coastguard Worker size_t arraySize = std::size(textSizes); 132*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < arraySize; ++i) { 133*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true); 134*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(x, y); 135*c8dee2aaSAndroid Build Coastguard Worker SkScalar scaleFactor = SkScalarInvert(scales[arraySize - i - 1]); 136*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(scaleFactor, scaleFactor); 137*c8dee2aaSAndroid Build Coastguard Worker font.setSize(textSizes[i]); 138*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 0, 0, font, paint); 139*c8dee2aaSAndroid Build Coastguard Worker y += font.getMetrics(nullptr)*scaleFactor; 140*c8dee2aaSAndroid Build Coastguard Worker } 141*c8dee2aaSAndroid Build Coastguard Worker 142*c8dee2aaSAndroid Build Coastguard Worker // check pos text 143*c8dee2aaSAndroid Build Coastguard Worker { 144*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true); 145*c8dee2aaSAndroid Build Coastguard Worker 146*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(2.0f, 2.0f); 147*c8dee2aaSAndroid Build Coastguard Worker 148*c8dee2aaSAndroid Build Coastguard Worker AutoTArray<SkGlyphID> glyphs(SkToInt(textLen)); 149*c8dee2aaSAndroid Build Coastguard Worker int count = font.textToGlyphs(text, textLen, SkTextEncoding::kUTF8, glyphs.get(), textLen); 150*c8dee2aaSAndroid Build Coastguard Worker AutoTArray<SkPoint> pos(count); 151*c8dee2aaSAndroid Build Coastguard Worker font.setSize(textSizes[0]); 152*c8dee2aaSAndroid Build Coastguard Worker font.getPos(glyphs.get(), count, pos.get(), {340, 75}); 153*c8dee2aaSAndroid Build Coastguard Worker 154*c8dee2aaSAndroid Build Coastguard Worker auto blob = SkTextBlob::MakeFromPosText(glyphs.get(), count * sizeof(SkGlyphID), 155*c8dee2aaSAndroid Build Coastguard Worker pos.get(), font, SkTextEncoding::kGlyphID); 156*c8dee2aaSAndroid Build Coastguard Worker canvas->drawTextBlob(blob, 0, 0, paint); 157*c8dee2aaSAndroid Build Coastguard Worker } 158*c8dee2aaSAndroid Build Coastguard Worker 159*c8dee2aaSAndroid Build Coastguard Worker 160*c8dee2aaSAndroid Build Coastguard Worker // check gamma-corrected blending 161*c8dee2aaSAndroid Build Coastguard Worker const SkColor fg[] = { 162*c8dee2aaSAndroid Build Coastguard Worker 0xFFFFFFFF, 163*c8dee2aaSAndroid Build Coastguard Worker 0xFFFFFF00, 0xFFFF00FF, 0xFF00FFFF, 164*c8dee2aaSAndroid Build Coastguard Worker 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 165*c8dee2aaSAndroid Build Coastguard Worker 0xFF000000, 166*c8dee2aaSAndroid Build Coastguard Worker }; 167*c8dee2aaSAndroid Build Coastguard Worker 168*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(0xFFF7F3F7); 169*c8dee2aaSAndroid Build Coastguard Worker SkRect r = SkRect::MakeLTRB(670, 215, 820, 397); 170*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(r, paint); 171*c8dee2aaSAndroid Build Coastguard Worker 172*c8dee2aaSAndroid Build Coastguard Worker x = SkIntToScalar(680); 173*c8dee2aaSAndroid Build Coastguard Worker y = SkIntToScalar(235); 174*c8dee2aaSAndroid Build Coastguard Worker font.setSize(SkIntToScalar(19)); 175*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(fg); ++i) { 176*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(fg[i]); 177*c8dee2aaSAndroid Build Coastguard Worker 178*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, x, y, font, paint); 179*c8dee2aaSAndroid Build Coastguard Worker y += font.getMetrics(nullptr); 180*c8dee2aaSAndroid Build Coastguard Worker } 181*c8dee2aaSAndroid Build Coastguard Worker 182*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(0xFF181C18); 183*c8dee2aaSAndroid Build Coastguard Worker r = SkRect::MakeLTRB(820, 215, 970, 397); 184*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(r, paint); 185*c8dee2aaSAndroid Build Coastguard Worker 186*c8dee2aaSAndroid Build Coastguard Worker x = SkIntToScalar(830); 187*c8dee2aaSAndroid Build Coastguard Worker y = SkIntToScalar(235); 188*c8dee2aaSAndroid Build Coastguard Worker font.setSize(SkIntToScalar(19)); 189*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < std::size(fg); ++i) { 190*c8dee2aaSAndroid Build Coastguard Worker paint.setColor(fg[i]); 191*c8dee2aaSAndroid Build Coastguard Worker 192*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, x, y, font, paint); 193*c8dee2aaSAndroid Build Coastguard Worker y += font.getMetrics(nullptr); 194*c8dee2aaSAndroid Build Coastguard Worker } 195*c8dee2aaSAndroid Build Coastguard Worker 196*c8dee2aaSAndroid Build Coastguard Worker // check skew 197*c8dee2aaSAndroid Build Coastguard Worker { 198*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(SkFont::Edging::kAntiAlias); 199*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true); 200*c8dee2aaSAndroid Build Coastguard Worker canvas->skew(0.0f, 0.151515f); 201*c8dee2aaSAndroid Build Coastguard Worker font.setSize(SkIntToScalar(32)); 202*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 745, 70, font, paint); 203*c8dee2aaSAndroid Build Coastguard Worker } 204*c8dee2aaSAndroid Build Coastguard Worker { 205*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(SkFont::Edging::kSubpixelAntiAlias); 206*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true); 207*c8dee2aaSAndroid Build Coastguard Worker canvas->skew(0.5f, 0.0f); 208*c8dee2aaSAndroid Build Coastguard Worker font.setSize(SkIntToScalar(32)); 209*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 580, 125, font, paint); 210*c8dee2aaSAndroid Build Coastguard Worker } 211*c8dee2aaSAndroid Build Coastguard Worker 212*c8dee2aaSAndroid Build Coastguard Worker // check perspective 213*c8dee2aaSAndroid Build Coastguard Worker { 214*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(SkFont::Edging::kAntiAlias); 215*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true); 216*c8dee2aaSAndroid Build Coastguard Worker SkMatrix persp; 217*c8dee2aaSAndroid Build Coastguard Worker persp.setAll(0.9839f, 0, 0, 218*c8dee2aaSAndroid Build Coastguard Worker 0.2246f, 0.6829f, 0, 219*c8dee2aaSAndroid Build Coastguard Worker 0.0002352f, -0.0003844f, 1); 220*c8dee2aaSAndroid Build Coastguard Worker canvas->concat(persp); 221*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(1100, -295); 222*c8dee2aaSAndroid Build Coastguard Worker font.setSize(37.5f); 223*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 0, 0, font, paint); 224*c8dee2aaSAndroid Build Coastguard Worker } 225*c8dee2aaSAndroid Build Coastguard Worker { 226*c8dee2aaSAndroid Build Coastguard Worker font.setSubpixel(false); 227*c8dee2aaSAndroid Build Coastguard Worker font.setEdging(SkFont::Edging::kAlias); 228*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(canvas, true); 229*c8dee2aaSAndroid Build Coastguard Worker SkMatrix persp; 230*c8dee2aaSAndroid Build Coastguard Worker persp.setAll(0.9839f, 0, 0, 231*c8dee2aaSAndroid Build Coastguard Worker 0.2246f, 0.6829f, 0, 232*c8dee2aaSAndroid Build Coastguard Worker 0.0002352f, -0.0003844f, 1); 233*c8dee2aaSAndroid Build Coastguard Worker canvas->concat(persp); 234*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(1075, -245); 235*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(375, 375); 236*c8dee2aaSAndroid Build Coastguard Worker font.setSize(0.1f); 237*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(text, textLen, SkTextEncoding::kUTF8, 0, 0, font, paint); 238*c8dee2aaSAndroid Build Coastguard Worker } 239*c8dee2aaSAndroid Build Coastguard Worker 240*c8dee2aaSAndroid Build Coastguard Worker // check color emoji 241*c8dee2aaSAndroid Build Coastguard Worker if (fEmojiSample.typeface) { 242*c8dee2aaSAndroid Build Coastguard Worker SkFont emojiFont; 243*c8dee2aaSAndroid Build Coastguard Worker emojiFont.setSubpixel(true); 244*c8dee2aaSAndroid Build Coastguard Worker emojiFont.setTypeface(fEmojiSample.typeface); 245*c8dee2aaSAndroid Build Coastguard Worker emojiFont.setSize(SkIntToScalar(19)); 246*c8dee2aaSAndroid Build Coastguard Worker canvas->drawSimpleText(fEmojiSample.sampleText, 247*c8dee2aaSAndroid Build Coastguard Worker strlen(fEmojiSample.sampleText), 248*c8dee2aaSAndroid Build Coastguard Worker SkTextEncoding::kUTF8, 249*c8dee2aaSAndroid Build Coastguard Worker 670, 250*c8dee2aaSAndroid Build Coastguard Worker 90, 251*c8dee2aaSAndroid Build Coastguard Worker emojiFont, 252*c8dee2aaSAndroid Build Coastguard Worker paint); 253*c8dee2aaSAndroid Build Coastguard Worker } 254*c8dee2aaSAndroid Build Coastguard Worker 255*c8dee2aaSAndroid Build Coastguard Worker // render offscreen buffer 256*c8dee2aaSAndroid Build Coastguard Worker if (surface) { 257*c8dee2aaSAndroid Build Coastguard Worker SkAutoCanvasRestore acr(inputCanvas, true); 258*c8dee2aaSAndroid Build Coastguard Worker // since we prepended this matrix already, we blit using identity 259*c8dee2aaSAndroid Build Coastguard Worker inputCanvas->resetMatrix(); 260*c8dee2aaSAndroid Build Coastguard Worker inputCanvas->drawImage(surface->makeImageSnapshot().get(), 0, 0); 261*c8dee2aaSAndroid Build Coastguard Worker } 262*c8dee2aaSAndroid Build Coastguard Worker } 263*c8dee2aaSAndroid Build Coastguard Worker 264*c8dee2aaSAndroid Build Coastguard Worker private: 265*c8dee2aaSAndroid Build Coastguard Worker ToolUtils::EmojiTestSample fEmojiSample; 266*c8dee2aaSAndroid Build Coastguard Worker 267*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = skiagm::GM; 268*c8dee2aaSAndroid Build Coastguard Worker }; 269*c8dee2aaSAndroid Build Coastguard Worker 270*c8dee2aaSAndroid Build Coastguard Worker DEF_GM(return new DFTextGM;) 271