blob: f903c7eda192b496ed089c5a39c9079dc6fe7064 [file] [log] [blame]
/*
* Copyright 2022 Rive
*/
#ifndef _RIVE_HITTEST_HPP_
#define _RIVE_HITTEST_HPP_
#include "rive/span.hpp"
#include "rive/math/aabb.hpp"
#include "rive/math/path_types.hpp"
#include "rive/math/vec2d.hpp"
#include <cstdint>
#include <vector>
namespace rive {
class HitTester {
std::vector<int> m_DW; // width * height delta-windings
Vec2D m_First, m_Prev;
Vec2D m_offset;
float m_height;
int m_IWidth, m_IHeight;
bool m_ExpectsMove;
void recurse_cubic(Vec2D b, Vec2D c, Vec2D d, int count);
public:
HitTester() {}
HitTester(const IAABB& area) { reset(area); }
void reset();
void reset(const IAABB& area);
void move(Vec2D);
void line(Vec2D);
void quad(Vec2D, Vec2D);
void cubic(Vec2D, Vec2D, Vec2D);
void close();
void addRect(const AABB&, const Mat2D&, PathDirection = PathDirection::ccw);
bool test(FillRule = rive::FillRule::nonZero);
static bool testMesh(Vec2D point, Span<Vec2D> verts, Span<uint16_t> indices);
static bool testMesh(const IAABB&, Span<Vec2D> verts, Span<uint16_t> indices);
};
} // namespace rive
#endif