blob: e96892de63ed107f13f4efe26213c828a9db8a8d [file] [log] [blame]
#pragma once
#include "rive/math/simd.hpp"
#include <vector>
namespace rive
{
class IntersectionBoardReferenceImpl
{
public:
// For testing IntersectionTile.
void reset(int left, int top, int16_t baselineGroupIndex)
{
m_baselineGroupIndex = baselineGroupIndex;
m_rects.clear();
m_groupIndices.clear();
}
// For testing IntersectionBoard.
void resizeAndReset(uint32_t viewportWidth, uint32_t viewportHeight)
{
reset(0, 0, 0);
}
// For testing IntersectionTile.
void addRectangle(int4 ltrb, int16_t groupIndex)
{
m_rects.push_back(ltrb);
m_groupIndices.push_back(groupIndex);
}
// For testing IntersectionTile.
int16x8 findMaxIntersectingGroupIndex(
int4 ltrb,
int16x8 baselineGroupIndices = 0) const
{
int16_t index = m_baselineGroupIndex;
for (size_t i = 0; i < m_rects.size(); ++i)
{
if (simd::all(ltrb.xy < m_rects[i].zw) &&
simd::all(ltrb.zw > m_rects[i].xy))
{
index = std::max(index, m_groupIndices[i]);
}
}
return index;
}
// For testing IntersectionBoard.
int16_t addRectangle(int4 ltrb)
{
int16_t groupIndex = findMaxIntersectingGroupIndex(ltrb)[0] + 1;
addRectangle(ltrb, groupIndex);
return groupIndex;
}
private:
int16_t m_baselineGroupIndex;
std::vector<int4> m_rects;
std::vector<int16_t> m_groupIndices;
};
} // namespace rive