diff --git a/pom.xml b/pom.xml
index 2920712a6..06e97842c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -555,12 +555,12 @@ It pairs really well with Marlin-polargraph, the code in the brain of the robot
org.marginallyclever
donatello
- 1.1
+ 1.2
com.marginallyclever
nodegraphcore
- 1.0.21
+ 1.0.22
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/DonatelloRegistry.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/DonatelloRegistry.java
index cd640086e..441317e95 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/DonatelloRegistry.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/DonatelloRegistry.java
@@ -42,6 +42,7 @@ public void registerNodes() {
NodeFactory.registerNode(AddTurtles.class);
NodeFactory.registerNode(ColorTurtle.class);
NodeFactory.registerNode(LoadTurtle.class);
+ NodeFactory.registerNode(LineWeightByImage.class);
NodeFactory.registerNode(PathImageMask.class);
NodeFactory.registerNode(PatternOnPath.class);
NodeFactory.registerNode(PointOnPath.class);
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/AddTurtles.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/AddTurtles.java
index 20b9ffde2..b1e969c82 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/AddTurtles.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/AddTurtles.java
@@ -1,8 +1,8 @@
package com.marginallyclever.makelangelo.donatelloimpl.nodes;
import com.marginallyclever.makelangelo.turtle.Turtle;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
public class AddTurtles extends Node {
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/ColorTurtle.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/ColorTurtle.java
index 846adf0e5..a01d909db 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/ColorTurtle.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/ColorTurtle.java
@@ -3,8 +3,8 @@
import com.marginallyclever.makelangelo.turtle.MovementType;
import com.marginallyclever.makelangelo.turtle.Turtle;
import com.marginallyclever.makelangelo.turtle.TurtleMove;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
import java.awt.*;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/LineWeightByImage.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/LineWeightByImage.java
new file mode 100644
index 000000000..1158afa64
--- /dev/null
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/LineWeightByImage.java
@@ -0,0 +1,367 @@
+package com.marginallyclever.makelangelo.donatelloimpl.nodes;
+
+import com.marginallyclever.convenience.LineCollection;
+import com.marginallyclever.convenience.LineSegment2D;
+import com.marginallyclever.convenience.Point2D;
+import com.marginallyclever.makelangelo.makeart.TransformedImage;
+import com.marginallyclever.makelangelo.makeart.turtlegenerator.lineweight.LineWeight;
+import com.marginallyclever.makelangelo.makeart.turtlegenerator.lineweight.LineWeightSegment;
+import com.marginallyclever.makelangelo.turtle.Turtle;
+import com.marginallyclever.nodegraphcore.Node;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.vecmath.Vector2d;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Use an image to mask a path. Lay the path over the image and modulate the width of the line by the intensity of the
+ * image at the same location. The fine grain resolution (and the amount of testing) is controlled by the stepSize.
+ * @author Dan Royer
+ * @since 2025-01-07
+ */
+public class LineWeightByImage extends Node {
+ private static final Logger logger = LoggerFactory.getLogger(LineWeightByImage.class);
+
+ private static final double EPSILON = 0.0001;
+
+ private final Input image = new Input<>("image", BufferedImage.class,new BufferedImage(1,1,BufferedImage.TYPE_INT_RGB));
+ private final Input turtle = new Input<>("turtle", Turtle.class,new Turtle());
+ private final Input stepSize = new Input<>("stepSize", Number.class, 5);
+ private final Input thickness = new Input<>("thickness", Number.class, 5);
+ private final Output result = new Output<>("result", Turtle.class,new Turtle());
+
+ private static final LinkedList unsorted = new LinkedList<>();
+
+ // segments sorted for drawing efficiency
+ private static final List sortedLines = new ArrayList<>();
+ private TransformedImage sourceImage = null;
+
+ public LineWeightByImage() {
+ super("LineWeightByImage");
+ addVariable(image);
+ addVariable(turtle);
+ addVariable(stepSize);
+ addVariable(result);
+ addVariable(thickness);
+ }
+
+ @Override
+ public void update() {
+ Turtle myTurtle = turtle.getValue();
+ if(myTurtle==null || myTurtle.history.isEmpty()) return;
+
+ sourceImage = new TransformedImage(image.getValue());
+ sourceImage.setScale(1,1);
+ sourceImage.setTranslation(0,0);
+ Turtle turtle = new Turtle();
+ List colors = myTurtle.splitByToolChange();
+ for( Turtle t2 : colors ) {
+ turtle.add(calculate(t2));
+ }
+
+ result.send(turtle);
+ }
+
+ private Turtle calculate(Turtle from) {
+ Turtle turtle = new Turtle();
+ buildSegmentList(from);
+ sortSegmentsIntoLines();
+ generateThickLines(turtle);
+ //generateThinLines(turtle);
+
+ // clean up
+ unsorted.clear();
+ sortedLines.clear();
+ return turtle;
+ }
+
+ /**
+ * Generate thin lines for debugging
+ * @param turtle the turtle to draw with
+ */
+ private void generateThinLines(Turtle turtle) {
+ logger.debug("generateThinLines {}",sortedLines.size());
+ for(LineWeight line : sortedLines) {
+ boolean first=true;
+ for(LineWeightSegment w : line.segments) {
+ if (first) {
+ turtle.jumpTo(w.start.x, w.start.y);
+ first = false;
+ }
+ turtle.moveTo(w.end.x, w.end.y);
+ }
+ }
+ }
+
+ private void generateThickLines(Turtle turtle) {
+ logger.debug("generateThickLines");
+ for(LineWeight i : sortedLines) {
+ if(i.segments.isEmpty()) continue;
+ generateOneThickLine(turtle,i);
+ }
+ }
+
+ private void generateOneThickLine(Turtle turtle, LineWeight line) {
+ // find the thickest part of the line, which tells us how many cycles we'll have to make.
+ double numPasses=0;
+ for(LineWeightSegment s : line.segments) {
+ numPasses = Math.max(numPasses,s.weight);
+ }
+ numPasses = Math.max(1,Math.ceil(numPasses));
+
+ LineWeightSegment start = line.segments.get(0);
+
+ boolean first=true;
+ // collect all the points, write them at the end.
+ for(int pass=0; pass<=numPasses; ++pass) {
+ double ratio = pass/numPasses;
+ List offsetLine = generateOneThickLinePass(line,start,ratio);
+ if((pass%2)==1) Collections.reverse(offsetLine);
+
+ // draw pass
+ for( Point2D p : offsetLine ) {
+ if(first) {
+ turtle.jumpTo(p.x,p.y);
+ first=false;
+ }
+ turtle.moveTo(p.x,p.y);
+ }
+ }
+ }
+
+ private List generateOneThickLinePass(LineWeight line,LineWeightSegment start,double distance) {
+ List offsetSequence = new ArrayList<>();
+
+ // add first point at start of line
+ double [] s0 = getOffsetLine(start, adjustedOffset(start.weight,distance));
+
+ Vector2d unit = line.segments.get(0).getUnit();
+ unit.scale(distance);
+ offsetSequence.add(new Point2D(s0[0]-unit.x,s0[1]-unit.y));
+
+ // add the middle points of the line
+ for(int i=1;i6 || Math.abs(head.iy-next.iy)>6) return false;
+ if(closeEnough(head.start,next.end)) return true;
+ if(closeEnough(head.start,next.start)) {
+ // next is backwards
+ next.flip();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * @param tail the first line
+ * @param next the second line
+ * @return true if {@link LineWeightSegment} tail and next are in sequence.
+ */
+ private boolean closeEnoughToTail(LineWeightSegment tail, LineWeightSegment next) {
+ if(next==null) {
+ throw new IllegalArgumentException("next is null");
+ }
+ // fast reject if truchet index too far apart
+ if(Math.abs(tail.ix-next.ix)>2 || Math.abs(tail.iy-next.iy)>2) return false;
+ if(closeEnough(tail.end,next.start)) return true;
+ if(closeEnough(tail.end,next.end)) {
+ next.flip();
+ return true;
+ }
+ return false;
+ }
+
+ boolean closeEnough(Point2D p0,Point2D p1) {
+ return p0.distanceSquared(p1) filename = new Input<>("filename",String.class,null);
+ private final Input filename = new Input<>("filename",Filename.class,new Filename(""));
private final Output contents = new Output<>("contents", Turtle.class, new Turtle());
private final Output w = new Output<>("width", Number.class, 0);
private final Output h = new Output<>("height", Number.class, 0);
@@ -27,9 +28,8 @@ public LoadTurtle() {
@Override
public void update() {
-
try {
- Turtle t = TurtleFactory.load(filename.getValue());
+ Turtle t = TurtleFactory.load(filename.getValue().get());
contents.send(t);
Rectangle2D r = t.getBounds();
w.send(r.getWidth());
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PathImageMask.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PathImageMask.java
index 68f7feddd..07cc192d9 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PathImageMask.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PathImageMask.java
@@ -2,8 +2,8 @@
import com.marginallyclever.convenience.*;
import com.marginallyclever.makelangelo.turtle.Turtle;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PatternOnPath.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PatternOnPath.java
index 7c7496d3a..d35d8a5a7 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PatternOnPath.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PatternOnPath.java
@@ -2,8 +2,8 @@
import com.marginallyclever.convenience.Point2D;
import com.marginallyclever.makelangelo.turtle.Turtle;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PointOnPath.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PointOnPath.java
index 221cb3051..595c6a992 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PointOnPath.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PointOnPath.java
@@ -2,8 +2,8 @@
import com.marginallyclever.convenience.Point2D;
import com.marginallyclever.makelangelo.turtle.Turtle;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PrintTurtle.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PrintTurtle.java
index 72e88e0f9..2ed5b5567 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PrintTurtle.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/PrintTurtle.java
@@ -1,15 +1,17 @@
package com.marginallyclever.makelangelo.donatelloimpl.nodes;
+import com.marginallyclever.donatello.graphview.GraphViewPanel;
import com.marginallyclever.makelangelo.turtle.Turtle;
import com.marginallyclever.makelangelo.turtle.TurtleMove;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
import com.marginallyclever.nodegraphcore.Node;
import com.marginallyclever.nodegraphcore.PrintWithGraphics;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import java.awt.*;
public class PrintTurtle extends Node implements PrintWithGraphics {
+ //private static final Logger logger = LoggerFactory.getLogger(PrintTurtle.class);
private final Input turtle = new Input<>("turtle", Turtle.class,new Turtle());
private final Input px = new Input<>("X",Number.class,0);
private final Input py = new Input<>("Y",Number.class,0);
@@ -31,9 +33,12 @@ public void print(Graphics g) {
Turtle myTurtle = turtle.getValue();
if(myTurtle==null || myTurtle.history.isEmpty()) return;
+ Graphics2D g2 = (Graphics2D)g.create();
+ GraphViewPanel.setHints(g2);
+
int dx=px.getValue().intValue();
int dy=py.getValue().intValue();
- g.translate(dx,dy);
+ g2.translate(dx,dy);
// where we're at in the drawing (to check if we're between first & last)
boolean showPenUp = showTravel.getValue();
@@ -56,8 +61,8 @@ public void print(Graphics g) {
case TRAVEL -> {
if (inShow && previousMove != null) {
if (showPenUp) {
- g.setColor(upColor);
- g.drawLine((int) previousMove.x, (int)previousMove.y, (int) m.x, (int) m.y);
+ g2.setColor(upColor);
+ g2.drawLine((int) previousMove.x, (int)previousMove.y, (int) m.x, (int) m.y);
}
}
count++;
@@ -65,23 +70,21 @@ public void print(Graphics g) {
}
case DRAW_LINE -> {
if (inShow && previousMove != null) {
- g.setColor(downColor);
- g.drawLine((int) previousMove.x, (int)previousMove.y, (int) m.x, (int) m.y);
+ g2.setColor(downColor);
+ g2.drawLine((int) previousMove.x, (int)previousMove.y, (int) m.x, (int) m.y);
}
count++;
previousMove = m;
}
case TOOL_CHANGE -> {
downColor = m.getColor();
- ((Graphics2D) g).setStroke(new BasicStroke((int) m.getDiameter()));
+ g2.setStroke(new BasicStroke((int) m.getDiameter()));
}
}
}
}
catch(Exception e) {
- //Log.error(e.getMessage());
+ //logger.error(e.getMessage());
}
-
- g.translate(-dx,-dy);
}
}
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/SaveTurtle.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/SaveTurtle.java
index c982fb56e..c49faf779 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/SaveTurtle.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/SaveTurtle.java
@@ -2,8 +2,8 @@
import com.marginallyclever.makelangelo.plotter.plottersettings.PlotterSettings;
import com.marginallyclever.makelangelo.plotter.plottersettings.PlotterSettingsManager;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
import com.marginallyclever.makelangelo.makeart.io.TurtleFactory;
import com.marginallyclever.makelangelo.turtle.Turtle;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TransformTurtle.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TransformTurtle.java
index 1c6d3fd20..a3d7e09fe 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TransformTurtle.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TransformTurtle.java
@@ -1,7 +1,7 @@
package com.marginallyclever.makelangelo.donatelloimpl.nodes;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
import com.marginallyclever.makelangelo.turtle.Turtle;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TurtleToBufferedImage.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TurtleToBufferedImage.java
index 1f516b174..2f0779fe6 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TurtleToBufferedImage.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TurtleToBufferedImage.java
@@ -2,8 +2,8 @@
import com.marginallyclever.makelangelo.turtle.Turtle;
import com.marginallyclever.makelangelo.turtle.TurtleMove;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
@@ -16,7 +16,7 @@ public class TurtleToBufferedImage extends Node {
private final Output output = new Output<>("output", BufferedImage.class, new BufferedImage(1,1,BufferedImage.TYPE_INT_ARGB));
public TurtleToBufferedImage() {
- super("TurtleToImage");
+ super("TurtleToBufferedImage");
addVariable(turtle);
addVariable(output);
}
@@ -29,7 +29,12 @@ public void update() {
int h = (int)Math.ceil(r.getHeight());
int w = (int)Math.ceil(r.getWidth());
BufferedImage img = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
- Graphics2D g = img.createGraphics();
+ Graphics2D g = (Graphics2D)img.createGraphics();
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
+ g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY);
+ g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_PURE);
+ g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING,RenderingHints.VALUE_COLOR_RENDER_QUALITY);
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g.translate(-r.getX(),-r.getY());
TurtleMove previousMove = null;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TurtleToRectangle.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TurtleToRectangle.java
index 2aa8f7985..51bda6431 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TurtleToRectangle.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/TurtleToRectangle.java
@@ -2,8 +2,8 @@
import com.marginallyclever.makelangelo.turtle.Turtle;
import com.marginallyclever.nodegraphcore.Node;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import java.awt.*;
import java.awt.geom.Rectangle2D;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Circle.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Circle.java
index 8881ad312..26d68998c 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Circle.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Circle.java
@@ -1,8 +1,8 @@
package com.marginallyclever.makelangelo.donatelloimpl.nodes.shapes;
import com.marginallyclever.makelangelo.turtle.Turtle;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
import org.slf4j.Logger;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Line.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Line.java
index 6356c5f82..75b8d7a3e 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Line.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Line.java
@@ -2,8 +2,8 @@
import com.marginallyclever.makelangelo.turtle.Turtle;
import com.marginallyclever.nodegraphcore.*;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/NGon.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/NGon.java
index b1e63a6a6..d695172a5 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/NGon.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/NGon.java
@@ -1,8 +1,8 @@
package com.marginallyclever.makelangelo.donatelloimpl.nodes.shapes;
import com.marginallyclever.makelangelo.turtle.Turtle;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
import org.slf4j.Logger;
diff --git a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Rectangle.java b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Rectangle.java
index 57ddae3e4..51d9df27a 100644
--- a/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Rectangle.java
+++ b/src/main/java/com/marginallyclever/makelangelo/donatelloimpl/nodes/shapes/Rectangle.java
@@ -1,8 +1,8 @@
package com.marginallyclever.makelangelo.donatelloimpl.nodes.shapes;
import com.marginallyclever.makelangelo.turtle.Turtle;
-import com.marginallyclever.nodegraphcore.dock.Input;
-import com.marginallyclever.nodegraphcore.dock.Output;
+import com.marginallyclever.nodegraphcore.port.Input;
+import com.marginallyclever.nodegraphcore.port.Output;
import com.marginallyclever.nodegraphcore.Node;
import org.slf4j.Logger;
diff --git a/src/main/java/com/marginallyclever/makelangelo/makeart/TransformedImage.java b/src/main/java/com/marginallyclever/makelangelo/makeart/TransformedImage.java
index 4342e6771..ebd21a858 100644
--- a/src/main/java/com/marginallyclever/makelangelo/makeart/TransformedImage.java
+++ b/src/main/java/com/marginallyclever/makelangelo/makeart/TransformedImage.java
@@ -221,6 +221,10 @@ public void setScale(float x,float y) {
scaleY = y;
}
+ public void setTranslation(float x,float y) {
+ translateX = x;
+ translateY = y;
+ }
public void setRGB(float x, float y, int c) {
sourceImage.setRGB(getTransformedX(x), getTransformedY(y), c);
diff --git a/src/main/java/com/marginallyclever/makelangelo/makeart/imagefilter/FilterContrastAdjust.java b/src/main/java/com/marginallyclever/makelangelo/makeart/imagefilter/FilterContrastAdjust.java
index 3d3d6ad03..1863a8b89 100644
--- a/src/main/java/com/marginallyclever/makelangelo/makeart/imagefilter/FilterContrastAdjust.java
+++ b/src/main/java/com/marginallyclever/makelangelo/makeart/imagefilter/FilterContrastAdjust.java
@@ -40,16 +40,16 @@ public TransformedImage filter() {
BufferedImage bi = img.getSourceImage();
TransformedImage after = new TransformedImage(img);
BufferedImage afterBI = after.getSourceImage();
-
+ var cm = bi.getColorModel();
for (int y = 0; y < h; ++y) {
for (int x = 0; x < w; ++x) {
int color = bi.getRGB(x, y);
- int red = adjust(red32(color));
- int green = adjust(green32(color));
- int blue = adjust(blue32(color));
- int alpha = alpha32(color);
-
- afterBI.setRGB(x, y, ImageFilter.encode32bit(red,green,blue,alpha));
+ int red = adjust(cm.getRed(color));
+ int green = adjust(cm.getGreen(color));
+ int blue = adjust(cm.getBlue(color));
+ int alpha = cm.getAlpha(color);
+ Color c = new Color(red,green,blue,alpha);
+ afterBI.setRGB(x, y, c.getRGB());
}
}
diff --git a/src/main/java/com/marginallyclever/makelangelo/makeart/imagefilter/ImageFilter.java b/src/main/java/com/marginallyclever/makelangelo/makeart/imagefilter/ImageFilter.java
index 62cbab300..a35353b61 100644
--- a/src/main/java/com/marginallyclever/makelangelo/makeart/imagefilter/ImageFilter.java
+++ b/src/main/java/com/marginallyclever/makelangelo/makeart/imagefilter/ImageFilter.java
@@ -9,48 +9,13 @@
* @author dan Royer
*/
public abstract class ImageFilter {
- protected static int red32(int color) {
- return ((color >> 16) & 0xff);
- }
-
- protected static int green32(int color) {
- return ((color >> 8) & 0xff);
- }
-
- protected static int blue32(int color) {
- return ((color) & 0xff);
- }
-
- protected static int alpha32(int color) {
- return ((color >> 24) & 0xff);
- }
-
/**
* @param color RGBA
* @return grayscale value
*/
public static int decode32bit(int color) {
- int r = red32(color);
- int g = green32(color);
- int b = blue32(color);
- int a = alpha32(color);
-
- return average(r, g, b, a / 255.0);
- }
-
- /**
- * @param red 0-255
- * @param green 0-255
- * @param blue 0-255
- * @param alpha 0-255
- * @return RGB color
- */
- public static int encode32bit(int red,int green,int blue,int alpha) {
- red &= 0xff;
- green &= 0xff;
- blue &= 0xff;
- alpha &= 0xff;
- return (alpha << 24) | (red << 16) | (green << 8) | blue;
+ Color c = new Color(color);
+ return (c.getRed() + c.getGreen() + c.getBlue()) / 3;
}
/**
@@ -59,34 +24,8 @@ public static int encode32bit(int red,int green,int blue,int alpha) {
*/
public static int encode32bit(int greyscale) {
greyscale &= 0xff;
- return encode32bit(greyscale,greyscale,greyscale,0xff);
- }
-
- /**
- * @param color RGBA
- * @return grayscale value
- */
- protected static int decodeColor(Color color) {
- int r = color.getRed();
- int g = color.getGreen();
- int b = color.getBlue();
- int a = color.getAlpha();
- return average(r, g, b, a / 255.0);
- }
-
- /**
- * @param r red
- * @param g green
- * @param b blue
- * @param a alpha
- * @return grayscale value
- */
- private static int average(int r, int g, int b, double a) {
- int r2 = (int)(r * a);
- int g2 = (int)(g * a);
- int b2 = (int)(b * a);
-
- return (r2 + g2 + b2) / 3;
+ Color c = new Color(greyscale,greyscale,greyscale);
+ return c.getRGB();
}
/**
diff --git a/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeight.java b/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeight.java
index 93721f0b7..e3ba68672 100644
--- a/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeight.java
+++ b/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeight.java
@@ -3,7 +3,7 @@
import java.util.Collections;
import java.util.LinkedList;
-class LineWeight {
+public class LineWeight {
public LinkedList segments = new LinkedList<>();
public void flip() {
diff --git a/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeightByImageIntensity.java b/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeightByImageIntensity.java
index 0599fcf09..98df87b3f 100644
--- a/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeightByImageIntensity.java
+++ b/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeightByImageIntensity.java
@@ -25,7 +25,6 @@ public class LineWeightByImageIntensity extends TurtleGenerator {
private static final Logger logger = LoggerFactory.getLogger(LineWeightByImageIntensity.class);
private final double EPSILON = 0.001;
- private final double CORNER_THRESHOLD = Math.cos(Math.toRadians(15));
/**
* must be greater than zero.
diff --git a/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeightSegment.java b/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeightSegment.java
index e98450820..eff739f51 100644
--- a/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeightSegment.java
+++ b/src/main/java/com/marginallyclever/makelangelo/makeart/turtlegenerator/lineweight/LineWeightSegment.java
@@ -8,7 +8,7 @@
* Many segments make up a {@link LineWeight}.
* @author Dan Royer
*/
-class LineWeightSegment {
+public class LineWeightSegment {
public Point2D start, end;
public int ix, iy; // index for faster search
public double weight;
diff --git a/src/test/java/com/marginallyclever/makelangelo/donatelloimpl/TestNodeGraphMakelangelo.java b/src/test/java/com/marginallyclever/makelangelo/donatelloimpl/TestNodeGraphMakelangelo.java
index e872c63de..89a1a066c 100644
--- a/src/test/java/com/marginallyclever/makelangelo/donatelloimpl/TestNodeGraphMakelangelo.java
+++ b/src/test/java/com/marginallyclever/makelangelo/donatelloimpl/TestNodeGraphMakelangelo.java
@@ -3,7 +3,7 @@
import com.marginallyclever.makelangelo.donatelloimpl.nodes.TurtleDAO4JSON;
import com.marginallyclever.makelangelo.turtle.Turtle;
import com.marginallyclever.nodegraphcore.DAO4JSONFactory;
-import com.marginallyclever.nodegraphcore.dock.*;
+import com.marginallyclever.nodegraphcore.port.*;
import com.marginallyclever.nodegraphcore.Graph;
import com.marginallyclever.nodegraphcore.NodeFactory;
import org.junit.jupiter.api.BeforeAll;