1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Benchmark.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShader.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTArray.h" 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotenum Flags { 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kStroke_Flag = 1 << 0, 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kBig_Flag = 1 << 1 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define FLAGS00 Flags(0) 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define FLAGS01 Flags(kStroke_Flag) 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define FLAGS10 Flags(kBig_Flag) 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define FLAGS11 Flags(kStroke_Flag | kBig_Flag) 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathBench : public Benchmark { 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint fPaint; 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot Flags fFlags; 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot PathBench(Flags flags) : fFlags(flags) { 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaint.setStyle(flags & kStroke_Flag ? SkPaint::kStroke_Style : 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint::kFill_Style); 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaint.setStrokeWidth(SkIntToScalar(5)); 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaint.setStrokeJoin(SkPaint::kBevel_Join); 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void appendName(SkString*) = 0; 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void makePath(SkPath*) = 0; 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual int complexity() { return 0; } 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("path_%s_%s_", 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFlags & kStroke_Flag ? "stroke" : "fill", 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fFlags & kBig_Flag ? "big" : "small"); 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->appendName(&fName); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint(fPaint); 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setupPaint(&paint); 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath path; 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->makePath(&path); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fFlags & kBig_Flag) { 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkMatrix m = SkMatrix::MakeScale(SkIntToScalar(10), SkIntToScalar(10)); 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.transform(m); 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; i++) { 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(path, paint); 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass TrianglePathBench : public PathBench { 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot TrianglePathBench(Flags flags) : INHERITED(flags) {} 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append("triangle"); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) override { 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const int gCoord[] = { 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 10, 10, 15, 5, 20, 20 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->close(); 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef PathBench INHERITED; 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass RectPathBench : public PathBench { 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot RectPathBench(Flags flags) : INHERITED(flags) {} 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append("rect"); 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) override { 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r = { 10, 10, 20, 20 }; 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->addRect(r); 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef PathBench INHERITED; 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass RotatedRectBench : public PathBench { 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot RotatedRectBench(Flags flags, bool aa, int degrees) : INHERITED(flags) { 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fAA = aa; 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDegrees = degrees; 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString suffix; 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot suffix.printf("rotated_rect_%s_%d", fAA ? "aa" : "noaa", fDegrees); 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append(suffix); 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) override { 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r = { 10, 10, 20, 20 }; 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->addRect(r); 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMatrix rotateMatrix; 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rotateMatrix.setRotate((SkScalar)fDegrees); 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->transform(rotateMatrix); 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void setupPaint(SkPaint* paint) override { 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot PathBench::setupPaint(paint); 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint->setAntiAlias(fAA); 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef PathBench INHERITED; 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fDegrees; 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fAA; 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass OvalPathBench : public PathBench { 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot OvalPathBench(Flags flags) : INHERITED(flags) {} 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append("oval"); 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) override { 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r = { 10, 10, 23, 20 }; 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->addOval(r); 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef PathBench INHERITED; 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass CirclePathBench: public PathBench { 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot CirclePathBench(Flags flags) : INHERITED(flags) {} 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append("circle"); 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) override { 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->addCircle(SkIntToScalar(20), SkIntToScalar(20), 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(10)); 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef PathBench INHERITED; 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass NonAACirclePathBench: public CirclePathBench { 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot NonAACirclePathBench(Flags flags) : INHERITED(flags) {} 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append("nonaacircle"); 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setupPaint(SkPaint* paint) override { 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot CirclePathBench::setupPaint(paint); 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint->setAntiAlias(false); 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef CirclePathBench INHERITED; 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Test max speedup of Analytic AA for concave paths 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass AAAConcavePathBench : public PathBench { 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot AAAConcavePathBench(Flags flags) : INHERITED(flags) {} 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append("concave_aaa"); 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) override { 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->moveTo(10, 10); 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(15, 10); 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(15, 5); 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(40, 40); 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->close(); 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef PathBench INHERITED; 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Test max speedup of Analytic AA for convex paths 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass AAAConvexPathBench : public PathBench { 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot AAAConvexPathBench(Flags flags) : INHERITED(flags) {} 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append("convex_aaa"); 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) override { 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->moveTo(10, 10); 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(15, 10); 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(40, 50); 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->close(); 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef PathBench INHERITED; 226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SawToothPathBench : public PathBench { 229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SawToothPathBench(Flags flags) : INHERITED(flags) {} 231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append("sawtooth"); 234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) override { 236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar x = SkIntToScalar(20); 237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar y = SkIntToScalar(20); 238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar x0 = x; 239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar dx = SK_Scalar1 * 5; 240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar dy = SK_Scalar1 * 10; 241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->moveTo(x, y); 243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < 32; i++) { 244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot x += dx; 245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(x, y - dy); 246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot x += dx; 247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(x, y + dy); 248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(x, y + 2 * dy); 250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(x0, y + 2 * dy); 251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->close(); 252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int complexity() override { return 1; } 254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef PathBench INHERITED; 256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass LongCurvedPathBench : public PathBench { 259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot LongCurvedPathBench(Flags flags) : INHERITED(flags) {} 261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append("long_curved"); 264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) override { 266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand (12); 267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int i; 268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (i = 0; i < 100; i++) { 269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->quadTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480, 270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); 271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->close(); 273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int complexity() override { return 2; } 275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef PathBench INHERITED; 277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass LongLinePathBench : public PathBench { 280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot LongLinePathBench(Flags flags) : INHERITED(flags) {} 282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void appendName(SkString* name) override { 284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot name->append("long_line"); 285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) override { 287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->moveTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); 289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t i = 1; i < 100; i++) { 290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(rand.nextUScalar1() * 640, rand.nextUScalar1() * 480); 291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int complexity() override { return 2; } 294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef PathBench INHERITED; 296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass RandomPathBench : public Benchmark { 299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isSuitableFor(Backend backend) override { 301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return backend == kNonRendering_Backend; 302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void createData(int minVerbs, 306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int maxVerbs, 307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool allowMoves = true, 308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect* bounds = nullptr) { 309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect tempBounds; 310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (nullptr == bounds) { 311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot tempBounds.setXYWH(0, 0, SK_Scalar1, SK_Scalar1); 312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bounds = &tempBounds; 313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fVerbCnts.reset(kNumVerbCnts); 315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < kNumVerbCnts; ++i) { 316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fVerbCnts[i] = fRandom.nextRangeU(minVerbs, maxVerbs + 1); 317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fVerbs.reset(kNumVerbs); 319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < kNumVerbs; ++i) { 320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot do { 321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fVerbs[i] = static_cast<SkPath::Verb>(fRandom.nextULessThan(SkPath::kDone_Verb)); 322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } while (!allowMoves && SkPath::kMove_Verb == fVerbs[i]); 323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPoints.reset(kNumPoints); 325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < kNumPoints; ++i) { 326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPoints[i].set(fRandom.nextRangeScalar(bounds->fLeft, bounds->fRight), 327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRandom.nextRangeScalar(bounds->fTop, bounds->fBottom)); 328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->restartMakingPaths(); 330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void restartMakingPaths() { 333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCurrPath = 0; 334fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCurrVerb = 0; 335fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCurrPoint = 0; 336fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 337fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 338fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePath(SkPath* path) { 339fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int vCount = fVerbCnts[(fCurrPath++) & (kNumVerbCnts - 1)]; 340fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int v = 0; v < vCount; ++v) { 341fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int verb = fVerbs[(fCurrVerb++) & (kNumVerbs - 1)]; 342fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (verb) { 343fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkPath::kMove_Verb: 344fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->moveTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]); 345fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 346fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkPath::kLine_Verb: 347fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(fPoints[(fCurrPoint++) & (kNumPoints - 1)]); 348fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 349fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkPath::kQuad_Verb: 350fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->quadTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 351fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPoints[(fCurrPoint + 1) & (kNumPoints - 1)]); 352fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCurrPoint += 2; 353fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 354fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkPath::kConic_Verb: 355fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->conicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 356fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPoints[(fCurrPoint + 1) & (kNumPoints - 1)], 357fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ScalarHalf); 358fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCurrPoint += 2; 359fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 360fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkPath::kCubic_Verb: 361fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->cubicTo(fPoints[(fCurrPoint + 0) & (kNumPoints - 1)], 362fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPoints[(fCurrPoint + 1) & (kNumPoints - 1)], 363fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPoints[(fCurrPoint + 2) & (kNumPoints - 1)]); 364fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCurrPoint += 3; 365fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 366fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkPath::kClose_Verb: 367fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->close(); 368fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 369fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot default: 370fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Unexpected path verb"); 371fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 372fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 373fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 374fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 375fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 376fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void finishedMakingPaths() { 377fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fVerbCnts.reset(0); 378fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fVerbs.reset(0); 379fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPoints.reset(0); 380fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 381fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 382fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 383fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 384fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // these should all be pow 2 385fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kNumVerbCnts = 1 << 5, 386fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kNumVerbs = 1 << 5, 387fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kNumPoints = 1 << 5, 388fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 389fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<int> fVerbCnts; 390fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<SkPath::Verb> fVerbs; 391fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<SkPoint> fPoints; 392fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fCurrPath; 393fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fCurrVerb; 394fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fCurrPoint; 395fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom fRandom; 396fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 397fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 398fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 399fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathCreateBench : public RandomPathBench { 400fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 401fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot PathCreateBench() { 402fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 403fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 404fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 405fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 406fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "path_create"; 407fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 408fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 409fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDelayedSetup() override { 410fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->createData(10, 100); 411fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 412fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 413fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 414fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 415fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (i % 1000 == 0) { 416fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPath.reset(); // PathRef memory can grow without bound otherwise. 417fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 418fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->makePath(&fPath); 419fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 420fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->restartMakingPaths(); 421fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 422fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 423fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 424fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath fPath; 425fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 426fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef RandomPathBench INHERITED; 427fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 428fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 429fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathCopyBench : public RandomPathBench { 430fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 431fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot PathCopyBench() { 432fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 433fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 434fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 435fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 436fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "path_copy"; 437fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 438fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDelayedSetup() override { 439fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->createData(10, 100); 440fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaths.reset(kPathCnt); 441fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCopies.reset(kPathCnt); 442fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < kPathCnt; ++i) { 443fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->makePath(&fPaths[i]); 444fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 445fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->finishedMakingPaths(); 446fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 447fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 448fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 449fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int idx = i & (kPathCnt - 1); 450fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCopies[idx] = fPaths[idx]; 451fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 452fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 453fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 454fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 455fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 456fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // must be a pow 2 457fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kPathCnt = 1 << 5, 458fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 459fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<SkPath> fPaths; 460fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<SkPath> fCopies; 461fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 462fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef RandomPathBench INHERITED; 463fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 464fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 465fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathTransformBench : public RandomPathBench { 466fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 467fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot PathTransformBench(bool inPlace) : fInPlace(inPlace) {} 468fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 469fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 470fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 471fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fInPlace ? "path_transform_in_place" : "path_transform_copy"; 472fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 473fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 474fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDelayedSetup() override { 475fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fMatrix.setScale(5 * SK_Scalar1, 6 * SK_Scalar1); 476fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->createData(10, 100); 477fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaths.reset(kPathCnt); 478fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < kPathCnt; ++i) { 479fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->makePath(&fPaths[i]); 480fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 481fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->finishedMakingPaths(); 482fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!fInPlace) { 483fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTransformed.reset(kPathCnt); 484fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 485fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 486fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 487fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 488fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fInPlace) { 489fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 490fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaths[i & (kPathCnt - 1)].transform(fMatrix); 491fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 492fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 493fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 494fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int idx = i & (kPathCnt - 1); 495fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaths[idx].transform(fMatrix, &fTransformed[idx]); 496fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 497fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 498fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 499fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 500fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 501fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 502fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // must be a pow 2 503fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kPathCnt = 1 << 5, 504fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 505fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<SkPath> fPaths; 506fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<SkPath> fTransformed; 507fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 508fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMatrix fMatrix; 509fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fInPlace; 510fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef RandomPathBench INHERITED; 511fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 512fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 513fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathEqualityBench : public RandomPathBench { 514fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 515fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot PathEqualityBench() { } 516fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 517fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 518fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 519fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "path_equality_50%"; 520fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 521fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 522fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDelayedSetup() override { 523fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fParity = 0; 524fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->createData(10, 100); 525fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaths.reset(kPathCnt); 526fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCopies.reset(kPathCnt); 527fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < kPathCnt; ++i) { 528fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->makePath(&fPaths[i]); 529fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fCopies[i] = fPaths[i]; 530fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 531fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->finishedMakingPaths(); 532fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 533fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 534fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 535fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 536fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int idx = i & (kPathCnt - 1); 537fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fParity ^= (fPaths[idx] == fCopies[idx & ~0x1]); 538fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 539fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 540fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 541fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 542fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fParity; // attempt to keep compiler from optimizing out the == 543fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 544fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // must be a pow 2 545fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kPathCnt = 1 << 5, 546fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 547fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<SkPath> fPaths; 548fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<SkPath> fCopies; 549fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef RandomPathBench INHERITED; 550fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 551fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 552fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkBench_AddPathTest : public RandomPathBench { 553fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 554fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum AddType { 555fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAdd_AddType, 556fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAddTrans_AddType, 557fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAddMatrix_AddType, 558fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kReverseAdd_AddType, 559fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kReversePathTo_AddType, 560fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 561fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 562fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBench_AddPathTest(AddType type) : fType(type) { 563fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fMatrix.setRotate(60 * SK_Scalar1); 564fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 565fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 566fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 567fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 568fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (fType) { 569fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kAdd_AddType: 570fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "path_add_path"; 571fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kAddTrans_AddType: 572fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "path_add_path_trans"; 573fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kAddMatrix_AddType: 574fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "path_add_path_matrix"; 575fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kReverseAdd_AddType: 576fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "path_reverse_add_path"; 577fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kReversePathTo_AddType: 578fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "path_reverse_path_to"; 579fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot default: 580fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGFAIL("Bad add type"); 581fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return ""; 582fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 583fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 584fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 585fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDelayedSetup() override { 586fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // reversePathTo assumes a single contour path. 587fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool allowMoves = kReversePathTo_AddType != fType; 588fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->createData(10, 100, allowMoves); 589fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaths0.reset(kPathCnt); 590fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPaths1.reset(kPathCnt); 591fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < kPathCnt; ++i) { 592fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->makePath(&fPaths0[i]); 593fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->makePath(&fPaths1[i]); 594fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 595fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->finishedMakingPaths(); 596fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 597fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 598fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 599fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (fType) { 600fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kAdd_AddType: 601fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 602fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int idx = i & (kPathCnt - 1); 603fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath result = fPaths0[idx]; 604fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result.addPath(fPaths1[idx]); 605fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 606fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 607fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kAddTrans_AddType: 608fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 609fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int idx = i & (kPathCnt - 1); 610fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath result = fPaths0[idx]; 611fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result.addPath(fPaths1[idx], 2 * SK_Scalar1, 5 * SK_Scalar1); 612fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 613fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 614fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kAddMatrix_AddType: 615fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 616fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int idx = i & (kPathCnt - 1); 617fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath result = fPaths0[idx]; 618fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result.addPath(fPaths1[idx], fMatrix); 619fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 620fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 621fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kReverseAdd_AddType: 622fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 623fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int idx = i & (kPathCnt - 1); 624fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath result = fPaths0[idx]; 625fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result.reverseAddPath(fPaths1[idx]); 626fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 627fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 628fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kReversePathTo_AddType: 629fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 630fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int idx = i & (kPathCnt - 1); 631fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath result = fPaths0[idx]; 632fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result.reversePathTo(fPaths1[idx]); 633fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 634fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 635fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 636fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 637fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 638fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 639fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot AddType fType; // or reverseAddPath 640fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 641fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // must be a pow 2 642fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kPathCnt = 1 << 5, 643fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 644fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<SkPath> fPaths0; 645fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkAutoTArray<SkPath> fPaths1; 646fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMatrix fMatrix; 647fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef RandomPathBench INHERITED; 648fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 649fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 650fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 651fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass CirclesBench : public Benchmark { 652fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 653fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 654fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot Flags fFlags; 655fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 656fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 657fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot CirclesBench(Flags flags) : fFlags(flags) { 658fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("circles_%s", fFlags & kStroke_Flag ? "stroke" : "fill"); 659fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 660fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 661fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 662fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 663fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 664fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 665fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 666fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 667fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 668fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 669fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(SK_ColorBLACK); 670fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(true); 671fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fFlags & kStroke_Flag) { 672fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStyle(SkPaint::kStroke_Style); 673fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 674fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 675fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 676fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 677fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r; 678fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 679fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 680fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar radius = rand.nextUScalar1() * 3; 681fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.fLeft = rand.nextUScalar1() * 300; 682fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.fTop = rand.nextUScalar1() * 300; 683fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.fRight = r.fLeft + 2 * radius; 684fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.fBottom = r.fTop + 2 * radius; 685fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 686fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fFlags & kStroke_Flag) { 687fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStrokeWidth(rand.nextUScalar1() * 5.0f); 688fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 689fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 690fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath temp; 691fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 692fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // mimic how Chrome does circles 693fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot temp.arcTo(r, 0, 0, false); 694fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot temp.addOval(r, SkPath::kCCW_Direction); 695fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot temp.arcTo(r, 360, 0, true); 696fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot temp.close(); 697fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 698fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(temp, paint); 699fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 700fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 701fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 702fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 703fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 704fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 705fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 706fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 707fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Chrome creates its own round rects with each corner possibly being different. 708fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// In its "zero radius" incarnation it creates degenerate round rects. 709fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Note: PathTest::test_arb_round_rect_is_convex and 710fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// test_arb_zero_rad_round_rect_is_rect perform almost exactly 711fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// the same test (but with no drawing) 712fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ArbRoundRectBench : public Benchmark { 713fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 714fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 715fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 716fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 717fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ArbRoundRectBench(bool zeroRad) : fZeroRad(zeroRad) { 718fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (zeroRad) { 719fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("zeroradroundrect"); 720fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 721fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("arbroundrect"); 722fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 723fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 724fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 725fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 726fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 727fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 728fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 729fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 730fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static void add_corner_arc(SkPath* path, const SkRect& rect, 731fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar xIn, SkScalar yIn, 732fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int startAngle) 733fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 734fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 735fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar rx = SkMinScalar(rect.width(), xIn); 736fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar ry = SkMinScalar(rect.height(), yIn); 737fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 738fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect arcRect; 739fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot arcRect.set(-rx, -ry, rx, ry); 740fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (startAngle) { 741fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 0: 742fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot arcRect.offset(rect.fRight - arcRect.fRight, rect.fBottom - arcRect.fBottom); 743fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 744fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 90: 745fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fBottom - arcRect.fBottom); 746fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 747fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 180: 748fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot arcRect.offset(rect.fLeft - arcRect.fLeft, rect.fTop - arcRect.fTop); 749fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 750fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case 270: 751fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot arcRect.offset(rect.fRight - arcRect.fRight, rect.fTop - arcRect.fTop); 752fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 753fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot default: 754fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 755fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 756fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 757fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->arcTo(arcRect, SkIntToScalar(startAngle), SkIntToScalar(90), false); 758fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 759fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 760fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static void make_arb_round_rect(SkPath* path, const SkRect& r, 761fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar xCorner, SkScalar yCorner) { 762fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // we are lazy here and use the same x & y for each corner 763fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot add_corner_arc(path, r, xCorner, yCorner, 270); 764fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot add_corner_arc(path, r, xCorner, yCorner, 0); 765fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot add_corner_arc(path, r, xCorner, yCorner, 90); 766fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot add_corner_arc(path, r, xCorner, yCorner, 180); 767fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->close(); 768fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 769fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(path->isConvex()); 770fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 771fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 772fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 773fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 774fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r; 775fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 776fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 777fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 778fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(0xff000000 | rand.nextU()); 779fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(true); 780fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 781fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar size = rand.nextUScalar1() * 30; 782fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (size < SK_Scalar1) { 783fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot continue; 784fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 785fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.fLeft = rand.nextUScalar1() * 300; 786fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.fTop = rand.nextUScalar1() * 300; 787fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.fRight = r.fLeft + 2 * size; 788fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.fBottom = r.fTop + 2 * size; 789fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 790fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath temp; 791fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 792fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fZeroRad) { 793fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot make_arb_round_rect(&temp, r, 0, 0); 794fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 795fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(temp.isRect(nullptr)); 796fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 797fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot make_arb_round_rect(&temp, r, r.width() / 10, r.height() / 15); 798fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 799fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 800fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(temp, paint); 801fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 802fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 803fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 804fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 805fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fZeroRad; // should 0 radius rounds rects be tested? 806fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 807fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 808fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 809fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 810fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConservativelyContainsBench : public Benchmark { 811fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 812fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum Type { 813fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kRect_Type, 814fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kRoundRect_Type, 815fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kOval_Type, 816fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 817fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 818fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ConservativelyContainsBench(Type type) { 819fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fParity = false; 820fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName = "conservatively_contains_"; 821fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (type) { 822fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kRect_Type: 823fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.append("rect"); 824fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPath.addRect(kBaseRect); 825fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 826fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kRoundRect_Type: 827fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.append("round_rect"); 828fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPath.addRoundRect(kBaseRect, kRRRadii[0], kRRRadii[1]); 829fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 830fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kOval_Type: 831fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.append("oval"); 832fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPath.addOval(kBaseRect); 833fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 834fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 835fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 836fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 837fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isSuitableFor(Backend backend) override { 838fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return backend == kNonRendering_Backend; 839fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 840fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 841fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 842fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 843fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 844fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 845fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 846fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 847fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 848fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkRect& rect = fQueryRects[i % kQueryRectCnt]; 849fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fParity = fParity != fPath.conservativelyContainsRect(rect); 850fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 851fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 852fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 853fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDelayedSetup() override { 854fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fQueryRects.setCount(kQueryRectCnt); 855fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 856fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 857fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < kQueryRectCnt; ++i) { 858fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkSize size; 859fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint xy; 860fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size.fWidth = rand.nextRangeScalar(kQueryMin.fWidth, kQueryMax.fWidth); 861fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size.fHeight = rand.nextRangeScalar(kQueryMin.fHeight, kQueryMax.fHeight); 862fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot xy.fX = rand.nextRangeScalar(kBounds.fLeft, kBounds.fRight - size.fWidth); 863fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot xy.fY = rand.nextRangeScalar(kBounds.fTop, kBounds.fBottom - size.fHeight); 864fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 865fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fQueryRects[i] = SkRect::MakeXYWH(xy.fX, xy.fY, size.fWidth, size.fHeight); 866fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 867fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 868fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 869fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 870fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kQueryRectCnt = 400, 871fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 872fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const SkRect kBounds; // bounds for all random query rects 873fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const SkSize kQueryMin; // minimum query rect size, should be <= kQueryMax 874fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const SkSize kQueryMax; // max query rect size, should < kBounds 875fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const SkRect kBaseRect; // rect that is used to construct the path 876fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const SkScalar kRRRadii[2]; // x and y radii for round rect 877fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 878fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 879fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath fPath; 880fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fParity; 881fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<SkRect> fQueryRects; 882fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 883fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 884fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 885fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 886fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////// 887fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 888fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGeometry.h" 889fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 890fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_Chop : public Benchmark { 891fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 892fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkConic fRQ, fDst[2]; 893fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 894fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 895fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ConicBench_Chop() : fName("conic-chop") { 896fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRQ.fPts[0].set(0, 0); 897fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRQ.fPts[1].set(100, 0); 898fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRQ.fPts[2].set(100, 100); 899fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRQ.fW = SkScalarCos(SK_ScalarPI/4); 900fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 901fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 902fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isSuitableFor(Backend backend) override { 903fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return backend == kNonRendering_Backend; 904fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 905fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 906fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 907fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { return fName.c_str(); } 908fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 909fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 910fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 911fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRQ.chop(fDst); 912fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 913fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 914fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 915fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 916fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 917fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_Chop; ) 918fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 919fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_EvalPos : public ConicBench_Chop { 920fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const bool fUseV2; 921fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 922fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ConicBench_EvalPos(bool useV2) : fUseV2(useV2) { 923fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("conic-eval-pos%d", useV2); 924fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 925fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 926fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fUseV2) { 927fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 928fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int j = 0; j < 1000; ++j) { 929fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDst[0].fPts[0] = fRQ.evalAt(0.4f); 930fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 931fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 932fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 933fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 934fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int j = 0; j < 1000; ++j) { 935fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRQ.evalAt(0.4f, &fDst[0].fPts[0], nullptr); 936fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 937fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 938fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 939fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 940fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 941fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_EvalPos(false); ) 942fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_EvalPos(true); ) 943fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 944fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_EvalTan : public ConicBench_Chop { 945fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const bool fUseV2; 946fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 947fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ConicBench_EvalTan(bool useV2) : fUseV2(useV2) { 948fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("conic-eval-tan%d", useV2); 949fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 950fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 951fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fUseV2) { 952fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 953fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int j = 0; j < 1000; ++j) { 954fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDst[0].fPts[0] = fRQ.evalTangentAt(0.4f); 955fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 956fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 957fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 958fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 959fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int j = 0; j < 1000; ++j) { 960fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fRQ.evalAt(0.4f, nullptr, &fDst[0].fPts[0]); 961fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 962fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 963fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 964fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 965fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 966fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_EvalTan(false); ) 967fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_EvalTan(true); ) 968fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 969fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////// 970fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 971fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void rand_conic(SkConic* conic, SkRandom& rand) { 972fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < 3; ++i) { 973fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot conic->fPts[i].set(rand.nextUScalar1() * 100, rand.nextUScalar1() * 100); 974fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 975fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (rand.nextUScalar1() > 0.5f) { 976fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot conic->fW = rand.nextUScalar1(); 977fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 978fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot conic->fW = 1 + rand.nextUScalar1() * 4; 979fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 980fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 981fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 982fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench : public Benchmark { 983fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 984fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ConicBench() { 985fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 986fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < CONICS; ++i) { 987fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rand_conic(&fConics[i], rand); 988fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 989fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 990fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 991fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isSuitableFor(Backend backend) override { 992fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return backend == kNonRendering_Backend; 993fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 994fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 995fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 996fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 997fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot CONICS = 100 998fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 999fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkConic fConics[CONICS]; 1000fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1001fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 1002fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 1003fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 1004fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1005fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_ComputeError : public ConicBench { 1006fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 1007fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ConicBench_ComputeError() {} 1008fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1009fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 1010fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 1011fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "conic-compute-error"; 1012fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1013fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1014fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 1015fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkVector err; 1016fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 1017fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int j = 0; j < CONICS; ++j) { 1018fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fConics[j].computeAsQuadError(&err); 1019fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1020fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1021fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1022fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1023fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 1024fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef ConicBench INHERITED; 1025fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 1026fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1027fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_asQuadTol : public ConicBench { 1028fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 1029fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ConicBench_asQuadTol() {} 1030fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1031fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 1032fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 1033fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "conic-asQuadTol"; 1034fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1035fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1036fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 1037fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 1038fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int j = 0; j < CONICS; ++j) { 1039fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fConics[j].asQuadTol(SK_ScalarHalf); 1040fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1041fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1042fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1043fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1044fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 1045fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef ConicBench INHERITED; 1046fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 1047fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1048fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass ConicBench_quadPow2 : public ConicBench { 1049fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 1050fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ConicBench_quadPow2() {} 1051fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1052fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 1053fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 1054fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return "conic-quadPow2"; 1055fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1056fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1057fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 1058fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 1059fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int j = 0; j < CONICS; ++j) { 1060fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fConics[j].computeQuadPOW2(SK_ScalarHalf); 1061fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1062fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1063fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1064fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1065fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 1066fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef ConicBench INHERITED; 1067fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 1068fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1069fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////// 1070fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1071fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass TightBoundsBench : public Benchmark { 1072fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath fPath; 1073fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 1074fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect (*fProc)(const SkPath&); 1075fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1076fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 1077fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot TightBoundsBench(SkRect (*proc)(const SkPath&), const char suffix[]) : fProc(proc) { 1078fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("tight_bounds_%s", suffix); 1079fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1080fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const int N = 100; 1081fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRandom rand; 1082fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < N; ++i) { 1083fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPath.moveTo(rand.nextF()*100, rand.nextF()*100); 1084fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPath.lineTo(rand.nextF()*100, rand.nextF()*100); 1085fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPath.quadTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100); 1086fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPath.conicTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, 1087fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rand.nextF()*10); 1088fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPath.cubicTo(rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, rand.nextF()*100, 1089fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rand.nextF()*100, rand.nextF()*100); 1090fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1091fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1092fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1093fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 1094fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isSuitableFor(Backend backend) override { 1095fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return backend == kNonRendering_Backend; 1096fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1097fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1098fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { return fName.c_str(); } 1099fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 1101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops*100; ++i) { 1102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fProc(fPath); 1103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 1105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 1107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 1108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 1109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkRect ConservativelyContainsBench::kBounds = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); 1112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkSize ConservativelyContainsBench::kQueryMin = {SkIntToScalar(1), SkIntToScalar(1)}; 1113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkSize ConservativelyContainsBench::kQueryMax = {SkIntToScalar(40), SkIntToScalar(40)}; 1114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkRect ConservativelyContainsBench::kBaseRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), SkIntToScalar(50), SkIntToScalar(50)); 1115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkScalar ConservativelyContainsBench::kRRRadii[2] = {SkIntToScalar(5), SkIntToScalar(10)}; 1116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TrianglePathBench(FLAGS00); ) 1118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TrianglePathBench(FLAGS01); ) 1119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TrianglePathBench(FLAGS10); ) 1120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TrianglePathBench(FLAGS11); ) 1121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RectPathBench(FLAGS00); ) 1123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RectPathBench(FLAGS01); ) 1124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RectPathBench(FLAGS10); ) 1125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RectPathBench(FLAGS11); ) 1126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RotatedRectBench(FLAGS00, false, 45)); 1128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RotatedRectBench(FLAGS10, false, 45)); 1129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RotatedRectBench(FLAGS00, true, 45)); 1130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new RotatedRectBench(FLAGS10, true, 45)); 1131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new OvalPathBench(FLAGS00); ) 1133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new OvalPathBench(FLAGS01); ) 1134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new OvalPathBench(FLAGS10); ) 1135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new OvalPathBench(FLAGS11); ) 1136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclePathBench(FLAGS00); ) 1138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclePathBench(FLAGS01); ) 1139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclePathBench(FLAGS10); ) 1140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclePathBench(FLAGS11); ) 1141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new NonAACirclePathBench(FLAGS00); ) 1143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new NonAACirclePathBench(FLAGS10); ) 1144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new AAAConcavePathBench(FLAGS00); ) 1146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new AAAConcavePathBench(FLAGS10); ) 1147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new AAAConvexPathBench(FLAGS00); ) 1148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new AAAConvexPathBench(FLAGS10); ) 1149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SawToothPathBench(FLAGS00); ) 1151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SawToothPathBench(FLAGS01); ) 1152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new LongCurvedPathBench(FLAGS00); ) 1154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new LongCurvedPathBench(FLAGS01); ) 1155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new LongLinePathBench(FLAGS00); ) 1156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new LongLinePathBench(FLAGS01); ) 1157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new PathCreateBench(); ) 1159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new PathCopyBench(); ) 1160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new PathTransformBench(true); ) 1161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new PathTransformBench(false); ) 1162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new PathEqualityBench(); ) 1163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAdd_AddType); ) 1165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddTrans_AddType); ) 1166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kAddMatrix_AddType); ) 1167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReverseAdd_AddType); ) 1168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new SkBench_AddPathTest(SkBench_AddPathTest::kReversePathTo_AddType); ) 1169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclesBench(FLAGS00); ) 1171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new CirclesBench(FLAGS01); ) 1172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ArbRoundRectBench(false); ) 1173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ArbRoundRectBench(true); ) 1174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRect_Type); ) 1175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kRoundRect_Type); ) 1176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConservativelyContainsBench(ConservativelyContainsBench::kOval_Type); ) 1177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPathOps.h" 1179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPathPriv.h" 1180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TightBoundsBench([](const SkPath& path){ return path.computeTightBounds();}, 1181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot "priv"); ) 1182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new TightBoundsBench([](const SkPath& path) { 1183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect bounds; TightBounds(path, &bounds); return bounds; 1184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }, "pathops"); ) 1185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// These seem to be optimized away, which is troublesome for timing. 1187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 1188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_Chop5() ) 1189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_ComputeError() ) 1190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_asQuadTol() ) 1191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new ConicBench_quadPow2() ) 1192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot*/ 1193