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