blob: 9fda9978f475a0e7a9c912409941d0335f198b15 [file] [log] [blame] [edit]
/*
* 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);