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