| /* | 
 |  * 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); ) |