ap_math.h63 lines · 2.3 KB · raw
1#pragma once
2#include <ap_macro.h>
3
4#define ABSDIFF(x, y) (((x) < (y)) ? ((y) - (x)) : ((x) - (y)))
5#define ABS(x)    ((x) < 0 ? -(x) : (x))
6#define MIN(x, y) (((x) < (y)) ? (x) : (y))
7#define MAX(x, y) (((x) > (y)) ? (x) : (y))
8
9#define CAST16(x) ((uint16_t) (x))
10
11struct xy {
12    uint16_t x;
13    uint16_t y;
14};
15
16#define XY(_x, _y) ((struct xy) { .x = CAST16(_x), .y = CAST16(_y) })
17#define XYOP1(a, op) XY(((a).x op), ((a).y op))
18#define XYOP2(a, op, b) XY(((a).x op (b).x), ((a).y op (b).y))
19#define XYFN1(fn, a) XY(fn((a).x), fn((a).y))
20#define XYFN2(fn, a, b) XY(fn((a).x, (b).x), fn((a).y, (b).y))
21#define XYL1DIST(a, b) ((int) ABSDIFF((a).x, (b).x) + (int) ABSDIFF((a).y, (b).y))
22#define XYMAP8(xy) ((((xy).x & 0x1F8) >> 3) | (((xy).y) & 0x1F8) << 3)
23#define XYMAPSCREEN(xy) ( ((xy).x >> 8) | ((xy).y & 0xFF00) )
24#define XYMID(a, b) XYOP2(XYOP1(a, / 2), +, XYOP1(b, / 2))
25#define XYIN(xy, tl, br) ((xy).x >= (tl).x && (xy).y >= (tl).y && (xy).x <= (br).x && (xy).y <= (br).y)
26#define XYLINKIN(xy, tl, br) ((xy).x >= (tl).x && (xy).y >= (tl).y && (xy).x + 15 <= (br).x && (xy).y + 15 <= (br).y)
27#define XYEQ(a, b) ((a).x == (b).x && (a).y == (b).y)
28#define XYRDIV8(xy) XY(((xy).x + 3) / 8, ((xy).y + 3) / 8)
29#define XYUNDER(xy, br) ((xy).x < (br).x && (xy).y < (br).y)
30
31#define XYINDOORS(xy) ((xy).x >= 0x4000)
32#define XYONLOWER(xy) (XYINDOORS(xy) && ((xy).x & 0x200) == 0x000)
33#define XYONUPPER(xy) (XYINDOORS(xy) && ((xy).x & 0x200) == 0x200)
34#define XYFLIPBG(xy) XY((xy).x ^ 0x200, (xy).y)
35#define XYTOLOWER(xy) XY((xy).x & ~0x200, (xy).y)
36#define XYTOUPPER(xy) XY((xy).x | 0x200, (xy).y)
37
38#define PRIXYV "(%u %#06x, %u %#06x)"
39#define PRIXYVF(xy) (xy).x, (xy).x, (xy).y, (xy).y
40#define PRIXY "%x,%x"
41#define PRIXYF(xy) (xy).x, (xy).y
42#define PRIBB PRIXY ";" PRIXY
43#define PRIBBF(bb) PRIXYF((bb).tl), PRIXYF((bb).br)
44#define PRIBBV PRIXYV " x " PRIXYV
45#define PRIBBVF(bb) PRIXYVF((bb).tl), PRIXYVF((bb).br)
46#define PRIBBWH PRIXY "@" PRIXY
47#define PRIBBWHF(bb) PRIXYF(XYOP2((bb).br, -, (bb).tl)), PRIXYF((bb).tl)
48
49static inline int
50XYL1BOXDIST(struct xy xy, struct xy tl, struct xy br) {
51    int dist = 0;
52    if (tl.x > xy.x) {
53        dist += tl.x - xy.x;
54    } else if (xy.x > br.x) {
55        dist += xy.x - br.x;
56    }
57    if (tl.y > xy.y) {
58        dist += tl.y - xy.y;
59    } else if (xy.y > br.y) {
60        dist += xy.y - br.y;
61    }
62    return dist;
63}