18e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
28e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com/*
38e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com * Copyright 2013 Google Inc.
48e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com *
58e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com * Use of this source code is governed by a BSD-style license that can be
68e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com * found in the LICENSE file.
78e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com */
88e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
98e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com#include "gm.h"
108e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com#include "SkTArray.h"
118e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com#include "SkRandom.h"
128e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com#include "SkMatrix.h"
138e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com#include "SkBlurMaskFilter.h"
148e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com#include "SkGradientShader.h"
158e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com#include "SkBlurDrawLooper.h"
168e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com#include "SkRect.h"
178e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
188e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.comnamespace skiagm {
198e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
208e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.comclass OvalGM : public GM {
218e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.compublic:
228e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    OvalGM() {
238e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        this->setBGColor(0xFF000000);
248e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        this->makePaints();
258e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        this->makeMatrices();
268e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
278e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
288e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.comprotected:
29a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
30a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
31a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
32a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
338e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    virtual SkString onShortName() SK_OVERRIDE {
348e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        return SkString("ovals");
358e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
368e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
378e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    virtual SkISize onISize() SK_OVERRIDE {
38f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(1200, 900);
398e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
408e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
418e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    void makePaints() {
428e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
438e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // no AA
448e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint p;
458e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fPaints.push_back(p);
468e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
478e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
488e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
498e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // AA
508e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint p;
518e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setAntiAlias(true);
528e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fPaints.push_back(p);
538e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
548e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
558e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
568e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // AA with stroke style
578e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint p;
588e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setAntiAlias(true);
598e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setStyle(SkPaint::kStroke_Style);
608e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setStrokeWidth(SkIntToScalar(5));
618e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fPaints.push_back(p);
628e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
638e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
648e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
658e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // AA with stroke style, width = 0
668e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint p;
678e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setAntiAlias(true);
688e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setStyle(SkPaint::kStroke_Style);
698e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fPaints.push_back(p);
708e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
718e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
728e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
738e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // AA with stroke and fill style
748e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint p;
758e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setAntiAlias(true);
768e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setStyle(SkPaint::kStrokeAndFill_Style);
778e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setStrokeWidth(SkIntToScalar(3));
788e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fPaints.push_back(p);
798e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
808e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
818e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
828e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    void makeMatrices() {
838e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
848e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
858e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setIdentity();
868e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
878e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
888e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
898e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
908e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
918e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setScale(SkIntToScalar(3), SkIntToScalar(2));
928e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
938e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
948e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
958e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
968e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
978e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setScale(SkIntToScalar(2), SkIntToScalar(2));
988e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
998e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1008e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1018e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
1028e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
1038e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setScale(SkIntToScalar(1), SkIntToScalar(2));
1048e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
1058e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1068e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1078e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
1088e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
1098e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setScale(SkIntToScalar(4), SkIntToScalar(1));
1108e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
1118e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1128e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1138e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
1148e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
1158e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setRotate(SkIntToScalar(90));
1168e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
1178e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1188e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1198e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
1208e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
1218e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
1228e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
1238e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1248e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1258e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
1268e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
1278e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setRotate(SkIntToScalar(60));
1288e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
1298e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1308e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
1318e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
132e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkColor genColor(SkRandom* rand) {
1338e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkScalar hsv[3];
1344b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        hsv[0] = rand->nextRangeF(0.0f, 360.0f);
1354b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        hsv[1] = rand->nextRangeF(0.75f, 1.0f);
1364b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        hsv[2] = rand->nextRangeF(0.75f, 1.0f);
1378e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1388e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        return SkHSVToColor(hsv);
1398e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
1408e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1418e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
142e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand(1);
1438e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
1448e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkRect oval = SkRect::MakeLTRB(-20, -30, 20, 30);
1458e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1468e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        const SkScalar kXStart = 60.0f;
1478e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        const SkScalar kYStart = 80.0f;
1488e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        const int kXStep = 150;
1498e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        const int kYStep = 160;
1508e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        int maxX = fMatrices.count();
1518e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1528e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint rectPaint;
1538e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        rectPaint.setAntiAlias(true);
1548e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        rectPaint.setStyle(SkPaint::kStroke_Style);
1558e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        rectPaint.setStrokeWidth(SkIntToScalar(0));
1568e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        rectPaint.setColor(SK_ColorLTGRAY);
1578e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1588e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        int testCount = 0;
159cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
1608e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            for (int j = 0; j < fMatrices.count(); ++j) {
1618e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                canvas->save();
1628e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                SkMatrix mat = fMatrices[j];
1638e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                // position the oval, and make it at off-integer coords.
164cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com                mat.postTranslate(kXStart + SK_Scalar1 * kXStep * (testCount % maxX) +
1658e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                  SK_Scalar1 / 4,
166cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com                                  kYStart + SK_Scalar1 * kYStep * (testCount / maxX) +
1678e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                  3 * SK_Scalar1 / 4);
1688e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                canvas->concat(mat);
169cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
1708e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                SkColor color = genColor(&rand);
1718e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                fPaints[i].setColor(color);
1728e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1738e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                canvas->drawRect(oval, rectPaint);
1748e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                canvas->drawOval(oval, fPaints[i]);
1758e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1768e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                canvas->restore();
1778e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1788e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                ++testCount;
1798e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            }
1808e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1818e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1828e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // special cases
1838e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1848e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // non-scaled tall and skinny oval
185cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
1868e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkRect oval = SkRect::MakeLTRB(-20, -60, 20, 60);
1878e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->save();
1888e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            // position the oval, and make it at off-integer coords.
1898e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.55f + SK_Scalar1 / 4,
1908e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
191cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
1928e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkColor color = genColor(&rand);
1938e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setColor(color);
1948e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1958e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawRect(oval, rectPaint);
1968e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawOval(oval, fPaints[i]);
1978e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->restore();
1988e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1998e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2008e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // non-scaled wide and short oval
201cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
2028e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkRect oval = SkRect::MakeLTRB(-80, -30, 80, 30);
2038e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->save();
2048e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            // position the oval, and make it at off-integer coords.
2058e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->translate(kXStart + SK_Scalar1 * kXStep * 4 + SK_Scalar1 / 4,
2068e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
2078e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              SK_ScalarHalf * kYStep);
208cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
2098e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkColor color = genColor(&rand);
2108e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setColor(color);
2118e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2128e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawRect(oval, rectPaint);
2138e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawOval(oval, fPaints[i]);
2148e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->restore();
2158e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
2168e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2178e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // super skinny oval
218cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
2198e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkRect oval = SkRect::MakeLTRB(0, -60, 1, 60);
2208e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->save();
2218e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            // position the oval, and make it at off-integer coords.
2228e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->translate(kXStart + SK_Scalar1 * kXStep * 3.25f + SK_Scalar1 / 4,
2238e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
224cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
2258e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkColor color = genColor(&rand);
2268e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setColor(color);
2278e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2288e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawOval(oval, fPaints[i]);
2298e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->restore();
2308e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
2318e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2328e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // super short oval
233cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
2348e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkRect oval = SkRect::MakeLTRB(-80, -1, 80, 0);
2358e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->save();
2368e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            // position the oval, and make it at off-integer coords.
2378e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.5f + SK_Scalar1 / 4,
2388e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
2398e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              SK_ScalarHalf * kYStep);
240cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
2418e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkColor color = genColor(&rand);
2428e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setColor(color);
2438e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2448e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawOval(oval, fPaints[i]);
2458e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->restore();
2468e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
2478e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2488e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // radial gradient
2498e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPoint center = SkPoint::Make(SkIntToScalar(0), SkIntToScalar(0));
2508e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
2518e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
2528e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkAutoTUnref<SkShader> shader(SkGradientShader::CreateRadial(center,
2538e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                                     SkIntToScalar(20),
2548e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                                     colors,
2558e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                                     pos,
2568e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                                     SK_ARRAY_COUNT(colors),
2578e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                                     SkShader::kClamp_TileMode));
2588e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
259cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
2608e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->save();
2618e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            // position the path, and make it at off-integer coords.
2628e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->translate(kXStart + SK_Scalar1 * kXStep * 0 + SK_Scalar1 / 4,
2638e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
2648e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              SK_ScalarHalf * kYStep);
265cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
2668e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkColor color = genColor(&rand);
2678e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setColor(color);
2688e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setShader(shader);
2698e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2708e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawRect(oval, rectPaint);
2718e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawOval(oval, fPaints[i]);
272cabd0ed14fe6c4679325259682f76f351c8c99ccjvanverth@google.com
273cabd0ed14fe6c4679325259682f76f351c8c99ccjvanverth@google.com            fPaints[i].setShader(NULL);
274cabd0ed14fe6c4679325259682f76f351c8c99ccjvanverth@google.com
2758e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->restore();
2768e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
2778e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
2788e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2798e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.comprivate:
2808e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    SkTArray<SkPaint> fPaints;
2818e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    SkTArray<SkMatrix> fMatrices;
2828e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2838e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    typedef GM INHERITED;
2848e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com};
2858e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2868e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com//////////////////////////////////////////////////////////////////////////////
2878e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2888e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.comstatic GM* MyFactory(void*) { return new OvalGM; }
2898e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.comstatic GMRegistry reg(MyFactory);
2908e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2918e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com}
292