18c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
28c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com/*
38c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com * Copyright 2011 Google Inc.
48c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com *
58c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
68c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com * found in the LICENSE file.
78c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com */
88c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com#include "gm.h"
9cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com#include "SkGradientShader.h"
108c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
118c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.comnamespace skiagm {
128c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
138c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.comclass FillTypePerspGM : public GM {
148c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    SkPath fPath;
158c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.compublic:
16d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com    FillTypePerspGM() {}
17d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
18d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com    void makePath() {
19d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com        if (fPath.isEmpty()) {
20d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com            const SkScalar radius = SkIntToScalar(45);
21d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com            fPath.addCircle(SkIntToScalar(50), SkIntToScalar(50), radius);
22d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com            fPath.addCircle(SkIntToScalar(100), SkIntToScalar(100), radius);
23d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com        }
248c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    }
25d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
268c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.comprotected:
27a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
28a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
29a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
30a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
318c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    virtual SkString onShortName() {
328c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        return SkString("filltypespersp");
338c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    }
348c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
358c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    virtual SkISize onISize() {
36f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(835, 840);
378c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    }
388c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
398c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    void showPath(SkCanvas* canvas, int x, int y, SkPath::FillType ft,
408c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                  SkScalar scale, const SkPaint& paint) {
418c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
428c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        const SkRect r = { 0, 0, SkIntToScalar(150), SkIntToScalar(150) };
438c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
448c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->save();
458c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
468c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->clipRect(r);
478c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->drawColor(SK_ColorWHITE);
488c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        fPath.setFillType(ft);
498c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->translate(r.centerX(), r.centerY());
508c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->scale(scale, scale);
518c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->translate(-r.centerX(), -r.centerY());
528c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->drawPath(fPath, paint);
538c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->restore();
548c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    }
558c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
568c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    void showFour(SkCanvas* canvas, SkScalar scale, bool aa) {
578c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
588c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        SkPaint paint;
598c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        SkPoint center = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(100));
608c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN};
618c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1};
628c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        SkShader* s = SkGradientShader::CreateRadial(center,
638c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                                                     SkIntToScalar(100),
648c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                                                     colors,
658c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                                                     pos,
668c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                                                     SK_ARRAY_COUNT(colors),
678c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                                                     SkShader::kClamp_TileMode);
688c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        paint.setShader(s)->unref();
698c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        paint.setAntiAlias(aa);
708c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
718c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        showPath(canvas,   0,   0, SkPath::kWinding_FillType,
728c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                 scale, paint);
738c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        showPath(canvas, 200,   0, SkPath::kEvenOdd_FillType,
748c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                 scale, paint);
758c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        showPath(canvas,  00, 200, SkPath::kInverseWinding_FillType,
768c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                 scale, paint);
778c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        showPath(canvas, 200, 200, SkPath::kInverseEvenOdd_FillType,
788c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                 scale, paint);
798c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    }
808c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
818c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    virtual void onDraw(SkCanvas* canvas) {
82d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com        this->makePath();
83d42e3f60cd571afb6c0f1837f9e0996bfe149001reed@google.com
848c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        // do perspective drawPaint as the background;
858c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        SkPaint bkgnrd;
86cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com        SkPoint center = SkPoint::Make(SkIntToScalar(100),
87cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com                                       SkIntToScalar(100));
88cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com        SkColor colors[] = {SK_ColorBLACK, SK_ColorCYAN,
89cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com                            SK_ColorYELLOW, SK_ColorWHITE};
90cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com        SkScalar pos[] = {0, SK_ScalarHalf / 2,
91cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com                          3 * SK_ScalarHalf / 2, SK_Scalar1};
928c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        SkShader* s = SkGradientShader::CreateRadial(center,
938c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                                                     SkIntToScalar(1000),
948c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                                                     colors,
958c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                                                     pos,
968c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                                                     SK_ARRAY_COUNT(colors),
978c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com                                                     SkShader::kClamp_TileMode);
988c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        bkgnrd.setShader(s)->unref();
998c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->save();
1008c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com            canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
1018c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com            SkMatrix mat;
1028c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com            mat.reset();
10307faed110275048c83a55ae39042da2c9d916108bungeman@google.com            mat.setPerspY(SkScalarToPersp(SK_Scalar1 / 1000));
1048c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com            canvas->concat(mat);
1058c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com            canvas->drawPaint(bkgnrd);
1068c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->restore();
1078c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
1088c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        // draw the paths in perspective
1098c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        SkMatrix persp;
1108c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        persp.reset();
11107faed110275048c83a55ae39042da2c9d916108bungeman@google.com        persp.setPerspX(SkScalarToPersp(-SK_Scalar1 / 1800));
11207faed110275048c83a55ae39042da2c9d916108bungeman@google.com        persp.setPerspY(SkScalarToPersp(SK_Scalar1 / 500));
1138c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->concat(persp);
1148c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
1158c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
1168c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        const SkScalar scale = SkIntToScalar(5)/4;
1178c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
1188c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        showFour(canvas, SK_Scalar1, false);
1198c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->translate(SkIntToScalar(450), 0);
120cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com        showFour(canvas, scale, false);
1218c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
1228c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->translate(SkIntToScalar(-450), SkIntToScalar(450));
1238c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        showFour(canvas, SK_Scalar1, true);
1248c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com        canvas->translate(SkIntToScalar(450), 0);
125cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.com        showFour(canvas, scale, true);
1268c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    }
127d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
1288c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.comprivate:
1298c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com    typedef GM INHERITED;
1308c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com};
1318c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
1328c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
1338c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
134cecd3ac9d04c16c1c2b3c18a3f0eedd4318c1ddebsalomon@google.comstatic GM* MyFactory(void*) { return new FillTypePerspGM; }
1358c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.comstatic GMRegistry reg(MyFactory);
1368c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com
1378c2fe99ed2c210317786683e8c1f1e86cff0be49bsalomon@google.com}
138