| /* |
| * 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 |