1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTileMode.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkRandom.h" 24*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ToolUtils.h" 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private; 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker namespace skiagm { 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker class OvalGM : public GM { 31*c8dee2aaSAndroid Build Coastguard Worker public: OvalGM()32*c8dee2aaSAndroid Build Coastguard Worker OvalGM() { 33*c8dee2aaSAndroid Build Coastguard Worker this->setBGColor(0xFF000000); 34*c8dee2aaSAndroid Build Coastguard Worker this->makePaints(); 35*c8dee2aaSAndroid Build Coastguard Worker this->makeMatrices(); 36*c8dee2aaSAndroid Build Coastguard Worker } 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker protected: getName() const39*c8dee2aaSAndroid Build Coastguard Worker SkString getName() const override { return SkString("ovals"); } 40*c8dee2aaSAndroid Build Coastguard Worker getISize()41*c8dee2aaSAndroid Build Coastguard Worker SkISize getISize() override { return SkISize::Make(1200, 900); } 42*c8dee2aaSAndroid Build Coastguard Worker makePaints()43*c8dee2aaSAndroid Build Coastguard Worker void makePaints() { 44*c8dee2aaSAndroid Build Coastguard Worker { 45*c8dee2aaSAndroid Build Coastguard Worker // no AA 46*c8dee2aaSAndroid Build Coastguard Worker SkPaint p; 47*c8dee2aaSAndroid Build Coastguard Worker fPaints.push_back(p); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker { 51*c8dee2aaSAndroid Build Coastguard Worker // AA 52*c8dee2aaSAndroid Build Coastguard Worker SkPaint p; 53*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true); 54*c8dee2aaSAndroid Build Coastguard Worker fPaints.push_back(p); 55*c8dee2aaSAndroid Build Coastguard Worker } 56*c8dee2aaSAndroid Build Coastguard Worker 57*c8dee2aaSAndroid Build Coastguard Worker { 58*c8dee2aaSAndroid Build Coastguard Worker // AA with stroke style 59*c8dee2aaSAndroid Build Coastguard Worker SkPaint p; 60*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true); 61*c8dee2aaSAndroid Build Coastguard Worker p.setStyle(SkPaint::kStroke_Style); 62*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeWidth(SkIntToScalar(5)); 63*c8dee2aaSAndroid Build Coastguard Worker fPaints.push_back(p); 64*c8dee2aaSAndroid Build Coastguard Worker } 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker { 67*c8dee2aaSAndroid Build Coastguard Worker // AA with stroke style, width = 0 68*c8dee2aaSAndroid Build Coastguard Worker SkPaint p; 69*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true); 70*c8dee2aaSAndroid Build Coastguard Worker p.setStyle(SkPaint::kStroke_Style); 71*c8dee2aaSAndroid Build Coastguard Worker fPaints.push_back(p); 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker { 75*c8dee2aaSAndroid Build Coastguard Worker // AA with stroke and fill style 76*c8dee2aaSAndroid Build Coastguard Worker SkPaint p; 77*c8dee2aaSAndroid Build Coastguard Worker p.setAntiAlias(true); 78*c8dee2aaSAndroid Build Coastguard Worker p.setStyle(SkPaint::kStrokeAndFill_Style); 79*c8dee2aaSAndroid Build Coastguard Worker p.setStrokeWidth(SkIntToScalar(3)); 80*c8dee2aaSAndroid Build Coastguard Worker fPaints.push_back(p); 81*c8dee2aaSAndroid Build Coastguard Worker } 82*c8dee2aaSAndroid Build Coastguard Worker } 83*c8dee2aaSAndroid Build Coastguard Worker makeMatrices()84*c8dee2aaSAndroid Build Coastguard Worker void makeMatrices() { 85*c8dee2aaSAndroid Build Coastguard Worker { 86*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 87*c8dee2aaSAndroid Build Coastguard Worker m.setIdentity(); 88*c8dee2aaSAndroid Build Coastguard Worker fMatrices.push_back(m); 89*c8dee2aaSAndroid Build Coastguard Worker } 90*c8dee2aaSAndroid Build Coastguard Worker 91*c8dee2aaSAndroid Build Coastguard Worker { 92*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 93*c8dee2aaSAndroid Build Coastguard Worker m.setScale(SkIntToScalar(3), SkIntToScalar(2)); 94*c8dee2aaSAndroid Build Coastguard Worker fMatrices.push_back(m); 95*c8dee2aaSAndroid Build Coastguard Worker } 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker { 98*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 99*c8dee2aaSAndroid Build Coastguard Worker m.setScale(SkIntToScalar(2), SkIntToScalar(2)); 100*c8dee2aaSAndroid Build Coastguard Worker fMatrices.push_back(m); 101*c8dee2aaSAndroid Build Coastguard Worker } 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker { 104*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 105*c8dee2aaSAndroid Build Coastguard Worker m.setScale(SkIntToScalar(1), SkIntToScalar(2)); 106*c8dee2aaSAndroid Build Coastguard Worker fMatrices.push_back(m); 107*c8dee2aaSAndroid Build Coastguard Worker } 108*c8dee2aaSAndroid Build Coastguard Worker 109*c8dee2aaSAndroid Build Coastguard Worker { 110*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 111*c8dee2aaSAndroid Build Coastguard Worker m.setScale(SkIntToScalar(4), SkIntToScalar(1)); 112*c8dee2aaSAndroid Build Coastguard Worker fMatrices.push_back(m); 113*c8dee2aaSAndroid Build Coastguard Worker } 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Worker { 116*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 117*c8dee2aaSAndroid Build Coastguard Worker m.setRotate(SkIntToScalar(90)); 118*c8dee2aaSAndroid Build Coastguard Worker fMatrices.push_back(m); 119*c8dee2aaSAndroid Build Coastguard Worker } 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker { 122*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 123*c8dee2aaSAndroid Build Coastguard Worker m.setSkew(SkIntToScalar(2), SkIntToScalar(3)); 124*c8dee2aaSAndroid Build Coastguard Worker fMatrices.push_back(m); 125*c8dee2aaSAndroid Build Coastguard Worker } 126*c8dee2aaSAndroid Build Coastguard Worker 127*c8dee2aaSAndroid Build Coastguard Worker { 128*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 129*c8dee2aaSAndroid Build Coastguard Worker m.setRotate(SkIntToScalar(60)); 130*c8dee2aaSAndroid Build Coastguard Worker fMatrices.push_back(m); 131*c8dee2aaSAndroid Build Coastguard Worker } 132*c8dee2aaSAndroid Build Coastguard Worker } 133*c8dee2aaSAndroid Build Coastguard Worker genColor(SkRandom * rand)134*c8dee2aaSAndroid Build Coastguard Worker SkColor genColor(SkRandom* rand) { 135*c8dee2aaSAndroid Build Coastguard Worker SkScalar hsv[3]; 136*c8dee2aaSAndroid Build Coastguard Worker hsv[0] = rand->nextRangeF(0.0f, 360.0f); 137*c8dee2aaSAndroid Build Coastguard Worker hsv[1] = rand->nextRangeF(0.75f, 1.0f); 138*c8dee2aaSAndroid Build Coastguard Worker hsv[2] = rand->nextRangeF(0.75f, 1.0f); 139*c8dee2aaSAndroid Build Coastguard Worker 140*c8dee2aaSAndroid Build Coastguard Worker return ToolUtils::color_to_565(SkHSVToColor(hsv)); 141*c8dee2aaSAndroid Build Coastguard Worker } 142*c8dee2aaSAndroid Build Coastguard Worker onDraw(SkCanvas * canvas)143*c8dee2aaSAndroid Build Coastguard Worker void onDraw(SkCanvas* canvas) override { 144*c8dee2aaSAndroid Build Coastguard Worker SkRandom rand(1); 145*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1); 146*c8dee2aaSAndroid Build Coastguard Worker const SkRect kOval = SkRect::MakeLTRB(-20, -30, 20, 30); 147*c8dee2aaSAndroid Build Coastguard Worker 148*c8dee2aaSAndroid Build Coastguard Worker const SkScalar kXStart = 60.0f; 149*c8dee2aaSAndroid Build Coastguard Worker const SkScalar kYStart = 80.0f; 150*c8dee2aaSAndroid Build Coastguard Worker const int kXStep = 150; 151*c8dee2aaSAndroid Build Coastguard Worker const int kYStep = 160; 152*c8dee2aaSAndroid Build Coastguard Worker int maxX = fMatrices.size(); 153*c8dee2aaSAndroid Build Coastguard Worker 154*c8dee2aaSAndroid Build Coastguard Worker SkPaint rectPaint; 155*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setAntiAlias(true); 156*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStyle(SkPaint::kStroke_Style); 157*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setStrokeWidth(SkIntToScalar(0)); 158*c8dee2aaSAndroid Build Coastguard Worker rectPaint.setColor(SK_ColorLTGRAY); 159*c8dee2aaSAndroid Build Coastguard Worker 160*c8dee2aaSAndroid Build Coastguard Worker int testCount = 0; 161*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fPaints.size(); ++i) { 162*c8dee2aaSAndroid Build Coastguard Worker for (int j = 0; j < fMatrices.size(); ++j) { 163*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 164*c8dee2aaSAndroid Build Coastguard Worker SkMatrix mat = fMatrices[j]; 165*c8dee2aaSAndroid Build Coastguard Worker // position the oval, and make it at off-integer coords. 166*c8dee2aaSAndroid Build Coastguard Worker mat.postTranslate(kXStart + SK_Scalar1 * kXStep * (testCount % maxX) + 167*c8dee2aaSAndroid Build Coastguard Worker SK_Scalar1 / 4, 168*c8dee2aaSAndroid Build Coastguard Worker kYStart + SK_Scalar1 * kYStep * (testCount / maxX) + 169*c8dee2aaSAndroid Build Coastguard Worker 3 * SK_Scalar1 / 4); 170*c8dee2aaSAndroid Build Coastguard Worker canvas->concat(mat); 171*c8dee2aaSAndroid Build Coastguard Worker 172*c8dee2aaSAndroid Build Coastguard Worker SkColor color = genColor(&rand); 173*c8dee2aaSAndroid Build Coastguard Worker fPaints[i].setColor(color); 174*c8dee2aaSAndroid Build Coastguard Worker 175*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(kOval, rectPaint); 176*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(kOval, fPaints[i]); 177*c8dee2aaSAndroid Build Coastguard Worker 178*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 179*c8dee2aaSAndroid Build Coastguard Worker 180*c8dee2aaSAndroid Build Coastguard Worker ++testCount; 181*c8dee2aaSAndroid Build Coastguard Worker } 182*c8dee2aaSAndroid Build Coastguard Worker } 183*c8dee2aaSAndroid Build Coastguard Worker 184*c8dee2aaSAndroid Build Coastguard Worker // special cases 185*c8dee2aaSAndroid Build Coastguard Worker 186*c8dee2aaSAndroid Build Coastguard Worker // non-scaled tall and skinny oval 187*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fPaints.size(); ++i) { 188*c8dee2aaSAndroid Build Coastguard Worker SkRect oval = SkRect::MakeLTRB(-20, -60, 20, 60); 189*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 190*c8dee2aaSAndroid Build Coastguard Worker // position the oval, and make it at off-integer coords. 191*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.55f + SK_Scalar1 / 4, 192*c8dee2aaSAndroid Build Coastguard Worker kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4); 193*c8dee2aaSAndroid Build Coastguard Worker 194*c8dee2aaSAndroid Build Coastguard Worker SkColor color = genColor(&rand); 195*c8dee2aaSAndroid Build Coastguard Worker fPaints[i].setColor(color); 196*c8dee2aaSAndroid Build Coastguard Worker 197*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(oval, rectPaint); 198*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(oval, fPaints[i]); 199*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 200*c8dee2aaSAndroid Build Coastguard Worker } 201*c8dee2aaSAndroid Build Coastguard Worker 202*c8dee2aaSAndroid Build Coastguard Worker // non-scaled wide and short oval 203*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fPaints.size(); ++i) { 204*c8dee2aaSAndroid Build Coastguard Worker SkRect oval = SkRect::MakeLTRB(-80, -30, 80, 30); 205*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 206*c8dee2aaSAndroid Build Coastguard Worker // position the oval, and make it at off-integer coords. 207*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(kXStart + SK_Scalar1 * kXStep * 4 + SK_Scalar1 / 4, 208*c8dee2aaSAndroid Build Coastguard Worker kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 + 209*c8dee2aaSAndroid Build Coastguard Worker SK_ScalarHalf * kYStep); 210*c8dee2aaSAndroid Build Coastguard Worker 211*c8dee2aaSAndroid Build Coastguard Worker SkColor color = genColor(&rand); 212*c8dee2aaSAndroid Build Coastguard Worker fPaints[i].setColor(color); 213*c8dee2aaSAndroid Build Coastguard Worker 214*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(oval, rectPaint); 215*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(oval, fPaints[i]); 216*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 217*c8dee2aaSAndroid Build Coastguard Worker } 218*c8dee2aaSAndroid Build Coastguard Worker 219*c8dee2aaSAndroid Build Coastguard Worker // super skinny oval 220*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fPaints.size(); ++i) { 221*c8dee2aaSAndroid Build Coastguard Worker SkRect oval = SkRect::MakeLTRB(0, -60, 1, 60); 222*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 223*c8dee2aaSAndroid Build Coastguard Worker // position the oval, and make it at off-integer coords. 224*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(kXStart + SK_Scalar1 * kXStep * 3.25f + SK_Scalar1 / 4, 225*c8dee2aaSAndroid Build Coastguard Worker kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4); 226*c8dee2aaSAndroid Build Coastguard Worker 227*c8dee2aaSAndroid Build Coastguard Worker SkColor color = genColor(&rand); 228*c8dee2aaSAndroid Build Coastguard Worker fPaints[i].setColor(color); 229*c8dee2aaSAndroid Build Coastguard Worker 230*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(oval, fPaints[i]); 231*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 232*c8dee2aaSAndroid Build Coastguard Worker } 233*c8dee2aaSAndroid Build Coastguard Worker 234*c8dee2aaSAndroid Build Coastguard Worker // super short oval 235*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fPaints.size(); ++i) { 236*c8dee2aaSAndroid Build Coastguard Worker SkRect oval = SkRect::MakeLTRB(-80, -1, 80, 0); 237*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 238*c8dee2aaSAndroid Build Coastguard Worker // position the oval, and make it at off-integer coords. 239*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(kXStart + SK_Scalar1 * kXStep * 2.5f + SK_Scalar1 / 4, 240*c8dee2aaSAndroid Build Coastguard Worker kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 + 241*c8dee2aaSAndroid Build Coastguard Worker SK_ScalarHalf * kYStep); 242*c8dee2aaSAndroid Build Coastguard Worker 243*c8dee2aaSAndroid Build Coastguard Worker SkColor color = genColor(&rand); 244*c8dee2aaSAndroid Build Coastguard Worker fPaints[i].setColor(color); 245*c8dee2aaSAndroid Build Coastguard Worker 246*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(oval, fPaints[i]); 247*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 248*c8dee2aaSAndroid Build Coastguard Worker } 249*c8dee2aaSAndroid Build Coastguard Worker 250*c8dee2aaSAndroid Build Coastguard Worker // radial gradient 251*c8dee2aaSAndroid Build Coastguard Worker SkPoint center = SkPoint::Make(SkIntToScalar(0), SkIntToScalar(0)); 252*c8dee2aaSAndroid Build Coastguard Worker SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN }; 253*c8dee2aaSAndroid Build Coastguard Worker SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 }; 254*c8dee2aaSAndroid Build Coastguard Worker auto shader = SkGradientShader::MakeRadial(center, 20, colors, pos, std::size(colors), 255*c8dee2aaSAndroid Build Coastguard Worker SkTileMode::kClamp); 256*c8dee2aaSAndroid Build Coastguard Worker 257*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fPaints.size(); ++i) { 258*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 259*c8dee2aaSAndroid Build Coastguard Worker // position the path, and make it at off-integer coords. 260*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(kXStart + SK_Scalar1 * kXStep * 0 + SK_Scalar1 / 4, 261*c8dee2aaSAndroid Build Coastguard Worker kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 + 262*c8dee2aaSAndroid Build Coastguard Worker SK_ScalarHalf * kYStep); 263*c8dee2aaSAndroid Build Coastguard Worker 264*c8dee2aaSAndroid Build Coastguard Worker SkColor color = genColor(&rand); 265*c8dee2aaSAndroid Build Coastguard Worker fPaints[i].setColor(color); 266*c8dee2aaSAndroid Build Coastguard Worker fPaints[i].setShader(shader); 267*c8dee2aaSAndroid Build Coastguard Worker 268*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(kOval, rectPaint); 269*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(kOval, fPaints[i]); 270*c8dee2aaSAndroid Build Coastguard Worker 271*c8dee2aaSAndroid Build Coastguard Worker fPaints[i].setShader(nullptr); 272*c8dee2aaSAndroid Build Coastguard Worker 273*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 274*c8dee2aaSAndroid Build Coastguard Worker } 275*c8dee2aaSAndroid Build Coastguard Worker 276*c8dee2aaSAndroid Build Coastguard Worker // reflected oval 277*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fPaints.size(); ++i) { 278*c8dee2aaSAndroid Build Coastguard Worker SkRect oval = SkRect::MakeLTRB(-30, -30, 30, 30); 279*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 280*c8dee2aaSAndroid Build Coastguard Worker // position the oval, and make it at off-integer coords. 281*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(kXStart + SK_Scalar1 * kXStep * 5 + SK_Scalar1 / 4, 282*c8dee2aaSAndroid Build Coastguard Worker kYStart + SK_Scalar1 * kYStep * i + 3 * SK_Scalar1 / 4 + 283*c8dee2aaSAndroid Build Coastguard Worker SK_ScalarHalf * kYStep); 284*c8dee2aaSAndroid Build Coastguard Worker canvas->rotate(90); 285*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(1, -1); 286*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(1, 0.66f); 287*c8dee2aaSAndroid Build Coastguard Worker 288*c8dee2aaSAndroid Build Coastguard Worker SkColor color = genColor(&rand); 289*c8dee2aaSAndroid Build Coastguard Worker fPaints[i].setColor(color); 290*c8dee2aaSAndroid Build Coastguard Worker 291*c8dee2aaSAndroid Build Coastguard Worker canvas->drawRect(oval, rectPaint); 292*c8dee2aaSAndroid Build Coastguard Worker canvas->drawOval(oval, fPaints[i]); 293*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 294*c8dee2aaSAndroid Build Coastguard Worker } 295*c8dee2aaSAndroid Build Coastguard Worker } 296*c8dee2aaSAndroid Build Coastguard Worker 297*c8dee2aaSAndroid Build Coastguard Worker private: 298*c8dee2aaSAndroid Build Coastguard Worker TArray<SkPaint> fPaints; 299*c8dee2aaSAndroid Build Coastguard Worker TArray<SkMatrix> fMatrices; 300*c8dee2aaSAndroid Build Coastguard Worker 301*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GM; 302*c8dee2aaSAndroid Build Coastguard Worker }; 303*c8dee2aaSAndroid Build Coastguard Worker 304*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 305*c8dee2aaSAndroid Build Coastguard Worker 306*c8dee2aaSAndroid Build Coastguard Worker DEF_GM( return new OvalGM; ) 307*c8dee2aaSAndroid Build Coastguard Worker 308*c8dee2aaSAndroid Build Coastguard Worker } // namespace skiagm 309