Home | History | Annotate | Download | only in gm
      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