diff --git a/src/com/annimon/graphics/Clip.java b/src/com/annimon/graphics/Clip.java index e7a6d37..534166c 100644 --- a/src/com/annimon/graphics/Clip.java +++ b/src/com/annimon/graphics/Clip.java @@ -24,6 +24,50 @@ public class Clip extends Rect { return y + height; } + public double[] clip(double x1, double y1, double x2, double y2) { + int c1 = getClipCode(x1, y1); + int c2 = getClipCode(x2, y2); + while (c1 != 0 || (c2 != 0)) { + if (c1 == 0 && c2 == 0) { + return new double[] { x1, y1, x2, y2 }; + } + double dx = x2 - x1; + double dy = y2 - y1; + if (c1 != 0) { + if (x1 < x) { + y1 += dy * (x - x1) / dx; + x1 = x; + } else if (x1 > getXMax()) { + y1 += dy * (getXMax() - x1) / dx; + x1 = getXMax(); + } else if (y1 < y) { + x1 += dx * (y - y1) / dy; + y1 = y; + } else if (y1 > getYMax()) { + x1 += dx * (getYMax() - y1) / dy; + y1 = getYMax(); + } + c1 = getClipCode(x1, y1); + } else if (c2 != 0) { + if (x2 < x) { + y2 += dy * (x - x2) / dx; + x2 = x; + } else if (x2 > getXMax()) { + y2 += dy * (getXMax() - x2) / dx; + x2 = getXMax(); + } else if (y2 < y) { + x2 += dx * (y - y2) / dy; + y2 = y; + } else if (y2 > getYMax()) { + x2 += dx * (getYMax() - y2) / dy; + y2 = getYMax(); + } + c2 = getClipCode(x2, y2); + } + } + return new double[] { x1, y1, x2, y2 }; + } + public int getClipCode(double x, double y) { int xmin = (x < super.x) ? 1 : 0; int xmax = (x > getXMax()) ? 1 : 0;