/* * Copyright 2018 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 "SkPath.h" #include "SkPathOps.h" #include "SkRandom.h" #include "SkShader.h" #include "SkString.h" #include "SkTArray.h" class PathOpsBench : public Benchmark { SkString fName; SkPath fPath1, fPath2; SkPathOp fOp; public: PathOpsBench(const char suffix[], SkPathOp op) : fOp(op) { fName.printf("pathops_%s", suffix); fPath1.addOval({-10, -20, 10, 20}); fPath2.addOval({-20, -10, 20, 10}); } bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } protected: const char* onGetName() override { return fName.c_str(); } void onDraw(int loops, SkCanvas* canvas) override { for (int i = 0; i < loops; i++) { for (int j = 0; j < 1000; ++j) { SkPath result; Op(fPath1, fPath2, fOp, &result); } } } private: typedef Benchmark INHERITED; }; class PathOpsSimplifyBench : public Benchmark { SkString fName; SkPath fPath; public: PathOpsSimplifyBench(const char suffix[], const SkPath& path) : fPath(path) { fName.printf("pathops_simplify_%s", suffix); } bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; } protected: const char* onGetName() override { return fName.c_str(); } void onDraw(int loops, SkCanvas* canvas) override { for (int i = 0; i < loops; i++) { for (int j = 0; j < 100; ++j) { SkPath result; Simplify(fPath, &result); } } } private: typedef Benchmark INHERITED; }; DEF_BENCH( return new PathOpsBench("sect", kIntersect_SkPathOp); ) DEF_BENCH( return new PathOpsBench("join", kUnion_SkPathOp); ) static SkPath makerects() { SkRandom rand; SkPath path; SkScalar scale = 100; for (int i = 0; i < 20; ++i) { SkScalar x = rand.nextUScalar1() * scale; SkScalar y = rand.nextUScalar1() * scale; path.addRect({x, y, x + scale, y + scale}); } return path; } DEF_BENCH( return new PathOpsSimplifyBench("rects", makerects()); )