shared/java/RRect.java (84 lines of code) (raw):
package org.jetbrains.skija;
import java.util.*;
import lombok.*;
import org.jetbrains.annotations.*;
@EqualsAndHashCode(callSuper = true)
public class RRect extends Rect {
public final float[] _radii;
@ApiStatus.Internal
public RRect(float l, float t, float r, float b, float[] radii) {
super(l, t, r, b);
this._radii = radii;
}
public static RRect makeLTRB(float l, float t, float r, float b, float radius) {
return new RRect(l, t, r, b, new float[] { radius } );
}
public static RRect makeLTRB(float l, float t, float r, float b, float xRad, float yRad) {
return new RRect(l, t, r, b, new float[] { xRad, yRad } );
}
public static RRect makeLTRB(float l, float t, float r, float b, float tlRad, float trRad, float brRad, float blRad) {
return new RRect(l, t, r, b, new float[] { tlRad, trRad, brRad, blRad });
}
public static RRect makeNinePatchLTRB(float l, float t, float r, float b, float lRad, float tRad, float rRad, float bRad) {
return new RRect(l, t, r, b, new float[] { lRad, tRad, rRad, tRad, rRad, bRad, lRad, bRad });
}
public static RRect makeComplexLTRB(float l, float t, float r, float b, float[] radii) {
return new RRect(l, t, r, b, radii);
}
public static RRect makeOvalLTRB(float l, float t, float r, float b) {
return new RRect(l, t, r, b, new float[] { Math.abs(r - l) / 2f, Math.abs(b - t) / 2f } );
}
public static RRect makePillLTRB(float l, float t, float r, float b) {
return new RRect(l, t, r, b, new float[] { Math.min(Math.abs(r - l), Math.abs(t - b)) / 2f } );
}
public static RRect makeXYWH(float l, float t, float w, float h, float radius) {
return new RRect(l, t, l + w, t + h, new float[] { radius } );
}
public static RRect makeXYWH(float l, float t, float w, float h, float xRad, float yRad) {
return new RRect(l, t, l + w, t + h, new float[] { xRad, yRad } );
}
public static RRect makeXYWH(float l, float t, float w, float h, float tlRad, float trRad, float brRad, float blRad) {
return new RRect(l, t, l + w, t + h, new float[] { tlRad, trRad, brRad, blRad });
}
public static RRect makeNinePatchXYWH(float l, float t, float w, float h, float lRad, float tRad, float rRad, float bRad) {
return new RRect(l, t, l + w, t + h, new float[] { lRad, tRad, rRad, tRad, rRad, bRad, lRad, bRad });
}
public static RRect makeComplexXYWH(float l, float t, float w, float h, float[] radii) {
return new RRect(l, t, l + w, t + h, radii);
}
public static RRect makeOvalXYWH(float l, float t, float w, float h) {
return new RRect(l, t, l + w, t + h, new float[] { w / 2f, h / 2f } );
}
public static RRect makePillXYWH(float l, float t, float w, float h) {
return new RRect(l, t, l + w, t + h, new float[] { Math.min(w, h) / 2f } );
}
@Override @NotNull
public Rect inflate(float spread) {
boolean becomesRect = true;
for (int i = 0; i < _radii.length; ++i) {
if (_radii[i] + spread >= 0) {
becomesRect = false;
break;
}
}
if (becomesRect)
return Rect.makeLTRB(_left - spread,
_top - spread,
Math.max(_left - spread, _right + spread),
Math.max(_top - spread, _bottom + spread));
else {
float[] radii = Arrays.copyOf(_radii, _radii.length);
for (int i = 0; i < radii.length; ++i)
radii[i] = Math.max(0f, radii[i] + spread);
return new RRect(_left - spread,
_top - spread,
Math.max(_left - spread, _right + spread),
Math.max(_top - spread, _bottom + spread),
radii);
}
}
@Override
public String toString() {
return "RRect(_left=" + _left + ", _top=" + _top + ", _right=" + _right + ", _bottom=" + _bottom + ", _radii=" + Arrays.toString(_radii) + ")";
}
}