1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 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" 136e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com#include "SkRandom.h" 14d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkShader.h" 15d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#include "SkString.h" 1630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com#include "SkTArray.h" 1730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 18d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comenum Flags { 19d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com kStroke_Flag = 1 << 0, 20d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com kBig_Flag = 1 << 1 21d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 22d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 23d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS00 Flags(0) 24d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS01 Flags(kStroke_Flag) 25d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS10 Flags(kBig_Flag) 26d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com#define FLAGS11 Flags(kStroke_Flag | kBig_Flag) 27d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 28f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass PathBench : public Benchmark { 29d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkPaint fPaint; 30d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkString fName; 31d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com Flags fFlags; 32d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 33410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathBench(Flags flags) : fFlags(flags) { 34d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style : 35d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkPaint::kFill_Style); 36d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fPaint.setStrokeWidth(SkIntToScalar(5)); 37d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fPaint.setStrokeJoin(SkPaint::kBevel_Join); 38d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 39d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 40d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com virtual void appendName(SkString*) = 0; 41d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com virtual void makePath(SkPath*) = 0; 426e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com virtual int complexity() { return 0; } 43d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 44d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprotected: 451647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual const char* onGetName() SK_OVERRIDE { 46d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fName.printf("path_%s_%s_", 47d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fFlags & kStroke_Flag ? "stroke" : "fill", 48d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com fFlags & kBig_Flag ? "big" : "small"); 49d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com this->appendName(&fName); 50d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com return fName.c_str(); 51d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 52d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 533361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 54d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkPaint paint(fPaint); 55d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com this->setupPaint(&paint); 56d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 57d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkPath path; 58d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com this->makePath(&path); 59d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com if (fFlags & kBig_Flag) { 60d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkMatrix m; 61d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com m.setScale(SkIntToScalar(10), SkIntToScalar(10)); 62d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path.transform(m); 63d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 64d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 653361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org int count = loops; 66d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com if (fFlags & kBig_Flag) { 67d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com count >>= 2; 68d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 696e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com count >>= (3 * complexity()); 70d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 71d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com for (int i = 0; i < count; i++) { 72d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com canvas->drawPath(path, paint); 73d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 74d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 75d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 76d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 77f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 78d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 79d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 80d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass TrianglePathBench : public PathBench { 81d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 82410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com TrianglePathBench(Flags flags) : INHERITED(flags) {} 83fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 841647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void appendName(SkString* name) SK_OVERRIDE { 85d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("triangle"); 86d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 871647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void makePath(SkPath* path) SK_OVERRIDE { 88d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com static const int gCoord[] = { 89d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 10, 10, 15, 5, 20, 20 90d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com }; 91d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); 92d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); 93d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); 94d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->close(); 95d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 96d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 97d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 98d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 99d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 100d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass RectPathBench : public PathBench { 101d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 102410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com RectPathBench(Flags flags) : INHERITED(flags) {} 103fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1041647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void appendName(SkString* name) SK_OVERRIDE { 105d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("rect"); 106d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 1071647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void makePath(SkPath* path) SK_OVERRIDE { 108d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkRect r = { 10, 10, 20, 20 }; 109d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->addRect(r); 110d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 111d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 112d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 113d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 114d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 115d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass OvalPathBench : public PathBench { 116d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 117410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com OvalPathBench(Flags flags) : INHERITED(flags) {} 118fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1191647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void appendName(SkString* name) SK_OVERRIDE { 120d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("oval"); 121d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 1221647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void makePath(SkPath* path) SK_OVERRIDE { 123e2bfd8b7b17c7a66728883d6fb5f7b7639c73b90jvanverth@google.com SkRect r = { 10, 10, 23, 20 }; 124d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->addOval(r); 125d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 126d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 127d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 128d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 129d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 1301647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comclass CirclePathBench: public PathBench { 1311647a1955fa44654102ae36df7af683bb8874175bsalomon@google.compublic: 132410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com CirclePathBench(Flags flags) : INHERITED(flags) {} 1331647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com 1341647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void appendName(SkString* name) SK_OVERRIDE { 1351647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com name->append("circle"); 1361647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com } 1371647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void makePath(SkPath* path) SK_OVERRIDE { 1381647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com path->addCircle(SkIntToScalar(20), SkIntToScalar(20), 1391647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com SkIntToScalar(10)); 1401647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com } 1411647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comprivate: 1421647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com typedef PathBench INHERITED; 1431647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com}; 1441647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com 145d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass SawToothPathBench : public PathBench { 146d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 147410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com SawToothPathBench(Flags flags) : INHERITED(flags) {} 148fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1491647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void appendName(SkString* name) SK_OVERRIDE { 150d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("sawtooth"); 151d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 152d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com virtual void makePath(SkPath* path) { 153d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkScalar x = SkIntToScalar(20); 154d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkScalar y = SkIntToScalar(20); 155d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com const SkScalar x0 = x; 156d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com const SkScalar dx = SK_Scalar1 * 5; 157d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com const SkScalar dy = SK_Scalar1 * 10; 158d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 159d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->moveTo(x, y); 160d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com for (int i = 0; i < 32; i++) { 161d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com x += dx; 162d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x, y - dy); 163d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com x += dx; 164d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x, y + dy); 165d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 166d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x, y + 2 * dy); 167d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x0, y + 2 * dy); 168d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->close(); 169d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 1701647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual int complexity() SK_OVERRIDE { return 1; } 1716e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comprivate: 1726e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com typedef PathBench INHERITED; 1736e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com}; 1746e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 1756e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comclass LongCurvedPathBench : public PathBench { 1766e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.compublic: 177410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com LongCurvedPathBench(Flags flags) : INHERITED(flags) {} 1786e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 1791647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void appendName(SkString* name) SK_OVERRIDE { 1806e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com name->append("long_curved"); 1816e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com } 1821647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void makePath(SkPath* path) SK_OVERRIDE { 183e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand (12); 1846e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com int i; 1856e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com for (i = 0; i < 100; i++) { 1866e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com path->quadTo(SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)), 1876e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)), 1886e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)), 1896e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480))); 1906e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com } 1916e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com path->close(); 1926e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com } 1931647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual int complexity() SK_OVERRIDE { return 2; } 194d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 195d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 196d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 197d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 198e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgclass LongLinePathBench : public PathBench { 199e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgpublic: 200410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com LongLinePathBench(Flags flags) : INHERITED(flags) {} 201e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org 2021647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void appendName(SkString* name) SK_OVERRIDE { 203e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org name->append("long_line"); 204e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org } 2051647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual void makePath(SkPath* path) SK_OVERRIDE { 206e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 207e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); 208e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org for (size_t i = 1; i < 100; i++) { 209e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); 210e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org } 211e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org } 2121647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com virtual int complexity() SK_OVERRIDE { return 2; } 213e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgprivate: 214e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org typedef PathBench INHERITED; 215e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org}; 2166e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 217f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RandomPathBench : public Benchmark { 21830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 219644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 220644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 22130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 22230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 22330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 22430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void createData(int minVerbs, 22530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com int maxVerbs, 22630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bool allowMoves = true, 22730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkRect* bounds = NULL) { 22830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkRect tempBounds; 22930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com if (NULL == bounds) { 23030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com tempBounds.setXYWH(0, 0, SK_Scalar1, SK_Scalar1); 23130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bounds = &tempBounds; 23230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 2336d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbCnts.reset(kNumVerbCnts); 2346d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com for (int i = 0; i < kNumVerbCnts; ++i) { 2356d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbCnts[i] = fRandom.nextRangeU(minVerbs, maxVerbs + 1); 2366d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com } 2376d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbs.reset(kNumVerbs); 2386d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com for (int i = 0; i < kNumVerbs; ++i) { 2396d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com do { 2406d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbs[i] = static_cast<SkPath::Verb>(fRandom.nextULessThan(SkPath::kDone_Verb)); 2416d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com } while (!allowMoves && SkPath::kMove_Verb == fVerbs[i]); 2426d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com } 2436d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fPoints.reset(kNumPoints); 2446d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com for (int i = 0; i < kNumPoints; ++i) { 2456d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fPoints[i].set(fRandom.nextRangeScalar(bounds->fLeft, bounds->fRight), 2466d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fRandom.nextRangeScalar(bounds->fTop, bounds->fBottom)); 24730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 24830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->restartMakingPaths(); 24930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 25030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 25130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void restartMakingPaths() { 25230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCurrPath = 0; 25330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCurrVerb = 0; 25430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCurrPoint = 0; 25530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 25630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 25730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void makePath(SkPath* path) { 2586d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int vCount = fVerbCnts[(fCurrPath++) & (kNumVerbCnts - 1)]; 25930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com for (int v = 0; v < vCount; ++v) { 2606d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int verb = fVerbs[(fCurrVerb++) & (kNumVerbs - 1)]; 2616d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com switch (verb) { 26230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kMove_Verb: 2636d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com path->moveTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]); 26430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 26530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kLine_Verb: 2666d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com path->lineTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]); 26730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 26830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kQuad_Verb: 269373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com path->quadTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 270373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fPoints[(fCurrPoint + 1) & (kNumPoints - 1)]); 271373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fCurrPoint += 2; 27230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 273277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 274277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com path->conicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 275277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com fPoints[(fCurrPoint + 1) & (kNumPoints - 1)], 276277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com SK_ScalarHalf); 277277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com fCurrPoint += 2; 278277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com break; 27930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kCubic_Verb: 280373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com path->cubicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 281373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fPoints[(fCurrPoint + 1) & (kNumPoints - 1)], 282373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fPoints[(fCurrPoint + 2) & (kNumPoints - 1)]); 283373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fCurrPoint += 3; 28430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 28530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kClose_Verb: 28630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com path->close(); 28730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 28830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com default: 28930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkDEBUGFAIL("Unexpected path verb"); 29030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 29130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 29230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 29330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 29430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 29530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void finishedMakingPaths() { 2966d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbCnts.reset(0); 2976d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbs.reset(0); 2986d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fPoints.reset(0); 29930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 30030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 30130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 3026d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com enum { 3036d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com // these should all be pow 2 304b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kNumVerbCnts = 1 << 5, 305b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kNumVerbs = 1 << 5, 306b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kNumPoints = 1 << 5, 3076d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com }; 3086d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com SkAutoTArray<int> fVerbCnts; 3096d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com SkAutoTArray<SkPath::Verb> fVerbs; 3106d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com SkAutoTArray<SkPoint> fPoints; 3116d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int fCurrPath; 3126d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int fCurrVerb; 3136d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int fCurrPoint; 314e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom fRandom; 315f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 31630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 31730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 31830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCreateBench : public RandomPathBench { 31930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 320410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathCreateBench() { 32130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 32230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 32330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 32430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com virtual const char* onGetName() SK_OVERRIDE { 32530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_create"; 32630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 32730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 32830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com virtual void onPreDraw() SK_OVERRIDE { 3296d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 33030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 33130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 3323361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 3333361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 3348f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org if (i % 1000 == 0) { 3358f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org fPath.reset(); // PathRef memory can grow without bound otherwise. 3368f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org } 3378f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org this->makePath(&fPath); 33830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 33930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->restartMakingPaths(); 34030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 34130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 34230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 3438f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org SkPath fPath; 34430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 34530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 34630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 34730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 34830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCopyBench : public RandomPathBench { 34930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 350410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathCopyBench() { 35130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 35230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 35330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 35430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com virtual const char* onGetName() SK_OVERRIDE { 35530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_copy"; 35630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 35730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com virtual void onPreDraw() SK_OVERRIDE { 3586d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 359b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths.reset(kPathCnt); 360b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fCopies.reset(kPathCnt); 361b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 36230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths[i]); 36330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 36430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->finishedMakingPaths(); 36530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 3663361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 3673361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 368b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 369b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fCopies[idx] = fPaths[idx]; 37030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 37130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 37230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 37330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 374b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 375b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 376b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 377b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 378b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths; 379b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fCopies; 38030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 38130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 38230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 38330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 38430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathTransformBench : public RandomPathBench { 38530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 386410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathTransformBench(bool inPlace) : fInPlace(inPlace) {} 38730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 38830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 38930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com virtual const char* onGetName() SK_OVERRIDE { 39030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return fInPlace ? "path_transform_in_place" : "path_transform_copy"; 39130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 39230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 39330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com virtual void onPreDraw() SK_OVERRIDE { 39430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1); 3956d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 396b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths.reset(kPathCnt); 397b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 39830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths[i]); 39930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 400b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com this->finishedMakingPaths(); 40130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com if (!fInPlace) { 402b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fTransformed.reset(kPathCnt); 40330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 40430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 40530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 4063361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 40730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com if (fInPlace) { 4083361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 409b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths[i & (kPathCnt - 1)].transform(fMatrix); 41030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 41130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } else { 4123361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 413b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 414b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths[idx].transform(fMatrix, &fTransformed[idx]); 41530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 41630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 41730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 41830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 41930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 420b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 421b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 422b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 423b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 424b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths; 425b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fTransformed; 426b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com 42730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkMatrix fMatrix; 42830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bool fInPlace; 42930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 43030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 43130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 43230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathEqualityBench : public RandomPathBench { 43330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 434410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathEqualityBench() { } 43530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 43630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 43730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com virtual const char* onGetName() SK_OVERRIDE { 43830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_equality_50%"; 43930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 44030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 44130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com virtual void onPreDraw() SK_OVERRIDE { 44230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fParity = 0; 4436d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 444b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths.reset(kPathCnt); 445b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fCopies.reset(kPathCnt); 446b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 44730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths[i]); 44830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCopies[i] = fPaths[i]; 44930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 45030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->finishedMakingPaths(); 45130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 45230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 4533361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 4543361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 455b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 456b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]); 45730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 45830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 45930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 46030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 46130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bool fParity; // attempt to keep compiler from optimizing out the == 462b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 463b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 464b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 465b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 466b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths; 467b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fCopies; 46830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 46930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 47030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 47130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass SkBench_AddPathTest : public RandomPathBench { 47230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 47330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com enum AddType { 47430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kAdd_AddType, 47530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kAddTrans_AddType, 47630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kAddMatrix_AddType, 47730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kReverseAdd_AddType, 47830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kReversePathTo_AddType, 47930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com }; 48030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 481410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com SkBench_AddPathTest(AddType type) : fType(type) { 48230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fMatrix.setRotate(60 * SK_Scalar1); 48330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 48430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 48530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 48630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com virtual const char* onGetName() SK_OVERRIDE { 48730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com switch (fType) { 48830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAdd_AddType: 48930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_add_path"; 49030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddTrans_AddType: 49130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_add_path_trans"; 49230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddMatrix_AddType: 49330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_add_path_matrix"; 49430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReverseAdd_AddType: 49530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_reverse_add_path"; 49630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReversePathTo_AddType: 49730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_reverse_path_to"; 49830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com default: 49930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkDEBUGFAIL("Bad add type"); 50030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return ""; 50130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 50230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 50330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 50430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com virtual void onPreDraw() SK_OVERRIDE { 505a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // reversePathTo assumes a single contour path. 506a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool allowMoves = kReversePathTo_AddType != fType; 5076d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100, allowMoves); 508b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths0.reset(kPathCnt); 509b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths1.reset(kPathCnt); 510b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 51130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths0[i]); 51230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths1[i]); 51330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 51430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->finishedMakingPaths(); 51530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 51630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 5173361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 51830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com switch (fType) { 51930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAdd_AddType: 5203361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 521b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 522b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 523b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.addPath(fPaths1[idx]); 52430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 52530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 52630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddTrans_AddType: 5273361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 528b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 529b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 530b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1); 53130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 53230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 53330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddMatrix_AddType: 5343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 535b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 536b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 537b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.addPath(fPaths1[idx], fMatrix); 53830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 53930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 54030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReverseAdd_AddType: 5413361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 542b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 543b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 544b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.reverseAddPath(fPaths1[idx]); 54530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 54630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 54730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReversePathTo_AddType: 5483361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 549b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 550b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 551b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.reversePathTo(fPaths1[idx]); 55230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 55330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 55430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 55530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 55630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 55730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 55830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com AddType fType; // or reverseAddPath 559b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 560b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 561b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 562b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 563b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths0; 564b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths1; 56530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkMatrix fMatrix; 56630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 56730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 5686e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 56917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 570f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass CirclesBench : public Benchmark { 57117bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected: 57217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkString fName; 57346d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com Flags fFlags; 57417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 57517bb458fe897411218d8c9781770948d4398b723robertphillips@google.compublic: 576410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com CirclesBench(Flags flags) : fFlags(flags) { 57746d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill"); 57817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 57917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 58017bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected: 58117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com virtual const char* onGetName() SK_OVERRIDE { 58217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com return fName.c_str(); 58317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 58417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 5853361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 58617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkPaint paint; 58717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 58817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com paint.setColor(SK_ColorBLACK); 58917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com paint.setAntiAlias(true); 59046d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com if (fFlags & kStroke_Flag) { 59146d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com paint.setStyle(SkPaint::kStroke_Style); 59246d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com } 59317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 594e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 59517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 59617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkRect r; 59717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 5983361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 59917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkScalar radius = rand.nextUScalar1() * 3; 60017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 60117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 60217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fRight = r.fLeft + 2 * radius; 60317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fBottom = r.fTop + 2 * radius; 60417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 60546d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com if (fFlags & kStroke_Flag) { 60646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com paint.setStrokeWidth(rand.nextUScalar1() * 5.0f); 60746d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com } 60846d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com 60917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkPath temp; 61017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 61117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com // mimic how Chrome does circles 61217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.arcTo(r, 0, 0, false); 61317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.addOval(r, SkPath::kCCW_Direction); 61417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.arcTo(r, 360, 0, true); 61517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.close(); 616fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 61717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com canvas->drawPath(temp, paint); 61817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 61917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 62017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 62117bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprivate: 622f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 62317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com}; 62417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 62546d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com 626158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Chrome creates its own round rects with each corner possibly being different. 627158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// In its "zero radius" incarnation it creates degenerate round rects. 6281e34ff7030c95a96c3cd5940de9b4dda4e1cef86skia.committer@gmail.com// Note: PathTest::test_arb_round_rect_is_convex and 629158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// test_arb_zero_rad_round_rect_is_rect perform almost exactly 630b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// the same test (but with no drawing) 631f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ArbRoundRectBench : public Benchmark { 632f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected: 633f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkString fName; 634f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 635f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.compublic: 636410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) { 637158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (zeroRad) { 638158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com fName.printf("zeroradroundrect"); 639158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } else { 640158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com fName.printf("arbroundrect"); 641158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 642f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 643f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 644f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected: 645f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com virtual const char* onGetName() SK_OVERRIDE { 646f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com return fName.c_str(); 647f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 648f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 649989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com static void add_corner_arc(SkPath* path, const SkRect& rect, 650989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com SkScalar xIn, SkScalar yIn, 651f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com int startAngle) 652f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com { 653f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 654f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkScalar rx = SkMinScalar(rect.width(), xIn); 655f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkScalar ry = SkMinScalar(rect.height(), yIn); 656f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 657f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkRect arcRect; 658f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.set(-rx, -ry, rx, ry); 659f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com switch (startAngle) { 660f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 0: 661f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom); 662f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 663f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 90: 664f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom); 665f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 666f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 180: 667f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop); 668f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 669f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 270: 670f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop); 671f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 672f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com default: 673f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 674f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 675f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 676f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false); 677f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 678f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 679989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com static void make_arb_round_rect(SkPath* path, const SkRect& r, 680f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkScalar xCorner, SkScalar yCorner) { 681f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com // we are lazy here and use the same x & y for each corner 682f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 270); 683f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 0); 684f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 90); 685f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 180); 686158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com path->close(); 687f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 688b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkASSERT(path->isConvex()); 689f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 690f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 6913361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 692e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 693f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkRect r; 694f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 6953361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 696f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkPaint paint; 697f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com paint.setColor(0xff000000 | rand.nextU()); 698f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com paint.setAntiAlias(true); 699f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 700158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkScalar size = rand.nextUScalar1() * 30; 701158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (size < SK_Scalar1) { 702b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com continue; 703b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 704f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 705f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 706158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fRight = r.fLeft + 2 * size; 707158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fBottom = r.fTop + 2 * size; 708f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 709f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkPath temp; 710f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 711158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (fZeroRad) { 712158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com make_arb_round_rect(&temp, r, 0, 0); 713158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 714158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkASSERT(temp.isRect(NULL)); 715158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } else { 716158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15); 717158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 718f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 719f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com canvas->drawPath(temp, paint); 720f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 721f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 722f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 723f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprivate: 724158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com bool fZeroRad; // should 0 radius rounds rects be tested? 725158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 726f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 727f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com}; 728f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 729f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConservativelyContainsBench : public Benchmark { 7309bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.compublic: 7319bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com enum Type { 7329bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kRect_Type, 7339bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kRoundRect_Type, 7349bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kOval_Type, 7359bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com }; 7369bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 737410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConservativelyContainsBench(Type type) { 7389bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fParity = false; 7399bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName = "conservatively_contains_"; 7409bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com switch (type) { 7419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com case kRect_Type: 7429bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName.append("rect"); 7439bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fPath.addRect(kBaseRect); 7449bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com break; 7459bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com case kRoundRect_Type: 7469bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName.append("round_rect"); 7479bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]); 7489bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com break; 7499bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com case kOval_Type: 7509bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName.append("oval"); 7519bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fPath.addOval(kBaseRect); 7529bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com break; 7539bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7559bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 756644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 757644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 758644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 759644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 7609bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comprivate: 7619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com virtual const char* onGetName() SK_OVERRIDE { 7629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com return fName.c_str(); 7639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7649bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 7653361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 7663361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 7679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com const SkRect& rect = fQueryRects[i % kQueryRectCnt]; 7689bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fParity = fParity != fPath.conservativelyContainsRect(rect); 7699bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7709bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7719bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 7729bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com virtual void onPreDraw() SK_OVERRIDE { 7739bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fQueryRects.setCount(kQueryRectCnt); 7749bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 775e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 7769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com for (int i = 0; i < kQueryRectCnt; ++i) { 7779bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkSize size; 7789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPoint xy; 7799bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth, kQueryMax.fWidth); 7809bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHeight); 7819bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fWidth); 7829bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fHeight); 7839bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 7849bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fHeight); 7859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7869bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7879bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 7889bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com enum { 7899bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kQueryRectCnt = 400, 7909bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com }; 7919bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkRect kBounds; // bounds for all random query rects 7929bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkSize kQueryMin; // minimum query rect size, should be <= kQueryMax 7939bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkSize kQueryMax; // max query rect size, should < kBounds 7949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkRect kBaseRect; // rect that is used to construct the path 7959bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkScalar kRRRadii[2]; // x and y radii for round rect 7969bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 7979bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkString fName; 7989bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPath fPath; 7999bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fParity; 8009bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkTDArray<SkRect> fQueryRects; 8019bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 802f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 8039bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com}; 8049bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 8058d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 8068d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 8078d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org#include "SkGeometry.h" 8088d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 809f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConicBench_Chop5 : public Benchmark { 81028552e12a019bf5ae55c9e8602bbe216562d7a3emike@reedtribe.org SkConic fRQ; 8118d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgpublic: 812410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_Chop5() { 8138d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[0].set(0, 0); 8148d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[1].set(100, 0); 8158d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[2].set(100, 100); 8168d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fW = SkScalarCos(SK_ScalarPI/4); 8178d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 818ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com 8198d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgprivate: 8208d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org virtual const char* onGetName() SK_OVERRIDE { 8218d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org return "ratquad-chop-0.5"; 8228d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 823ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com 8243361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 82528552e12a019bf5ae55c9e8602bbe216562d7a3emike@reedtribe.org SkConic dst[2]; 8263361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 8278d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.chopAt(0.5f, dst); 8288d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 8298d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 830ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com 831f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 8328d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org}; 8338d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 834f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConicBench_ChopHalf : public Benchmark { 83528552e12a019bf5ae55c9e8602bbe216562d7a3emike@reedtribe.org SkConic fRQ; 8368d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgpublic: 837410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_ChopHalf() { 8388d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[0].set(0, 0); 8398d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[1].set(100, 0); 8408d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[2].set(100, 100); 8418d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fW = SkScalarCos(SK_ScalarPI/4); 8428d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 843815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 8448d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgprivate: 8458d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org virtual const char* onGetName() SK_OVERRIDE { 8468d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org return "ratquad-chop-half"; 8478d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 848815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 8493361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 85028552e12a019bf5ae55c9e8602bbe216562d7a3emike@reedtribe.org SkConic dst[2]; 8513361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 8528d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.chop(dst); 8538d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 8548d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 855815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 856f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 857af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 858af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 859af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 860ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com 861e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgstatic void rand_conic(SkConic* conic, SkRandom& rand) { 862af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int i = 0; i < 3; ++i) { 863af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org conic->fPts[i].set(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100); 864af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 865af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org if (rand.nextUScalar1() > 0.5f) { 866af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org conic->fW = rand.nextUScalar1(); 867af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } else { 868af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org conic->fW = 1 + rand.nextUScalar1() * 4; 869af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 870af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org} 871af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 872f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConicBench : public Benchmark { 873af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 874410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench() { 875e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 876af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int i = 0; i < CONICS; ++i) { 877af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org rand_conic(&fConics[i], rand); 878af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 879644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 880644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 881644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org virtual bool isSuitableFor(Backend backend) SK_OVERRIDE { 882644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 883af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 884815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 885af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 886af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org enum { 887af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org CONICS = 100 888af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org }; 889af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org SkConic fConics[CONICS]; 890815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 891af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 892f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 8938d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org}; 8948d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 895af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_ComputeError : public ConicBench { 896af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 897410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_ComputeError() {} 898815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 899af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 900af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org virtual const char* onGetName() SK_OVERRIDE { 901af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org return "conic-compute-error"; 902af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 903815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 9043361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 905af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org SkVector err; 9063361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 907af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int j = 0; j < CONICS; ++j) { 908af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org fConics[j].computeAsQuadError(&err); 909af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 910af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 911af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 912815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 913af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 914af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org typedef ConicBench INHERITED; 915af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 916af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 917af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_asQuadTol : public ConicBench { 918af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 919410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_asQuadTol() {} 920815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 921af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 922af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org virtual const char* onGetName() SK_OVERRIDE { 923af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org return "conic-asQuadTol"; 924af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 925815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 9263361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 9273361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 928af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int j = 0; j < CONICS; ++j) { 929af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org fConics[j].asQuadTol(SK_ScalarHalf); 930af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 931af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 932af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 933815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 934af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 935af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org typedef ConicBench INHERITED; 936af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 937af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 938af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_quadPow2 : public ConicBench { 939af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 940410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_quadPow2() {} 941af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 942af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 943af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org virtual const char* onGetName() SK_OVERRIDE { 944af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org return "conic-quadPow2"; 945af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 946815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 9473361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 9483361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 949af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int j = 0; j < CONICS; ++j) { 950af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org fConics[j].computeQuadPOW2(SK_ScalarHalf); 951af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 952af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 953af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 954815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 955af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 956af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org typedef ConicBench INHERITED; 957af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 958af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 9598d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 9608d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 9619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBounds = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 9629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkSize ConservativelyContainsBench::kQueryMin = SkSize::Make(SkIntToScalar(1), SkIntToScalar(1)); 9639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkSize ConservativelyContainsBench::kQueryMax = SkSize::Make(SkIntToScalar(40), SkIntToScalar(40)); 9649bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBaseRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), SkIntToScalar(50), SkIntToScalar(50)); 9659bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkScalar ConservativelyContainsBench::kRRRadii[2] = {SkIntToScalar(5), SkIntToScalar(10)}; 9669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 967410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS00); ) 968410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS01); ) 969410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS10); ) 970410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS11); ) 971410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 972410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS00); ) 973410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS01); ) 974410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS10); ) 975410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS11); ) 976410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 977410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS00); ) 978410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS01); ) 979410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS10); ) 980410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS11); ) 981410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 982410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS00); ) 983410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS01); ) 984410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS10); ) 985410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS11); ) 986410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 987410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS00); ) 988410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS01); ) 989410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 990410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS00); ) 991410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS01); ) 992410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS00); ) 993410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS01); ) 994410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 995410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCreateBench(); ) 996410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCopyBench(); ) 997410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(true); ) 998410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(false); ) 999410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathEqualityBench(); ) 1000410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1001410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAdd_AddType); ) 1002410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddTrans_AddType); ) 1003410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddMatrix_AddType); ) 1004410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReverseAdd_AddType); ) 1005410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReversePathTo_AddType); ) 1006410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1007410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS00); ) 1008410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS01); ) 1009410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(false); ) 1010410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(true); ) 1011410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRect_Type); ) 1012410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); ) 1013410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); ) 1014410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1015410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_Chop5() ) 1016410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_ChopHalf() ) 1017410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_ComputeError() ) 1018410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_asQuadTol() ) 1019410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_quadPow2() ) 1020