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
3036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
318e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        return SkString("ovals");
328e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
338e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
3436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
35f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(1200, 900);
368e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
378e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
388e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    void makePaints() {
398e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
408e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // no AA
418e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint p;
428e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fPaints.push_back(p);
438e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
448e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
458e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
468e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // AA
478e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint p;
488e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setAntiAlias(true);
498e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fPaints.push_back(p);
508e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
518e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
528e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
538e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // AA with stroke style
548e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint p;
558e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setAntiAlias(true);
568e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setStyle(SkPaint::kStroke_Style);
578e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setStrokeWidth(SkIntToScalar(5));
588e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fPaints.push_back(p);
598e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
608e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
618e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
628e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // AA with stroke style, width = 0
638e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint p;
648e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setAntiAlias(true);
658e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setStyle(SkPaint::kStroke_Style);
668e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fPaints.push_back(p);
678e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
688e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
698e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
708e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // AA with stroke and fill style
718e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint p;
728e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setAntiAlias(true);
738e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setStyle(SkPaint::kStrokeAndFill_Style);
748e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        p.setStrokeWidth(SkIntToScalar(3));
758e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fPaints.push_back(p);
768e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
778e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
788e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
798e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    void makeMatrices() {
808e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
818e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
828e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setIdentity();
838e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
848e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
858e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
868e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
878e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
888e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setScale(SkIntToScalar(3), SkIntToScalar(2));
898e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
908e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
918e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
928e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
938e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
948e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setScale(SkIntToScalar(2), SkIntToScalar(2));
958e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
968e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
978e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
988e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
998e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
1008e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setScale(SkIntToScalar(1), SkIntToScalar(2));
1018e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
1028e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1038e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1048e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
1058e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
1068e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setScale(SkIntToScalar(4), SkIntToScalar(1));
1078e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
1088e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1098e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1108e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
1118e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
1128e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setRotate(SkIntToScalar(90));
1138e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
1148e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1158e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1168e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
1178e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
1188e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
1198e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
1208e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1218e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1228e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        {
1238e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkMatrix m;
1248e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        m.setRotate(SkIntToScalar(60));
1258e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        fMatrices.push_back(m);
1268e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1278e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
1288e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
129e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org    SkColor genColor(SkRandom* rand) {
1308e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkScalar hsv[3];
1314b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        hsv[0] = rand->nextRangeF(0.0f, 360.0f);
1324b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        hsv[1] = rand->nextRangeF(0.75f, 1.0f);
1334b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        hsv[2] = rand->nextRangeF(0.75f, 1.0f);
1348e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1358e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        return SkHSVToColor(hsv);
1368e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
1378e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
13836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
139e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org        SkRandom rand(1);
1408e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
1418e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkRect oval = SkRect::MakeLTRB(-20, -30, 20, 30);
1428e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1438e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        const SkScalar kXStart = 60.0f;
1448e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        const SkScalar kYStart = 80.0f;
1458e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        const int kXStep = 150;
1468e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        const int kYStep = 160;
1478e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        int maxX = fMatrices.count();
1488e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1498e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPaint rectPaint;
1508e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        rectPaint.setAntiAlias(true);
1518e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        rectPaint.setStyle(SkPaint::kStroke_Style);
1528e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        rectPaint.setStrokeWidth(SkIntToScalar(0));
1538e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        rectPaint.setColor(SK_ColorLTGRAY);
1548e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1558e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        int testCount = 0;
156cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
1578e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            for (int j = 0; j < fMatrices.count(); ++j) {
1588e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                canvas->save();
1598e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                SkMatrix mat = fMatrices[j];
1608e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                // position the oval, and make it at off-integer coords.
161cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com                mat.postTranslate(kXStart + SK_Scalar1 * kXStep * (testCount % maxX) +
1628e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                  SK_Scalar1 / 4,
163cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com                                  kYStart + SK_Scalar1 * kYStep * (testCount / maxX) +
1648e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                  3 * SK_Scalar1 / 4);
1658e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                canvas->concat(mat);
166cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
1678e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                SkColor color = genColor(&rand);
1688e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                fPaints[i].setColor(color);
1698e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1708e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                canvas->drawRect(oval, rectPaint);
1718e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                canvas->drawOval(oval, fPaints[i]);
1728e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1738e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                canvas->restore();
1748e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1758e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                ++testCount;
1768e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            }
1778e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1788e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1798e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // special cases
1808e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1818e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // non-scaled tall and skinny oval
182cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
1838e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkRect oval = SkRect::MakeLTRB(-20, -60, 20, 60);
1848e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->save();
1858e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            // position the oval, and make it at off-integer coords.
1868e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.55f + SK_Scalar1 / 4,
1878e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
188cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
1898e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkColor color = genColor(&rand);
1908e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setColor(color);
1918e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1928e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawRect(oval, rectPaint);
1938e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawOval(oval, fPaints[i]);
1948e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->restore();
1958e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
1968e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
1978e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // non-scaled wide and short oval
198cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
1998e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkRect oval = SkRect::MakeLTRB(-80, -30, 80, 30);
2008e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->save();
2018e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            // position the oval, and make it at off-integer coords.
2028e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->translate(kXStart + SK_Scalar1 * kXStep * 4 + SK_Scalar1 / 4,
2038e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
2048e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              SK_ScalarHalf * kYStep);
205cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
2068e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkColor color = genColor(&rand);
2078e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setColor(color);
2088e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2098e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawRect(oval, rectPaint);
2108e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawOval(oval, fPaints[i]);
2118e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->restore();
2128e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
2138e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2148e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // super skinny oval
215cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
2168e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkRect oval = SkRect::MakeLTRB(0, -60, 1, 60);
2178e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->save();
2188e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            // position the oval, and make it at off-integer coords.
2198e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->translate(kXStart + SK_Scalar1 * kXStep * 3.25f + SK_Scalar1 / 4,
2208e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4);
221cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
2228e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkColor color = genColor(&rand);
2238e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setColor(color);
2248e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2258e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawOval(oval, fPaints[i]);
2268e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->restore();
2278e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
2288e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2298e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // super short oval
230cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
2318e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkRect oval = SkRect::MakeLTRB(-80, -1, 80, 0);
2328e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->save();
2338e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            // position the oval, and make it at off-integer coords.
2348e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.5f + SK_Scalar1 / 4,
2358e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
2368e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              SK_ScalarHalf * kYStep);
237cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
2388e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkColor color = genColor(&rand);
2398e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setColor(color);
2408e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2418e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawOval(oval, fPaints[i]);
2428e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->restore();
2438e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
2448e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2458e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        // radial gradient
2468e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkPoint center = SkPoint::Make(SkIntToScalar(0), SkIntToScalar(0));
2478e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
2488e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
2498e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        SkAutoTUnref<SkShader> shader(SkGradientShader::CreateRadial(center,
2508e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                                     SkIntToScalar(20),
2518e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                                     colors,
2528e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                                     pos,
2538e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                                     SK_ARRAY_COUNT(colors),
2548e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                                                     SkShader::kClamp_TileMode));
2558e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
256cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com        for (int i = 0; i < fPaints.count(); ++i) {
2578e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->save();
2588e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            // position the path, and make it at off-integer coords.
2598e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->translate(kXStart + SK_Scalar1 * kXStep * 0 + SK_Scalar1 / 4,
2608e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 +
2618e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com                              SK_ScalarHalf * kYStep);
262cb6dc752281841a8d3245d14530e30eff39816d3skia.committer@gmail.com
2638e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            SkColor color = genColor(&rand);
2648e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setColor(color);
2658e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            fPaints[i].setShader(shader);
2668e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2678e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawRect(oval, rectPaint);
2688e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->drawOval(oval, fPaints[i]);
269cabd0ed14fe6c4679325259682f76f351c8c99ccjvanverth@google.com
270cabd0ed14fe6c4679325259682f76f351c8c99ccjvanverth@google.com            fPaints[i].setShader(NULL);
271cabd0ed14fe6c4679325259682f76f351c8c99ccjvanverth@google.com
2728e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com            canvas->restore();
2738e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com        }
2748e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    }
2758e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2768e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.comprivate:
2778e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    SkTArray<SkPaint> fPaints;
2788e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    SkTArray<SkMatrix> fMatrices;
2798e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2808e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com    typedef GM INHERITED;
2818e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com};
2828e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2838e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com//////////////////////////////////////////////////////////////////////////////
2848e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2858e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.comstatic GM* MyFactory(void*) { return new OvalGM; }
2868e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.comstatic GMRegistry reg(MyFactory);
2878e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com
2888e2962fbb582baee8078cde7a1c306a5a93b06c9jvanverth@google.com}
289