placeIn
Return a rect that fits inside avail given the options. avail wins over
min_size.
Parameters
- avail:Rect
- Rect
- min_size:Size
- Size
- e:Options.Expand
- Options.Expand
- g:Options.Gravity
- Options.Gravity
Source
Implementation
pub fn placeIn(avail: Rect, min_size: Size, e: Options.Expand, g: Options.Gravity) Rect {
var size = min_size;
// you never get larger than available
size.w = @min(size.w, avail.w);
size.h = @min(size.h, avail.h);
switch (e) {
.none => {},
.horizontal => {
size.w = avail.w;
},
.vertical => {
size.h = avail.h;
},
.both => {
size = avail.size();
},
.ratio => {
if (min_size.w > 0 and min_size.h > 0 and avail.w > 0 and avail.h > 0) {
const ratio = min_size.w / min_size.h;
if (min_size.w > avail.w or min_size.h > avail.h) {
// contracting
const wratio = avail.w / min_size.w;
const hratio = avail.h / min_size.h;
if (wratio < hratio) {
// width is constraint
size.w = avail.w;
size.h = @min(avail.h, wratio * min_size.h);
} else {
// height is constraint
size.h = avail.h;
size.w = @min(avail.w, hratio * min_size.w);
}
} else {
// expanding
const aratio = (avail.w - size.w) / (avail.h - size.h);
if (aratio > ratio) {
// height is constraint
size.w = @min(avail.w, avail.h * ratio);
size.h = avail.h;
} else {
// width is constraint
size.w = avail.w;
size.h = @min(avail.h, avail.w / ratio);
}
}
}
},
}
var r = avail.shrinkToSize(size);
r.x = avail.x + g.x * (avail.w - r.w);
r.y = avail.y + g.y * (avail.h - r.h);
return r;
}