19564ce60a657acce89fb956deb8645b324eaad1ejvanverth/*
29564ce60a657acce89fb956deb8645b324eaad1ejvanverth * Copyright 2011 Google Inc.
39564ce60a657acce89fb956deb8645b324eaad1ejvanverth *
49564ce60a657acce89fb956deb8645b324eaad1ejvanverth * Use of this source code is governed by a BSD-style license that can be
59564ce60a657acce89fb956deb8645b324eaad1ejvanverth * found in the LICENSE file.
69564ce60a657acce89fb956deb8645b324eaad1ejvanverth */
79564ce60a657acce89fb956deb8645b324eaad1ejvanverth#include "gm.h"
8fca302ccf464933e44e00255654d27a7705abb7fjvanverth#include "Resources.h"
9fca302ccf464933e44e00255654d27a7705abb7fjvanverth#include "SkCanvas.h"
10fca302ccf464933e44e00255654d27a7705abb7fjvanverth#include "SkStream.h"
119564ce60a657acce89fb956deb8645b324eaad1ejvanverth#include "SkSurface.h"
129564ce60a657acce89fb956deb8645b324eaad1ejvanverth#include "SkTypeface.h"
139564ce60a657acce89fb956deb8645b324eaad1ejvanverth
14fca302ccf464933e44e00255654d27a7705abb7fjvanverthclass DFTextGM : public skiagm::GM {
159564ce60a657acce89fb956deb8645b324eaad1ejvanverthpublic:
169564ce60a657acce89fb956deb8645b324eaad1ejvanverth    DFTextGM() {
179564ce60a657acce89fb956deb8645b324eaad1ejvanverth        this->setBGColor(0xFFFFFFFF);
18fca302ccf464933e44e00255654d27a7705abb7fjvanverth        fTypeface = NULL;
199564ce60a657acce89fb956deb8645b324eaad1ejvanverth    }
209564ce60a657acce89fb956deb8645b324eaad1ejvanverth
219564ce60a657acce89fb956deb8645b324eaad1ejvanverth    virtual ~DFTextGM() {
22fca302ccf464933e44e00255654d27a7705abb7fjvanverth        SkSafeUnref(fTypeface);
239564ce60a657acce89fb956deb8645b324eaad1ejvanverth    }
249564ce60a657acce89fb956deb8645b324eaad1ejvanverth
259564ce60a657acce89fb956deb8645b324eaad1ejvanverthprotected:
2636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
273ffa126066542590dc7430514a1174e49191b875bungeman        fTypeface = GetResourceAsTypeface("/fonts/Funkster.ttf");
28fca302ccf464933e44e00255654d27a7705abb7fjvanverth    }
29fca302ccf464933e44e00255654d27a7705abb7fjvanverth
3036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
319564ce60a657acce89fb956deb8645b324eaad1ejvanverth        return SkString("dftext");
329564ce60a657acce89fb956deb8645b324eaad1ejvanverth    }
339564ce60a657acce89fb956deb8645b324eaad1ejvanverth
3436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
359564ce60a657acce89fb956deb8645b324eaad1ejvanverth        return SkISize::Make(1024, 768);
369564ce60a657acce89fb956deb8645b324eaad1ejvanverth    }
379564ce60a657acce89fb956deb8645b324eaad1ejvanverth
389564ce60a657acce89fb956deb8645b324eaad1ejvanverth    static void rotate_about(SkCanvas* canvas,
399564ce60a657acce89fb956deb8645b324eaad1ejvanverth        SkScalar degrees,
409564ce60a657acce89fb956deb8645b324eaad1ejvanverth        SkScalar px, SkScalar py) {
419564ce60a657acce89fb956deb8645b324eaad1ejvanverth        canvas->translate(px, py);
429564ce60a657acce89fb956deb8645b324eaad1ejvanverth        canvas->rotate(degrees);
439564ce60a657acce89fb956deb8645b324eaad1ejvanverth        canvas->translate(-px, -py);
449564ce60a657acce89fb956deb8645b324eaad1ejvanverth    }
459564ce60a657acce89fb956deb8645b324eaad1ejvanverth
4636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    virtual void onDraw(SkCanvas* inputCanvas) override {
47901704b34e9de5011f0792f7e2c81978a96506f1djsollen#ifdef SK_BUILD_FOR_ANDROID
48ed14f1d9db54c68b419bcb8b0a0ee1d0ded310a7jvanverth        SkScalar textSizes[] = { 9.0f, 9.0f*2.0f, 9.0f*5.0f, 9.0f*2.0f*5.0f };
49ed14f1d9db54c68b419bcb8b0a0ee1d0ded310a7jvanverth#else
509564ce60a657acce89fb956deb8645b324eaad1ejvanverth        SkScalar textSizes[] = { 11.0f, 11.0f*2.0f, 11.0f*5.0f, 11.0f*2.0f*5.0f };
51ed14f1d9db54c68b419bcb8b0a0ee1d0ded310a7jvanverth#endif
529564ce60a657acce89fb956deb8645b324eaad1ejvanverth        SkScalar scales[] = { 2.0f*5.0f, 5.0f, 2.0f, 1.0f };
539564ce60a657acce89fb956deb8645b324eaad1ejvanverth
549564ce60a657acce89fb956deb8645b324eaad1ejvanverth        // set up offscreen rendering with distance field text
559564ce60a657acce89fb956deb8645b324eaad1ejvanverth#if SK_SUPPORT_GPU
569564ce60a657acce89fb956deb8645b324eaad1ejvanverth        GrContext* ctx = inputCanvas->getGrContext();
579564ce60a657acce89fb956deb8645b324eaad1ejvanverth        SkImageInfo info = SkImageInfo::MakeN32Premul(onISize());
584a8126e7f81384526629b1e21bf89b632ea13cd9reed        SkSurfaceProps props(SkSurfaceProps::kUseDistanceFieldFonts_Flag,
594a8126e7f81384526629b1e21bf89b632ea13cd9reed                             SkSurfaceProps::kLegacyFontHost_InitType);
60afe3005be3392e43bc51eb7eb2017eefaed85ad1bsalomon        SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(ctx, SkSurface::kNo_Budgeted,
61afe3005be3392e43bc51eb7eb2017eefaed85ad1bsalomon                                                                   info, 0, &props));
6276ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        SkCanvas* canvas = surface.get() ? surface->getCanvas() : inputCanvas;
63f9669f43bff92419aba11c4a33c76f3e2daf2a44jvanverth        // init our new canvas with the old canvas's matrix
64f9669f43bff92419aba11c4a33c76f3e2daf2a44jvanverth        canvas->setMatrix(inputCanvas->getTotalMatrix());
659564ce60a657acce89fb956deb8645b324eaad1ejvanverth#else
669564ce60a657acce89fb956deb8645b324eaad1ejvanverth        SkCanvas* canvas = inputCanvas;
679564ce60a657acce89fb956deb8645b324eaad1ejvanverth#endif
6876ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        // apply global scale to test glyph positioning
6976ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        canvas->scale(1.05f, 1.05f);
709564ce60a657acce89fb956deb8645b324eaad1ejvanverth        canvas->clear(0xffffffff);
719564ce60a657acce89fb956deb8645b324eaad1ejvanverth
729564ce60a657acce89fb956deb8645b324eaad1ejvanverth        SkPaint paint;
739564ce60a657acce89fb956deb8645b324eaad1ejvanverth        paint.setAntiAlias(true);
749564ce60a657acce89fb956deb8645b324eaad1ejvanverth        paint.setSubpixelText(true);
759564ce60a657acce89fb956deb8645b324eaad1ejvanverth#if !SK_SUPPORT_GPU
769564ce60a657acce89fb956deb8645b324eaad1ejvanverth        paint.setDistanceFieldTextTEMP(true);
779564ce60a657acce89fb956deb8645b324eaad1ejvanverth#endif
789564ce60a657acce89fb956deb8645b324eaad1ejvanverth        sk_tool_utils::set_portable_typeface(&paint, "Times New Roman", SkTypeface::kNormal);
799564ce60a657acce89fb956deb8645b324eaad1ejvanverth
809564ce60a657acce89fb956deb8645b324eaad1ejvanverth        const char* text = "Hamburgefons";
819564ce60a657acce89fb956deb8645b324eaad1ejvanverth        const size_t textLen = strlen(text);
829564ce60a657acce89fb956deb8645b324eaad1ejvanverth
839564ce60a657acce89fb956deb8645b324eaad1ejvanverth        // check scaling up
849564ce60a657acce89fb956deb8645b324eaad1ejvanverth        SkScalar x = SkIntToScalar(0);
859564ce60a657acce89fb956deb8645b324eaad1ejvanverth        SkScalar y = SkIntToScalar(78);
869564ce60a657acce89fb956deb8645b324eaad1ejvanverth        for (size_t i = 0; i < SK_ARRAY_COUNT(textSizes); ++i) {
879564ce60a657acce89fb956deb8645b324eaad1ejvanverth            SkAutoCanvasRestore acr(canvas, true);
889564ce60a657acce89fb956deb8645b324eaad1ejvanverth            canvas->translate(x, y);
899564ce60a657acce89fb956deb8645b324eaad1ejvanverth            canvas->scale(scales[i], scales[i]);
909564ce60a657acce89fb956deb8645b324eaad1ejvanverth            paint.setTextSize(textSizes[i]);
919564ce60a657acce89fb956deb8645b324eaad1ejvanverth            canvas->drawText(text, textLen, 0, 0, paint);
929564ce60a657acce89fb956deb8645b324eaad1ejvanverth            y += paint.getFontMetrics(NULL)*scales[i];
939564ce60a657acce89fb956deb8645b324eaad1ejvanverth        }
949564ce60a657acce89fb956deb8645b324eaad1ejvanverth
959564ce60a657acce89fb956deb8645b324eaad1ejvanverth        // check rotation
969564ce60a657acce89fb956deb8645b324eaad1ejvanverth        for (size_t i = 0; i < 5; ++i) {
979564ce60a657acce89fb956deb8645b324eaad1ejvanverth            SkScalar rotX = SkIntToScalar(10);
989564ce60a657acce89fb956deb8645b324eaad1ejvanverth            SkScalar rotY = y;
999564ce60a657acce89fb956deb8645b324eaad1ejvanverth
1009564ce60a657acce89fb956deb8645b324eaad1ejvanverth            SkAutoCanvasRestore acr(canvas, true);
1019564ce60a657acce89fb956deb8645b324eaad1ejvanverth            canvas->translate(SkIntToScalar(10 + i * 200), -80);
1029564ce60a657acce89fb956deb8645b324eaad1ejvanverth            rotate_about(canvas, SkIntToScalar(i * 5), rotX, rotY);
1039564ce60a657acce89fb956deb8645b324eaad1ejvanverth            for (int ps = 6; ps <= 32; ps += 3) {
1049564ce60a657acce89fb956deb8645b324eaad1ejvanverth                paint.setTextSize(SkIntToScalar(ps));
1059564ce60a657acce89fb956deb8645b324eaad1ejvanverth                canvas->drawText(text, textLen, rotX, rotY, paint);
1069564ce60a657acce89fb956deb8645b324eaad1ejvanverth                rotY += paint.getFontMetrics(NULL);
1079564ce60a657acce89fb956deb8645b324eaad1ejvanverth            }
1089564ce60a657acce89fb956deb8645b324eaad1ejvanverth        }
1099564ce60a657acce89fb956deb8645b324eaad1ejvanverth
1109564ce60a657acce89fb956deb8645b324eaad1ejvanverth        // check scaling down
1119564ce60a657acce89fb956deb8645b324eaad1ejvanverth        paint.setLCDRenderText(true);
11276ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        x = SkIntToScalar(680);
1139564ce60a657acce89fb956deb8645b324eaad1ejvanverth        y = SkIntToScalar(20);
1149564ce60a657acce89fb956deb8645b324eaad1ejvanverth        size_t arraySize = SK_ARRAY_COUNT(textSizes);
1159564ce60a657acce89fb956deb8645b324eaad1ejvanverth        for (size_t i = 0; i < arraySize; ++i) {
1169564ce60a657acce89fb956deb8645b324eaad1ejvanverth            SkAutoCanvasRestore acr(canvas, true);
1179564ce60a657acce89fb956deb8645b324eaad1ejvanverth            canvas->translate(x, y);
1189564ce60a657acce89fb956deb8645b324eaad1ejvanverth            SkScalar scaleFactor = SkScalarInvert(scales[arraySize - i - 1]);
1199564ce60a657acce89fb956deb8645b324eaad1ejvanverth            canvas->scale(scaleFactor, scaleFactor);
1209564ce60a657acce89fb956deb8645b324eaad1ejvanverth            paint.setTextSize(textSizes[i]);
1219564ce60a657acce89fb956deb8645b324eaad1ejvanverth            canvas->drawText(text, textLen, 0, 0, paint);
1229564ce60a657acce89fb956deb8645b324eaad1ejvanverth            y += paint.getFontMetrics(NULL)*scaleFactor;
1239564ce60a657acce89fb956deb8645b324eaad1ejvanverth        }
1249564ce60a657acce89fb956deb8645b324eaad1ejvanverth
12576ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        // check pos text
12676ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        {
12776ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            SkAutoCanvasRestore acr(canvas, true);
12876ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth
12976ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            canvas->scale(2.0f, 2.0f);
13076ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth
131fbaace082745a0e301186b2d3b84af62e2fb87ecbsalomon            SkAutoTArray<SkPoint>  pos(SkToInt(textLen));
132fbaace082745a0e301186b2d3b84af62e2fb87ecbsalomon            SkAutoTArray<SkScalar> widths(SkToInt(textLen));
13376ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            paint.setTextSize(textSizes[0]);
13476ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth
13576ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            paint.getTextWidths(text, textLen, &widths[0]);
13676ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth
13776ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            SkScalar x = SkIntToScalar(340);
13876ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            SkScalar y = SkIntToScalar(75);
13976ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            for (unsigned int i = 0; i < textLen; ++i) {
14076ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth                pos[i].set(x, y);
14176ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth                x += widths[i];
14276ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            }
14376ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth
14476ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            canvas->drawPosText(text, textLen, &pos[0], paint);
14576ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        }
14676ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth
14776ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth
1489564ce60a657acce89fb956deb8645b324eaad1ejvanverth        // check gamma-corrected blending
1499564ce60a657acce89fb956deb8645b324eaad1ejvanverth        const SkColor fg[] = {
1509564ce60a657acce89fb956deb8645b324eaad1ejvanverth            0xFFFFFFFF,
1519564ce60a657acce89fb956deb8645b324eaad1ejvanverth            0xFFFFFF00, 0xFFFF00FF, 0xFF00FFFF,
1529564ce60a657acce89fb956deb8645b324eaad1ejvanverth            0xFFFF0000, 0xFF00FF00, 0xFF0000FF,
1539564ce60a657acce89fb956deb8645b324eaad1ejvanverth            0xFF000000,
1549564ce60a657acce89fb956deb8645b324eaad1ejvanverth        };
1559564ce60a657acce89fb956deb8645b324eaad1ejvanverth
1569564ce60a657acce89fb956deb8645b324eaad1ejvanverth        paint.setColor(0xFFF1F1F1);
15776ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        SkRect r = SkRect::MakeLTRB(670, 250, 820, 460);
1589564ce60a657acce89fb956deb8645b324eaad1ejvanverth        canvas->drawRect(r, paint);
1599564ce60a657acce89fb956deb8645b324eaad1ejvanverth
16076ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        x = SkIntToScalar(680);
1619564ce60a657acce89fb956deb8645b324eaad1ejvanverth        y = SkIntToScalar(270);
162901704b34e9de5011f0792f7e2c81978a96506f1djsollen#ifdef SK_BUILD_FOR_ANDROID
163ed14f1d9db54c68b419bcb8b0a0ee1d0ded310a7jvanverth        paint.setTextSize(SkIntToScalar(19));
164ed14f1d9db54c68b419bcb8b0a0ee1d0ded310a7jvanverth#else
1659564ce60a657acce89fb956deb8645b324eaad1ejvanverth        paint.setTextSize(SkIntToScalar(22));
166ed14f1d9db54c68b419bcb8b0a0ee1d0ded310a7jvanverth#endif
1679564ce60a657acce89fb956deb8645b324eaad1ejvanverth        for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) {
1689564ce60a657acce89fb956deb8645b324eaad1ejvanverth            paint.setColor(fg[i]);
1699564ce60a657acce89fb956deb8645b324eaad1ejvanverth
1709564ce60a657acce89fb956deb8645b324eaad1ejvanverth            canvas->drawText(text, textLen, x, y, paint);
1719564ce60a657acce89fb956deb8645b324eaad1ejvanverth            y += paint.getFontMetrics(NULL);
1729564ce60a657acce89fb956deb8645b324eaad1ejvanverth        }
1739564ce60a657acce89fb956deb8645b324eaad1ejvanverth
1749564ce60a657acce89fb956deb8645b324eaad1ejvanverth        paint.setColor(0xFF1F1F1F);
17576ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        r = SkRect::MakeLTRB(820, 250, 970, 460);
1769564ce60a657acce89fb956deb8645b324eaad1ejvanverth        canvas->drawRect(r, paint);
1779564ce60a657acce89fb956deb8645b324eaad1ejvanverth
17876ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        x = SkIntToScalar(830);
1799564ce60a657acce89fb956deb8645b324eaad1ejvanverth        y = SkIntToScalar(270);
180901704b34e9de5011f0792f7e2c81978a96506f1djsollen#ifdef SK_BUILD_FOR_ANDROID
181ed14f1d9db54c68b419bcb8b0a0ee1d0ded310a7jvanverth        paint.setTextSize(SkIntToScalar(19));
182ed14f1d9db54c68b419bcb8b0a0ee1d0ded310a7jvanverth#else
1839564ce60a657acce89fb956deb8645b324eaad1ejvanverth        paint.setTextSize(SkIntToScalar(22));
184ed14f1d9db54c68b419bcb8b0a0ee1d0ded310a7jvanverth#endif
1859564ce60a657acce89fb956deb8645b324eaad1ejvanverth        for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) {
1869564ce60a657acce89fb956deb8645b324eaad1ejvanverth            paint.setColor(fg[i]);
1879564ce60a657acce89fb956deb8645b324eaad1ejvanverth
1889564ce60a657acce89fb956deb8645b324eaad1ejvanverth            canvas->drawText(text, textLen, x, y, paint);
1899564ce60a657acce89fb956deb8645b324eaad1ejvanverth            y += paint.getFontMetrics(NULL);
1909564ce60a657acce89fb956deb8645b324eaad1ejvanverth        }
1919564ce60a657acce89fb956deb8645b324eaad1ejvanverth
192354eba5cb61801130a84378356434d3cc0a4b71ajvanverth        // check skew
193354eba5cb61801130a84378356434d3cc0a4b71ajvanverth        {
194354eba5cb61801130a84378356434d3cc0a4b71ajvanverth            paint.setLCDRenderText(false);
195354eba5cb61801130a84378356434d3cc0a4b71ajvanverth            SkAutoCanvasRestore acr(canvas, true);
196354eba5cb61801130a84378356434d3cc0a4b71ajvanverth            canvas->skew(0.0f, 0.151515f);
197d68a550ec890c3e3135ffa119621e17e55d58dd6jvanverth            paint.setTextSize(SkIntToScalar(32));
198354eba5cb61801130a84378356434d3cc0a4b71ajvanverth            canvas->drawText(text, textLen, 745, 70, paint);
199354eba5cb61801130a84378356434d3cc0a4b71ajvanverth        }
200354eba5cb61801130a84378356434d3cc0a4b71ajvanverth        {
201354eba5cb61801130a84378356434d3cc0a4b71ajvanverth            paint.setLCDRenderText(true);
202354eba5cb61801130a84378356434d3cc0a4b71ajvanverth            SkAutoCanvasRestore acr(canvas, true);
203354eba5cb61801130a84378356434d3cc0a4b71ajvanverth            canvas->skew(0.5f, 0.0f);
204d68a550ec890c3e3135ffa119621e17e55d58dd6jvanverth            paint.setTextSize(SkIntToScalar(32));
205354eba5cb61801130a84378356434d3cc0a4b71ajvanverth            canvas->drawText(text, textLen, 580, 230, paint);
206354eba5cb61801130a84378356434d3cc0a4b71ajvanverth        }
207354eba5cb61801130a84378356434d3cc0a4b71ajvanverth
208fca302ccf464933e44e00255654d27a7705abb7fjvanverth        // check color emoji
209fca302ccf464933e44e00255654d27a7705abb7fjvanverth        paint.setTypeface(fTypeface);
210d68a550ec890c3e3135ffa119621e17e55d58dd6jvanverth#ifdef SK_BUILD_FOR_ANDROID
211d68a550ec890c3e3135ffa119621e17e55d58dd6jvanverth        paint.setTextSize(SkIntToScalar(19));
212d68a550ec890c3e3135ffa119621e17e55d58dd6jvanverth#else
213d68a550ec890c3e3135ffa119621e17e55d58dd6jvanverth        paint.setTextSize(SkIntToScalar(22));
214d68a550ec890c3e3135ffa119621e17e55d58dd6jvanverth#endif
215fca302ccf464933e44e00255654d27a7705abb7fjvanverth        canvas->drawText(text, textLen, 670, 100, paint);
216fca302ccf464933e44e00255654d27a7705abb7fjvanverth
2179564ce60a657acce89fb956deb8645b324eaad1ejvanverth#if SK_SUPPORT_GPU
2189564ce60a657acce89fb956deb8645b324eaad1ejvanverth        // render offscreen buffer
21976ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        if (surface) {
220f9669f43bff92419aba11c4a33c76f3e2daf2a44jvanverth            SkAutoCanvasRestore acr(inputCanvas, true);
221f9669f43bff92419aba11c4a33c76f3e2daf2a44jvanverth            // since we prepended this matrix already, we blit using identity
222f9669f43bff92419aba11c4a33c76f3e2daf2a44jvanverth            inputCanvas->resetMatrix();
22376ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            SkImage* image = surface->newImageSnapshot();
224b5fae93d72c7b6480f83fd8a7b534cd1fdfcd49apiotaixr            inputCanvas->drawImage(image, 0, 0, NULL);
22576ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth            image->unref();
22676ce81e5e6c205dbb6344f9da51bfb7eba7bb43cjvanverth        }
2279564ce60a657acce89fb956deb8645b324eaad1ejvanverth#endif
2289564ce60a657acce89fb956deb8645b324eaad1ejvanverth    }
2299564ce60a657acce89fb956deb8645b324eaad1ejvanverth
2309564ce60a657acce89fb956deb8645b324eaad1ejvanverthprivate:
231fca302ccf464933e44e00255654d27a7705abb7fjvanverth    SkTypeface* fTypeface;
2329564ce60a657acce89fb956deb8645b324eaad1ejvanverth
233fca302ccf464933e44e00255654d27a7705abb7fjvanverth    typedef skiagm::GM INHERITED;
234fca302ccf464933e44e00255654d27a7705abb7fjvanverth};
2359564ce60a657acce89fb956deb8645b324eaad1ejvanverth
236fca302ccf464933e44e00255654d27a7705abb7fjvanverthDEF_GM( return SkNEW(DFTextGM); )
237