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,
     39                             SkShader::TileMode tm, SkUnitMapper* mapper) {
     40     return SkGradientShader::CreateLinear(pts, data.fColors, data.fPos,
     41                                           data.fCount, tm, mapper);
     42 }
     43 
     44 static SkShader* MakeRadial(const SkPoint pts[2], const GradData& data,
     45                             SkShader::TileMode tm, SkUnitMapper* mapper) {
     46     SkPoint center;
     47     center.set(SkScalarAve(pts[0].fX, pts[1].fX),
     48                SkScalarAve(pts[0].fY, pts[1].fY));
     49     return SkGradientShader::CreateRadial(center, center.fX, data.fColors,
     50                                           data.fPos, data.fCount, tm, mapper);
     51 }
     52 
     53 static SkShader* MakeSweep(const SkPoint pts[2], const GradData& data,
     54                            SkShader::TileMode, SkUnitMapper* mapper) {
     55     SkPoint center;
     56     center.set(SkScalarAve(pts[0].fX, pts[1].fX),
     57                SkScalarAve(pts[0].fY, pts[1].fY));
     58     return SkGradientShader::CreateSweep(center.fX, center.fY, data.fColors,
     59                                          data.fPos, data.fCount, mapper);
     60 }
     61 
     62 
     63 typedef SkShader* (*GradMaker)(const SkPoint pts[2], const GradData& data,
     64                                SkShader::TileMode tm, SkUnitMapper* mapper);
     65 static const GradMaker gGradMakers[] = {
     66     MakeLinear, MakeRadial, MakeSweep,
     67 };
     68 
     69 ///////////////////////////////////////////////////////////////////////////////
     70 
     71 class GradientsGM : public GM {
     72 public:
     73     GradientsGM() {
     74         this->setBGColor(0xFFDDDDDD);
     75     }
     76 
     77 protected:
     78     SkString onShortName() SK_OVERRIDE { return SkString("gradient_dirty_laundry"); }
     79     virtual SkISize onISize() SK_OVERRIDE { return make_isize(640, 615); }
     80 
     81     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
     82         SkPoint pts[2] = { { 0, 0 },
     83                            { SkIntToScalar(100), SkIntToScalar(100) }
     84         };
     85         SkShader::TileMode tm = SkShader::kClamp_TileMode;
     86         SkRect r = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
     87         SkPaint paint;
     88         paint.setAntiAlias(true);
     89 
     90         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
     91         for (size_t i = 0; i < SK_ARRAY_COUNT(gGradData); i++) {
     92             canvas->save();
     93             for (size_t j = 0; j < SK_ARRAY_COUNT(gGradMakers); j++) {
     94                 SkShader* shader = gGradMakers[j](pts, gGradData[i], tm, NULL);
     95                 paint.setShader(shader)->unref();
     96                 canvas->drawRect(r, paint);
     97                 canvas->translate(0, SkIntToScalar(120));
     98             }
     99             canvas->restore();
    100             canvas->translate(SkIntToScalar(120), 0);
    101         }
    102     }
    103 
    104 private:
    105     typedef GM INHERITED;
    106 };
    107 
    108 ///////////////////////////////////////////////////////////////////////////////
    109 
    110 static GM* MyFactory(void*) { return new GradientsGM; }
    111 static GMRegistry reg(MyFactory);
    112