blob: 3cd8fca18f65ad98a5d20f53e0b3ec7c96d8ec5b [file] [edit]
/*
* 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);