/* * 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 "SkPath.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(nullptr, 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(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); )