/* | |
* SPDX-License-Identifier: GPL-2.0-or-later | |
*/ | |
#ifndef QEMU_RECT_H | |
#define QEMU_RECT_H | |
typedef struct QemuRect { | |
int16_t x; | |
int16_t y; | |
uint16_t width; | |
uint16_t height; | |
} QemuRect; | |
static inline void qemu_rect_init(QemuRect *rect, | |
int16_t x, int16_t y, | |
uint16_t width, uint16_t height) | |
{ | |
rect->x = x; | |
rect->y = y; | |
rect->width = width; | |
rect->height = height; | |
} | |
static inline void qemu_rect_translate(QemuRect *rect, | |
int16_t dx, int16_t dy) | |
{ | |
rect->x += dx; | |
rect->y += dy; | |
} | |
static inline bool qemu_rect_intersect(const QemuRect *a, const QemuRect *b, | |
QemuRect *res) | |
{ | |
int16_t x1, x2, y1, y2; | |
x1 = MAX(a->x, b->x); | |
y1 = MAX(a->y, b->y); | |
x2 = MIN(a->x + a->width, b->x + b->width); | |
y2 = MIN(a->y + a->height, b->y + b->height); | |
if (x1 >= x2 || y1 >= y2) { | |
if (res) { | |
qemu_rect_init(res, 0, 0, 0, 0); | |
} | |
return false; | |
} | |
if (res) { | |
qemu_rect_init(res, x1, y1, x2 - x1, y2 - y1); | |
} | |
return true; | |
} | |
#endif |