135 lines
3.1 KiB
C
135 lines
3.1 KiB
C
|
#ifndef RECT_H
|
||
|
#define RECT_H
|
||
|
|
||
|
#include "typedef.h"
|
||
|
|
||
|
|
||
|
#define AT_UI_RAM AT(.ui_ram)
|
||
|
|
||
|
struct position {
|
||
|
int x;
|
||
|
int y;
|
||
|
};
|
||
|
|
||
|
struct rect {
|
||
|
int left;
|
||
|
int top;
|
||
|
int width;
|
||
|
int height;
|
||
|
};
|
||
|
|
||
|
#define rect_left(r) ((r)->left)
|
||
|
#define rect_top(r) ((r)->top)
|
||
|
#define rect_right(r) ((r)->left + (r)->width)
|
||
|
#define rect_bottom(r) ((r)->top + (r)->height)
|
||
|
|
||
|
//#define rect_height(v) ((v)->bottom - (v)->top)
|
||
|
//#define rect_width(v) ((v)->right - (v)->left)
|
||
|
|
||
|
|
||
|
static inline int in_rect(const struct rect *rect, struct position *pos)
|
||
|
{
|
||
|
if (rect->left <= pos->x && rect_right(rect) > pos->x) {
|
||
|
if (rect->top <= pos->y && rect_bottom(rect) > pos->y) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
AT_UI_RAM
|
||
|
static inline bool get_rect_cover(const struct rect *a, const struct rect *b, struct rect *c)
|
||
|
{
|
||
|
int right, bottom;
|
||
|
|
||
|
c->top = MAX(a->top, b->top);
|
||
|
c->left = MAX(a->left, b->left);
|
||
|
right = MIN(rect_right(a), rect_right(b));
|
||
|
bottom = MIN(rect_bottom(a), rect_bottom(b));
|
||
|
|
||
|
if ((c->top < bottom) && (c->left < right)) {
|
||
|
c->width = right - c->left;
|
||
|
c->height = bottom - c->top;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline bool get_rect_nocover_l(const struct rect *a, const struct rect *b, struct rect *c)
|
||
|
{
|
||
|
int right, bottom;
|
||
|
|
||
|
c->left = MIN(rect_left(a), rect_left(b));
|
||
|
c->top = MIN(rect_top(a), rect_top(b));
|
||
|
right = MAX(rect_left(a), rect_left(b));
|
||
|
bottom = MAX(rect_bottom(a), rect_bottom(b));
|
||
|
|
||
|
if ((c->top < bottom) && (c->left < right)) {
|
||
|
c->width = right - c->left;
|
||
|
c->height = bottom - c->top;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
static inline bool get_rect_nocover_r(const struct rect *a, const struct rect *b, struct rect *c)
|
||
|
{
|
||
|
int right, bottom;
|
||
|
|
||
|
c->left = MIN(rect_right(a), rect_right(b));
|
||
|
c->top = MIN(rect_top(a), rect_top(b));
|
||
|
right = MAX(rect_right(a), rect_right(b));
|
||
|
bottom = MAX(rect_bottom(a), rect_bottom(b));
|
||
|
|
||
|
if ((c->top < bottom) && (c->left < right)) {
|
||
|
c->width = right - c->left;
|
||
|
c->height = bottom - c->top;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
static inline bool get_rect_nocover_t(const struct rect *a, const struct rect *b, struct rect *c)
|
||
|
{
|
||
|
int right, bottom;
|
||
|
|
||
|
c->left = MIN(rect_left(a), rect_left(b));
|
||
|
c->top = MIN(rect_top(a), rect_top(b));
|
||
|
right = MAX(rect_right(a), rect_right(b));
|
||
|
bottom = MAX(rect_top(a), rect_top(b));
|
||
|
|
||
|
if ((c->top < bottom) && (c->left < right)) {
|
||
|
c->width = right - c->left;
|
||
|
c->height = bottom - c->top;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
static inline bool get_rect_nocover_b(const struct rect *a, const struct rect *b, struct rect *c)
|
||
|
{
|
||
|
int right, bottom;
|
||
|
|
||
|
c->left = MIN(rect_left(a), rect_left(b));
|
||
|
c->top = MIN(rect_bottom(a), rect_bottom(b));
|
||
|
right = MAX(rect_right(a), rect_right(b));
|
||
|
bottom = MAX(rect_bottom(a), rect_bottom(b));
|
||
|
|
||
|
if ((c->top < bottom) && (c->left < right)) {
|
||
|
c->width = right - c->left;
|
||
|
c->height = bottom - c->top;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|