11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "gm.h"
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGradientShader.h"
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace skiagm {
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass FillTypePerspGM : public GM {
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPath fPath;
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    FillTypePerspGM() {
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const SkScalar radius = SkIntToScalar(45);
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fPath.addCircle(SkIntToScalar(50), SkIntToScalar(50), radius);
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fPath.addCircle(SkIntToScalar(100), SkIntToScalar(100), radius);
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkString onShortName() {
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkString("filltypespersp");
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkISize onISize() {
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return make_isize(835, 840);
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void showPath(SkCanvas* canvas, int x, int y, SkPath::FillType ft,
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                  SkScalar scale, const SkPaint& paint) {
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const SkRect r = { 0, 0, SkIntToScalar(150), SkIntToScalar(150) };
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(SkIntToScalar(x), SkIntToScalar(y));
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->clipRect(r);
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawColor(SK_ColorWHITE);
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fPath.setFillType(ft);
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(r.centerX(), r.centerY());
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->scale(scale, scale);
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(-r.centerX(), -r.centerY());
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawPath(fPath, paint);
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void showFour(SkCanvas* canvas, SkScalar scale, bool aa) {
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPoint center = SkPoint::Make(SkIntToScalar(100), SkIntToScalar(100));
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkColor colors[] = {SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN};
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar pos[] = {0, SK_ScalarHalf, SK_Scalar1};
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkShader* s = SkGradientShader::CreateRadial(center,
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     SkIntToScalar(100),
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     colors,
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     pos,
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     SK_ARRAY_COUNT(colors),
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     SkShader::kClamp_TileMode);
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setShader(s)->unref();
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setAntiAlias(aa);
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        showPath(canvas,   0,   0, SkPath::kWinding_FillType,
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 scale, paint);
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        showPath(canvas, 200,   0, SkPath::kEvenOdd_FillType,
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 scale, paint);
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        showPath(canvas,  00, 200, SkPath::kInverseWinding_FillType,
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 scale, paint);
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        showPath(canvas, 200, 200, SkPath::kInverseEvenOdd_FillType,
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                 scale, paint);
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // do perspective drawPaint as the background;
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint bkgnrd;
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPoint center = SkPoint::Make(SkIntToScalar(100),
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                       SkIntToScalar(100));
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkColor colors[] = {SK_ColorBLACK, SK_ColorCYAN,
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                            SK_ColorYELLOW, SK_ColorWHITE};
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar pos[] = {0, SK_ScalarHalf / 2,
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          3 * SK_ScalarHalf / 2, SK_Scalar1};
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkShader* s = SkGradientShader::CreateRadial(center,
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     SkIntToScalar(1000),
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     colors,
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     pos,
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     SK_ARRAY_COUNT(colors),
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                     SkShader::kClamp_TileMode);
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        bkgnrd.setShader(s)->unref();
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkMatrix mat;
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            mat.reset();
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            mat.setPerspY(SkScalarToPersp(SK_Scalar1 / 1000));
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->concat(mat);
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawPaint(bkgnrd);
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->restore();
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // draw the paths in perspective
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkMatrix persp;
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        persp.reset();
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        persp.setPerspX(SkScalarToPersp(-SK_Scalar1 / 1800));
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        persp.setPerspY(SkScalarToPersp(SK_Scalar1 / 500));
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->concat(persp);
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        const SkScalar scale = SkIntToScalar(5)/4;
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        showFour(canvas, SK_Scalar1, false);
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(SkIntToScalar(450), 0);
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        showFour(canvas, scale, false);
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(SkIntToScalar(-450), SkIntToScalar(450));
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        showFour(canvas, SK_Scalar1, true);
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(SkIntToScalar(450), 0);
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        showFour(canvas, scale, true);
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GM INHERITED;
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//////////////////////////////////////////////////////////////////////////////
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* MyFactory(void*) { return new FillTypePerspGM; }
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry reg(MyFactory);
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
129