37 lines
1.2 KiB
C++
37 lines
1.2 KiB
C++
#pragma once
|
|
// rect.h — the one concrete pixel rectangle. XYWH storage, half-open on both axes: a rect
|
|
// covers [x, x+width) x [y, y+height) — matches the LICE/SWELL RECT convention.
|
|
|
|
namespace reasampler::ui {
|
|
|
|
struct Rect {
|
|
int x = 0;
|
|
int y = 0;
|
|
int width = 0;
|
|
int height = 0;
|
|
|
|
int right() const { return x + width; }
|
|
int bottom() const { return y + height; }
|
|
|
|
// Zero-or-negative area means "not placed / suppressed" — caller must not draw or hit-test it.
|
|
bool empty() const { return width <= 0 || height <= 0; }
|
|
|
|
// LTRB constructor for call sites that think in edges rather than extents.
|
|
static Rect ltrb(int left, int top, int right, int bottom) {
|
|
return Rect{left, top, right - left, bottom - top};
|
|
}
|
|
|
|
bool operator==(const Rect& o) const {
|
|
return x == o.x && y == o.y && width == o.width && height == o.height;
|
|
}
|
|
bool operator!=(const Rect& o) const { return !(*this == o); }
|
|
};
|
|
|
|
// Half-open containment; an empty rect contains nothing, so a suppressed affordance never
|
|
// claims a click.
|
|
inline bool contains(const Rect& r, int px, int py) {
|
|
return px >= r.x && px < r.x + r.width && py >= r.y && py < r.y + r.height;
|
|
}
|
|
|
|
} // namespace reasampler::ui
|