diff --git a/src/main/java/de/ph87/kindermalen/drawing/DrawingPanel.java b/src/main/java/de/ph87/kindermalen/drawing/DrawingPanel.java index 97af34e..c7ffdc0 100644 --- a/src/main/java/de/ph87/kindermalen/drawing/DrawingPanel.java +++ b/src/main/java/de/ph87/kindermalen/drawing/DrawingPanel.java @@ -26,24 +26,13 @@ public class DrawingPanel extends JPanel { } private void onPress(final MouseEvent e) { - lastPoint = new Vector(e.getPoint()); drawing.getCurrent().newRevision(); - toolBox.getTool().apply(drawing.getCurrent().getCurrent(), e.getX(), e.getY()); + lastPoint = toolBox.getTool().apply(null, drawing.getCurrent().getCurrent(), new Vector(e.getPoint())); repaint(); } private void onDrag(final MouseEvent e) { - final Vector vector = new Vector(lastPoint, e.getPoint()); - int i = 0; - for (int rest = (int) Math.floor(vector.length); rest >= 20; rest -= 20) { - System.out.println(rest); - toolBox.getTool().apply(drawing.getCurrent().getCurrent(), e.getX(), e.getY()); - lastPoint = lastPoint.plus(vector.withLength(20)); - i++; - if (i > 100) { - break; - } - } + lastPoint = toolBox.getTool().apply(lastPoint, drawing.getCurrent().getCurrent(), new Vector(e.getPoint())); repaint(); } diff --git a/src/main/java/de/ph87/kindermalen/drawing/Layer.java b/src/main/java/de/ph87/kindermalen/drawing/Layer.java index 9cac284..f370f27 100644 --- a/src/main/java/de/ph87/kindermalen/drawing/Layer.java +++ b/src/main/java/de/ph87/kindermalen/drawing/Layer.java @@ -31,7 +31,10 @@ public class Layer { public void newRevision() { if (canRedo()) { - history = history.subList(0, index + 1); + final int old = history.size(); + final int keep = index + 1; + history = history.subList(0, keep); + log.info("{} Revisions deleted", old - keep); } current = copy(); index = history.size(); diff --git a/src/main/java/de/ph87/kindermalen/drawing/Vector.java b/src/main/java/de/ph87/kindermalen/drawing/Vector.java index c0805cb..b811bbf 100644 --- a/src/main/java/de/ph87/kindermalen/drawing/Vector.java +++ b/src/main/java/de/ph87/kindermalen/drawing/Vector.java @@ -14,7 +14,7 @@ public class Vector { this(point.x, point.y); } - public Vector(final Vector start, final Point end) { + public Vector(final Vector start, final Vector end) { this(end.x - start.x, end.y - start.y); } @@ -26,11 +26,19 @@ public class Vector { public Vector withLength(final double newLength) { final double factor = newLength / length; - return new Vector(x / factor, y / factor); + return new Vector(x * factor, y * factor); } public Vector plus(final Vector other) { return new Vector(x + other.x, y + other.y); } + public int intY() { + return (int) Math.round(y); + } + + public int intX() { + return (int) Math.round(x); + } + } diff --git a/src/main/java/de/ph87/kindermalen/tool/Tool.java b/src/main/java/de/ph87/kindermalen/tool/Tool.java index a6d9aee..7a864aa 100644 --- a/src/main/java/de/ph87/kindermalen/tool/Tool.java +++ b/src/main/java/de/ph87/kindermalen/tool/Tool.java @@ -1,5 +1,6 @@ package de.ph87.kindermalen.tool; +import de.ph87.kindermalen.drawing.Vector; import lombok.Getter; import java.awt.image.BufferedImage; @@ -13,6 +14,6 @@ public abstract class Tool { this.name = name; } - public abstract void apply(final BufferedImage image, final int x, final int y); + public abstract Vector apply(final Vector last, final BufferedImage image, final Vector point); } diff --git a/src/main/java/de/ph87/kindermalen/tool/stamp/StampTool.java b/src/main/java/de/ph87/kindermalen/tool/stamp/StampTool.java index 1a268ce..07e0aa9 100644 --- a/src/main/java/de/ph87/kindermalen/tool/stamp/StampTool.java +++ b/src/main/java/de/ph87/kindermalen/tool/stamp/StampTool.java @@ -1,5 +1,6 @@ package de.ph87.kindermalen.tool.stamp; +import de.ph87.kindermalen.drawing.Vector; import de.ph87.kindermalen.tool.Tool; import lombok.Getter; import lombok.ToString; @@ -91,8 +92,22 @@ public class StampTool extends Tool { } @Override - public void apply(final BufferedImage destination, final int x, final int y) { - destination.getGraphics().drawImage(prepared, x - prepared.getWidth() / 2, y - prepared.getHeight() / 2, null); + public Vector apply(Vector last, final BufferedImage destination, final Vector current) { + if (last == null) { + apply(destination, current); + return current; + } + final Vector vector = new Vector(last, current); + for (int rest = (int) Math.floor(vector.length); rest >= 20; rest -= 20) { + final Vector point = last.plus(vector.withLength(20)); + apply(destination, point); + last = point; + } + return last; + } + + private void apply(final BufferedImage destination, final Vector point) { + destination.getGraphics().drawImage(prepared, point.intX() - prepared.getWidth() / 2, point.intY() - prepared.getHeight() / 2, null); } }