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: 4536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() 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 5336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas* canvas) 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) { 601d24b8dfe9aac9cadaf3914b8574a4ff6e9bc19drobertphillips const SkMatrix m = SkMatrix::MakeScale(SkIntToScalar(10), SkIntToScalar(10)); 61d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path.transform(m); 62d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 63d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 643361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org int count = loops; 65d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com if (fFlags & kBig_Flag) { 66d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com count >>= 2; 67d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 686e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com count >>= (3 * complexity()); 69d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 70d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com for (int i = 0; i < count; i++) { 71d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com canvas->drawPath(path, paint); 72d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 73d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 74d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 75d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 76f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 77d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 78d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 79d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass TrianglePathBench : public PathBench { 80d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 81410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com TrianglePathBench(Flags flags) : INHERITED(flags) {} 82fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 8336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 84d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("triangle"); 85d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 8636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 87d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com static const int gCoord[] = { 88d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 10, 10, 15, 5, 20, 20 89d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com }; 90d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); 91d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); 92d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); 93d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->close(); 94d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 95d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 96d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 97d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 98d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 99d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass RectPathBench : public PathBench { 100d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 101410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com RectPathBench(Flags flags) : INHERITED(flags) {} 102fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 10336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 104d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("rect"); 105d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 10636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 107d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkRect r = { 10, 10, 20, 20 }; 108d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->addRect(r); 109d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 110d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 111d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 112d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 113d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 114d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass OvalPathBench : public PathBench { 115d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 116410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com OvalPathBench(Flags flags) : INHERITED(flags) {} 117fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 11836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 119d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("oval"); 120d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 12136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 122e2bfd8b7b17c7a66728883d6fb5f7b7639c73b90jvanverth@google.com SkRect r = { 10, 10, 23, 20 }; 123d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->addOval(r); 124d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 125d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 126d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 127d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 128d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 1291647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comclass CirclePathBench: public PathBench { 1301647a1955fa44654102ae36df7af683bb8874175bsalomon@google.compublic: 131410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com CirclePathBench(Flags flags) : INHERITED(flags) {} 1321647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com 13336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 1341647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com name->append("circle"); 1351647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com } 13636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 1371647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com path->addCircle(SkIntToScalar(20), SkIntToScalar(20), 1381647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com SkIntToScalar(10)); 1391647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com } 1401647a1955fa44654102ae36df7af683bb8874175bsalomon@google.comprivate: 1411647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com typedef PathBench INHERITED; 1421647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com}; 1431647a1955fa44654102ae36df7af683bb8874175bsalomon@google.com 144d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comclass SawToothPathBench : public PathBench { 145d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.compublic: 146410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com SawToothPathBench(Flags flags) : INHERITED(flags) {} 147fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 14836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 149d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com name->append("sawtooth"); 150d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 151d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com virtual void makePath(SkPath* path) { 152d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkScalar x = SkIntToScalar(20); 153d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com SkScalar y = SkIntToScalar(20); 154d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com const SkScalar x0 = x; 155d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com const SkScalar dx = SK_Scalar1 * 5; 156d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com const SkScalar dy = SK_Scalar1 * 10; 157d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 158d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->moveTo(x, y); 159d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com for (int i = 0; i < 32; i++) { 160d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com x += dx; 161d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x, y - dy); 162d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com x += dx; 163d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x, y + dy); 164d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 165d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x, y + 2 * dy); 166d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->lineTo(x0, y + 2 * dy); 167d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com path->close(); 168d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com } 16936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein int complexity() override { return 1; } 1706e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comprivate: 1716e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com typedef PathBench INHERITED; 1726e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com}; 1736e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 1746e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.comclass LongCurvedPathBench : public PathBench { 1756e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.compublic: 176410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com LongCurvedPathBench(Flags flags) : INHERITED(flags) {} 1776e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 17836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 1796e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com name->append("long_curved"); 1806e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com } 18136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 182e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand (12); 1836e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com int i; 1846e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com for (i = 0; i < 100; i++) { 1856e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com path->quadTo(SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)), 1866e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480)), 1876e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com SkScalarMul(rand.nextUScalar1(), SkIntToScalar(640)), 1886e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com SkScalarMul(rand.nextUScalar1(), SkIntToScalar(480))); 1896e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com } 1906e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com path->close(); 1916e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com } 19236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein int complexity() override { return 2; } 193d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.comprivate: 194d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com typedef PathBench INHERITED; 195d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com}; 196d34658a5f1b961e2852c2272ac8b47701a42e50dreed@google.com 197e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgclass LongLinePathBench : public PathBench { 198e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgpublic: 199410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com LongLinePathBench(Flags flags) : INHERITED(flags) {} 200e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org 20136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void appendName(SkString* name) override { 202e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org name->append("long_line"); 203e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org } 20436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void makePath(SkPath* path) override { 205e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 206e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); 207e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org for (size_t i = 1; i < 100; i++) { 208e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); 209e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org } 210e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org } 21136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein int complexity() override { return 2; } 212e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.orgprivate: 213e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org typedef PathBench INHERITED; 214e50f7361b4ee9fc8968e0e8a511379b3bf5f5123senorblanco@chromium.org}; 2156e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 216f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass RandomPathBench : public Benchmark { 21730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 21836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 219644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 22030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 22130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 22230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 22330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void createData(int minVerbs, 22430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com int maxVerbs, 22530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bool allowMoves = true, 22630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkRect* bounds = NULL) { 22730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkRect tempBounds; 22830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com if (NULL == bounds) { 22930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com tempBounds.setXYWH(0, 0, SK_Scalar1, SK_Scalar1); 23030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bounds = &tempBounds; 23130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 2326d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbCnts.reset(kNumVerbCnts); 2336d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com for (int i = 0; i < kNumVerbCnts; ++i) { 2346d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbCnts[i] = fRandom.nextRangeU(minVerbs, maxVerbs + 1); 2356d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com } 2366d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbs.reset(kNumVerbs); 2376d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com for (int i = 0; i < kNumVerbs; ++i) { 2386d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com do { 2396d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbs[i] = static_cast<SkPath::Verb>(fRandom.nextULessThan(SkPath::kDone_Verb)); 2406d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com } while (!allowMoves && SkPath::kMove_Verb == fVerbs[i]); 2416d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com } 2426d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fPoints.reset(kNumPoints); 2436d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com for (int i = 0; i < kNumPoints; ++i) { 2446d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fPoints[i].set(fRandom.nextRangeScalar(bounds->fLeft, bounds->fRight), 2456d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fRandom.nextRangeScalar(bounds->fTop, bounds->fBottom)); 24630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 24730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->restartMakingPaths(); 24830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 24930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 25030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void restartMakingPaths() { 25130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCurrPath = 0; 25230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCurrVerb = 0; 25330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCurrPoint = 0; 25430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 25530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 25630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void makePath(SkPath* path) { 2576d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int vCount = fVerbCnts[(fCurrPath++) & (kNumVerbCnts - 1)]; 25830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com for (int v = 0; v < vCount; ++v) { 2596d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int verb = fVerbs[(fCurrVerb++) & (kNumVerbs - 1)]; 2606d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com switch (verb) { 26130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kMove_Verb: 2626d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com path->moveTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]); 26330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 26430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kLine_Verb: 2656d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com path->lineTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]); 26630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 26730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kQuad_Verb: 268373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com path->quadTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 269373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fPoints[(fCurrPoint + 1) & (kNumPoints - 1)]); 270373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fCurrPoint += 2; 27130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 272277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com case SkPath::kConic_Verb: 273277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com path->conicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 274277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com fPoints[(fCurrPoint + 1) & (kNumPoints - 1)], 275277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com SK_ScalarHalf); 276277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com fCurrPoint += 2; 277277c3f87656c44e0a651ed0dd56efa16c0ab07b4reed@google.com break; 27830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kCubic_Verb: 279373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com path->cubicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 280373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fPoints[(fCurrPoint + 1) & (kNumPoints - 1)], 281373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fPoints[(fCurrPoint + 2) & (kNumPoints - 1)]); 282373ebc634573364c27b1ebd35bb537ef1285cba4bsalomon@google.com fCurrPoint += 3; 28330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 28430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case SkPath::kClose_Verb: 28530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com path->close(); 28630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 28730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com default: 28830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkDEBUGFAIL("Unexpected path verb"); 28930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 29030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 29130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 29230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 29330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 29430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com void finishedMakingPaths() { 2956d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbCnts.reset(0); 2966d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fVerbs.reset(0); 2976d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com fPoints.reset(0); 29830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 29930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 30030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 3016d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com enum { 3026d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com // these should all be pow 2 303b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kNumVerbCnts = 1 << 5, 304b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kNumVerbs = 1 << 5, 305b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kNumPoints = 1 << 5, 3066d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com }; 3076d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com SkAutoTArray<int> fVerbCnts; 3086d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com SkAutoTArray<SkPath::Verb> fVerbs; 3096d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com SkAutoTArray<SkPoint> fPoints; 3106d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int fCurrPath; 3116d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int fCurrVerb; 3126d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com int fCurrPoint; 313e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom fRandom; 314f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 31530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 31630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 31730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCreateBench : public RandomPathBench { 31830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 319410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathCreateBench() { 32030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 32130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 32230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 32336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 32430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_create"; 32530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 32630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 32736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onPreDraw() override { 3286d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 32930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 33030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 33136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 3323361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 3338f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org if (i % 1000 == 0) { 3348f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org fPath.reset(); // PathRef memory can grow without bound otherwise. 3358f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org } 3368f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org this->makePath(&fPath); 33730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 33830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->restartMakingPaths(); 33930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 34030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 34130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 3428f88117940ebb0a7f514194a4ad3384073c1f145commit-bot@chromium.org SkPath fPath; 34330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 34430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 34530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 34630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 34730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathCopyBench : public RandomPathBench { 34830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 349410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathCopyBench() { 35030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 35130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 35230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 35336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 35430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_copy"; 35530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 35636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onPreDraw() override { 3576d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 358b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths.reset(kPathCnt); 359b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fCopies.reset(kPathCnt); 360b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 36130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths[i]); 36230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 36330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->finishedMakingPaths(); 36430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 36536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 3663361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 367b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 368b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fCopies[idx] = fPaths[idx]; 36930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 37030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 37130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 37230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 373b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 374b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 375b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 376b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 377b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths; 378b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fCopies; 37930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 38030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 38130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 38230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 38330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathTransformBench : public RandomPathBench { 38430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 385410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathTransformBench(bool inPlace) : fInPlace(inPlace) {} 38630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 38730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 38836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 38930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return fInPlace ? "path_transform_in_place" : "path_transform_copy"; 39030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 39130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 39236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onPreDraw() override { 39330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1); 3946d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 395b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths.reset(kPathCnt); 396b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 39730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths[i]); 39830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 399b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com this->finishedMakingPaths(); 40030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com if (!fInPlace) { 401b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fTransformed.reset(kPathCnt); 40230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 40330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 40430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 40536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 40630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com if (fInPlace) { 4073361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 408b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths[i & (kPathCnt - 1)].transform(fMatrix); 40930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 41030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } else { 4113361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 412b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 413b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths[idx].transform(fMatrix, &fTransformed[idx]); 41430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 41530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 41630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 41730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 41830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 419b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 420b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 421b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 422b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 423b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths; 424b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fTransformed; 425b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com 42630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkMatrix fMatrix; 42730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bool fInPlace; 42830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 42930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 43030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 43130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass PathEqualityBench : public RandomPathBench { 43230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 433410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com PathEqualityBench() { } 43430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 43530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 43636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 43730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_equality_50%"; 43830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 43930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 44036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onPreDraw() override { 44130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fParity = 0; 4426d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100); 443b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths.reset(kPathCnt); 444b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fCopies.reset(kPathCnt); 445b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 44630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths[i]); 44730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fCopies[i] = fPaths[i]; 44830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 44930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->finishedMakingPaths(); 45030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 45130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 45236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 4533361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 454b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 455b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]); 45630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 45730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 45830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 45930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 46030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com bool fParity; // attempt to keep compiler from optimizing out the == 461b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 462b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 463b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 464b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 465b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths; 466b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fCopies; 46730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 46830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 46930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 47030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comclass SkBench_AddPathTest : public RandomPathBench { 47130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.compublic: 47230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com enum AddType { 47330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kAdd_AddType, 47430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kAddTrans_AddType, 47530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kAddMatrix_AddType, 47630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kReverseAdd_AddType, 47730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com kReversePathTo_AddType, 47830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com }; 47930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 480410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com SkBench_AddPathTest(AddType type) : fType(type) { 48130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com fMatrix.setRotate(60 * SK_Scalar1); 48230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 48330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 48430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprotected: 48536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 48630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com switch (fType) { 48730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAdd_AddType: 48830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_add_path"; 48930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddTrans_AddType: 49030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_add_path_trans"; 49130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddMatrix_AddType: 49230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_add_path_matrix"; 49330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReverseAdd_AddType: 49430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_reverse_add_path"; 49530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReversePathTo_AddType: 49630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return "path_reverse_path_to"; 49730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com default: 49830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkDEBUGFAIL("Bad add type"); 49930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com return ""; 50030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 50130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 50230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 50336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onPreDraw() override { 504a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org // reversePathTo assumes a single contour path. 505a1a097ee814d05a92487d85db8ad02e1d852fd6fcommit-bot@chromium.org bool allowMoves = kReversePathTo_AddType != fType; 5066d552ee5f56e76da6ba244df0f0df2234f2d8977bsalomon@google.com this->createData(10, 100, allowMoves); 507b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths0.reset(kPathCnt); 508b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com fPaths1.reset(kPathCnt); 509b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com for (int i = 0; i < kPathCnt; ++i) { 51030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths0[i]); 51130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->makePath(&fPaths1[i]); 51230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 51330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com this->finishedMakingPaths(); 51430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 51530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 51636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 51730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com switch (fType) { 51830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAdd_AddType: 5193361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 520b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 521b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 522b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.addPath(fPaths1[idx]); 52330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 52430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 52530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddTrans_AddType: 5263361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 527b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 528b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 529b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1); 53030e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 53130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 53230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kAddMatrix_AddType: 5333361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 534b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 535b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 536b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.addPath(fPaths1[idx], fMatrix); 53730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 53830e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 53930e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReverseAdd_AddType: 5403361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 541b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 542b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 543b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.reverseAddPath(fPaths1[idx]); 54430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 54530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 54630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com case kReversePathTo_AddType: 5473361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 548b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com int idx = i & (kPathCnt - 1); 549b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkPath result = fPaths0[idx]; 550b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com result.reversePathTo(fPaths1[idx]); 55130e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 55230e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com break; 55330e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 55430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com } 55530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com 55630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.comprivate: 55730e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com AddType fType; // or reverseAddPath 558b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com enum { 559b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com // must be a pow 2 560b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com kPathCnt = 1 << 5, 561b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com }; 562b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths0; 563b5e4703b8661a54d6f0bc1a81307dac936644046bsalomon@google.com SkAutoTArray<SkPath> fPaths1; 56430e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com SkMatrix fMatrix; 56530e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com typedef RandomPathBench INHERITED; 56630e6d2c2054c15f1cb6c0637bee6756261291751bsalomon@google.com}; 5676e8d335b458ac2416bc5d09bab40e503384d102dtomhudson@google.com 56817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 569f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass CirclesBench : public Benchmark { 57017bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected: 57117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkString fName; 57246d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com Flags fFlags; 57317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 57417bb458fe897411218d8c9781770948d4398b723robertphillips@google.compublic: 575410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com CirclesBench(Flags flags) : fFlags(flags) { 57646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill"); 57717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 57817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 57917bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprotected: 58036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 58117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com return fName.c_str(); 58217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 58317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 58436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas* canvas) override { 58517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkPaint paint; 58617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 58717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com paint.setColor(SK_ColorBLACK); 58817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com paint.setAntiAlias(true); 58946d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com if (fFlags & kStroke_Flag) { 59046d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com paint.setStyle(SkPaint::kStroke_Style); 59146d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com } 59217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 593e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 59417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 59517bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkRect r; 59617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 5973361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 59817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkScalar radius = rand.nextUScalar1() * 3; 59917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 60017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 60117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fRight = r.fLeft + 2 * radius; 60217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com r.fBottom = r.fTop + 2 * radius; 60317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 60446d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com if (fFlags & kStroke_Flag) { 60546d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com paint.setStrokeWidth(rand.nextUScalar1() * 5.0f); 60646d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com } 60746d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com 60817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com SkPath temp; 60917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 61017bb458fe897411218d8c9781770948d4398b723robertphillips@google.com // mimic how Chrome does circles 61117bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.arcTo(r, 0, 0, false); 61217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.addOval(r, SkPath::kCCW_Direction); 61317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.arcTo(r, 360, 0, true); 61417bb458fe897411218d8c9781770948d4398b723robertphillips@google.com temp.close(); 615fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 61617bb458fe897411218d8c9781770948d4398b723robertphillips@google.com canvas->drawPath(temp, paint); 61717bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 61817bb458fe897411218d8c9781770948d4398b723robertphillips@google.com } 61917bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 62017bb458fe897411218d8c9781770948d4398b723robertphillips@google.comprivate: 621f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 62217bb458fe897411218d8c9781770948d4398b723robertphillips@google.com}; 62317bb458fe897411218d8c9781770948d4398b723robertphillips@google.com 62446d3d39e65e0b3ea2ad7c91c176ccafb4df0fa24jvanverth@google.com 625158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// Chrome creates its own round rects with each corner possibly being different. 626158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// In its "zero radius" incarnation it creates degenerate round rects. 6271e34ff7030c95a96c3cd5940de9b4dda4e1cef86skia.committer@gmail.com// Note: PathTest::test_arb_round_rect_is_convex and 628158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com// test_arb_zero_rad_round_rect_is_rect perform almost exactly 629b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com// the same test (but with no drawing) 630f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ArbRoundRectBench : public Benchmark { 631f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected: 632f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkString fName; 633f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 634f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.compublic: 635410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) { 636158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (zeroRad) { 637158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com fName.printf("zeroradroundrect"); 638158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } else { 639158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com fName.printf("arbroundrect"); 640158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 641f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 642f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 643f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprotected: 64436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 645f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com return fName.c_str(); 646f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 647f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 648989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com static void add_corner_arc(SkPath* path, const SkRect& rect, 649989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com SkScalar xIn, SkScalar yIn, 650f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com int startAngle) 651f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com { 652f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 653f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkScalar rx = SkMinScalar(rect.width(), xIn); 654f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkScalar ry = SkMinScalar(rect.height(), yIn); 655f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 656f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkRect arcRect; 657f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.set(-rx, -ry, rx, ry); 658f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com switch (startAngle) { 659f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 0: 660f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom); 661f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 662f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 90: 663f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom); 664f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 665f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 180: 666f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop); 667f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 668f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com case 270: 669f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop); 670f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 671f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com default: 672f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com break; 673f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 674f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 675f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false); 676f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 677f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 678989a95ea77230e8347da18876e1bd5f39a78ebb5skia.committer@gmail.com static void make_arb_round_rect(SkPath* path, const SkRect& r, 679f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkScalar xCorner, SkScalar yCorner) { 680f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com // we are lazy here and use the same x & y for each corner 681f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 270); 682f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 0); 683f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 90); 684f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com add_corner_arc(path, r, xCorner, yCorner, 180); 685158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com path->close(); 686f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 687b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com SkASSERT(path->isConvex()); 688f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 689f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 69036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas* canvas) override { 691e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 692f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkRect r; 693f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 6943361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 695f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkPaint paint; 696f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com paint.setColor(0xff000000 | rand.nextU()); 697f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com paint.setAntiAlias(true); 698f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 699158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkScalar size = rand.nextUScalar1() * 30; 700158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (size < SK_Scalar1) { 701b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com continue; 702b95eaa8d0842a8bba97f0bc7e19cfd9172d09722robertphillips@google.com } 703f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com r.fLeft = rand.nextUScalar1() * 300; 704f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com r.fTop = rand.nextUScalar1() * 300; 705158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fRight = r.fLeft + 2 * size; 706158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com r.fBottom = r.fTop + 2 * size; 707f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 708f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com SkPath temp; 709f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 710158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com if (fZeroRad) { 711158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com make_arb_round_rect(&temp, r, 0, 0); 712158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 713158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com SkASSERT(temp.isRect(NULL)); 714158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } else { 715158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15); 716158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com } 717f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 718f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com canvas->drawPath(temp, paint); 719f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 720f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com } 721f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 722f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.comprivate: 723158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com bool fZeroRad; // should 0 radius rounds rects be tested? 724158618ec62c36b8261e195f04567e09ed76f6534robertphillips@google.com 725f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 726f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com}; 727f6fc3fcadd343fad8d89d34749146d7e3c43d95brobertphillips@google.com 728f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConservativelyContainsBench : public Benchmark { 7299bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.compublic: 7309bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com enum Type { 7319bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kRect_Type, 7329bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kRoundRect_Type, 7339bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kOval_Type, 7349bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com }; 7359bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 736410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConservativelyContainsBench(Type type) { 7379bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fParity = false; 7389bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName = "conservatively_contains_"; 7399bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com switch (type) { 7409bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com case kRect_Type: 7419bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName.append("rect"); 7429bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fPath.addRect(kBaseRect); 7439bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com break; 7449bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com case kRoundRect_Type: 7459bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName.append("round_rect"); 7469bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]); 7479bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com break; 7489bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com case kOval_Type: 7499bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fName.append("oval"); 7509bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fPath.addOval(kBaseRect); 7519bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com break; 7529bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7539bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7549bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 75536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 756644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 757644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 758644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 7599bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comprivate: 76036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 7619bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com return fName.c_str(); 7629bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7639bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 76436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 7653361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 7669bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com const SkRect& rect = fQueryRects[i % kQueryRectCnt]; 7679bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fParity = fParity != fPath.conservativelyContainsRect(rect); 7689bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7699bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7709bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 77136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onPreDraw() override { 7729bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fQueryRects.setCount(kQueryRectCnt); 7739bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 774e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 7759bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com for (int i = 0; i < kQueryRectCnt; ++i) { 7769bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkSize size; 7779bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPoint xy; 7789bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth, kQueryMax.fWidth); 7799bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHeight); 7809bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fWidth); 7819bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fHeight); 7829bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 7839bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fHeight); 7849bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7859bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com } 7869bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 7879bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com enum { 7889bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com kQueryRectCnt = 400, 7899bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com }; 7909bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkRect kBounds; // bounds for all random query rects 7919bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkSize kQueryMin; // minimum query rect size, should be <= kQueryMax 7929bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkSize kQueryMax; // max query rect size, should < kBounds 7939bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkRect kBaseRect; // rect that is used to construct the path 7949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com static const SkScalar kRRRadii[2]; // x and y radii for round rect 7959bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 7969bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkString fName; 7979bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkPath fPath; 7989bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com bool fParity; 7999bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com SkTDArray<SkRect> fQueryRects; 8009bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 801f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 8029bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com}; 8039bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 8048d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 8058d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 8068d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org#include "SkGeometry.h" 8078d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 80855011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_Chop : public Benchmark { 809b640203cd5733aaf110277e28e22007c5b541565reedprotected: 810b640203cd5733aaf110277e28e22007c5b541565reed SkConic fRQ, fDst[2]; 811b640203cd5733aaf110277e28e22007c5b541565reed SkString fName; 8128d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.orgpublic: 81355011038816a3fc7f0c0a39d482fb85347cc2e78reed ConicBench_Chop() : fName("conic-chop") { 8148d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[0].set(0, 0); 8158d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[1].set(100, 0); 8168d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fPts[2].set(100, 100); 8178d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org fRQ.fW = SkScalarCos(SK_ScalarPI/4); 8188d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 819815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 82036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 821b640203cd5733aaf110277e28e22007c5b541565reed return backend == kNonRendering_Backend; 8228d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 823815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 824b640203cd5733aaf110277e28e22007c5b541565reedprivate: 82536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { return fName.c_str(); } 826b640203cd5733aaf110277e28e22007c5b541565reed 82736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 82855011038816a3fc7f0c0a39d482fb85347cc2e78reed for (int i = 0; i < loops; ++i) { 82955011038816a3fc7f0c0a39d482fb85347cc2e78reed fRQ.chop(fDst); 8308d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 8318d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org } 832815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 833f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 834af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 83555011038816a3fc7f0c0a39d482fb85347cc2e78reedDEF_BENCH( return new ConicBench_Chop; ) 836b640203cd5733aaf110277e28e22007c5b541565reed 83755011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_EvalPos : public ConicBench_Chop { 83855011038816a3fc7f0c0a39d482fb85347cc2e78reed const bool fUseV2; 839b640203cd5733aaf110277e28e22007c5b541565reedpublic: 84055011038816a3fc7f0c0a39d482fb85347cc2e78reed ConicBench_EvalPos(bool useV2) : fUseV2(useV2) { 841b640203cd5733aaf110277e28e22007c5b541565reed fName.printf("conic-eval-pos%d", useV2); 842b640203cd5733aaf110277e28e22007c5b541565reed } 84336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 844b640203cd5733aaf110277e28e22007c5b541565reed if (fUseV2) { 845b640203cd5733aaf110277e28e22007c5b541565reed for (int i = 0; i < loops; ++i) { 846b640203cd5733aaf110277e28e22007c5b541565reed for (int j = 0; j < 1000; ++j) { 847b640203cd5733aaf110277e28e22007c5b541565reed fDst[0].fPts[0] = fRQ.evalAt(0.4f); 848b640203cd5733aaf110277e28e22007c5b541565reed } 849b640203cd5733aaf110277e28e22007c5b541565reed } 850b640203cd5733aaf110277e28e22007c5b541565reed } else { 851b640203cd5733aaf110277e28e22007c5b541565reed for (int i = 0; i < loops; ++i) { 852b640203cd5733aaf110277e28e22007c5b541565reed for (int j = 0; j < 1000; ++j) { 853b640203cd5733aaf110277e28e22007c5b541565reed fRQ.evalAt(0.4f, &fDst[0].fPts[0], NULL); 854b640203cd5733aaf110277e28e22007c5b541565reed } 855b640203cd5733aaf110277e28e22007c5b541565reed } 856b640203cd5733aaf110277e28e22007c5b541565reed } 857b640203cd5733aaf110277e28e22007c5b541565reed } 858b640203cd5733aaf110277e28e22007c5b541565reed}; 859b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalPos(false); ) 860b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalPos(true); ) 861b640203cd5733aaf110277e28e22007c5b541565reed 86255011038816a3fc7f0c0a39d482fb85347cc2e78reedclass ConicBench_EvalTan : public ConicBench_Chop { 86355011038816a3fc7f0c0a39d482fb85347cc2e78reed const bool fUseV2; 864b640203cd5733aaf110277e28e22007c5b541565reedpublic: 86555011038816a3fc7f0c0a39d482fb85347cc2e78reed ConicBench_EvalTan(bool useV2) : fUseV2(useV2) { 866b640203cd5733aaf110277e28e22007c5b541565reed fName.printf("conic-eval-tan%d", useV2); 867b640203cd5733aaf110277e28e22007c5b541565reed } 86836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 869b640203cd5733aaf110277e28e22007c5b541565reed if (fUseV2) { 870b640203cd5733aaf110277e28e22007c5b541565reed for (int i = 0; i < loops; ++i) { 871b640203cd5733aaf110277e28e22007c5b541565reed for (int j = 0; j < 1000; ++j) { 872b640203cd5733aaf110277e28e22007c5b541565reed fDst[0].fPts[0] = fRQ.evalTangentAt(0.4f); 873b640203cd5733aaf110277e28e22007c5b541565reed } 874b640203cd5733aaf110277e28e22007c5b541565reed } 875b640203cd5733aaf110277e28e22007c5b541565reed } else { 876b640203cd5733aaf110277e28e22007c5b541565reed for (int i = 0; i < loops; ++i) { 877b640203cd5733aaf110277e28e22007c5b541565reed for (int j = 0; j < 1000; ++j) { 878b640203cd5733aaf110277e28e22007c5b541565reed fRQ.evalAt(0.4f, NULL, &fDst[0].fPts[0]); 879b640203cd5733aaf110277e28e22007c5b541565reed } 880b640203cd5733aaf110277e28e22007c5b541565reed } 881b640203cd5733aaf110277e28e22007c5b541565reed } 882b640203cd5733aaf110277e28e22007c5b541565reed } 883b640203cd5733aaf110277e28e22007c5b541565reed}; 884b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalTan(false); ) 885b640203cd5733aaf110277e28e22007c5b541565reedDEF_BENCH( return new ConicBench_EvalTan(true); ) 886af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 887af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 888ab38e560e922b554ea9fa98adc4f79aee7eca8baskia.committer@gmail.com 889e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.orgstatic void rand_conic(SkConic* conic, SkRandom& rand) { 890af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int i = 0; i < 3; ++i) { 891af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org conic->fPts[i].set(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100); 892af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 893af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org if (rand.nextUScalar1() > 0.5f) { 894af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org conic->fW = rand.nextUScalar1(); 895af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } else { 896af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org conic->fW = 1 + rand.nextUScalar1() * 4; 897af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 898af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org} 899af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 900f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConicBench : public Benchmark { 901af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 902410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench() { 903e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 904af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int i = 0; i < CONICS; ++i) { 905af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org rand_conic(&fConics[i], rand); 906af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 907644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org } 908644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org 90936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 910644629c1c7913a43ced172b98d56e0f471bc348bcommit-bot@chromium.org return backend == kNonRendering_Backend; 911af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 912815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 913af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 914af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org enum { 915af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org CONICS = 100 916af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org }; 917af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org SkConic fConics[CONICS]; 918815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 919af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 920f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 9218d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org}; 9228d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 923af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_ComputeError : public ConicBench { 924af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 925410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_ComputeError() {} 926815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 927af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 92836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 929af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org return "conic-compute-error"; 930af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 931815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 93236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 933af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org SkVector err; 9343361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 935af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int j = 0; j < CONICS; ++j) { 936af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org fConics[j].computeAsQuadError(&err); 937af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 938af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 939af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 940815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 941af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 942af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org typedef ConicBench INHERITED; 943af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 944af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 945af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_asQuadTol : public ConicBench { 946af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 947410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_asQuadTol() {} 948815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 949af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 95036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 951af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org return "conic-asQuadTol"; 952af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 953815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 95436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 9553361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 956af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int j = 0; j < CONICS; ++j) { 957af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org fConics[j].asQuadTol(SK_ScalarHalf); 958af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 959af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 960af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 961815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 962af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 963af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org typedef ConicBench INHERITED; 964af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 965af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 966af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgclass ConicBench_quadPow2 : public ConicBench { 967af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgpublic: 968410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConicBench_quadPow2() {} 969af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 970af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprotected: 97136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 972af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org return "conic-quadPow2"; 973af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 974815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 97536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(const int loops, SkCanvas*) override { 9763361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; ++i) { 977af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org for (int j = 0; j < CONICS; ++j) { 978af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org fConics[j].computeQuadPOW2(SK_ScalarHalf); 979af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 980af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 981af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org } 982815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com 983af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.orgprivate: 984af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org typedef ConicBench INHERITED; 985af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org}; 986af5c506cd6b63f43a0ebee2fb171ea55ba98e09fmike@reedtribe.org 9878d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org/////////////////////////////////////////////////////////////////////////////// 9888d551011966a1bc14a654dbde704f343c0e222b6mike@reedtribe.org 9899bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBounds = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 9909bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkSize ConservativelyContainsBench::kQueryMin = SkSize::Make(SkIntToScalar(1), SkIntToScalar(1)); 9919bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkSize ConservativelyContainsBench::kQueryMax = SkSize::Make(SkIntToScalar(40), SkIntToScalar(40)); 9929bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkRect ConservativelyContainsBench::kBaseRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), SkIntToScalar(50), SkIntToScalar(50)); 9939bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.comconst SkScalar ConservativelyContainsBench::kRRRadii[2] = {SkIntToScalar(5), SkIntToScalar(10)}; 9949bee33afbeca29f531c8455513b925f6e93da633bsalomon@google.com 995410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS00); ) 996410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS01); ) 997410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS10); ) 998410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new TrianglePathBench(FLAGS11); ) 999410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1000410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS00); ) 1001410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS01); ) 1002410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS10); ) 1003410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new RectPathBench(FLAGS11); ) 1004410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1005410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS00); ) 1006410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS01); ) 1007410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS10); ) 1008410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new OvalPathBench(FLAGS11); ) 1009410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1010410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS00); ) 1011410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS01); ) 1012410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS10); ) 1013410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclePathBench(FLAGS11); ) 1014410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1015410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS00); ) 1016410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SawToothPathBench(FLAGS01); ) 1017410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1018410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS00); ) 1019410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongCurvedPathBench(FLAGS01); ) 1020410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS00); ) 1021410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new LongLinePathBench(FLAGS01); ) 1022410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1023410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCreateBench(); ) 1024410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathCopyBench(); ) 1025410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(true); ) 1026410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathTransformBench(false); ) 1027410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new PathEqualityBench(); ) 1028410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1029410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAdd_AddType); ) 1030410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddTrans_AddType); ) 1031410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddMatrix_AddType); ) 1032410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReverseAdd_AddType); ) 1033410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReversePathTo_AddType); ) 1034410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1035410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS00); ) 1036410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new CirclesBench(FLAGS01); ) 1037410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(false); ) 1038410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ArbRoundRectBench(true); ) 1039410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRect_Type); ) 1040410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); ) 1041410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); ) 1042410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com 1043b640203cd5733aaf110277e28e22007c5b541565reed 10443f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein// These seem to be optimized away, which is troublesome for timing. 10453f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein/* 1046410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_Chop5() ) 1047410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_ComputeError() ) 1048410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_asQuadTol() ) 1049410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH( return new ConicBench_quadPow2() ) 10503f376a55002c205aacacc4cb16ed745e3afbad31Mike Klein*/ 1051