BezierBench.cpp 3.0 KB

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