/*
 * 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(); }
