diff options
Diffstat (limited to 'bench/BezierBench.cpp')
-rwxr-xr-x | bench/BezierBench.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/bench/BezierBench.cpp b/bench/BezierBench.cpp new file mode 100755 index 0000000000..ec83d958bb --- /dev/null +++ b/bench/BezierBench.cpp @@ -0,0 +1,101 @@ +/* + * Copyright 2014 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 "SkString.h" + +struct BezierRec { + SkCanvas* fCanvas; + SkPaint fPaint; + SkPath fQuad; + SkPath fCubic; +}; + +typedef const char* (*DrawProc)(const BezierRec*, int); + +static const char* draw_quad(const BezierRec* rec, int count) { + if (rec) { + SkCanvas* canvas = rec->fCanvas; + const SkPaint& paint = rec->fPaint; + const SkPath& path = rec->fQuad; + for (int i = 0; i < count; ++i) { + canvas->drawPath(path, paint); + } + } + return "quad"; +} + +static const char* draw_cubic(const BezierRec* rec, int count) { + if (rec) { + SkCanvas* canvas = rec->fCanvas; + const SkPaint& paint = rec->fPaint; + const SkPath& path = rec->fCubic; + for (int i = 0; i < count; ++i) { + canvas->drawPath(path, paint); + } + } + return "cubic"; +} + +class BezierBench : public Benchmark { + SkString fName; + SkPaint::Cap fCap; + SkPaint::Join fJoin; + BezierRec fRec; + DrawProc fProc; + SkScalar fWidth; +public: + BezierBench(SkPaint::Cap c, SkPaint::Join j, SkScalar w, DrawProc proc) { + static const char* gCapName[] = { + "butt", "round", "square" + }; + static const char* gJoinName[] = { + "miter", "round", "bevel" + }; + + fCap = c; + fJoin = j; + fProc = proc; + fWidth = SkIntToScalar(w); + fName.printf("draw_stroke_bezier_%s_%s_%s_%g", proc(NULL, 0), gCapName[c], gJoinName[j], w); + + fRec.fQuad.moveTo(20, 20); + fRec.fQuad.quadTo(60, 20, 60, 60); + fRec.fQuad.quadTo(20, 60, 20, 100); + fRec.fCubic.moveTo(20, 20); + fRec.fCubic.cubicTo(40, 20, 60, 40, 60, 60); + fRec.fCubic.cubicTo(40, 60, 20, 80, 20, 100); + } + +protected: + virtual const char* onGetName() { + return fName.c_str(); + } + + virtual void onDraw(const int loops, SkCanvas* canvas) { + fRec.fCanvas = canvas; + this->setupPaint(&fRec.fPaint); + fRec.fPaint.setStyle(SkPaint::kStroke_Style); + fRec.fPaint.setStrokeCap(fCap); + fRec.fPaint.setStrokeJoin(fJoin); + fRec.fPaint.setStrokeWidth(fWidth); + fProc(&fRec, loops); + } + +private: + typedef Benchmark INHERITED; +}; + +DEF_BENCH( return new BezierBench(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2, draw_quad); ) +DEF_BENCH( return new BezierBench(SkPaint::kSquare_Cap, SkPaint::kBevel_Join, 10, draw_quad); ) +DEF_BENCH( return new BezierBench(SkPaint::kRound_Cap, SkPaint::kMiter_Join, 50, draw_quad); ) + +DEF_BENCH( return new BezierBench(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2, draw_cubic); ) +DEF_BENCH( return new BezierBench(SkPaint::kSquare_Cap, SkPaint::kBevel_Join, 10, draw_cubic); ) +DEF_BENCH( return new BezierBench(SkPaint::kRound_Cap, SkPaint::kMiter_Join, 50, draw_cubic); ) |