Home | History | Annotate | Download | only in gm
      1 
      2 /*
      3  * Copyright 2013 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "gm.h"
      9 #include "SkGradientShader.h"
     10 
     11 using namespace skiagm;
     12 
     13 struct GradData {
     14     int             fCount;
     15     const SkColor*  fColors;
     16     const SkScalar* fPos;
     17 };
     18 
     19 static const SkColor gColors[] = {
     20     SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
     21     SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
     22     SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
     23     SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
     24     SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
     25     SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
     26     SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
     27     SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE, SK_ColorWHITE, SK_ColorBLACK,
     28 };
     29 
     30 //static const SkScalar gPos[] = { SK_Scalar1*999/2000, SK_Scalar1*1001/2000 };
     31 
     32 static const GradData gGradData[] = {
     33     { 40, gColors, NULL },
     34     //  { 2, gColors, gPos },
     35     //  { 2, gCol2, NULL },
     36 };
     37 
     38 static SkShader* MakeLinear(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
     39     return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos, data.fCount, tm);
     40 }
     41 
     42 static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm) {
     43     SkPoint center;
     44     center.set(SkScalarAve(pts[0].fX, pts[1].fX),
     45                SkScalarAve(pts[0].fY, pts[1].fY));
     46     return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
     47                                           data.fPos, data.fCount, tm);
     48 }
     49 
     50 static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data, SkShader::TileMode) {
     51     SkPoint center;
     52     center.set(SkScalarAve(pts[0].fX, pts[1].fX),
     53                SkScalarAve(pts[0].fY, pts[1].fY));
     54     return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors, data.fPos, data.fCount);
     55 }
     56 
     57 
     58 typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data, SkShader::TileMode tm);
     59 
     60 static const GradMaker gGradMakers[] = {
     61     MakeLinear, MakeRadial, MakeSweep,
     62 };
     63 
     64 ///////////////////////////////////////////////////////////////////////////////
     65 
     66 class GradientsGM : public GM {
     67 public:
     68     GradientsGM() {
     69         this->setBGColor(0xFFDDDDDD);
     70     }
     71 
     72 protected:
     73     virtual uint32_t onGetFlags() const SK_OVERRIDE {
     74         return kSkipTiled_Flag;
     75     }
     76 
     77     SkString onShortName() SK_OVERRIDE { return SkString("gradient_dirty_laundry"); }
     78     virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(640, 615); }
     79 
     80     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
     81         SkPoint pts[2] = { { 0, 0 },
     82                            { SkIntToScalar(100), SkIntToScalar(100) }
     83         };
     84         SkShader::TileMode tm = SkShader::kClamp_TileMode;
     85         SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
     86         SkPaint paint;
     87         paint.setAntiAlias(true);
     88 
     89         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
     90         for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
     91             canvas->save();
     92             for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
     93                 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm);
     94                 paint.setShader(shader)->unref();
     95                 canvas->drawRect(r, paint);
     96                 canvas->translate(0, SkIntToScalar(120));
     97             }
     98             canvas->restore();
     99             canvas->translate(SkIntToScalar(120), 0);
    100         }
    101     }
    102 
    103 private:
    104     typedef GM INHERITED;
    105 };
    106 
    107 ///////////////////////////////////////////////////////////////////////////////
    108 
    109 static GM* MyFactory(void*) { return new GradientsGM; }
    110 static GMRegistry reg(MyFactory);
    111