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