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 14 static 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 23 static 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 31 static 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 38 namespace skiagm { 39 40 // Replicate chrome layout test - clipped pathed gradient-shaded text 41 class ChromeGradTextGM1 : public GM { 42 public: 43 ChromeGradTextGM1() { } 44 protected: 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 } 63 private: 64 typedef GM INHERITED; 65 }; 66 67 68 // Replicate chrome layout test - switching between solid & gadient text 69 class ChromeGradTextGM2 : public GM { 70 public: 71 ChromeGradTextGM2() { } 72 protected: 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 79 paint.setStyle(SkPaint::kFill_Style); 80 canvas->drawText("Normal Fill Text", 16, 0, 50, paint); 81 paint.setStyle(SkPaint::kStroke_Style); 82 canvas->drawText("Normal Stroke Text", 18, 0, 100, paint); 83 84 // Minimal repro doesn't require AA, LCD, or a nondefault typeface 85 paint.setShader(make_chrome_solid())->unref(); 86 87 paint.setStyle(SkPaint::kFill_Style); 88 canvas->drawText("Gradient Fill Text", 18, 0, 150, paint); 89 paint.setStyle(SkPaint::kStroke_Style); 90 canvas->drawText("Gradient Stroke Text", 20, 0, 200, paint); 91 } 92 private: 93 typedef GM INHERITED; 94 }; 95 96 97 98 class GradTextGM : public GM { 99 public: 100 GradTextGM () {} 101 102 protected: 103 104 virtual SkString onShortName() { 105 return SkString("gradtext"); 106 } 107 108 virtual SkISize onISize() { return make_isize(500, 480); } 109 110 static void draw_text(SkCanvas* canvas, const SkPaint& paint) { 111 const char* text = "When in the course of human events"; 112 size_t len = strlen(text); 113 canvas->drawText(text, len, 0, 0, paint); 114 } 115 116 static void draw_text3(SkCanvas* canvas, const SkPaint& paint) { 117 SkPaint p(paint); 118 119 p.setAntiAlias(false); 120 draw_text(canvas, p); 121 p.setAntiAlias(true); 122 canvas->translate(0, paint.getTextSize() * 4/3); 123 draw_text(canvas, p); 124 p.setLCDRenderText(true); 125 canvas->translate(0, paint.getTextSize() * 4/3); 126 draw_text(canvas, p); 127 } 128 129 virtual void onDraw(SkCanvas* canvas) { 130 SkPaint paint; 131 paint.setTextSize(SkIntToScalar(26)); 132 133 const SkISize& size = this->getISize(); 134 SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()), 135 SkIntToScalar(size.height()) / 2); 136 canvas->drawRect(r, paint); 137 138 canvas->translate(SkIntToScalar(20), paint.getTextSize()); 139 140 for (int i = 0; i < 2; ++i) { 141 paint.setShader(make_grad(SkIntToScalar(80)))->unref(); 142 draw_text3(canvas, paint); 143 144 canvas->translate(0, paint.getTextSize() * 2); 145 146 paint.setShader(make_grad2(SkIntToScalar(80)))->unref(); 147 draw_text3(canvas, paint); 148 149 canvas->translate(0, paint.getTextSize() * 2); 150 } 151 } 152 153 private: 154 typedef GM INHERITED; 155 }; 156 157 ////////////////////////////////////////////////////////////////////////////// 158 159 static GM* MyFactory(void*) { return new GradTextGM; } 160 static GM* CMyFactory(void*) { return new ChromeGradTextGM1; } 161 static GM* CMyFactory2(void*) { return new ChromeGradTextGM2; } 162 163 static GMRegistry reg(MyFactory); 164 static GMRegistry Creg(CMyFactory); 165 static GMRegistry Creg2(CMyFactory2); 166 } 167