1 /* 2 * Copyright 2014 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "Benchmark.h" 9 #include "SkCanvas.h" 10 #include "SkPaint.h" 11 #include "SkPath.h" 12 #include "SkString.h" 13 14 struct BezierRec { 15 SkCanvas* fCanvas; 16 SkPaint fPaint; 17 SkPath fQuad; 18 SkPath fCubic; 19 }; 20 21 typedef const char* (*DrawProc)(const BezierRec*, int); 22 23 static const char* draw_quad(const BezierRec* rec, int count) { 24 if (rec) { 25 SkCanvas* canvas = rec->fCanvas; 26 const SkPaint& paint = rec->fPaint; 27 const SkPath& path = rec->fQuad; 28 for (int i = 0; i < count; ++i) { 29 canvas->drawPath(path, paint); 30 } 31 } 32 return "quad"; 33 } 34 35 static const char* draw_cubic(const BezierRec* rec, int count) { 36 if (rec) { 37 SkCanvas* canvas = rec->fCanvas; 38 const SkPaint& paint = rec->fPaint; 39 const SkPath& path = rec->fCubic; 40 for (int i = 0; i < count; ++i) { 41 canvas->drawPath(path, paint); 42 } 43 } 44 return "cubic"; 45 } 46 47 class BezierBench : public Benchmark { 48 SkString fName; 49 SkPaint::Cap fCap; 50 SkPaint::Join fJoin; 51 BezierRec fRec; 52 DrawProc fProc; 53 SkScalar fWidth; 54 public: 55 BezierBench(SkPaint::Cap c, SkPaint::Join j, SkScalar w, DrawProc proc) { 56 static const char* gCapName[] = { 57 "butt", "round", "square" 58 }; 59 static const char* gJoinName[] = { 60 "miter", "round", "bevel" 61 }; 62 63 fCap = c; 64 fJoin = j; 65 fProc = proc; 66 fWidth = SkIntToScalar(w); 67 fName.printf("draw_stroke_bezier_%s_%s_%s_%g", proc(nullptr, 0), gCapName[c], gJoinName[j], w); 68 69 fRec.fQuad.moveTo(20, 20); 70 fRec.fQuad.quadTo(60, 20, 60, 60); 71 fRec.fQuad.quadTo(20, 60, 20, 100); 72 fRec.fCubic.moveTo(20, 20); 73 fRec.fCubic.cubicTo(40, 20, 60, 40, 60, 60); 74 fRec.fCubic.cubicTo(40, 60, 20, 80, 20, 100); 75 } 76 77 protected: 78 virtual const char* onGetName() { 79 return fName.c_str(); 80 } 81 82 virtual void onDraw(int loops, SkCanvas* canvas) { 83 fRec.fCanvas = canvas; 84 this->setupPaint(&fRec.fPaint); 85 fRec.fPaint.setStyle(SkPaint::kStroke_Style); 86 fRec.fPaint.setStrokeCap(fCap); 87 fRec.fPaint.setStrokeJoin(fJoin); 88 fRec.fPaint.setStrokeWidth(fWidth); 89 fProc(&fRec, loops); 90 } 91 92 private: 93 typedef Benchmark INHERITED; 94 }; 95 96 DEF_BENCH( return new BezierBench(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2, draw_quad); ) 97 DEF_BENCH( return new BezierBench(SkPaint::kSquare_Cap, SkPaint::kBevel_Join, 10, draw_quad); ) 98 DEF_BENCH( return new BezierBench(SkPaint::kRound_Cap, SkPaint::kMiter_Join, 50, draw_quad); ) 99 100 DEF_BENCH( return new BezierBench(SkPaint::kButt_Cap, SkPaint::kRound_Join, 2, draw_cubic); ) 101 DEF_BENCH( return new BezierBench(SkPaint::kSquare_Cap, SkPaint::kBevel_Join, 10, draw_cubic); ) 102 DEF_BENCH( return new BezierBench(SkPaint::kRound_Cap, SkPaint::kMiter_Join, 50, draw_cubic); ) 103