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