1 /* 2 * Copyright 2012 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 "SkGradientShader.h" 10 11 namespace skiagm { 12 13 static sk_sp<SkShader> MakeLinear(SkScalar width, SkScalar height, bool alternate, 14 const SkMatrix& localMatrix) { 15 SkPoint pts[2] = { {0, 0}, {width, height}}; 16 SkColor colors[2] = {SK_ColorRED, SK_ColorGREEN}; 17 if (alternate) { 18 pts[1].fY = 0; 19 colors[0] = SK_ColorBLUE; 20 colors[1] = SK_ColorYELLOW; 21 } 22 return SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode, 23 0, &localMatrix); 24 } 25 26 /////////////////////////////////////////////////////////////////////////////// 27 28 class ShaderBoundsGM : public GM { 29 public: 30 typedef sk_sp<SkShader> (*ShaderGenFunc)(SkScalar width, SkScalar height, 31 bool alternate, const SkMatrix& localMatrix); 32 ShaderBoundsGM(ShaderGenFunc maker, const SkString& name) 33 : fShaderMaker(maker), 34 fName(name) { 35 } 36 37 protected: 38 39 SkString onShortName() override { 40 return fName; 41 } 42 43 SkISize onISize() override { return SkISize::Make(320, 240); } 44 45 SkMatrix onGetInitialTransform() const override { 46 SkMatrix result; 47 SkScalar scale = 0.8f; 48 result.setScale(scale, scale); 49 result.postTranslate(SkIntToScalar(7), SkIntToScalar(23)); 50 return result; 51 } 52 53 void onDraw(SkCanvas* canvas) override { 54 // The PDF device has already clipped to the content area, but we 55 // do it again here so that the raster and pdf results are consistent. 56 canvas->clipRect(SkRect::MakeWH(SkIntToScalar(320), 57 SkIntToScalar(240))); 58 59 SkMatrix canvasScale; 60 SkScalar scale = 0.7f; 61 canvasScale.setScale(scale, scale); 62 canvas->concat(canvasScale); 63 64 // Background shader. 65 SkPaint paint; 66 paint.setShader(MakeShader(559, 387, false)); 67 SkRect r = SkRect::MakeXYWH(SkIntToScalar(-12), SkIntToScalar(-41), 68 SkIntToScalar(571), SkIntToScalar(428)); 69 canvas->drawRect(r, paint); 70 71 // Constrained shader. 72 paint.setShader(MakeShader(101, 151, true)); 73 r = SkRect::MakeXYWH(SkIntToScalar(43), SkIntToScalar(71), 74 SkIntToScalar(101), SkIntToScalar(151)); 75 canvas->clipRect(r); 76 canvas->drawRect(r, paint); 77 } 78 79 sk_sp<SkShader> MakeShader(int width, int height, bool background) { 80 SkScalar scale = 0.5f; 81 if (background) { 82 scale = 0.6f; 83 } 84 SkScalar shaderWidth = width / scale; 85 SkScalar shaderHeight = height / scale; 86 SkMatrix shaderScale = SkMatrix::MakeScale(scale); 87 return fShaderMaker(shaderWidth, shaderHeight, background, shaderScale); 88 } 89 90 private: 91 typedef GM INHERITED; 92 93 ShaderGenFunc fShaderMaker; 94 SkString fName; 95 96 sk_sp<SkShader> MakeShader(bool background); 97 }; 98 99 /////////////////////////////////////////////////////////////////////////////// 100 101 static GM* MyFactory(void*) { 102 return new ShaderBoundsGM(MakeLinear, SkString("shaderbounds_linear")); 103 } 104 static GMRegistry reg(MyFactory); 105 106 } 107