| /* | |
| * Copyright 2022 Rive | |
| */ | |
| #include "bench.hpp" | |
| #include "rive/math/raw_path.hpp" | |
| using namespace rive; | |
| static Vec2D randpt() | |
| { | |
| return Vec2D(float(rand()), float(rand())) * 100 / (float)RAND_MAX; | |
| } | |
| // Measure the speed of building a RawPath, without growing arrays or figuring | |
| // out the actual path contents. | |
| class BuildRawPath : public Bench | |
| { | |
| public: | |
| BuildRawPath() | |
| { | |
| // Decide the path data we will build with upfront. | |
| srand(0); | |
| for (int i = 0; i < 100000; ++i) | |
| { | |
| switch (rand() % 4) | |
| { | |
| case 0: | |
| m_verbs.push_back(PathVerb::move); | |
| m_pts.push_back(randpt()); | |
| break; | |
| case 1: | |
| m_verbs.push_back(PathVerb::line); | |
| for (int i = 0; i < 10; ++i) | |
| { // 10 lines. | |
| m_pts.push_back(randpt()); | |
| } | |
| break; | |
| case 2: | |
| m_verbs.push_back(PathVerb::cubic); | |
| for (int i = 0; i < 10 * 3; ++i) | |
| { // 10 cubics. | |
| m_pts.push_back(randpt()); | |
| } | |
| break; | |
| case 3: | |
| m_verbs.push_back(PathVerb::close); | |
| break; | |
| } | |
| } | |
| run(); // Run once to preallocate the RawPath arrays. | |
| } | |
| private: | |
| int run() const override | |
| { | |
| const Vec2D* p = m_pts.data(); | |
| m_path.rewind(); | |
| for (PathVerb verb : m_verbs) | |
| { | |
| switch (verb) | |
| { | |
| case PathVerb::move: | |
| m_path.move(*p++); | |
| break; | |
| case PathVerb::line: // 10 lines. | |
| for (int i = 0; i < 10; ++i) | |
| { | |
| m_path.line(*p++); | |
| } | |
| break; | |
| case PathVerb::cubic: // 10 cubics. | |
| for (int i = 0; i < 10; ++i) | |
| { | |
| m_path.cubic(p[0], p[1], p[2]); | |
| p += 3; | |
| } | |
| break; | |
| case PathVerb::close: | |
| m_path.close(); | |
| break; | |
| case PathVerb::quad: | |
| RIVE_UNREACHABLE(); | |
| } | |
| } | |
| return static_cast<int>(m_path.points().count()); | |
| } | |
| // Decide verbs and points upfront so we just measure path building time. | |
| std::vector<PathVerb> m_verbs; | |
| std::vector<Vec2D> m_pts; | |
| mutable RawPath m_path; | |
| }; | |
| REGISTER_BENCH(BuildRawPath); |