gradtext.cpp revision 100abf49e10544bc4f436bf1f38e6929779621f4
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 8#include "gm.h" 9#include "SkCanvas.h" 10#include "SkGradientShader.h" 11#include "SkTypeface.h" 12 13// test shader w/ transparency 14static SkShader* make_grad(SkScalar width) { 15 SkColor colors[] = { SK_ColorRED, 0x0000FF00, SK_ColorBLUE }; 16 SkPoint pts[] = { { 0, 0 }, { width, 0 } }; 17 return SkGradientShader::CreateLinear(pts, colors, NULL, 18 SK_ARRAY_COUNT(colors), 19 SkShader::kMirror_TileMode); 20} 21 22// test opaque shader 23static SkShader* make_grad2(SkScalar width) { 24 SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE }; 25 SkPoint pts[] = { { 0, 0 }, { width, 0 } }; 26 return SkGradientShader::CreateLinear(pts, colors, NULL, 27 SK_ARRAY_COUNT(colors), 28 SkShader::kMirror_TileMode); 29} 30 31static SkShader* make_chrome_solid() { 32 SkColor colors[] = { SK_ColorGREEN, SK_ColorGREEN }; 33 SkPoint pts[] = { { 0, 0 }, { 1, 0 } }; 34 return SkGradientShader::CreateLinear(pts, colors, NULL, 2, 35 SkShader::kClamp_TileMode); 36} 37 38namespace skiagm { 39 40// Replicate chrome layout test - clipped pathed gradient-shaded text 41class ChromeGradTextGM1 : public GM { 42public: 43 ChromeGradTextGM1() { } 44protected: 45 46 virtual SkString onShortName() { return SkString("chrome_gradtext1"); } 47 virtual SkISize onISize() { return make_isize(500, 480); } 48 virtual void onDraw(SkCanvas* canvas) { 49 SkPaint paint; 50 SkRect r = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 51 52 canvas->clipRect(r); 53 54 paint.setColor(SK_ColorRED); 55 canvas->drawRect(r, paint); 56 57 // Minimal repro doesn't require AA, LCD, or a nondefault typeface 58 paint.setShader(make_chrome_solid())->unref(); 59 paint.setTextSize(SkIntToScalar(500)); 60 61 canvas->drawText("I", 1, 0, 100, paint); 62 } 63private: 64 typedef GM INHERITED; 65}; 66 67 68// Replicate chrome layout test - switching between solid & gadient text 69class ChromeGradTextGM2 : public GM { 70public: 71 ChromeGradTextGM2() { } 72protected: 73 74 virtual SkString onShortName() { return SkString("chrome_gradtext2"); } 75 virtual SkISize onISize() { return make_isize(500, 480); } 76 virtual void onDraw(SkCanvas* canvas) { 77 SkPaint paint; 78 SkRect r = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 79 80 81 paint.setStyle(SkPaint::kFill_Style); 82 canvas->drawText("Normal Fill Text", 16, 0, 50, paint); 83 paint.setStyle(SkPaint::kStroke_Style); 84 canvas->drawText("Normal Stroke Text", 18, 0, 100, paint); 85 86 // Minimal repro doesn't require AA, LCD, or a nondefault typeface 87 paint.setShader(make_chrome_solid())->unref(); 88 89 paint.setStyle(SkPaint::kFill_Style); 90 canvas->drawText("Gradient Fill Text", 18, 0, 150, paint); 91 paint.setStyle(SkPaint::kStroke_Style); 92 canvas->drawText("Gradient Stroke Text", 20, 0, 200, paint); 93 } 94private: 95 typedef GM INHERITED; 96}; 97 98 99 100class GradTextGM : public GM { 101public: 102 GradTextGM () {} 103 104protected: 105 106 virtual SkString onShortName() { 107 return SkString("gradtext"); 108 } 109 110 virtual SkISize onISize() { return make_isize(500, 480); } 111 112 static void draw_text(SkCanvas* canvas, const SkPaint& paint) { 113 const char* text = "When in the course of human events"; 114 size_t len = strlen(text); 115 canvas->drawText(text, len, 0, 0, paint); 116 } 117 118 static void draw_text3(SkCanvas* canvas, const SkPaint& paint) { 119 SkPaint p(paint); 120 121 p.setAntiAlias(false); 122 draw_text(canvas, p); 123 p.setAntiAlias(true); 124 canvas->translate(0, paint.getTextSize() * 4/3); 125 draw_text(canvas, p); 126 p.setLCDRenderText(true); 127 canvas->translate(0, paint.getTextSize() * 4/3); 128 draw_text(canvas, p); 129 } 130 131 virtual void onDraw(SkCanvas* canvas) { 132 SkPaint paint; 133 paint.setTextSize(SkIntToScalar(26)); 134 135 const SkISize& size = this->getISize(); 136 SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()), 137 SkIntToScalar(size.height()) / 2); 138 canvas->drawRect(r, paint); 139 140 canvas->translate(SkIntToScalar(20), paint.getTextSize()); 141 142 for (int i = 0; i < 2; ++i) { 143 paint.setShader(make_grad(SkIntToScalar(80)))->unref(); 144 draw_text3(canvas, paint); 145 146 canvas->translate(0, paint.getTextSize() * 2); 147 148 paint.setShader(make_grad2(SkIntToScalar(80)))->unref(); 149 draw_text3(canvas, paint); 150 151 canvas->translate(0, paint.getTextSize() * 2); 152 } 153 } 154 155private: 156 typedef GM INHERITED; 157}; 158 159////////////////////////////////////////////////////////////////////////////// 160 161static GM* MyFactory(void*) { return new GradTextGM; } 162static GM* CMyFactory(void*) { return new ChromeGradTextGM1; } 163static GM* CMyFactory2(void*) { return new ChromeGradTextGM2; } 164 165static GMRegistry reg(MyFactory); 166static GMRegistry Creg(CMyFactory); 167static GMRegistry Creg2(CMyFactory2); 168} 169 170