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