shared/java/PathSegment.java (81 lines of code) (raw):

package org.jetbrains.skija; import lombok.AllArgsConstructor; import lombok.Getter; import java.util.Objects; @AllArgsConstructor @Getter public class PathSegment { public final PathVerb _verb; public final Point _p0; public final Point _p1; public final Point _p2; public final Point _p3; public final float _conicWeight; public final boolean _closeLine; public final boolean _closedContour; public PathSegment() { this(PathVerb.DONE, null, null, null, null, 0f, false, false); } public PathSegment(int verbOrdinal, float x0, float y0, boolean isClosedContour) { this(PathVerb._values[verbOrdinal], new Point(x0, y0), null, null, null, 0f, false, isClosedContour); assert verbOrdinal == PathVerb.MOVE.ordinal() || verbOrdinal == PathVerb.CLOSE.ordinal() : "Expected MOVE or CLOSE, got " + PathVerb._values[verbOrdinal]; } public PathSegment(float x0, float y0, float x1, float y1, boolean isCloseLine, boolean isClosedContour) { this(PathVerb.LINE, new Point(x0, y0), new Point(x1, y1), null, null, 0f, isCloseLine, isClosedContour); } public PathSegment(float x0, float y0, float x1, float y1, float x2, float y2, boolean isClosedContour) { this(PathVerb.QUAD, new Point(x0, y0), new Point(x1, y1), new Point(x2, y2), null, 0f, false, isClosedContour); } public PathSegment(float x0, float y0, float x1, float y1, float x2, float y2, float conicWeight, boolean isClosedContour) { this(PathVerb.CONIC, new Point(x0, y0), new Point(x1, y1), new Point(x2, y2), null, conicWeight, false, isClosedContour); } public PathSegment(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, boolean isClosedContour) { this(PathVerb.CUBIC, new Point(x0, y0), new Point(x1, y1), new Point(x2, y2), new Point(x3, y3), 0f, false, isClosedContour); } @Override public String toString() { return "Segment(" + "verb=" + _verb + (_verb != PathVerb.DONE ? ", p0=" + _p0 : "") + (_verb == PathVerb.LINE || _verb == PathVerb.QUAD || _verb == PathVerb.CONIC || _verb == PathVerb.CUBIC ? ", p1=" + _p1 : "") + (_verb == PathVerb.QUAD || _verb == PathVerb.CONIC || _verb == PathVerb.CUBIC ? ", p2=" + _p2 : "") + (_verb == PathVerb.CUBIC ? ", p3=" + _p3 : "") + (_verb == PathVerb.CONIC ? ", conicWeight=" + _conicWeight : "") + (_verb == PathVerb.LINE ? ", closeLine=" + _closeLine : "") + (_verb != PathVerb.DONE ? ", closedContour=" + _closedContour : "") + ")"; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PathSegment segment = (PathSegment) o; return _verb == segment._verb && (_verb != PathVerb.DONE ? Objects.equals(_p0, segment._p0) : true) && (_verb == PathVerb.LINE || _verb == PathVerb.QUAD || _verb == PathVerb.CONIC || _verb == PathVerb.CUBIC ? Objects.equals(_p1, segment._p1) : true) && (_verb == PathVerb.QUAD || _verb == PathVerb.CONIC || _verb == PathVerb.CUBIC ? Objects.equals(_p2, segment._p2) : true) && (_verb == PathVerb.CUBIC ? Objects.equals(_p3, segment._p3) : true) && (_verb == PathVerb.CONIC ? Float.compare(segment._conicWeight, _conicWeight) == 0 : true) && (_verb == PathVerb.LINE ? _closeLine == segment._closeLine : true) && (_verb != PathVerb.DONE ? _closedContour == segment._closedContour : true); } @Override public int hashCode() { switch (_verb) { case DONE: return Objects.hash(_verb); case MOVE: return Objects.hash(_verb, _p0, _closedContour); case LINE: return Objects.hash(_verb, _p0, _p1, _closeLine, _closedContour); case QUAD: return Objects.hash(_verb, _p0, _p1, _p2, _closedContour); case CONIC: return Objects.hash(_verb, _p0, _p1, _p2, _conicWeight, _closedContour); case CUBIC: return Objects.hash(_verb, _p0, _p1, _p2, _p3, _closedContour); default: throw new RuntimeException("Unreachable"); } } }