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 SkISize::Make(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 SkISize::Make(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 virtual uint32_t onGetFlags() const SK_OVERRIDE { 104 return kSkipTiled_Flag; 105 } 106 107 108 virtual SkString onShortName() { 109 return SkString("gradtext"); 110 } 111 112 virtual SkISize onISize() { return SkISize::Make(500, 480); } 113 114 static void draw_text(SkCanvas* canvas, const SkPaint& paint) { 115 const char* text = "When in the course of human events"; 116 size_t len = strlen(text); 117 canvas->drawText(text, len, 0, 0, paint); 118 } 119 120 static void draw_text3(SkCanvas* canvas, const SkPaint& paint) { 121 SkPaint p(paint); 122 123 p.setAntiAlias(false); 124 draw_text(canvas, p); 125 p.setAntiAlias(true); 126 canvas->translate(0, paint.getTextSize() * 4/3); 127 draw_text(canvas, p); 128 p.setLCDRenderText(true); 129 canvas->translate(0, paint.getTextSize() * 4/3); 130 draw_text(canvas, p); 131 } 132 133 virtual void onDraw(SkCanvas* canvas) { 134 SkPaint paint; 135 paint.setTextSize(SkIntToScalar(26)); 136 137 const SkISize& size = this->getISize(); 138 SkRect r = SkRect::MakeWH(SkIntToScalar(size.width()), 139 SkIntToScalar(size.height()) / 2); 140 canvas->drawRect(r, paint); 141 142 canvas->translate(SkIntToScalar(20), paint.getTextSize()); 143 144 for (int i = 0; i < 2; ++i) { 145 paint.setShader(make_grad(SkIntToScalar(80)))->unref(); 146 draw_text3(canvas, paint); 147 148 canvas->translate(0, paint.getTextSize() * 2); 149 150 paint.setShader(make_grad2(SkIntToScalar(80)))->unref(); 151 draw_text3(canvas, paint); 152 153 canvas->translate(0, paint.getTextSize() * 2); 154 } 155 } 156 157 private: 158 typedef GM INHERITED; 159 }; 160 161 ////////////////////////////////////////////////////////////////////////////// 162 163 static GM* MyFactory(void*) { return new GradTextGM; } 164 static GM* CMyFactory(void*) { return new ChromeGradTextGM1; } 165 static GM* CMyFactory2(void*) { return new ChromeGradTextGM2; } 166 167 static GMRegistry reg(MyFactory); 168 static GMRegistry Creg(CMyFactory); 169 static GMRegistry Creg2(CMyFactory2); 170 } 171