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 #include "gm.h"
      8 #include "SkGradientShader.h"
      9 
     10 namespace skiagm {
     11 
     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, NULL, 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);
     31     ShaderBoundsGM(ShaderGenFunc maker, const SkString& name)
     32         : fShaderMaker(maker),
     33           fName(name) {
     34     }
     35 
     36 protected:
     37     virtual uint32_t onGetFlags() const SK_OVERRIDE {
     38         return kSkipTiled_Flag;
     39     }
     40 
     41     SkString onShortName() {
     42         return fName;
     43     }
     44 
     45     virtual SkISize onISize() { return SkISize::Make(320, 240); }
     46 
     47     virtual SkMatrix onGetInitialTransform() const SK_OVERRIDE {
     48         SkMatrix result;
     49         SkScalar scale = 0.8f;
     50         result.setScale(scale, scale);
     51         result.postTranslate(SkIntToScalar(7), SkIntToScalar(23));
     52         return result;
     53     }
     54 
     55     virtual void onDraw(SkCanvas* canvas) {
     56         // The PDF device has already clipped to the content area, but we
     57         // do it again here so that the raster and pdf results are consistent.
     58         canvas->clipRect(SkRect::MakeWH(SkIntToScalar(320),
     59                                         SkIntToScalar(240)));
     60 
     61         SkMatrix canvasScale;
     62         SkScalar scale = 0.7f;
     63         canvasScale.setScale(scale, scale);
     64         canvas->concat(canvasScale);
     65 
     66         // Background shader.
     67         SkPaint paint;
     68         paint.setShader(MakeShader(559, 387, false))->unref();
     69         SkRect r = SkRect::MakeXYWH(SkIntToScalar(-12), SkIntToScalar(-41),
     70                                     SkIntToScalar(571), SkIntToScalar(428));
     71         canvas->drawRect(r, paint);
     72 
     73         // Constrained shader.
     74         paint.setShader(MakeShader(101, 151, true))->unref();
     75         r = SkRect::MakeXYWH(SkIntToScalar(43), SkIntToScalar(71),
     76                              SkIntToScalar(101), SkIntToScalar(151));
     77         canvas->clipRect(r);
     78         canvas->drawRect(r, paint);
     79     }
     80 
     81     SkShader* MakeShader(int width, int height, bool background) {
     82         SkScalar scale = 0.5f;
     83         if (background) {
     84             scale = 0.6f;
     85         }
     86         SkScalar shaderWidth = SkScalarDiv(SkIntToScalar(width), scale);
     87         SkScalar shaderHeight = SkScalarDiv(SkIntToScalar(height), scale);
     88         SkMatrix shaderScale;
     89         shaderScale.setScale(scale, scale);
     90         SkShader* shader = fShaderMaker(shaderWidth, shaderHeight, background, shaderScale);
     91         return shader;
     92     }
     93 
     94 private:
     95     typedef GM INHERITED;
     96 
     97     ShaderGenFunc fShaderMaker;
     98     SkString fName;
     99 
    100     SkShader* MakeShader(bool background);
    101 };
    102 
    103 ///////////////////////////////////////////////////////////////////////////////
    104 
    105 static GM* MyFactory(void*) {
    106     return new ShaderBoundsGM(MakeLinear, SkString("shaderbounds_linear"));
    107 }
    108 static GMRegistry reg(MyFactory);
    109 
    110 }
    111