• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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