xref: /openbmc/qemu/include/ui/rect.h (revision b0b05c9c)
1a200d53bSMarc-André Lureau /*
2a200d53bSMarc-André Lureau  * SPDX-License-Identifier: GPL-2.0-or-later
3a200d53bSMarc-André Lureau  */
4a200d53bSMarc-André Lureau #ifndef QEMU_RECT_H
5a200d53bSMarc-André Lureau #define QEMU_RECT_H
6a200d53bSMarc-André Lureau 
7a200d53bSMarc-André Lureau 
8a200d53bSMarc-André Lureau typedef struct QemuRect {
9a200d53bSMarc-André Lureau     int16_t x;
10a200d53bSMarc-André Lureau     int16_t y;
11a200d53bSMarc-André Lureau     uint16_t width;
12a200d53bSMarc-André Lureau     uint16_t height;
13a200d53bSMarc-André Lureau } QemuRect;
14a200d53bSMarc-André Lureau 
qemu_rect_init(QemuRect * rect,int16_t x,int16_t y,uint16_t width,uint16_t height)15a200d53bSMarc-André Lureau static inline void qemu_rect_init(QemuRect *rect,
16a200d53bSMarc-André Lureau                                   int16_t x, int16_t y,
17a200d53bSMarc-André Lureau                                   uint16_t width, uint16_t height)
18a200d53bSMarc-André Lureau {
19a200d53bSMarc-André Lureau     rect->x = x;
20*9d5b42beSElen Avan     rect->y = y;
21a200d53bSMarc-André Lureau     rect->width = width;
22a200d53bSMarc-André Lureau     rect->height = height;
23a200d53bSMarc-André Lureau }
24a200d53bSMarc-André Lureau 
qemu_rect_translate(QemuRect * rect,int16_t dx,int16_t dy)25a200d53bSMarc-André Lureau static inline void qemu_rect_translate(QemuRect *rect,
26a200d53bSMarc-André Lureau                                        int16_t dx, int16_t dy)
27a200d53bSMarc-André Lureau {
28a200d53bSMarc-André Lureau     rect->x += dx;
29a200d53bSMarc-André Lureau     rect->y += dy;
30a200d53bSMarc-André Lureau }
31a200d53bSMarc-André Lureau 
qemu_rect_intersect(const QemuRect * a,const QemuRect * b,QemuRect * res)32a200d53bSMarc-André Lureau static inline bool qemu_rect_intersect(const QemuRect *a, const QemuRect *b,
33a200d53bSMarc-André Lureau                                        QemuRect *res)
34a200d53bSMarc-André Lureau {
35a200d53bSMarc-André Lureau     int16_t x1, x2, y1, y2;
36a200d53bSMarc-André Lureau 
37a200d53bSMarc-André Lureau     x1 = MAX(a->x, b->x);
38a200d53bSMarc-André Lureau     y1 = MAX(a->y, b->y);
39a200d53bSMarc-André Lureau     x2 = MIN(a->x + a->width, b->x + b->width);
40a200d53bSMarc-André Lureau     y2 = MIN(a->y + a->height, b->y + b->height);
41a200d53bSMarc-André Lureau 
42a200d53bSMarc-André Lureau     if (x1 >= x2 || y1 >= y2) {
43a200d53bSMarc-André Lureau         if (res) {
44a200d53bSMarc-André Lureau             qemu_rect_init(res, 0, 0, 0, 0);
45a200d53bSMarc-André Lureau         }
46a200d53bSMarc-André Lureau 
47a200d53bSMarc-André Lureau         return false;
48a200d53bSMarc-André Lureau     }
49a200d53bSMarc-André Lureau 
50a200d53bSMarc-André Lureau     if (res) {
51a200d53bSMarc-André Lureau         qemu_rect_init(res, x1, y1, x2 - x1, y2 - y1);
52a200d53bSMarc-André Lureau     }
53a200d53bSMarc-André Lureau 
54a200d53bSMarc-André Lureau     return true;
55a200d53bSMarc-André Lureau }
56a200d53bSMarc-André Lureau 
57a200d53bSMarc-André Lureau #endif
58