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, nullptr, 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, nullptr, 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, nullptr, 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 SkISize::Make(500, 480); } 48 virtual void onDraw(SkCanvas* canvas) { 49 SkPaint paint; 50 sk_tool_utils::set_portable_typeface(&paint); 51 SkRect r = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 52 53 canvas->clipRect(r); 54 55 paint.setColor(SK_ColorRED); 56 canvas->drawRect(r, paint); 57 58 // Minimal repro doesn't require AA, LCD, or a nondefault typeface 59 paint.setShader(make_chrome_solid())->unref(); 60 paint.setTextSize(SkIntToScalar(500)); 61 62 canvas->drawText("I", 1, 0, 100, paint); 63 } 64private: 65 typedef GM INHERITED; 66}; 67 68 69// Replicate chrome layout test - switching between solid & gradient text 70class ChromeGradTextGM2 : public GM { 71public: 72 ChromeGradTextGM2() { } 73protected: 74 75 virtual SkString onShortName() { return SkString("chrome_gradtext2"); } 76 virtual SkISize onISize() { return SkISize::Make(500, 480); } 77 virtual void onDraw(SkCanvas* canvas) { 78 SkPaint paint; 79 sk_tool_utils::set_portable_typeface(&paint); 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 SkString onShortName() override { 106 return SkString("gradtext"); 107 } 108 109 SkISize onISize() override { return SkISize::Make(500, 480); } 110 111 static void draw_text(SkCanvas* canvas, const SkPaint& paint) { 112 const char* text = "When in the course of human events"; 113 size_t len = strlen(text); 114 canvas->drawText(text, len, 0, 0, paint); 115 } 116 117 static void draw_text3(SkCanvas* canvas, const SkPaint& paint) { 118 SkPaint p(paint); 119 120 p.setAntiAlias(false); 121 draw_text(canvas, p); 122 p.setAntiAlias(true); 123 canvas->translate(0, paint.getTextSize() * 4/3); 124 draw_text(canvas, p); 125 p.setLCDRenderText(true); 126 canvas->translate(0, paint.getTextSize() * 4/3); 127 draw_text(canvas, p); 128 } 129 130 void onDraw(SkCanvas* canvas) override { 131 SkPaint paint; 132 sk_tool_utils::set_portable_typeface(&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