CubicKLMBench.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /*
  2. * Copyright 2017 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 "src/core/SkGeometry.h"
  9. #include "src/gpu/geometry/GrPathUtils.h"
  10. class CubicKLMBench : public Benchmark {
  11. public:
  12. CubicKLMBench(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1,
  13. SkScalar x2, SkScalar y2, SkScalar x3, SkScalar y3) {
  14. fPoints[0].set(x0, y0);
  15. fPoints[1].set(x1, y1);
  16. fPoints[2].set(x2, y2);
  17. fPoints[3].set(x3, y3);
  18. fName = "cubic_klm_";
  19. switch (SkClassifyCubic(fPoints)) {
  20. case SkCubicType::kSerpentine:
  21. fName.append("serp");
  22. break;
  23. case SkCubicType::kLoop:
  24. fName.append("loop");
  25. break;
  26. default:
  27. SK_ABORT("Unexpected cubic type");
  28. break;
  29. }
  30. }
  31. bool isSuitableFor(Backend backend) override {
  32. return backend == kNonRendering_Backend;
  33. }
  34. const char* onGetName() override {
  35. return fName.c_str();
  36. }
  37. void onDraw(int loops, SkCanvas*) override {
  38. SkPoint dst[10];
  39. SkMatrix klm;
  40. int loopIdx;
  41. for (int i = 0; i < loops * 50000; ++i) {
  42. GrPathUtils::chopCubicAtLoopIntersection(fPoints, dst, &klm, &loopIdx);
  43. }
  44. }
  45. private:
  46. SkPoint fPoints[4];
  47. SkString fName;
  48. typedef Benchmark INHERITED;
  49. };
  50. DEF_BENCH( return new CubicKLMBench(285.625f, 499.687f, 411.625f, 808.188f,
  51. 1064.62f, 135.688f, 1042.63f, 585.187f); )
  52. DEF_BENCH( return new CubicKLMBench(635.625f, 614.687f, 171.625f, 236.188f,
  53. 1064.62f, 135.688f, 516.625f, 570.187f); )