#pragma once

#include <common.h>

// 26.6 fixed point. 1.0 = 64, -32.0 .. 31.999 range in SSINT32.
typedef SSINT32 f26_6;

#define F26_ONE         ((f26_6)64)
#define F26_HALF        ((f26_6)32)
#define F26_FROM_INT(x) ((f26_6)((x) * 64))
#define F26_FLOOR(x)    ((x) >> 6)
#define F26_ROUND(x)    (((x) + 32) >> 6)
#define F26_FRAC(x)     ((x) & 63)

static inline f26_6 f26_mul(f26_6 a, f26_6 b) {
    return (f26_6)(((SSINT64)a * b) >> 6);
}

static inline f26_6 f26_div(f26_6 a, f26_6 b) {
    if (b == 0) return 0;
    return (f26_6)(((SSINT64)a << 6) / b);
}

// Linear interpolation. t in [0, 64].
static inline f26_6 f26_lerp(f26_6 a, f26_6 b, f26_6 t) {
    return a + f26_mul(b - a, t);
}

// Floor-of-division helper for bezier root solving.
static inline SSINT32 isign(SSINT32 x) { return (x > 0) - (x < 0); }
