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