1 /* 2 * Copyright 2011 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 #include "gm.h" 8 #include "Resources.h" 9 #include "SkCanvas.h" 10 #include "SkStream.h" 11 #include "SkSurface.h" 12 #include "SkTypeface.h" 13 14 class DFTextGM : public skiagm::GM { 15 public: DFTextGM()16 DFTextGM() { 17 this->setBGColor(0xFFFFFFFF); 18 fTypeface = NULL; 19 } 20 ~DFTextGM()21 virtual ~DFTextGM() { 22 SkSafeUnref(fTypeface); 23 } 24 25 protected: onOnceBeforeDraw()26 void onOnceBeforeDraw() override { 27 fTypeface = GetResourceAsTypeface("/fonts/Funkster.ttf"); 28 } 29 onShortName()30 SkString onShortName() override { 31 return SkString("dftext"); 32 } 33 onISize()34 SkISize onISize() override { 35 return SkISize::Make(1024, 768); 36 } 37 rotate_about(SkCanvas * canvas,SkScalar degrees,SkScalar px,SkScalar py)38 static void rotate_about(SkCanvas* canvas, 39 SkScalar degrees, 40 SkScalar px, SkScalar py) { 41 canvas->translate(px, py); 42 canvas->rotate(degrees); 43 canvas->translate(-px, -py); 44 } 45 onDraw(SkCanvas * inputCanvas)46 virtual void onDraw(SkCanvas* inputCanvas) override { 47 #ifdef SK_BUILD_FOR_ANDROID 48 SkScalar textSizes[] = { 9.0f, 9.0f*2.0f, 9.0f*5.0f, 9.0f*2.0f*5.0f }; 49 #else 50 SkScalar textSizes[] = { 11.0f, 11.0f*2.0f, 11.0f*5.0f, 11.0f*2.0f*5.0f }; 51 #endif 52 SkScalar scales[] = { 2.0f*5.0f, 5.0f, 2.0f, 1.0f }; 53 54 // set up offscreen rendering with distance field text 55 #if SK_SUPPORT_GPU 56 GrContext* ctx = inputCanvas->getGrContext(); 57 SkImageInfo info = SkImageInfo::MakeN32Premul(onISize()); 58 SkSurfaceProps props(SkSurfaceProps::kUseDistanceFieldFonts_Flag, 59 SkSurfaceProps::kLegacyFontHost_InitType); 60 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(ctx, SkSurface::kNo_Budgeted, 61 info, 0, &props)); 62 SkCanvas* canvas = surface.get() ? surface->getCanvas() : inputCanvas; 63 // init our new canvas with the old canvas's matrix 64 canvas->setMatrix(inputCanvas->getTotalMatrix()); 65 #else 66 SkCanvas* canvas = inputCanvas; 67 #endif 68 // apply global scale to test glyph positioning 69 canvas->scale(1.05f, 1.05f); 70 canvas->clear(0xffffffff); 71 72 SkPaint paint; 73 paint.setAntiAlias(true); 74 paint.setSubpixelText(true); 75 #if !SK_SUPPORT_GPU 76 paint.setDistanceFieldTextTEMP(true); 77 #endif 78 sk_tool_utils::set_portable_typeface(&paint, "Times New Roman", SkTypeface::kNormal); 79 80 const char* text = "Hamburgefons"; 81 const size_t textLen = strlen(text); 82 83 // check scaling up 84 SkScalar x = SkIntToScalar(0); 85 SkScalar y = SkIntToScalar(78); 86 for (size_t i = 0; i < SK_ARRAY_COUNT(textSizes); ++i) { 87 SkAutoCanvasRestore acr(canvas, true); 88 canvas->translate(x, y); 89 canvas->scale(scales[i], scales[i]); 90 paint.setTextSize(textSizes[i]); 91 canvas->drawText(text, textLen, 0, 0, paint); 92 y += paint.getFontMetrics(NULL)*scales[i]; 93 } 94 95 // check rotation 96 for (size_t i = 0; i < 5; ++i) { 97 SkScalar rotX = SkIntToScalar(10); 98 SkScalar rotY = y; 99 100 SkAutoCanvasRestore acr(canvas, true); 101 canvas->translate(SkIntToScalar(10 + i * 200), -80); 102 rotate_about(canvas, SkIntToScalar(i * 5), rotX, rotY); 103 for (int ps = 6; ps <= 32; ps += 3) { 104 paint.setTextSize(SkIntToScalar(ps)); 105 canvas->drawText(text, textLen, rotX, rotY, paint); 106 rotY += paint.getFontMetrics(NULL); 107 } 108 } 109 110 // check scaling down 111 paint.setLCDRenderText(true); 112 x = SkIntToScalar(680); 113 y = SkIntToScalar(20); 114 size_t arraySize = SK_ARRAY_COUNT(textSizes); 115 for (size_t i = 0; i < arraySize; ++i) { 116 SkAutoCanvasRestore acr(canvas, true); 117 canvas->translate(x, y); 118 SkScalar scaleFactor = SkScalarInvert(scales[arraySize - i - 1]); 119 canvas->scale(scaleFactor, scaleFactor); 120 paint.setTextSize(textSizes[i]); 121 canvas->drawText(text, textLen, 0, 0, paint); 122 y += paint.getFontMetrics(NULL)*scaleFactor; 123 } 124 125 // check pos text 126 { 127 SkAutoCanvasRestore acr(canvas, true); 128 129 canvas->scale(2.0f, 2.0f); 130 131 SkAutoTArray<SkPoint> pos(SkToInt(textLen)); 132 SkAutoTArray<SkScalar> widths(SkToInt(textLen)); 133 paint.setTextSize(textSizes[0]); 134 135 paint.getTextWidths(text, textLen, &widths[0]); 136 137 SkScalar x = SkIntToScalar(340); 138 SkScalar y = SkIntToScalar(75); 139 for (unsigned int i = 0; i < textLen; ++i) { 140 pos[i].set(x, y); 141 x += widths[i]; 142 } 143 144 canvas->drawPosText(text, textLen, &pos[0], paint); 145 } 146 147 148 // check gamma-corrected blending 149 const SkColor fg[] = { 150 0xFFFFFFFF, 151 0xFFFFFF00, 0xFFFF00FF, 0xFF00FFFF, 152 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 153 0xFF000000, 154 }; 155 156 paint.setColor(0xFFF1F1F1); 157 SkRect r = SkRect::MakeLTRB(670, 250, 820, 460); 158 canvas->drawRect(r, paint); 159 160 x = SkIntToScalar(680); 161 y = SkIntToScalar(270); 162 #ifdef SK_BUILD_FOR_ANDROID 163 paint.setTextSize(SkIntToScalar(19)); 164 #else 165 paint.setTextSize(SkIntToScalar(22)); 166 #endif 167 for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) { 168 paint.setColor(fg[i]); 169 170 canvas->drawText(text, textLen, x, y, paint); 171 y += paint.getFontMetrics(NULL); 172 } 173 174 paint.setColor(0xFF1F1F1F); 175 r = SkRect::MakeLTRB(820, 250, 970, 460); 176 canvas->drawRect(r, paint); 177 178 x = SkIntToScalar(830); 179 y = SkIntToScalar(270); 180 #ifdef SK_BUILD_FOR_ANDROID 181 paint.setTextSize(SkIntToScalar(19)); 182 #else 183 paint.setTextSize(SkIntToScalar(22)); 184 #endif 185 for (size_t i = 0; i < SK_ARRAY_COUNT(fg); ++i) { 186 paint.setColor(fg[i]); 187 188 canvas->drawText(text, textLen, x, y, paint); 189 y += paint.getFontMetrics(NULL); 190 } 191 192 // check skew 193 { 194 paint.setLCDRenderText(false); 195 SkAutoCanvasRestore acr(canvas, true); 196 canvas->skew(0.0f, 0.151515f); 197 paint.setTextSize(SkIntToScalar(32)); 198 canvas->drawText(text, textLen, 745, 70, paint); 199 } 200 { 201 paint.setLCDRenderText(true); 202 SkAutoCanvasRestore acr(canvas, true); 203 canvas->skew(0.5f, 0.0f); 204 paint.setTextSize(SkIntToScalar(32)); 205 canvas->drawText(text, textLen, 580, 230, paint); 206 } 207 208 // check color emoji 209 paint.setTypeface(fTypeface); 210 #ifdef SK_BUILD_FOR_ANDROID 211 paint.setTextSize(SkIntToScalar(19)); 212 #else 213 paint.setTextSize(SkIntToScalar(22)); 214 #endif 215 canvas->drawText(text, textLen, 670, 100, paint); 216 217 #if SK_SUPPORT_GPU 218 // render offscreen buffer 219 if (surface) { 220 SkAutoCanvasRestore acr(inputCanvas, true); 221 // since we prepended this matrix already, we blit using identity 222 inputCanvas->resetMatrix(); 223 SkImage* image = surface->newImageSnapshot(); 224 inputCanvas->drawImage(image, 0, 0, NULL); 225 image->unref(); 226 } 227 #endif 228 } 229 230 private: 231 SkTypeface* fTypeface; 232 233 typedef skiagm::GM INHERITED; 234 }; 235 236 DEF_GM( return SkNEW(DFTextGM); ) 237