1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7d3ebb48320cf1b7e969974673e4bd7743816985ebungeman 8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 9d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkBitmap.h" 10d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkCanvas.h" 11d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkColorPriv.h" 12d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkPaint.h" 13d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkPath.h" 146e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com#include "SkRandom.h" 15d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkShader.h" 16d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkString.h" 1730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com#include "SkTArray.h" 1830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 19d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comenum Flags { 20d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com kStroke_Flag = 1 << 0, 21d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com kBig_Flag = 1 << 1 22d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 23d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 24d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS00 Flags(0) 25d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS01 Flags(kStroke_Flag) 26d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS10 Flags(kBig_Flag) 27d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS11 Flags(kStroke_Flag | kBig_Flag) 28d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 29f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass PathBench : public Benchmark { 30d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkPaint fPaint; 31d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkString fName; 32d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com Flags fFlags; 33d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 34410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathBench(Flags flags) : fFlags(flags) { 35d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style : 36d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkPaint::kFill_Style); 37d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fPaint.setStrokeWidth(SkIntToScalar(5)); 38d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fPaint.setStrokeJoin(SkPaint::kBevel_Join); 39d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 40d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 41d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com virtual void appendName(SkString*) = 0; 42d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com virtual void makePath(SkPath*) = 0; 436e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com virtual int complexity() { return 0; } 44d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 45d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprotected: 4636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 47d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fName.printf("path_%s_%s_", 48d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fFlags & kStroke_Flag ? "stroke" : "fill", 49d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fFlags & kBig_Flag ? "big" : "small"); 50d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com this->appendName(&fName); 51d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com return fName.c_str(); 52d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 53d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 54a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas* canvas) override { 55d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkPaint paint(fPaint); 56d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com this->setupPaint(&paint); 57d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 58d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkPath path; 59d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com this->makePath(&path); 60d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com if (fFlags & kBig_Flag) { 611d24b8dfe9aac9cadaf3914b8574a4ff6e9bc19drobertphillips const SkMatrix m = SkMatrix::MakeScale(SkIntToScalar(10), SkIntToScalar(10)); 62d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path.transform(m); 63d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 64d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 65d29f0e7ccb84993562f34f2d8e3933a19a3ed676Yuqian Li for (int i = 0; i < loops; i++) { 66d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com canvas->drawPath(path, paint); 67d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 68d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 69d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 70d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 71f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 72d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 73d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 74d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass TrianglePathBench : public PathBench { 75d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 76410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com TrianglePathBench(Flags flags) : INHERITED(flags) {} 77fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 7836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 79d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("triangle"); 80d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 8136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 82d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com static const int gCoord[] = { 83d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 10, 10, 15, 5, 20, 20 84d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com }; 85d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); 86d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); 87d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); 88d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->close(); 89d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 90d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 91d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 92d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 93d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 94d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass RectPathBench : public PathBench { 95d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 96410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com RectPathBench(Flags flags) : INHERITED(flags) {} 97fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 9836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 99d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("rect"); 100d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 10136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 102d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkRect r = { 10, 10, 20, 20 }; 103d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->addRect(r); 104d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 105d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 106d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 107d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 108d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 109a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianclass RotatedRectBench : public PathBench { 110a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianpublic: 111a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian RotatedRectBench(Flags flags, bool aa, int degrees) : INHERITED(flags) { 112a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian fAA = aa; 113a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian fDegrees = degrees; 114a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian } 115a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian 116a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian void appendName(SkString* name) override { 117a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian SkString suffix; 118a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian suffix.printf("rotated_rect_%s_%d", fAA ? "aa" : "noaa", fDegrees); 119a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian name->append(suffix); 120a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian } 121a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian 122a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian void makePath(SkPath* path) override { 123a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian SkRect r = { 10, 10, 20, 20 }; 124a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian path->addRect(r); 125a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian SkMatrix rotateMatrix; 126a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian rotateMatrix.setRotate((SkScalar)fDegrees); 127a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian path->transform(rotateMatrix); 128a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian } 129a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian 130a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian virtual void setupPaint(SkPaint* paint) override { 131a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian PathBench::setupPaint(paint); 132a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian paint->setAntiAlias(fAA); 133a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian } 134a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianprivate: 135a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian typedef PathBench INHERITED; 136a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian int fDegrees; 137a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian bool fAA; 138a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian}; 139a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian 140d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass OvalPathBench : public PathBench { 141d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 142410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com OvalPathBench(Flags flags) : INHERITED(flags) {} 143fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 14436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 145d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("oval"); 146d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 14736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 148e2bfd8b7b17c7a66728883d6fb5f7b7639c73b90jvanverth@google.com SkRect r = { 10, 10, 23, 20 }; 149d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->addOval(r); 150d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 151d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 152d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 153d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 154d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 1551647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comclass CirclePathBench: public PathBench { 1561647a1955fa44654102ae36df7af683bb8874175bsalomon@google.compublic: 157410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com CirclePathBench(Flags flags) : INHERITED(flags) {} 1581647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com 15936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 1601647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com name->append("circle"); 1611647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com } 16236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 1631647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com path->addCircle(SkIntToScalar(20), SkIntToScalar(20), 1641647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com SkIntToScalar(10)); 1651647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com } 1661647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comprivate: 1671647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com typedef PathBench INHERITED; 1681647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com}; 1691647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com 1708eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Liclass NonAACirclePathBench: public CirclePathBench { 1718eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Lipublic: 1728eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li NonAACirclePathBench(Flags flags) : INHERITED(flags) {} 1738eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li 1748eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li void appendName(SkString* name) override { 1758eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li name->append("nonaacircle"); 1768eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li } 1778eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li 1788eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li void setupPaint(SkPaint* paint) override { 1798eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li CirclePathBench::setupPaint(paint); 1808eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li paint->setAntiAlias(false); 1818eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li } 1828eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li 1838eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Liprivate: 1848eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li typedef CirclePathBench INHERITED; 1858eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li}; 1868eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li 187131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li// Test max speedup of Analytic AA for concave paths 188131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Liclass AAAConcavePathBench : public PathBench { 189131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Lipublic: 190131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li AAAConcavePathBench(Flags flags) : INHERITED(flags) {} 191131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li 192131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li void appendName(SkString* name) override { 193131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li name->append("concave_aaa"); 194131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li } 195131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li 196131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li void makePath(SkPath* path) override { 197131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li path->moveTo(10, 10); 198131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li path->lineTo(15, 10); 199131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li path->lineTo(15, 5); 200131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li path->lineTo(40, 40); 201131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li path->close(); 202131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li } 203131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li 204131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Liprivate: 205131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li typedef PathBench INHERITED; 206131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li}; 207131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li 208131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li// Test max speedup of Analytic AA for convex paths 209131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Liclass AAAConvexPathBench : public PathBench { 210131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Lipublic: 211131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li AAAConvexPathBench(Flags flags) : INHERITED(flags) {} 212131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li 213131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li void appendName(SkString* name) override { 214131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li name->append("convex_aaa"); 215131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li } 216131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li 217131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li void makePath(SkPath* path) override { 218131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li path->moveTo(10, 10); 219131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li path->lineTo(15, 10); 220131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li path->lineTo(40, 50); 221131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li path->close(); 222131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li } 223131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li 224131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Liprivate: 225131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li typedef PathBench INHERITED; 226131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li}; 227131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li 228d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass SawToothPathBench : public PathBench { 229d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 230410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com SawToothPathBench(Flags flags) : INHERITED(flags) {} 231fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 23236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 233d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("sawtooth"); 234d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 235f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein void makePath(SkPath* path) override { 236d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkScalar x = SkIntToScalar(20); 237d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkScalar y = SkIntToScalar(20); 238d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com const SkScalar x0 = x; 239d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com const SkScalar dx = SK_Scalar1 * 5; 240d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com const SkScalar dy = SK_Scalar1 * 10; 241d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 242d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->moveTo(x, y); 243d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com for (int i = 0; i < 32; i++) { 244d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com x += dx; 245d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x, y - dy); 246d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com x += dx; 247d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x, y + dy); 248d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 249d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x, y + 2 * dy); 250d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x0, y + 2 * dy); 251d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->close(); 252d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 25336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein int complexity() override { return 1; } 2546e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comprivate: 2556e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com typedef PathBench INHERITED; 2566e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com}; 2576e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 2586e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comclass LongCurvedPathBench : public PathBench { 2596e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.compublic: 260410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com LongCurvedPathBench(Flags flags) : INHERITED(flags) {} 2616e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 26236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 2636e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com name->append("long_curved"); 2646e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com } 26536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 266e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand (12); 2676e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com int i; 2686e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com for (i = 0; i < 100; i++) { 269df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed path->quadTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480, 270df85c38163245c7fc3c23cad3a4ad104949f3a62Mike Reed rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); 2716e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com } 2726e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com path->close(); 2736e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com } 27436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein int complexity() override { return 2; } 275d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 276d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 277d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 278d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 279e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgclass LongLinePathBench : public PathBench { 280e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgpublic: 281410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com LongLinePathBench(Flags flags) : INHERITED(flags) {} 282e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org 28336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 284e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org name->append("long_line"); 285e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org } 28636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 287e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 288e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); 289e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org for (size_t i = 1; i < 100; i++) { 290e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); 291e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org } 292e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org } 29336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein int complexity() override { return 2; } 294e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgprivate: 295e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org typedef PathBench INHERITED; 296e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org}; 2976e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 298f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RandomPathBench : public Benchmark { 29930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 30036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 301644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 30230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 30330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 30430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 30530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void createData(int minVerbs, 30630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com int maxVerbs, 30730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bool allowMoves = true, 30896fcdcc219d2a0d3579719b84b28bede76efba64halcanary SkRect* bounds = nullptr) { 30930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkRect tempBounds; 31096fcdcc219d2a0d3579719b84b28bede76efba64halcanary if (nullptr == bounds) { 31130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com tempBounds.setXYWH(0, 0, SK_Scalar1, SK_Scalar1); 31230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bounds = &tempBounds; 31330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 3146d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbCnts.reset(kNumVerbCnts); 3156d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com for (int i = 0; i < kNumVerbCnts; ++i) { 3166d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbCnts[i] = fRandom.nextRangeU(minVerbs, maxVerbs + 1); 3176d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com } 3186d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbs.reset(kNumVerbs); 3196d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com for (int i = 0; i < kNumVerbs; ++i) { 3206d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com do { 3216d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbs[i] = static_cast<SkPath::Verb>(fRandom.nextULessThan(SkPath::kDone_Verb)); 3226d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com } while (!allowMoves && SkPath::kMove_Verb == fVerbs[i]); 3236d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com } 3246d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fPoints.reset(kNumPoints); 3256d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com for (int i = 0; i < kNumPoints; ++i) { 3266d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fPoints[i].set(fRandom.nextRangeScalar(bounds->fLeft, bounds->fRight), 3276d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fRandom.nextRangeScalar(bounds->fTop, bounds->fBottom)); 32830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 32930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->restartMakingPaths(); 33030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 33130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 33230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void restartMakingPaths() { 33330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCurrPath = 0; 33430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCurrVerb = 0; 33530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCurrPoint = 0; 33630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 33730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 33830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void makePath(SkPath* path) { 3396d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int vCount = fVerbCnts[(fCurrPath++) & (kNumVerbCnts - 1)]; 34030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com for (int v = 0; v < vCount; ++v) { 3416d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int verb = fVerbs[(fCurrVerb++) & (kNumVerbs - 1)]; 3426d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com switch (verb) { 34330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kMove_Verb: 3446d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com path->moveTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]); 34530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 34630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kLine_Verb: 3476d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com path->lineTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]); 34830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 34930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kQuad_Verb: 350373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com path->quadTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 351373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fPoints[(fCurrPoint + 1) & (kNumPoints - 1)]); 352373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fCurrPoint += 2; 35330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 354277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 355277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com path->conicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 356277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com fPoints[(fCurrPoint + 1) & (kNumPoints - 1)], 357277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com SK_ScalarHalf); 358277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com fCurrPoint += 2; 359277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com break; 36030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kCubic_Verb: 361373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com path->cubicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 362373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fPoints[(fCurrPoint + 1) & (kNumPoints - 1)], 363373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fPoints[(fCurrPoint + 2) & (kNumPoints - 1)]); 364373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fCurrPoint += 3; 36530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 36630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kClose_Verb: 36730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com path->close(); 36830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 36930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com default: 37030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkDEBUGFAIL("Unexpected path verb"); 37130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 37230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 37330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 37430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 37530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 37630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void finishedMakingPaths() { 3776d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbCnts.reset(0); 3786d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbs.reset(0); 3796d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fPoints.reset(0); 38030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 38130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 38230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 3836d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com enum { 3846d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com // these should all be pow 2 385b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kNumVerbCnts = 1 << 5, 386b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kNumVerbs = 1 << 5, 387b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kNumPoints = 1 << 5, 3886d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com }; 3896d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com SkAutoTArray<int> fVerbCnts; 3906d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com SkAutoTArray<SkPath::Verb> fVerbs; 3916d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com SkAutoTArray<SkPoint> fPoints; 3926d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int fCurrPath; 3936d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int fCurrVerb; 3946d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int fCurrPoint; 395e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom fRandom; 396f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 39730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 39830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 39930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCreateBench : public RandomPathBench { 40030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 401410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathCreateBench() { 40230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 40330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 40430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 40536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 40630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_create"; 40730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 40830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 4098a6697af95b340aad6dee7e6228048fa305c1e59joshualitt void onDelayedSetup() override { 4106d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 41130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 41230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 413a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 4143361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 4158f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org if (i % 1000 == 0) { 4168f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org fPath.reset(); // PathRef memory can grow without bound otherwise. 4178f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org } 4188f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org this->makePath(&fPath); 41930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 42030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->restartMakingPaths(); 42130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 42230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 42330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 4248f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org SkPath fPath; 42530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 42630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 42730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 42830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 42930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCopyBench : public RandomPathBench { 43030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 431410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathCopyBench() { 43230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 43330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 43430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 43536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 43630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_copy"; 43730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 4388a6697af95b340aad6dee7e6228048fa305c1e59joshualitt void onDelayedSetup() override { 4396d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 440b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths.reset(kPathCnt); 441b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fCopies.reset(kPathCnt); 442b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 44330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths[i]); 44430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 44530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->finishedMakingPaths(); 44630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 447a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 4483361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 449b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 450b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fCopies[idx] = fPaths[idx]; 45130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 45230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 45330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 45430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 455b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 456b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 457b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 458b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 459b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths; 460b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fCopies; 46130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 46230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 46330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 46430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 46530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathTransformBench : public RandomPathBench { 46630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 467410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathTransformBench(bool inPlace) : fInPlace(inPlace) {} 46830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 46930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 47036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 47130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return fInPlace ? "path_transform_in_place" : "path_transform_copy"; 47230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 47330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 4748a6697af95b340aad6dee7e6228048fa305c1e59joshualitt void onDelayedSetup() override { 47530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1); 4766d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 477b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths.reset(kPathCnt); 478b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 47930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths[i]); 48030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 481b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com this->finishedMakingPaths(); 48230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com if (!fInPlace) { 483b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fTransformed.reset(kPathCnt); 48430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 48530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 48630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 487a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 48830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com if (fInPlace) { 4893361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 490b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths[i & (kPathCnt - 1)].transform(fMatrix); 49130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 49230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } else { 4933361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 494b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 495b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths[idx].transform(fMatrix, &fTransformed[idx]); 49630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 49730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 49830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 49930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 50030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 501b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 502b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 503b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 504b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 505b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths; 506b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fTransformed; 507b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com 50830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkMatrix fMatrix; 50930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bool fInPlace; 51030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 51130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 51230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 51330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathEqualityBench : public RandomPathBench { 51430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 515410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathEqualityBench() { } 51630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 51730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 51836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 51930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_equality_50%"; 52030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 52130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 5228a6697af95b340aad6dee7e6228048fa305c1e59joshualitt void onDelayedSetup() override { 52330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fParity = 0; 5246d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 525b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths.reset(kPathCnt); 526b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fCopies.reset(kPathCnt); 527b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 52830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths[i]); 52930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCopies[i] = fPaths[i]; 53030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 53130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->finishedMakingPaths(); 53230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 53330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 534a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 5353361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 536b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 537b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]); 53830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 53930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 54030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 54130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 54230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bool fParity; // attempt to keep compiler from optimizing out the == 543b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 544b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 545b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 546b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 547b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths; 548b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fCopies; 54930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 55030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 55130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 55230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass SkBench_AddPathTest : public RandomPathBench { 55330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 55430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com enum AddType { 55530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kAdd_AddType, 55630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kAddTrans_AddType, 55730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kAddMatrix_AddType, 55830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kReverseAdd_AddType, 55930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kReversePathTo_AddType, 56030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com }; 56130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 562410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com SkBench_AddPathTest(AddType type) : fType(type) { 56330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fMatrix.setRotate(60 * SK_Scalar1); 56430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 56530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 56630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 56736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 56830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com switch (fType) { 56930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAdd_AddType: 57030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_add_path"; 57130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddTrans_AddType: 57230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_add_path_trans"; 57330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddMatrix_AddType: 57430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_add_path_matrix"; 57530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReverseAdd_AddType: 57630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_reverse_add_path"; 57730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReversePathTo_AddType: 57830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_reverse_path_to"; 57930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com default: 58030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkDEBUGFAIL("Bad add type"); 58130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return ""; 58230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 58330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 58430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 5858a6697af95b340aad6dee7e6228048fa305c1e59joshualitt void onDelayedSetup() override { 586a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // reversePathTo assumes a single contour path. 587a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool allowMoves = kReversePathTo_AddType != fType; 5886d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100, allowMoves); 589b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths0.reset(kPathCnt); 590b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths1.reset(kPathCnt); 591b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 59230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths0[i]); 59330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths1[i]); 59430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 59530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->finishedMakingPaths(); 59630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 59730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 598a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 59930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com switch (fType) { 60030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAdd_AddType: 6013361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 602b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 603b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 604b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.addPath(fPaths1[idx]); 60530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 60630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 60730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddTrans_AddType: 6083361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 609b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 610b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 611b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1); 61230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 61330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 61430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddMatrix_AddType: 6153361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 616b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 617b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 618b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.addPath(fPaths1[idx], fMatrix); 61930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 62030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 62130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReverseAdd_AddType: 6223361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 623b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 624b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 625b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.reverseAddPath(fPaths1[idx]); 62630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 62730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 62830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReversePathTo_AddType: 6293361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 630b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 631b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 632b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.reversePathTo(fPaths1[idx]); 63330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 63430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 63530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 63630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 63730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 63830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 63930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com AddType fType; // or reverseAddPath 640b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 641b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 642b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 643b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 644b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths0; 645b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths1; 64630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkMatrix fMatrix; 64730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 64830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 6496e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 65017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 651f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass CirclesBench : public Benchmark { 65217bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected: 65317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkString fName; 65446d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com Flags fFlags; 65517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 65617bb458fe897411218d8c9781770948d4398b723robertphillips@google.compublic: 657410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com CirclesBench(Flags flags) : fFlags(flags) { 65846d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill"); 65917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 66017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 66117bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected: 66236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 66317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com return fName.c_str(); 66417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 66517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 666a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas* canvas) override { 66717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkPaint paint; 66817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 66917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com paint.setColor(SK_ColorBLACK); 67017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com paint.setAntiAlias(true); 67146d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com if (fFlags & kStroke_Flag) { 67246d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com paint.setStyle(SkPaint::kStroke_Style); 67346d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com } 67417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 675e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 67617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 67717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkRect r; 67817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 6793361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 68017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkScalar radius = rand.nextUScalar1() * 3; 68117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 68217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 68317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fRight = r.fLeft + 2 * radius; 68417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fBottom = r.fTop + 2 * radius; 68517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 68646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com if (fFlags & kStroke_Flag) { 68746d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com paint.setStrokeWidth(rand.nextUScalar1() * 5.0f); 68846d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com } 68946d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com 69017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkPath temp; 69117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 69217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com // mimic how Chrome does circles 69317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.arcTo(r, 0, 0, false); 69417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.addOval(r, SkPath::kCCW_Direction); 69517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.arcTo(r, 360, 0, true); 69617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.close(); 697fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 69817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com canvas->drawPath(temp, paint); 69917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 70017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 70117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 70217bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprivate: 703f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 70417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com}; 70517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 70646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com 707158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Chrome creates its own round rects with each corner possibly being different. 708158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// In its "zero radius" incarnation it creates degenerate round rects. 7091e34ff7030c95a96c3cd5940de9b4dda4e1cef86skia.committer@gmail.com// Note: PathTest::test_arb_round_rect_is_convex and 710158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// test_arb_zero_rad_round_rect_is_rect perform almost exactly 711b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// the same test (but with no drawing) 712f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ArbRoundRectBench : public Benchmark { 713f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected: 714f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkString fName; 715f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 716f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.compublic: 717410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) { 718158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (zeroRad) { 719158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com fName.printf("zeroradroundrect"); 720158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } else { 721158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com fName.printf("arbroundrect"); 722158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 723f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 724f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 725f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected: 72636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 727f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com return fName.c_str(); 728f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 729f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 730989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com static void add_corner_arc(SkPath* path, const SkRect& rect, 731989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com SkScalar xIn, SkScalar yIn, 732f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com int startAngle) 733f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com { 734f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 735f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkScalar rx = SkMinScalar(rect.width(), xIn); 736f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkScalar ry = SkMinScalar(rect.height(), yIn); 737f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 738f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkRect arcRect; 739f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.set(-rx, -ry, rx, ry); 740f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com switch (startAngle) { 741f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 0: 742f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom); 743f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 744f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 90: 745f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom); 746f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 747f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 180: 748f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop); 749f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 750f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 270: 751f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop); 752f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 753f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com default: 754f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 755f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 756f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 757f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false); 758f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 759f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 760989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com static void make_arb_round_rect(SkPath* path, const SkRect& r, 761f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkScalar xCorner, SkScalar yCorner) { 762f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com // we are lazy here and use the same x & y for each corner 763f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 270); 764f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 0); 765f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 90); 766f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 180); 767158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com path->close(); 768f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 769b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkASSERT(path->isConvex()); 770f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 771f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 772a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas* canvas) override { 773e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 774f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkRect r; 775f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 7763361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 777f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkPaint paint; 778f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com paint.setColor(0xff000000 | rand.nextU()); 779f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com paint.setAntiAlias(true); 780f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 781158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkScalar size = rand.nextUScalar1() * 30; 782158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (size < SK_Scalar1) { 783b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com continue; 784b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 785f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 786f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 787158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fRight = r.fLeft + 2 * size; 788158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fBottom = r.fTop + 2 * size; 789f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 790f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkPath temp; 791f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 792158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (fZeroRad) { 793158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com make_arb_round_rect(&temp, r, 0, 0); 794158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 79596fcdcc219d2a0d3579719b84b28bede76efba64halcanary SkASSERT(temp.isRect(nullptr)); 796158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } else { 797158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15); 798158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 799f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 800f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com canvas->drawPath(temp, paint); 801f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 802f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 803f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 804f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprivate: 805158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com bool fZeroRad; // should 0 radius rounds rects be tested? 806158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 807f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 808f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com}; 809f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 810f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConservativelyContainsBench : public Benchmark { 8119bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.compublic: 8129bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com enum Type { 8139bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kRect_Type, 8149bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kRoundRect_Type, 8159bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kOval_Type, 8169bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com }; 8179bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 818410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConservativelyContainsBench(Type type) { 8199bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fParity = false; 8209bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName = "conservatively_contains_"; 8219bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com switch (type) { 8229bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com case kRect_Type: 8239bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName.append("rect"); 8249bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fPath.addRect(kBaseRect); 8259bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com break; 8269bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com case kRoundRect_Type: 8279bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName.append("round_rect"); 8289bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]); 8299bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com break; 8309bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com case kOval_Type: 8319bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName.append("oval"); 8329bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fPath.addOval(kBaseRect); 8339bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com break; 8349bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 8359bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 8369bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 83736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 838644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 839644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 840644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 8419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comprivate: 84236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 8439bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com return fName.c_str(); 8449bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 8459bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 846a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 8473361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 8489bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com const SkRect& rect = fQueryRects[i % kQueryRectCnt]; 8499bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fParity = fParity != fPath.conservativelyContainsRect(rect); 8509bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 8519bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 8529bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 8538a6697af95b340aad6dee7e6228048fa305c1e59joshualitt void onDelayedSetup() override { 8549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fQueryRects.setCount(kQueryRectCnt); 8559bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 856e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 8579bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com for (int i = 0; i < kQueryRectCnt; ++i) { 8589bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkSize size; 8599bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPoint xy; 8609bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth, kQueryMax.fWidth); 8619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHeight); 8629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fWidth); 8639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fHeight); 8649bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 8659bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fHeight); 8669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 8679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 8689bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 8699bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com enum { 8709bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kQueryRectCnt = 400, 8719bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com }; 8729bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkRect kBounds; // bounds for all random query rects 8739bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkSize kQueryMin; // minimum query rect size, should be <= kQueryMax 8749bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkSize kQueryMax; // max query rect size, should < kBounds 8759bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkRect kBaseRect; // rect that is used to construct the path 8769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkScalar kRRRadii[2]; // x and y radii for round rect 8779bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 8789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkString fName; 8799bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPath fPath; 8809bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fParity; 8819bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkTDArray<SkRect> fQueryRects; 8829bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 883f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 8849bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com}; 8859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 8868d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 8878d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 8888d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org#include "SkGeometry.h" 8898d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 89055011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_Chop : public Benchmark { 891b640203cd5733aaf110277e28e22007c5b541565reedprotected: 892b640203cd5733aaf110277e28e22007c5b541565reed SkConic fRQ, fDst[2]; 893b640203cd5733aaf110277e28e22007c5b541565reed SkString fName; 8948d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgpublic: 89555011038816a3fc7f0c0a39d482fb85347cc2e78reed ConicBench_Chop() : fName("conic-chop") { 8968d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[0].set(0, 0); 8978d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[1].set(100, 0); 8988d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[2].set(100, 100); 8998d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fW = SkScalarCos(SK_ScalarPI/4); 9008d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 901815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 90236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 903b640203cd5733aaf110277e28e22007c5b541565reed return backend == kNonRendering_Backend; 9048d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 905815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 906b640203cd5733aaf110277e28e22007c5b541565reedprivate: 90736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { return fName.c_str(); } 908b640203cd5733aaf110277e28e22007c5b541565reed 909a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 91055011038816a3fc7f0c0a39d482fb85347cc2e78reed for (int i = 0; i < loops; ++i) { 91155011038816a3fc7f0c0a39d482fb85347cc2e78reed fRQ.chop(fDst); 9128d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 9138d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 914815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 915f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 916af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 91755011038816a3fc7f0c0a39d482fb85347cc2e78reedDEF_BENCH( return new ConicBench_Chop; ) 918b640203cd5733aaf110277e28e22007c5b541565reed 91955011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_EvalPos : public ConicBench_Chop { 92055011038816a3fc7f0c0a39d482fb85347cc2e78reed const bool fUseV2; 921b640203cd5733aaf110277e28e22007c5b541565reedpublic: 92255011038816a3fc7f0c0a39d482fb85347cc2e78reed ConicBench_EvalPos(bool useV2) : fUseV2(useV2) { 923b640203cd5733aaf110277e28e22007c5b541565reed fName.printf("conic-eval-pos%d", useV2); 924b640203cd5733aaf110277e28e22007c5b541565reed } 925a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 926b640203cd5733aaf110277e28e22007c5b541565reed if (fUseV2) { 927b640203cd5733aaf110277e28e22007c5b541565reed for (int i = 0; i < loops; ++i) { 928b640203cd5733aaf110277e28e22007c5b541565reed for (int j = 0; j < 1000; ++j) { 929b640203cd5733aaf110277e28e22007c5b541565reed fDst[0].fPts[0] = fRQ.evalAt(0.4f); 930b640203cd5733aaf110277e28e22007c5b541565reed } 931b640203cd5733aaf110277e28e22007c5b541565reed } 932b640203cd5733aaf110277e28e22007c5b541565reed } else { 933b640203cd5733aaf110277e28e22007c5b541565reed for (int i = 0; i < loops; ++i) { 934b640203cd5733aaf110277e28e22007c5b541565reed for (int j = 0; j < 1000; ++j) { 93596fcdcc219d2a0d3579719b84b28bede76efba64halcanary fRQ.evalAt(0.4f, &fDst[0].fPts[0], nullptr); 936b640203cd5733aaf110277e28e22007c5b541565reed } 937b640203cd5733aaf110277e28e22007c5b541565reed } 938b640203cd5733aaf110277e28e22007c5b541565reed } 939b640203cd5733aaf110277e28e22007c5b541565reed } 940b640203cd5733aaf110277e28e22007c5b541565reed}; 941b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalPos(false); ) 942b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalPos(true); ) 943b640203cd5733aaf110277e28e22007c5b541565reed 94455011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_EvalTan : public ConicBench_Chop { 94555011038816a3fc7f0c0a39d482fb85347cc2e78reed const bool fUseV2; 946b640203cd5733aaf110277e28e22007c5b541565reedpublic: 94755011038816a3fc7f0c0a39d482fb85347cc2e78reed ConicBench_EvalTan(bool useV2) : fUseV2(useV2) { 948b640203cd5733aaf110277e28e22007c5b541565reed fName.printf("conic-eval-tan%d", useV2); 949b640203cd5733aaf110277e28e22007c5b541565reed } 950a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 951b640203cd5733aaf110277e28e22007c5b541565reed if (fUseV2) { 952b640203cd5733aaf110277e28e22007c5b541565reed for (int i = 0; i < loops; ++i) { 953b640203cd5733aaf110277e28e22007c5b541565reed for (int j = 0; j < 1000; ++j) { 954b640203cd5733aaf110277e28e22007c5b541565reed fDst[0].fPts[0] = fRQ.evalTangentAt(0.4f); 955b640203cd5733aaf110277e28e22007c5b541565reed } 956b640203cd5733aaf110277e28e22007c5b541565reed } 957b640203cd5733aaf110277e28e22007c5b541565reed } else { 958b640203cd5733aaf110277e28e22007c5b541565reed for (int i = 0; i < loops; ++i) { 959b640203cd5733aaf110277e28e22007c5b541565reed for (int j = 0; j < 1000; ++j) { 96096fcdcc219d2a0d3579719b84b28bede76efba64halcanary fRQ.evalAt(0.4f, nullptr, &fDst[0].fPts[0]); 961b640203cd5733aaf110277e28e22007c5b541565reed } 962b640203cd5733aaf110277e28e22007c5b541565reed } 963b640203cd5733aaf110277e28e22007c5b541565reed } 964b640203cd5733aaf110277e28e22007c5b541565reed } 965b640203cd5733aaf110277e28e22007c5b541565reed}; 966b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalTan(false); ) 967b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalTan(true); ) 968af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 969af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 970ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com 971e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgstatic void rand_conic(SkConic* conic, SkRandom& rand) { 972af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int i = 0; i < 3; ++i) { 973af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org conic->fPts[i].set(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100); 974af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 975af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org if (rand.nextUScalar1() > 0.5f) { 976af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org conic->fW = rand.nextUScalar1(); 977af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } else { 978af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org conic->fW = 1 + rand.nextUScalar1() * 4; 979af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 980af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org} 981af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 982f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConicBench : public Benchmark { 983af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 984410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench() { 985e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 986af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int i = 0; i < CONICS; ++i) { 987af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org rand_conic(&fConics[i], rand); 988af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 989644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 990644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 99136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 992644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 993af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 994815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 995af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 996af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org enum { 997af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org CONICS = 100 998af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org }; 999af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org SkConic fConics[CONICS]; 1000815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 1001af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 1002f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 10038d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org}; 10048d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 1005af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_ComputeError : public ConicBench { 1006af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 1007410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_ComputeError() {} 1008815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 1009af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 101036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 1011af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org return "conic-compute-error"; 1012af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1013815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 1014a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 1015af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org SkVector err; 10163361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 1017af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int j = 0; j < CONICS; ++j) { 1018af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org fConics[j].computeAsQuadError(&err); 1019af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1020af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1021af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1022815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 1023af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 1024af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org typedef ConicBench INHERITED; 1025af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 1026af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 1027af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_asQuadTol : public ConicBench { 1028af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 1029410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_asQuadTol() {} 1030815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 1031af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 103236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 1033af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org return "conic-asQuadTol"; 1034af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1035815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 1036a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 10373361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 1038af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int j = 0; j < CONICS; ++j) { 1039af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org fConics[j].asQuadTol(SK_ScalarHalf); 1040af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1041af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1042af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1043815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 1044af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 1045af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org typedef ConicBench INHERITED; 1046af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 1047af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 1048af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_quadPow2 : public ConicBench { 1049af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 1050410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_quadPow2() {} 1051af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 1052af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 105336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 1054af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org return "conic-quadPow2"; 1055af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1056815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 1057a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 10583361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 1059af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int j = 0; j < CONICS; ++j) { 1060af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org fConics[j].computeQuadPOW2(SK_ScalarHalf); 1061af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1062af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1063af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 1064815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 1065af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 1066af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org typedef ConicBench INHERITED; 1067af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 1068af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 10698d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 10708d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 10710d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reedclass TightBoundsBench : public Benchmark { 10720d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed SkPath fPath; 10730d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed SkString fName; 10748d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed SkRect (*fProc)(const SkPath&); 10750d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed 10760d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reedpublic: 10778d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed TightBoundsBench(SkRect (*proc)(const SkPath&), const char suffix[]) : fProc(proc) { 10780d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed fName.printf("tight_bounds_%s", suffix); 10799d5dcda7818abfb1443400b391d3b35f18ffd96aYuqian Li 10800d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed const int N = 100; 10810d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed SkRandom rand; 10820d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed for (int i = 0; i < N; ++i) { 10830d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed fPath.moveTo(rand.nextF()*100, rand.nextF()*100); 10840d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed fPath.lineTo(rand.nextF()*100, rand.nextF()*100); 10850d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed fPath.quadTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100); 10860d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed fPath.conicTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, 10870d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed rand.nextF()*10); 10880d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed fPath.cubicTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, 10890d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed rand.nextF()*100, rand.nextF()*100); 10900d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed } 10910d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed } 10920d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed 10930d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reedprotected: 10940d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed bool isSuitableFor(Backend backend) override { 10950d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed return backend == kNonRendering_Backend; 10960d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed } 10970d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed 10980d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed const char* onGetName() override { return fName.c_str(); } 10999d5dcda7818abfb1443400b391d3b35f18ffd96aYuqian Li 11000d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed void onDraw(int loops, SkCanvas* canvas) override { 11010d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed for (int i = 0; i < loops*100; ++i) { 11028d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed fProc(fPath); 11030d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed } 11040d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed } 11059d5dcda7818abfb1443400b391d3b35f18ffd96aYuqian Li 11060d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reedprivate: 11070d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed typedef Benchmark INHERITED; 11080d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed}; 11090d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed 11100d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed 11119bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBounds = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 1112fafe135349bd34961a12bfd8185733709cd0e45eHal Canaryconst SkSize ConservativelyContainsBench::kQueryMin = {SkIntToScalar(1), SkIntToScalar(1)}; 1113fafe135349bd34961a12bfd8185733709cd0e45eHal Canaryconst SkSize ConservativelyContainsBench::kQueryMax = {SkIntToScalar(40), SkIntToScalar(40)}; 11149bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBaseRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), SkIntToScalar(50), SkIntToScalar(50)); 11159bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkScalar ConservativelyContainsBench::kRRRadii[2] = {SkIntToScalar(5), SkIntToScalar(10)}; 11169bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 1117410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS00); ) 1118410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS01); ) 1119410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS10); ) 1120410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS11); ) 1121410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1122410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS00); ) 1123410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS01); ) 1124410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS10); ) 1125410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS11); ) 1126410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1127a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianDEF_BENCH( return new RotatedRectBench(FLAGS00, false, 45)); 1128a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianDEF_BENCH( return new RotatedRectBench(FLAGS10, false, 45)); 1129a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianDEF_BENCH( return new RotatedRectBench(FLAGS00, true, 45)); 1130a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqianDEF_BENCH( return new RotatedRectBench(FLAGS10, true, 45)); 1131a27f669f460e9186dbb3ebe3e9323acef95d41b8liyuqian 1132410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS00); ) 1133410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS01); ) 1134410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS10); ) 1135410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS11); ) 1136410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1137410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS00); ) 1138410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS01); ) 1139410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS10); ) 1140410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS11); ) 1141410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 11428eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian LiDEF_BENCH( return new NonAACirclePathBench(FLAGS00); ) 11438eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian LiDEF_BENCH( return new NonAACirclePathBench(FLAGS10); ) 11448eedbfc9ac3e14c5eac3167192cdbc5b4275adf8Yuqian Li 1145131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian LiDEF_BENCH( return new AAAConcavePathBench(FLAGS00); ) 1146131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian LiDEF_BENCH( return new AAAConcavePathBench(FLAGS10); ) 1147131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian LiDEF_BENCH( return new AAAConvexPathBench(FLAGS00); ) 1148131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian LiDEF_BENCH( return new AAAConvexPathBench(FLAGS10); ) 1149131c1fb96328ee00cb18f629eddfb665b36e9463Yuqian Li 1150410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS00); ) 1151410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS01); ) 1152410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1153410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS00); ) 1154410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS01); ) 1155410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS00); ) 1156410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS01); ) 1157410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1158410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCreateBench(); ) 1159410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCopyBench(); ) 1160410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(true); ) 1161410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(false); ) 1162410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathEqualityBench(); ) 1163410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1164410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAdd_AddType); ) 1165410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddTrans_AddType); ) 1166410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddMatrix_AddType); ) 1167410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReverseAdd_AddType); ) 1168410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReversePathTo_AddType); ) 1169410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1170410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS00); ) 1171410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS01); ) 1172410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(false); ) 1173410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(true); ) 1174410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRect_Type); ) 1175410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); ) 1176410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); ) 1177410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 11780d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed#include "SkPathOps.h" 11790d7dac8fb8c404cada8d46646a980772b9dc55d6Mike Reed#include "SkPathPriv.h" 11808d3196bdfcf478982bec9885d21e1d664ab9a72bMike ReedDEF_BENCH( return new TightBoundsBench([](const SkPath& path){ return path.computeTightBounds();}, 11818d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed "priv"); ) 11828d3196bdfcf478982bec9885d21e1d664ab9a72bMike ReedDEF_BENCH( return new TightBoundsBench([](const SkPath& path) { 11838d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed SkRect bounds; TightBounds(path, &bounds); return bounds; 11848d3196bdfcf478982bec9885d21e1d664ab9a72bMike Reed }, "pathops"); ) 1185b640203cd5733aaf110277e28e22007c5b541565reed 11863f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein// These seem to be optimized away, which is troublesome for timing. 11873f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein/* 1188410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_Chop5() ) 1189410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_ComputeError() ) 1190410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_asQuadTol() ) 1191410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_quadPow2() ) 11923f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein*/ 1193