2023-08-30 12:38:30 +03:00
|
|
|
/*
|
|
|
|
* 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;
|
2023-12-22 22:17:21 +03:00
|
|
|
rect->y = y;
|
2023-08-30 12:38:30 +03:00
|
|
|
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
|