180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBenchmark.h" 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkBitmap.h" 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h" 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkDashPathEffect.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPaint.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPath.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRandom.h" 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h" 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTDArray.h" 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Cases to consider: 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 1. antialiasing on/off (esp. width <= 1) 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 2. strokewidth == 0, 1, 2 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 3. hline, vline, diagonal, rect, oval 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 4. dots [1,1] ([N,N] where N=strokeWidth?) or arbitrary (e.g. [2,1] or [1,2,3,2]) 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void path_hline(SkPath* path) { 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->moveTo(SkIntToScalar(10), SkIntToScalar(10)); 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(SkIntToScalar(600), SkIntToScalar(10)); 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass DashBench : public SkBenchmark { 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString fName; 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkTDArray<SkScalar> fIntervals; 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int fWidth; 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint fPts[2]; 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool fDoClip; 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 410a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger DashBench(const SkScalar intervals[], int count, int width, 420a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger bool doClip = false) { 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIntervals.append(count, intervals); 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < count; ++i) { 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIntervals[i] *= width; 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fWidth = width; 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fName.printf("dash_%d_%s", width, doClip ? "clipped" : "noclip"); 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fDoClip = doClip; 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fPts[0].set(SkIntToScalar(10), SkIntToScalar(10)); 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fPts[1].set(SkIntToScalar(600), SkIntToScalar(10)); 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void makePath(SkPath* path) { 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path_hline(path); 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* onGetName() SK_OVERRIDE { 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fName.c_str(); 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 64910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->setupPaint(&paint); 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setStyle(SkPaint::kStroke_Style); 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setStrokeWidth(SkIntToScalar(fWidth)); 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setAntiAlias(false); 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath path; 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->makePath(&path); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setPathEffect(new SkDashPathEffect(fIntervals.begin(), 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIntervals.count(), 0))->unref(); 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (fDoClip) { 7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect r = path.getBounds(); 7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru r.inset(-SkIntToScalar(20), -SkIntToScalar(20)); 8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru // now move it so we don't intersect 8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru r.offset(0, r.height() * 3 / 2); 8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->clipRect(r); 8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 85910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger this->handlePath(canvas, path, paint, loops); 8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void handlePath(SkCanvas* canvas, const SkPath& path, 8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkPaint& paint, int N) { 9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < N; ++i) { 9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru// canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, paint); 9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawPath(path, paint); 9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkBenchmark INHERITED; 9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass RectDashBench : public DashBench { 10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 1020a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger RectDashBench(const SkScalar intervals[], int count, int width) 1030a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger : INHERITED(intervals, count, width) { 10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fName.append("_rect"); 10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual void handlePath(SkCanvas* canvas, const SkPath& path, 10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkPaint& paint, int N) SK_OVERRIDE { 11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint pts[2]; 11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!path.isLine(pts) || pts[0].fY != pts[1].fY) { 11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->INHERITED::handlePath(canvas, path, paint, N); 11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } else { 11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect rect; 11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru rect.fLeft = pts[0].fX; 11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru rect.fTop = pts[0].fY - paint.getStrokeWidth() / 2; 11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru rect.fRight = rect.fLeft + SkIntToScalar(fWidth); 11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru rect.fBottom = rect.fTop + paint.getStrokeWidth(); 11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint p(paint); 12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru p.setStyle(SkPaint::kFill_Style); 12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru p.setPathEffect(NULL); 12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int count = SkScalarRoundToInt((pts[1].fX - pts[0].fX) / (2*fWidth)); 12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar dx = SkIntToScalar(2 * fWidth); 12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 0; i < N*10; ++i) { 12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkRect r = rect; 12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int j = 0; j < count; ++j) { 13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawRect(r, p); 13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru r.offset(dx, 0); 13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef DashBench INHERITED; 13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void make_unit_star(SkPath* path, int n) { 14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar rad = -SK_ScalarPI / 2; 14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n; 14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->moveTo(0, -SK_Scalar1); 14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (int i = 1; i < n; i++) { 14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru rad += drad; 14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV); 14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->lineTo(cosV, sinV); 15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->close(); 15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void make_poly(SkPath* path) { 15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru make_unit_star(path, 9); 15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMatrix matrix; 15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru matrix.setScale(SkIntToScalar(100), SkIntToScalar(100)); 15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->transform(matrix); 15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void make_quad(SkPath* path) { 16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar x0 = SkIntToScalar(10); 16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar y0 = SkIntToScalar(10); 16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->moveTo(x0, y0); 16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->quadTo(x0, y0 + 400 * SK_Scalar1, 16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1); 16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic void make_cubic(SkPath* path) { 17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar x0 = SkIntToScalar(10); 17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar y0 = SkIntToScalar(10); 17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->moveTo(x0, y0); 17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru path->cubicTo(x0, y0 + 400 * SK_Scalar1, 17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru x0 + 600 * SK_Scalar1, y0 + 400 * SK_Scalar1, 17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru x0 + 600 * SK_Scalar1, y0); 17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass MakeDashBench : public SkBenchmark { 17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString fName; 18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath fPath; 18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAutoTUnref<SkPathEffect> fPE; 18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 1840a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger MakeDashBench(void (*proc)(SkPath*), const char name[]) { 18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fName.printf("makedash_%s", name); 18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru proc(&fPath); 18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar vals[] = { SkIntToScalar(4), SkIntToScalar(4) }; 18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fPE.reset(new SkDashPathEffect(vals, 2, 0)); 19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* onGetName() SK_OVERRIDE { 19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fName.c_str(); 19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 197910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { 19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPath dst; 199910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger for (int i = 0; i < loops; ++i) { 20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkStrokeRec rec(SkStrokeRec::kHairline_InitStyle); 20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 202d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger fPE->filterPath(&dst, fPath, &rec, NULL); 20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru dst.rewind(); 20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkBenchmark INHERITED; 20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * We try to special case square dashes (intervals are equal to strokewidth). 21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass DashLineBench : public SkBenchmark { 21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkString fName; 21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar fStrokeWidth; 21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool fIsRound; 21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkAutoTUnref<SkPathEffect> fPE; 21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 2210a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger DashLineBench(SkScalar width, bool isRound) { 22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fName.printf("dashline_%g_%s", SkScalarToFloat(width), isRound ? "circle" : "square"); 22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fStrokeWidth = width; 22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fIsRound = isRound; 22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar vals[] = { SK_Scalar1, SK_Scalar1 }; 22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru fPE.reset(new SkDashPathEffect(vals, 2, 0)); 22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected: 23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru virtual const char* onGetName() SK_OVERRIDE { 23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return fName.c_str(); 23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 235910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPaint paint; 23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru this->setupPaint(&paint); 23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setStrokeWidth(fStrokeWidth); 23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setStrokeCap(fIsRound ? SkPaint::kRound_Cap : SkPaint::kSquare_Cap); 24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru paint.setPathEffect(fPE); 241910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger for (int i = 0; i < loops; ++i) { 24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru canvas->drawLine(10 * SK_Scalar1, 10 * SK_Scalar1, 24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 640 * SK_Scalar1, 10 * SK_Scalar1, paint); 24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru typedef SkBenchmark INHERITED; 24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 251363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerclass DrawPointsDashingBench : public SkBenchmark { 252363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkString fName; 253363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger int fStrokeWidth; 254363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger bool fDoAA; 255363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 256363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkAutoTUnref<SkPathEffect> fPathEffect; 257363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 258363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerpublic: 2590a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger DrawPointsDashingBench(int dashLength, int strokeWidth, bool doAA) 2600a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger { 261363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fName.printf("drawpointsdash_%d_%d%s", dashLength, strokeWidth, doAA ? "_aa" : "_bw"); 262363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fStrokeWidth = strokeWidth; 263363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fDoAA = doAA; 264363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 265363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkScalar vals[] = { SkIntToScalar(dashLength), SkIntToScalar(dashLength) }; 266363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger fPathEffect.reset(new SkDashPathEffect(vals, 2, SK_Scalar1, false)); 267363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 268363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 269363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprotected: 270363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger virtual const char* onGetName() SK_OVERRIDE { 271363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger return fName.c_str(); 272363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 273363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 274910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 275363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPaint p; 276363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger this->setupPaint(&p); 277363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger p.setColor(SK_ColorBLACK); 278363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger p.setStyle(SkPaint::kStroke_Style); 279363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger p.setStrokeWidth(SkIntToScalar(fStrokeWidth)); 280363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger p.setPathEffect(fPathEffect); 281363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger p.setAntiAlias(fDoAA); 282363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 283363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger SkPoint pts[2] = { 284363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(10), 0 }, 285363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger { SkIntToScalar(640), 0 } 286363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger }; 287363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 288910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger for (int i = 0; i < loops; ++i) { 289363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger pts[0].fY = pts[1].fY = SkIntToScalar(i % 480); 290363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger canvas->drawPoints(SkCanvas::kLines_PointMode, 2, pts, p); 291363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 292363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger } 293363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger 294363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate: 295363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger typedef SkBenchmark INHERITED; 296363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger}; 297d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 298d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger// Want to test how we handle dashing when 99% of the dash is clipped out 299d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerclass GiantDashBench : public SkBenchmark { 300d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkString fName; 301d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkScalar fStrokeWidth; 302d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkPoint fPts[2]; 303d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkAutoTUnref<SkPathEffect> fPathEffect; 304d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 305d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerpublic: 306d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger enum LineType { 307d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kHori_LineType, 308d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger kVert_LineType, 3097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kDiag_LineType, 3107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kLineTypeCount 311d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger }; 312d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 313d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger static const char* LineTypeName(LineType lt) { 314d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger static const char* gNames[] = { "hori", "vert", "diag" }; 3157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger SK_COMPILE_ASSERT(kLineTypeCount == SK_ARRAY_COUNT(gNames), names_wrong_size); 316d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger return gNames[lt]; 317d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 318d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 3190a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger GiantDashBench(LineType lt, SkScalar width) { 320d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger fName.printf("giantdashline_%s_%g", LineTypeName(lt), width); 321d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger fStrokeWidth = width; 322d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 323d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger // deliberately pick intervals that won't be caught by asPoints(), so 324d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger // we can test the filterPath code-path. 325d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger const SkScalar intervals[] = { 2, 1, 1, 1 }; 326d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger fPathEffect.reset(new SkDashPathEffect(intervals, 327d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SK_ARRAY_COUNT(intervals), 0)); 328d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 329d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkScalar cx = 640 / 2; // center X 330d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkScalar cy = 480 / 2; // center Y 331d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkMatrix matrix; 332d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 333d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger switch (lt) { 334d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger case kHori_LineType: 335d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger matrix.setIdentity(); 336d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger break; 337d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger case kVert_LineType: 338d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger matrix.setRotate(90, cx, cy); 339d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger break; 340d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger case kDiag_LineType: 341d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger matrix.setRotate(45, cx, cy); 342d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger break; 3437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger case kLineTypeCount: 3447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // Not a real enum value. 3457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger break; 346d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 347d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 348d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger const SkScalar overshoot = 100*1000; 349d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger const SkPoint pts[2] = { 350d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger { -overshoot, cy }, { 640 + overshoot, cy } 351d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger }; 352d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger matrix.mapPoints(fPts, pts, 2); 353d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 354d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 355d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerprotected: 356d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger virtual const char* onGetName() SK_OVERRIDE { 357d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger return fName.c_str(); 358d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 359d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 360910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 361d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger SkPaint p; 362d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger this->setupPaint(&p); 363d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger p.setStyle(SkPaint::kStroke_Style); 364d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger p.setStrokeWidth(fStrokeWidth); 365d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger p.setPathEffect(fPathEffect); 366d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 367910f694aefb0b671dd8522a9afe9b6be645701c1Derek Sollenberger for (int i = 0; i < loops; i++) { 3680a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger canvas->drawPoints(SkCanvas::kLines_PointMode, 2, fPts, p); 3690a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger } 370d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger } 371d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 372d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenbergerprivate: 373d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger typedef SkBenchmark INHERITED; 374d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger}; 375d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 376d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 37780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 37880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 37980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const SkScalar gDots[] = { SK_Scalar1, SK_Scalar1 }; 38080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 38180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define PARAM(array) array, SK_ARRAY_COUNT(array) 38280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3830a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashBench(PARAM(gDots), 0); ) 3840a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashBench(PARAM(gDots), 1); ) 3850a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashBench(PARAM(gDots), 1, true); ) 3860a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashBench(PARAM(gDots), 4); ) 3870a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new MakeDashBench(make_poly, "poly"); ) 3880a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new MakeDashBench(make_quad, "quad"); ) 3890a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new MakeDashBench(make_cubic, "cubic"); ) 3900a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(0, false); ) 3910a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(SK_Scalar1, false); ) 3920a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(2 * SK_Scalar1, false); ) 3930a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(0, true); ) 3940a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(SK_Scalar1, true); ) 3950a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DashLineBench(2 * SK_Scalar1, true); ) 3960a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger 3970a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(1, 1, false); ) 3980a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(1, 1, true); ) 3990a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(3, 1, false); ) 4000a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(3, 1, true); ) 4010a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(5, 5, false); ) 4020a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new DrawPointsDashingBench(5, 5, true); ) 403d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 40458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger/* Disable the GiantDashBench for Android devices until we can better control 40558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger * the memory usage. (https://code.google.com/p/skia/issues/detail?id=1430) 40658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger */ 40758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#ifndef SK_BUILD_FOR_ANDROID 4080a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kHori_LineType, 0); ) 4090a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kVert_LineType, 0); ) 4100a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kDiag_LineType, 0); ) 411d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 412d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger// pass 2 to explicitly avoid any 1-is-the-same-as-hairline special casing 413d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger 414d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger// hori_2 is just too slow to enable at the moment 4150a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kHori_LineType, 2); ) 4160a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kVert_LineType, 2); ) 4170a657bbc2c6fc9daf699942e023050536d5ec95fDerek SollenbergerDEF_BENCH( return new GiantDashBench(GiantDashBench::kDiag_LineType, 2); ) 41858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#endif 419