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}