shared/java/Rect.java (101 lines of code) (raw):

package org.jetbrains.skija; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; import org.jetbrains.annotations.*; @Getter @EqualsAndHashCode @ToString public class Rect { public final float _left; public final float _top; public final float _right; public final float _bottom; @ApiStatus.Internal public Rect(float l, float t, float r, float b) { this._left = l; this._top = t; this._right = r; this._bottom = b; } public float getWidth() { return _right - _left; } public float getHeight() { return _bottom - _top; } @NotNull @Contract("_, _, _, _ -> new") public static Rect makeLTRB(float l, float t, float r, float b) { if (l > r) throw new IllegalArgumentException("Rect::makeLTRB expected l <= r, got " + l + " > " + r); if (t > b) throw new IllegalArgumentException("Rect::makeLTRB expected t <= b, got " + t + " > " + b); return new Rect(l, t, r, b); } @NotNull @Contract("_, _ -> new") public static Rect makeWH(float w, float h) { if (w < 0) throw new IllegalArgumentException("Rect::makeWH expected w >= 0, got: " + w); if (h < 0) throw new IllegalArgumentException("Rect::makeWH expected h >= 0, got: " + h); return new Rect(0, 0, w, h); } @NotNull @Contract("_, _ -> new") public static Rect makeWH(@NotNull Point size) { assert size != null : "Rect::makeWH expected size != null"; return makeWH(size._x, size._y); } @NotNull @Contract("_, _, _, _ -> new") public static Rect makeXYWH(float l, float t, float w, float h) { if (w < 0) throw new IllegalArgumentException("Rect::makeXYWH expected w >= 0, got: " + w); if (h < 0) throw new IllegalArgumentException("Rect::makeXYWH expected h >= 0, got: " + h); return new Rect(l, t, l + w, t + h); } @Nullable public Rect intersect(@NotNull Rect other) { assert other != null : "Rect::intersect expected other != null"; if (_right <= other._left || other._right <= _left || _bottom <= other._top || other._bottom <= _top) return null; return new Rect(Math.max(_left, other._left), Math.max(_top, other._top), Math.min(_right, other._right), Math.min(_bottom, other._bottom)); } @NotNull public Rect scale(float scale) { return scale(scale, scale); } @NotNull public Rect scale(float sx, float sy) { return new Rect(_left * sx, _top * sy, _right * sx, _bottom * sy); } @NotNull public Rect offset(float dx, float dy) { return new Rect(_left + dx, _top + dy, _right + dx, _bottom + dy); } @NotNull public Rect offset(@NotNull Point vec) { assert vec != null : "Rect::offset expected vec != null"; return offset(vec._x, vec._y); } @NotNull @Contract("-> new") public IRect toIRect() { return new IRect((int) _left, (int) _top, (int) _right, (int) _bottom); } @NotNull public Rect inflate(float spread) { if (spread <= 0) return Rect.makeLTRB(_left - spread, _top - spread, Math.max(_left - spread, _right + spread), Math.max(_top - spread, _bottom + spread)); else return RRect.makeLTRB(_left - spread, _top - spread, Math.max(_left - spread, _right + spread), Math.max(_top - spread, _bottom + spread), spread); } public boolean isEmpty() { return _right == _left || _top == _bottom; } }