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