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