/*
 * Copyright 2022 Rive
 */

#include "rive/hittest_command_path.hpp"

using namespace rive;

HitTestCommandPath::HitTestCommandPath(const IAABB& area) : m_Area(area) {
    m_Tester.reset(m_Area);
}

bool HitTestCommandPath::wasHit() {
    return m_Tester.test(m_FillRule);
}

void HitTestCommandPath::reset() {
    m_Tester.reset(m_Area);
}

void HitTestCommandPath::fillRule(FillRule value) {
    // remember this here, and pass it to test()
    m_FillRule = value;
}

void HitTestCommandPath::addPath(CommandPath* path, const Mat2D& transform) {
    assert(false);
    // not supported
}

RenderPath* HitTestCommandPath::renderPath() {
    assert(false);
    // not supported
    return nullptr;
}

void HitTestCommandPath::moveTo(float x, float y) {
    m_Tester.move(m_Xform * Vec2D(x, y));
}

void HitTestCommandPath::lineTo(float x, float y) {
    m_Tester.line(m_Xform * Vec2D(x, y));
}

void HitTestCommandPath::cubicTo(float ox, float oy, float ix, float iy, float x, float y) {
    m_Tester.cubic(m_Xform * Vec2D(ox, oy),
                   m_Xform * Vec2D(ix, iy),
                   m_Xform * Vec2D( x,  y));
}

void HitTestCommandPath::close() {
    m_Tester.close();
}
