| /* | |
| * Copyright 2026 Rive | |
| */ | |
| #include "bench.hpp" | |
| #include "rive/math/raw_path.hpp" | |
| #include "rive_render_path.hpp" | |
| using namespace rive; | |
| static Vec2D randpt() | |
| { | |
| return Vec2D(float(rand()), float(rand())) * 100 / (float)RAND_MAX; | |
| } | |
| // Measure the handoff every dirty ShapePaintPath makes once a frame. Points | |
| // are random, so nothing is prunable: the worst case for the untrusted variant. | |
| class AddRawPathToRenderPath : public Bench | |
| { | |
| public: | |
| AddRawPathToRenderPath() | |
| { | |
| srand(0); | |
| for (int i = 0; i < 1000; ++i) | |
| { | |
| RawPath path; | |
| path.move(randpt()); | |
| for (int j = 0; j < 64; ++j) | |
| { | |
| if (rand() % 4 == 0) | |
| { | |
| path.line(randpt()); | |
| } | |
| else | |
| { | |
| path.cubic(randpt(), randpt(), randpt()); | |
| } | |
| } | |
| path.close(); | |
| m_rawPaths.push_back(std::move(path)); | |
| m_renderPaths.push_back(make_rcp<RiveRenderPath>()); | |
| } | |
| run(); // Run once to preallocate the RiveRenderPath arrays. | |
| } | |
| protected: | |
| int run() const override | |
| { | |
| for (size_t i = 0; i < m_rawPaths.size(); ++i) | |
| { | |
| m_renderPaths[i]->rewind(); | |
| m_renderPaths[i]->addRawPath(m_rawPaths[i]); | |
| } | |
| return static_cast<int>(m_renderPaths.size()); | |
| } | |
| std::vector<RawPath> m_rawPaths; | |
| std::vector<rcp<RiveRenderPath>> m_renderPaths; | |
| }; | |
| // What a script's geometry costs over the trusted handoff above. | |
| class AddUntrustedRawPathToRenderPath : public AddRawPathToRenderPath | |
| { | |
| private: | |
| int run() const override | |
| { | |
| for (size_t i = 0; i < m_rawPaths.size(); ++i) | |
| { | |
| m_renderPaths[i]->rewind(); | |
| m_renderPaths[i]->addUntrustedRawPath(m_rawPaths[i]); | |
| } | |
| return static_cast<int>(m_renderPaths.size()); | |
| } | |
| }; | |
| REGISTER_BENCH(AddRawPathToRenderPath); | |
| REGISTER_BENCH(AddUntrustedRawPathToRenderPath); |