17839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
27839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/*
37839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Copyright 2013 Google Inc.
47839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger *
57839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be
67839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * found in the LICENSE file.
77839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */
87839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
97839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "gm.h"
107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTArray.h"
117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkRandom.h"
127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkMatrix.h"
137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkBlurMaskFilter.h"
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkGradientShader.h"
157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkBlurDrawLooper.h"
167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkRect.h"
177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergernamespace skiagm {
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerclass OvalGM : public GM {
217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerpublic:
227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    OvalGM() {
237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        this->setBGColor(0xFF000000);
247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        this->makePaints();
257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        this->makeMatrices();
267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprotected:
297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual SkString onShortName() SK_OVERRIDE {
307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return SkString("ovals");
317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual SkISize onISize() SK_OVERRIDE {
347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return make_isize(1200, 900);
357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void makePaints() {
387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // no AA
407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint p;
417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fPaints.push_back(p);
427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // AA
467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint p;
477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setAntiAlias(true);
487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fPaints.push_back(p);
497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // AA with stroke style
537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint p;
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setAntiAlias(true);
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setStyle(SkPaint::kStroke_Style);
567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setStrokeWidth(SkIntToScalar(5));
577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fPaints.push_back(p);
587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // AA with stroke style, width = 0
627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint p;
637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setAntiAlias(true);
647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setStyle(SkPaint::kStroke_Style);
657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fPaints.push_back(p);
667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // AA with stroke and fill style
707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint p;
717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setAntiAlias(true);
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setStyle(SkPaint::kStrokeAndFill_Style);
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        p.setStrokeWidth(SkIntToScalar(3));
747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fPaints.push_back(p);
757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void makeMatrices() {
797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkMatrix m;
817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        m.setIdentity();
827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fMatrices.push_back(m);
837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkMatrix m;
877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        m.setScale(SkIntToScalar(3), SkIntToScalar(2));
887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fMatrices.push_back(m);
897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkMatrix m;
937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        m.setScale(SkIntToScalar(2), SkIntToScalar(2));
947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fMatrices.push_back(m);
957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkMatrix m;
997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        m.setScale(SkIntToScalar(1), SkIntToScalar(2));
1007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fMatrices.push_back(m);
1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
1047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkMatrix m;
1057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        m.setScale(SkIntToScalar(4), SkIntToScalar(1));
1067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fMatrices.push_back(m);
1077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
1107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkMatrix m;
1117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        m.setRotate(SkIntToScalar(90));
1127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fMatrices.push_back(m);
1137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
1167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkMatrix m;
1177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fMatrices.push_back(m);
1197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        {
1227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkMatrix m;
1237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        m.setRotate(SkIntToScalar(60));
1247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        fMatrices.push_back(m);
1257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkColor genColor(SkMWCRandom* rand) {
1297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkScalar hsv[3];
1307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        hsv[0] = SkFloatToScalar(rand->nextRangeF(0.0f, 360.0f));
1317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        hsv[1] = SkFloatToScalar(rand->nextRangeF(0.75f, 1.0f));
1327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        hsv[2] = SkFloatToScalar(rand->nextRangeF(0.75f, 1.0f));
1337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        return SkHSVToColor(hsv);
1357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
1367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
1387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkMWCRandom rand(1);
1397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
1407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkRect oval = SkRect::MakeLTRB(-20, -30, 20, 30);
1417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        const SkScalar kXStart = 60.0f;
1437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        const SkScalar kYStart = 80.0f;
1447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        const int kXStep = 150;
1457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        const int kYStep = 160;
1467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        int maxX = fMatrices.count();
1477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPaint rectPaint;
1497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        rectPaint.setAntiAlias(true);
1507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        rectPaint.setStyle(SkPaint::kStroke_Style);
1517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        rectPaint.setStrokeWidth(SkIntToScalar(0));
1527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        rectPaint.setColor(SK_ColorLTGRAY);
1537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        int testCount = 0;
1557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (int i = 0; i < fPaints.count(); ++i) {
1567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            for (int j = 0; j < fMatrices.count(); ++j) {
1577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->save();
1587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                SkMatrix mat = fMatrices[j];
1597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                // position the oval, and make it at off-integer coords.
1607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                mat.postTranslate(kXStart + SK_Scalar1 * kXStep * (testCount % maxX) +
1617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                  SK_Scalar1 / 4,
1627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                  kYStart + SK_Scalar1 * kYStep * (testCount / maxX) +
1637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                  3 * SK_Scalar1 / 4);
1647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->concat(mat);
1657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                SkColor color = genColor(&rand);
1677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                fPaints[i].setColor(color);
1687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->drawRect(oval, rectPaint);
1707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->drawOval(oval, fPaints[i]);
1717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                canvas->restore();
1737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                ++testCount;
1757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            }
1767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // special cases
1797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // non-scaled tall and skinny oval
1817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (int i = 0; i < fPaints.count(); ++i) {
1827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkRect oval = SkRect::MakeLTRB(-20, -60, 20, 60);
1837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->save();
1847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            // position the oval, and make it at off-integer coords.
1857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.55f + SK_Scalar1 / 4,
1867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
1877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkColor color = genColor(&rand);
1897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fPaints[i].setColor(color);
1907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(oval, rectPaint);
1927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawOval(oval, fPaints[i]);
1937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->restore();
1947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
1957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // non-scaled wide and short oval
1977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (int i = 0; i < fPaints.count(); ++i) {
1987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkRect oval = SkRect::MakeLTRB(-80, -30, 80, 30);
1997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->save();
2007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            // position the oval, and make it at off-integer coords.
2017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->translate(kXStart + SK_Scalar1 * kXStep * 4 + SK_Scalar1 / 4,
2027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
2037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              SK_ScalarHalf * kYStep);
2047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkColor color = genColor(&rand);
2067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fPaints[i].setColor(color);
2077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(oval, rectPaint);
2097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawOval(oval, fPaints[i]);
2107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->restore();
2117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
2127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // super skinny oval
2147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (int i = 0; i < fPaints.count(); ++i) {
2157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkRect oval = SkRect::MakeLTRB(0, -60, 1, 60);
2167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->save();
2177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            // position the oval, and make it at off-integer coords.
2187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->translate(kXStart + SK_Scalar1 * kXStep * 3.25f + SK_Scalar1 / 4,
2197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
2207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkColor color = genColor(&rand);
2227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fPaints[i].setColor(color);
2237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawOval(oval, fPaints[i]);
2257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->restore();
2267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
2277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // super short oval
2297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (int i = 0; i < fPaints.count(); ++i) {
2307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkRect oval = SkRect::MakeLTRB(-80, -1, 80, 0);
2317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->save();
2327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            // position the oval, and make it at off-integer coords.
2337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.5f + SK_Scalar1 / 4,
2347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
2357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              SK_ScalarHalf * kYStep);
2367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkColor color = genColor(&rand);
2387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fPaints[i].setColor(color);
2397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawOval(oval, fPaints[i]);
2417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->restore();
2427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
2437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        // radial gradient
2457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkPoint center = SkPoint::Make(SkIntToScalar(0), SkIntToScalar(0));
2467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
2477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
2487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        SkAutoTUnref<SkShader> shader(SkGradientShader::CreateRadial(center,
2497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                                     SkIntToScalar(20),
2507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                                     colors,
2517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                                     pos,
2527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                                     SK_ARRAY_COUNT(colors),
2537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                                     SkShader::kClamp_TileMode));
2547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        for (int i = 0; i < fPaints.count(); ++i) {
2567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->save();
2577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            // position the path, and make it at off-integer coords.
2587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->translate(kXStart + SK_Scalar1 * kXStep * 0 + SK_Scalar1 / 4,
2597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
2607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              SK_ScalarHalf * kYStep);
2617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            SkColor color = genColor(&rand);
2637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fPaints[i].setColor(color);
2647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fPaints[i].setShader(shader);
2657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawRect(oval, rectPaint);
2677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->drawOval(oval, fPaints[i]);
2687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            fPaints[i].setShader(NULL);
2707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            canvas->restore();
2727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
2737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
2747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerprivate:
2767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkTArray<SkPaint> fPaints;
2777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    SkTArray<SkMatrix> fMatrices;
2787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    typedef GM INHERITED;
2807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger};
2817839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger//////////////////////////////////////////////////////////////////////////////
2837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic GM* MyFactory(void*) { return new OvalGM; }
2857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic GMRegistry reg(MyFactory);
2867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
2877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}
288