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#include "Benchmark.h" 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBitmap.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDashPathEffect.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkString.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkStrokeRec.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTDArray.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Cases to consider: 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 1. antialiasing on/off (esp. width <= 1) 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 2. strokewidth == 0, 1, 2 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 3. hline, vline, diagonal, rect, oval 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4. dots [1,1] ([N,N] where N=strokeWidth?) or arbitrary (e.g. [2,1] or [1,2,3,2]) 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void path_hline(SkPath* path) { 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->moveTo(SkIntToScalar(10), SkIntToScalar(10)); 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(SkIntToScalar(600), SkIntToScalar(10)); 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DashBench : public Benchmark { 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<SkScalar> fIntervals; 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fWidth; 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint fPts[2]; 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fDoClip; 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot DashBench(const SkScalar intervals[], int count, int width, 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool doClip = false) { 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fIntervals.append(count, intervals); 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < count; ++i) { 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fIntervals[i] *= width; 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fWidth = width; 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("dash_%d_%s", width, doClip ? "clipped" : "noclip"); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDoClip = doClip; 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPts[0].set(SkIntToScalar(10), SkIntToScalar(10)); 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPts[1].set(SkIntToScalar(600), SkIntToScalar(10)); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void makePath(SkPath* path) { 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path_hline(path); 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setupPaint(&paint); 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStyle(SkPaint::kStroke_Style); 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStrokeWidth(SkIntToScalar(fWidth)); 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(false); 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath path; 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->makePath(&path); 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setPathEffect(SkDashPathEffect::Make(fIntervals.begin(), fIntervals.count(), 0)); 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fDoClip) { 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r = path.getBounds(); 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.inset(-SkIntToScalar(20), -SkIntToScalar(20)); 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // now move it so we don't intersect 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.offset(0, r.height() * 3 / 2); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipRect(r); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->handlePath(canvas, path, paint, loops); 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void handlePath(SkCanvas* canvas, const SkPath& path, 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint& paint, int N) { 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < N; ++i) { 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, paint); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(path, paint); 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass RectDashBench : public DashBench { 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot RectDashBench(const SkScalar intervals[], int count, int width) 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : INHERITED(intervals, count, width) { 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.append("_rect"); 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void handlePath(SkCanvas* canvas, const SkPath& path, 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPaint& paint, int N) override { 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint pts[2]; 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!path.isLine(pts) || pts[0].fY != pts[1].fY) { 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->INHERITED::handlePath(canvas, path, paint, N); 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect rect; 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rect.fLeft = pts[0].fX; 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rect.fTop = pts[0].fY - paint.getStrokeWidth() / 2; 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rect.fRight = rect.fLeft + SkIntToScalar(fWidth); 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rect.fBottom = rect.fTop + paint.getStrokeWidth(); 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p(paint); 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStyle(SkPaint::kFill_Style); 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setPathEffect(nullptr); 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int count = SkScalarRoundToInt((pts[1].fX - pts[0].fX) / (2*fWidth)); 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar dx = SkIntToScalar(2 * fWidth); 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < N*10; ++i) { 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r = rect; 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int j = 0; j < count; ++j) { 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(r, p); 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.offset(dx, 0); 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef DashBench INHERITED; 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void make_unit_star(SkPath* path, int n) { 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar rad = -SK_ScalarPI / 2; 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n; 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->moveTo(0, -SK_Scalar1); 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 1; i < n; i++) { 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rad += drad; 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV); 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->lineTo(cosV, sinV); 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->close(); 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void make_poly(SkPath* path) { 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot make_unit_star(path, 9); 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkMatrix matrix = SkMatrix::MakeScale(SkIntToScalar(100), SkIntToScalar(100)); 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->transform(matrix); 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void make_quad(SkPath* path) { 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar x0 = SkIntToScalar(10); 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar y0 = SkIntToScalar(10); 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->moveTo(x0, y0); 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->quadTo(x0, y0 + 400 * SK_Scalar1, 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1); 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void make_cubic(SkPath* path) { 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar x0 = SkIntToScalar(10); 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar y0 = SkIntToScalar(10); 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->moveTo(x0, y0); 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path->cubicTo(x0, y0 + 400 * SK_Scalar1, 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1, 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot x0 + 600 * SK_Scalar1, y0); 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass MakeDashBench : public Benchmark { 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath fPath; 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkPathEffect> fPE; 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot MakeDashBench(void (*proc)(SkPath*), const char name[]) { 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("makedash_%s", name); 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot proc(&fPath); 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar vals[] = { SkIntToScalar(4), SkIntToScalar(4) }; 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPE = SkDashPathEffect::Make(vals, 2, 0); 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas*) override { 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath dst; 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkStrokeRec rec(SkStrokeRec::kHairline_InitStyle); 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPE->filterPath(&dst, fPath, &rec, nullptr); 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot dst.rewind(); 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * We try to special case square dashes (intervals are equal to strokewidth). 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DashLineBench : public Benchmark { 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fStrokeWidth; 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fIsRound; 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkPathEffect> fPE; 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot DashLineBench(SkScalar width, bool isRound) { 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("dashline_%g_%s", SkScalarToFloat(width), isRound ? "circle" : "square"); 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fStrokeWidth = width; 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fIsRound = isRound; 223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar vals[] = { SK_Scalar1, SK_Scalar1 }; 225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPE = SkDashPathEffect::Make(vals, 2, 0); 226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setupPaint(&paint); 236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStrokeWidth(fStrokeWidth); 237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setStrokeCap(fIsRound ? SkPaint::kRound_Cap : SkPaint::kSquare_Cap); 238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setPathEffect(fPE); 239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawLine(10 * SK_Scalar1, 10 * SK_Scalar1, 241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 640 * SK_Scalar1, 10 * SK_Scalar1, paint); 242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DrawPointsDashingBench : public Benchmark { 250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fStrokeWidth; 252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fDoAA; 253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkPathEffect> fPathEffect; 255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot DrawPointsDashingBench(int dashLength, int strokeWidth, bool doAA) 258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("drawpointsdash_%d_%d%s", dashLength, strokeWidth, doAA ? "_aa" : "_bw"); 260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fStrokeWidth = strokeWidth; 261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDoAA = doAA; 262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar vals[] = { SkIntToScalar(dashLength), SkIntToScalar(dashLength) }; 264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPathEffect = SkDashPathEffect::Make(vals, 2, SK_Scalar1); 265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 269fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 270fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 271fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 272fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 273fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 274fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setupPaint(&p); 275fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setColor(SK_ColorBLACK); 276fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStyle(SkPaint::kStroke_Style); 277fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStrokeWidth(SkIntToScalar(fStrokeWidth)); 278fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setPathEffect(fPathEffect); 279fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setAntiAlias(fDoAA); 280fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 281fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint pts[2] = { 282fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { SkIntToScalar(10), 0 }, 283fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { SkIntToScalar(640), 0 } 284fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 285fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 286fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 287fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot pts[0].fY = pts[1].fY = SkIntToScalar(i % 480); 288fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p); 289fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 290fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 291fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 292fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 293fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 294fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 295fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 296fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Want to test how we handle dashing when 99% of the dash is clipped out 297fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GiantDashBench : public Benchmark { 298fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 299fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fStrokeWidth; 300fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint fPts[2]; 301fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkPathEffect> fPathEffect; 302fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 303fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 304fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum LineType { 305fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kHori_LineType, 306fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kVert_LineType, 307fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kDiag_LineType, 308fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kLineTypeCount 309fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 310fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 311fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const char* LineTypeName(LineType lt) { 312fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const char* gNames[] = { "hori", "vert", "diag" }; 313fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static_assert(kLineTypeCount == SK_ARRAY_COUNT(gNames), "names_wrong_size"); 314fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return gNames[lt]; 315fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 316fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 317fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GiantDashBench(LineType lt, SkScalar width) { 318fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("giantdashline_%s_%g", LineTypeName(lt), width); 319fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fStrokeWidth = width; 320fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 321fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // deliberately pick intervals that won't be caught by asPoints(), so 322fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // we can test the filterPath code-path. 323fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar intervals[] = { 20, 10, 10, 10 }; 324fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPathEffect = SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0); 325fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 326fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar cx = 640 / 2; // center X 327fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar cy = 480 / 2; // center Y 328fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMatrix matrix; 329fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 330fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (lt) { 331fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kHori_LineType: 332fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot matrix.setIdentity(); 333fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 334fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kVert_LineType: 335fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot matrix.setRotate(90, cx, cy); 336fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 337fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kDiag_LineType: 338fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot matrix.setRotate(45, cx, cy); 339fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 340fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kLineTypeCount: 341fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Not a real enum value. 342fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 343fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 344fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 345fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkScalar overshoot = 100*1000; 346fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkPoint pts[2] = { 347fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { -overshoot, cy }, { 640 + overshoot, cy } 348fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 349fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot matrix.mapPoints(fPts, pts, 2); 350fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 351fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 352fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 353fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 354fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 355fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 356fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 357fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 358fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 359fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setupPaint(&p); 360fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStyle(SkPaint::kStroke_Style); 361fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStrokeWidth(fStrokeWidth); 362fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setPathEffect(fPathEffect); 363fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 364fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; i++) { 365fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, p); 366fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 367fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 368fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 369fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 370fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 371fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 372fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 373fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Want to test how we draw a dashed grid (like what is used in spreadsheets) of many 374fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// small dashed lines switching back and forth between horizontal and vertical 375fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass DashGridBench : public Benchmark { 376fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fName; 377fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fStrokeWidth; 378fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fDoAA; 379fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 380fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkPathEffect> fPathEffect; 381fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 382fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 383fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot DashGridBench(int dashLength, int strokeWidth, bool doAA) { 384fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fName.printf("dashgrid_%d_%d%s", dashLength, strokeWidth, doAA ? "_aa" : "_bw"); 385fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fStrokeWidth = strokeWidth; 386fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDoAA = doAA; 387fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 388fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar vals[] = { SkIntToScalar(dashLength), SkIntToScalar(dashLength) }; 389fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fPathEffect = SkDashPathEffect::Make(vals, 2, SK_Scalar1); 390fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 391fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 392fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 393fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* onGetName() override { 394fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fName.c_str(); 395fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 396fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 397fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(int loops, SkCanvas* canvas) override { 398fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 399fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setupPaint(&p); 400fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setColor(SK_ColorBLACK); 401fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStyle(SkPaint::kStroke_Style); 402fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setStrokeWidth(SkIntToScalar(fStrokeWidth)); 403fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setPathEffect(fPathEffect); 404fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setAntiAlias(fDoAA); 405fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 406fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint pts[4] = { 407fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { SkIntToScalar(0), 20.5f }, 408fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { SkIntToScalar(20), 20.5f }, 409fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 20.5f, SkIntToScalar(0) }, 410fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 20.5f, SkIntToScalar(20) } 411fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 412fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 413fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < loops; ++i) { 414fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int j = 0; j < 10; ++j) { 415fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int k = 0; k < 10; ++k) { 416fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Horizontal line 417fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint horPts[2]; 418fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot horPts[0].fX = pts[0].fX + k * 22.f; 419fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot horPts[0].fY = pts[0].fY + j * 22.f; 420fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot horPts[1].fX = pts[1].fX + k * 22.f; 421fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot horPts[1].fY = pts[1].fY + j * 22.f; 422fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPoints(SkCanvas::kLines_PointMode, 2, horPts, p); 423fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 424fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Vertical line 425fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint vertPts[2]; 426fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot vertPts[0].fX = pts[2].fX + k * 22.f; 427fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot vertPts[0].fY = pts[2].fY + j * 22.f; 428fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot vertPts[1].fX = pts[3].fX + k * 22.f; 429fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot vertPts[1].fY = pts[3].fY + j * 22.f; 430fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPoints(SkCanvas::kLines_PointMode, 2, vertPts, p); 431fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 432fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 433fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 434fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 435fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 436fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 437fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef Benchmark INHERITED; 438fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 439fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 440fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/////////////////////////////////////////////////////////////////////////////// 441fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 442fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const SkScalar gDots[] = { SK_Scalar1, SK_Scalar1 }; 443fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 444fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define PARAM(array) array, SK_ARRAY_COUNT(array) 445fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 446fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashBench(PARAM(gDots), 0); ) 447fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashBench(PARAM(gDots), 1); ) 448fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashBench(PARAM(gDots), 1, true); ) 449fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashBench(PARAM(gDots), 4); ) 450fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new MakeDashBench(make_poly, "poly"); ) 451fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new MakeDashBench(make_quad, "quad"); ) 452fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new MakeDashBench(make_cubic, "cubic"); ) 453fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(0, false); ) 454fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(SK_Scalar1, false); ) 455fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(2 * SK_Scalar1, false); ) 456fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(0, true); ) 457fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(SK_Scalar1, true); ) 458fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashLineBench(2 * SK_Scalar1, true); ) 459fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 460fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(1, 1, false); ) 461fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(1, 1, true); ) 462fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(3, 1, false); ) 463fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(3, 1, true); ) 464fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(5, 5, false); ) 465fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DrawPointsDashingBench(5, 5, true); ) 466fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 467fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* Disable the GiantDashBench for Android devices until we can better control 468fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * the memory usage. (https://code.google.com/p/skia/issues/detail?id=1430) 469fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 470fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SK_BUILD_FOR_ANDROID 471fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kHori_LineType, 0); ) 472fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kVert_LineType, 0); ) 473fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kDiag_LineType, 0); ) 474fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 475fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// pass 2 to explicitly avoid any 1-is-the-same-as-hairline special casing 476fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 477fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// hori_2 is just too slow to enable at the moment 478fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kHori_LineType, 2); ) 479fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kVert_LineType, 2); ) 480fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new GiantDashBench(GiantDashBench::kDiag_LineType, 2); ) 481fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 482fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashGridBench(1, 1, true); ) 483fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashGridBench(1, 1, false); ) 484fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashGridBench(3, 1, true); ) 485fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_BENCH( return new DashGridBench(3, 1, false); ) 486fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 487