Home | History | Annotate | Download | only in gm
      1 
      2 /*
      3  * Copyright 2011 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 namespace skiagm {
     12 
     13 class FillTypePerspGM : public GM {
     14     SkPath fPath;
     15 public:
     16     FillTypePerspGM() {}
     17 
     18     void makePath() {
     19         if (fPath.isEmpty()) {
     20             const SkScalar radius = SkIntToScalar(45);
     21             fPath.addCircle(SkIntToScalar(50), SkIntToScalar(50), radius);
     22             fPath.addCircle(SkIntToScalar(100), SkIntToScalar(100), radius);
     23         }
     24     }
     25 
     26 protected:
     27     virtual uint32_t onGetFlags() const SK_OVERRIDE {
     28         return kSkipTiled_Flag;
     29     }
     30 
     31     virtual SkString onShortName() {
     32         return SkString("filltypespersp");
     33     }
     34 
     35     virtual SkISize onISize() {
     36         return SkISize::Make(835, 840);
     37     }
     38 
     39     void showPath(SkCanvas* canvas, int x, int y, SkPath::FillType ft,
     40                   SkScalar scale, const SkPaint& paint) {
     41 
     42         const SkRect r = { 0, 0, SkIntToScalar(150), SkIntToScalar(150) };
     43 
     44         canvas->save();
     45         canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
     46         canvas->clipRect(r);
     47         canvas->drawColor(SK_ColorWHITE);
     48         fPath.setFillType(ft);
     49         canvas->translate(r.centerX(), r.centerY());
     50         canvas->scale(scale, scale);
     51         canvas->translate(-r.centerX(), -r.centerY());
     52         canvas->drawPath(fPath, paint);
     53         canvas->restore();
     54     }
     55 
     56     void showFour(SkCanvas* canvas, SkScalar scale, bool aa) {
     57 
     58         SkPaint paint;
     59         SkPoint center = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(100));
     60         SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN};
     61         SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1};
     62         SkShader* s = SkGradientShader::CreateRadial(center,
     63                                                      SkIntToScalar(100),
     64                                                      colors,
     65                                                      pos,
     66                                                      SK_ARRAY_COUNT(colors),
     67                                                      SkShader::kClamp_TileMode);
     68         paint.setShader(s)->unref();
     69         paint.setAntiAlias(aa);
     70 
     71         showPath(canvas,   0,   0, SkPath::kWinding_FillType,
     72                  scale, paint);
     73         showPath(canvas, 200,   0, SkPath::kEvenOdd_FillType,
     74                  scale, paint);
     75         showPath(canvas,  00, 200, SkPath::kInverseWinding_FillType,
     76                  scale, paint);
     77         showPath(canvas, 200, 200, SkPath::kInverseEvenOdd_FillType,
     78                  scale, paint);
     79     }
     80 
     81     virtual void onDraw(SkCanvas* canvas) {
     82         this->makePath();
     83 
     84         // do perspective drawPaint as the background;
     85         SkPaint bkgnrd;
     86         SkPoint center = SkPoint::Make(SkIntToScalar(100),
     87                                        SkIntToScalar(100));
     88         SkColor colors[] = {SK_ColorBLACK, SK_ColorCYAN,
     89                             SK_ColorYELLOW, SK_ColorWHITE};
     90         SkScalar pos[] = {0, SK_ScalarHalf / 2,
     91                           3 * SK_ScalarHalf / 2, SK_Scalar1};
     92         SkShader* s = SkGradientShader::CreateRadial(center,
     93                                                      SkIntToScalar(1000),
     94                                                      colors,
     95                                                      pos,
     96                                                      SK_ARRAY_COUNT(colors),
     97                                                      SkShader::kClamp_TileMode);
     98         bkgnrd.setShader(s)->unref();
     99         canvas->save();
    100             canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
    101             SkMatrix mat;
    102             mat.reset();
    103             mat.setPerspY(SkScalarToPersp(SK_Scalar1 / 1000));
    104             canvas->concat(mat);
    105             canvas->drawPaint(bkgnrd);
    106         canvas->restore();
    107 
    108         // draw the paths in perspective
    109         SkMatrix persp;
    110         persp.reset();
    111         persp.setPerspX(SkScalarToPersp(-SK_Scalar1 / 1800));
    112         persp.setPerspY(SkScalarToPersp(SK_Scalar1 / 500));
    113         canvas->concat(persp);
    114 
    115         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
    116         const SkScalar scale = SkIntToScalar(5)/4;
    117 
    118         showFour(canvas, SK_Scalar1, false);
    119         canvas->translate(SkIntToScalar(450), 0);
    120         showFour(canvas, scale, false);
    121 
    122         canvas->translate(SkIntToScalar(-450), SkIntToScalar(450));
    123         showFour(canvas, SK_Scalar1, true);
    124         canvas->translate(SkIntToScalar(450), 0);
    125         showFour(canvas, scale, true);
    126     }
    127 
    128 private:
    129     typedef GM INHERITED;
    130 };
    131 
    132 //////////////////////////////////////////////////////////////////////////////
    133 
    134 static GM* MyFactory(void*) { return new FillTypePerspGM; }
    135 static GMRegistry reg(MyFactory);
    136 
    137 }
    138