Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(599)

Unified Diff: bench/StrokeBench.cpp

Issue 1160093004: add bench for building strokes (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: bench/StrokeBench.cpp
diff --git a/bench/StrokeBench.cpp b/bench/StrokeBench.cpp
index 24e0cabbb03e46095f2397f4827f34a03be4af08..7844035bccad211caacb29e20efe25ed510c9671 100644
--- a/bench/StrokeBench.cpp
+++ b/bench/StrokeBench.cpp
@@ -1,104 +1,105 @@
/*
- * Copyright 2013 Google Inc.
+ * Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "Benchmark.h"
-#include "SkCanvas.h"
#include "SkPaint.h"
-#include "SkRRect.h"
+#include "SkPath.h"
+#include "SkRandom.h"
#include "SkString.h"
-struct RRectRec {
- SkCanvas* fCanvas;
- SkRRect fRRect;
- SkPaint fPaint;
-};
+class StrokeBench : public Benchmark {
+public:
+ StrokeBench(const SkPath& path, const SkPaint& paint, const char pathType[])
+ : fPath(path), fPaint(paint)
+ {
+ fName.printf("build_stroke_%s_%g_%d_%d",
+ pathType, paint.getStrokeWidth(), paint.getStrokeJoin(), paint.getStrokeCap());
+ }
-typedef const char* (*DrawProc)(const RRectRec*, int);
+protected:
+ const char* onGetName() override { return fName.c_str(); }
-static const char* draw_rect(const RRectRec* rec, int count) {
- if (rec) {
- const SkRect& r = rec->fRRect.getBounds();
- for (int i = 0; i < count; ++i) {
- rec->fCanvas->drawRect(r, rec->fPaint);
- }
- }
- return "rect";
-}
+ void onDraw(const int loops, SkCanvas* canvas) override {
+ SkPaint paint(fPaint);
+ this->setupPaint(&paint);
-static const char* draw_rrect(const RRectRec* rec, int count) {
- if (rec) {
- for (int i = 0; i < count; ++i) {
- rec->fCanvas->drawRRect(rec->fRRect, rec->fPaint);
+ for (int outer = 0; outer < 10; ++outer) {
+ for (int i = 0; i < loops; ++i) {
+ SkPath result;
+ paint.getFillPath(fPath, &result);
+ }
}
}
- return "rrect";
-}
-static const char* draw_oval(const RRectRec* rec, int count) {
- if (rec) {
- const SkRect& r = rec->fRRect.getBounds();
- for (int i = 0; i < count; ++i) {
- rec->fCanvas->drawOval(r, rec->fPaint);
- }
- }
- return "oval";
-}
+private:
+ SkPath fPath;
+ SkPaint fPaint;
+ SkString fName;
-// Handles rect, rrect, and oval
-//
-// Test drawing a small stroked version to see the effect of special-casing
-// our stroke code for these convex single-contour shapes.
-//
-class StrokeRRectBench : public Benchmark {
- SkString fName;
- SkPaint::Join fJoin;
- RRectRec fRec;
- DrawProc fProc;
-public:
- StrokeRRectBench(SkPaint::Join j, DrawProc proc) {
- static const char* gJoinName[] = {
- "miter", "round", "bevel"
- };
+ typedef Benchmark INHERITED;
+};
- fJoin = j;
- fProc = proc;
- fName.printf("draw_stroke_%s_%s", proc(NULL, 0), gJoinName[j]);
+///////////////////////////////////////////////////////////////////////////////
- SkRect r = { 20, 20, 40, 40 };
- SkScalar rad = 4;
- fRec.fRRect.setRectXY(r, rad, rad);
- }
+static const int N = 100;
+static const SkScalar X = 100;
+static const SkScalar Y = 100;
-protected:
- virtual const char* onGetName() {
- return fName.c_str();
- }
+static SkPoint rand_pt(SkRandom& rand) {
+ return SkPoint::Make(rand.nextSScalar1() * X, rand.nextSScalar1() * Y);
+}
- virtual void onDraw(const int loops, SkCanvas* canvas) {
- fRec.fCanvas = canvas;
- this->setupPaint(&fRec.fPaint);
- fRec.fPaint.setStyle(SkPaint::kStroke_Style);
- fRec.fPaint.setStrokeJoin(fJoin);
- fRec.fPaint.setStrokeWidth(5);
- fProc(&fRec, loops);
+static SkPath line_path_maker() {
+ SkPath path;
+ SkRandom rand;
+ path.moveTo(rand_pt(rand));
+ for (int i = 0; i < N; ++i) {
+ path.lineTo(rand_pt(rand));
}
+ return path;
+}
+static SkPath quad_path_maker() {
+ SkPath path;
+ SkRandom rand;
+ path.moveTo(rand_pt(rand));
+ for (int i = 0; i < N; ++i) {
+ path.quadTo(rand_pt(rand), rand_pt(rand));
+ }
+ return path;
+}
+static SkPath conic_path_maker() {
+ SkPath path;
+ SkRandom rand;
+ path.moveTo(rand_pt(rand));
+ for (int i = 0; i < N; ++i) {
+ path.conicTo(rand_pt(rand), rand_pt(rand), rand.nextUScalar1());
+ }
+ return path;
+}
+static SkPath cubic_path_maker() {
+ SkPath path;
+ SkRandom rand;
+ path.moveTo(rand_pt(rand));
+ for (int i = 0; i < N; ++i) {
+ path.cubicTo(rand_pt(rand), rand_pt(rand), rand_pt(rand));
+ }
+ return path;
+}
-private:
- typedef Benchmark INHERITED;
-};
-
-DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_rect); )
-DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_rect); )
-DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_rect); )
-
-DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_rrect); )
-DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_rrect); )
-DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_rrect); )
+static SkPaint paint_maker() {
+ SkPaint paint;
+ paint.setStyle(SkPaint::kStroke_Style);
+ paint.setStrokeWidth(X / 10);
+ paint.setStrokeJoin(SkPaint::kMiter_Join);
+ paint.setStrokeCap(SkPaint::kSquare_Cap);
+ return paint;
+}
-DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_oval); )
-DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_oval); )
-DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_oval); )
+DEF_BENCH( return SkNEW_ARGS(StrokeBench, (line_path_maker(), paint_maker(), "line")); )
+DEF_BENCH( return SkNEW_ARGS(StrokeBench, (quad_path_maker(), paint_maker(), "quad")); )
+DEF_BENCH( return SkNEW_ARGS(StrokeBench, (conic_path_maker(), paint_maker(), "conic")); )
+DEF_BENCH( return SkNEW_ARGS(StrokeBench, (cubic_path_maker(), paint_maker(), "cubic")); )
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698