Improved precision of rendering

This commit is contained in:
Bane Stojkovic
2026-06-10 17:19:21 +02:00
parent 9179086bd5
commit 1d7dd87d85
57 changed files with 1505 additions and 1460 deletions
@@ -386,8 +386,8 @@ public class DrawingManager {
g2dWrapper.setColor(CONTROL_POINT_COLOR); g2dWrapper.setColor(CONTROL_POINT_COLOR);
Point2D controlPoint = component.getControlPoint(i); Point2D controlPoint = component.getControlPoint(i);
int pointSize = CONTROL_POINT_SIZE - 2; int pointSize = CONTROL_POINT_SIZE - 2;
g2dWrapper.fillOval((int) (controlPoint.getX() - pointSize / 2), g2dWrapper.fillOval((int) Math.round(controlPoint.getX() - pointSize / 2),
(int) (controlPoint.getY() - pointSize / 2), pointSize, pointSize); (int) Math.round(controlPoint.getY() - pointSize / 2), pointSize, pointSize);
} }
} }
} }
@@ -403,11 +403,11 @@ public class DrawingManager {
int pointSize = CONTROL_POINT_SIZE; int pointSize = CONTROL_POINT_SIZE;
g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR.darker()); g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR.darker());
g2dWrapper.fillOval((int) (controlPoint.getX() - pointSize / 2), g2dWrapper.fillOval((int) Math.round(controlPoint.getX() - pointSize / 2),
(int) (controlPoint.getY() - pointSize / 2), pointSize, pointSize); (int) Math.round(controlPoint.getY() - pointSize / 2), pointSize, pointSize);
g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR); g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR);
g2dWrapper.fillOval((int) (controlPoint.getX() - CONTROL_POINT_SIZE / 2 + 1), g2dWrapper.fillOval((int) Math.round(controlPoint.getX() - CONTROL_POINT_SIZE / 2 + 1),
(int) (controlPoint.getY() - CONTROL_POINT_SIZE / 2 + 1), CONTROL_POINT_SIZE - 2, (int) Math.round(controlPoint.getY() - CONTROL_POINT_SIZE / 2 + 1), CONTROL_POINT_SIZE - 2,
CONTROL_POINT_SIZE - 2); CONTROL_POINT_SIZE - 2);
} }
} }
@@ -437,12 +437,12 @@ public class DrawingManager {
for (Point2D point : controlPointSlot) { for (Point2D point : controlPointSlot) {
if (point != null) { if (point != null) {
g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR.darker()); g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR.darker());
g2dWrapper.fillOval((int) (point.getX() - CONTROL_POINT_SIZE / 2), g2dWrapper.fillOval((int) Math.round(point.getX() - CONTROL_POINT_SIZE / 2),
(int) (point.getY() - CONTROL_POINT_SIZE / 2), CONTROL_POINT_SIZE, (int) Math.round(point.getY() - CONTROL_POINT_SIZE / 2), CONTROL_POINT_SIZE,
CONTROL_POINT_SIZE); CONTROL_POINT_SIZE);
g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR); g2dWrapper.setColor(SELECTED_CONTROL_POINT_COLOR);
g2dWrapper.fillOval((int) (point.getX() - CONTROL_POINT_SIZE / 2 + 1), g2dWrapper.fillOval((int) Math.round(point.getX() - CONTROL_POINT_SIZE / 2 + 1),
(int) (point.getY() - CONTROL_POINT_SIZE / 2 + 1), CONTROL_POINT_SIZE - 2, (int) Math.round(point.getY() - CONTROL_POINT_SIZE / 2 + 1), CONTROL_POINT_SIZE - 2,
CONTROL_POINT_SIZE - 2); CONTROL_POINT_SIZE - 2);
} }
} }
@@ -1289,8 +1289,8 @@ public class Presenter implements IPlugInPort {
// If there's no selection, the only thing to do is update the // If there's no selection, the only thing to do is update the
// selection rectangle and refresh. // selection rectangle and refresh.
Rectangle oldSelectionRect = selectionRect == null ? null : new Rectangle(selectionRect); Rectangle oldSelectionRect = selectionRect == null ? null : new Rectangle(selectionRect);
this.selectionRect = Utils.createRectangle(new Point((int)scaledPoint.getX(), (int)scaledPoint.getY()), this.selectionRect = Utils.createRectangle(new Point((int) Math.round(scaledPoint.getX()), (int) Math.round(scaledPoint.getY())),
new Point((int)previousDragPoint.getX(), (int)previousDragPoint.getY())); new Point((int) Math.round(previousDragPoint.getX()), (int) Math.round(previousDragPoint.getY())));
if (selectionRect.equals(oldSelectionRect)) { if (selectionRect.equals(oldSelectionRect)) {
return true; return true;
} }
@@ -1621,8 +1621,8 @@ public class Presenter implements IPlugInPort {
// If there's no selection finalize selectionRect and see which // If there's no selection finalize selectionRect and see which
// components intersect with it. // components intersect with it.
if (scaledPoint != null && previousDragPoint != null) { if (scaledPoint != null && previousDragPoint != null) {
this.selectionRect = Utils.createRectangle(new Point((int)scaledPoint.getX(), (int)scaledPoint.getY()), this.selectionRect = Utils.createRectangle(new Point((int) Math.round(scaledPoint.getX()), (int) Math.round(scaledPoint.getY())),
new Point((int)previousDragPoint.getX(), (int)previousDragPoint.getY()));; new Point((int) Math.round(previousDragPoint.getX()), (int) Math.round(previousDragPoint.getY())));;
} }
List<IDIYComponent<?>> newSelection = new ArrayList<IDIYComponent<?>>(); List<IDIYComponent<?>> newSelection = new ArrayList<IDIYComponent<?>>();
if (operationMode != OperationMode.HIGHLIGHT_CONNECTED_AREAS) if (operationMode != OperationMode.HIGHLIGHT_CONNECTED_AREAS)
@@ -32,6 +32,8 @@ import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import org.diylc.utils.MathUtils;
/** /**
* Serializes {@link Area} objects by converting coordinates from pixels to inches, thus avoiding * Serializes {@link Area} objects by converting coordinates from pixels to inches, thus avoiding
* the resolution to affect point placement. * the resolution to affect point placement.
@@ -66,7 +68,7 @@ public class AreaConverter implements Converter {
} }
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
writer.startNode("coordinate"); writer.startNode("coordinate");
writer.setValue(String.valueOf(coord[i])); writer.setValue(MathUtils.formatDouble(coord[i]));
writer.endNode(); writer.endNode();
} }
writer.endNode(); writer.endNode();
@@ -87,7 +89,7 @@ public class AreaConverter implements Converter {
List<java.lang.Double> values = new ArrayList<java.lang.Double>(); List<java.lang.Double> values = new ArrayList<java.lang.Double>();
while (reader.hasMoreChildren()) { while (reader.hasMoreChildren()) {
reader.moveDown(); reader.moveDown();
values.add(java.lang.Double.parseDouble(reader.getValue())); values.add(MathUtils.parseDouble(reader.getValue()));
reader.moveUp(); reader.moveUp();
} }
java.lang.Double[] coord = values.toArray(new java.lang.Double[0]); java.lang.Double[] coord = values.toArray(new java.lang.Double[0]);
@@ -30,6 +30,7 @@ import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import org.diylc.utils.Constants; import org.diylc.utils.Constants;
import org.diylc.utils.MathUtils;
/** /**
* Serializes {@link Point2D} objects by converting coordinates from pixels to inches, thus avoiding * Serializes {@link Point2D} objects by converting coordinates from pixels to inches, thus avoiding
@@ -42,26 +43,27 @@ public class PointConverter implements Converter {
@Override @Override
public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext context) { public void marshal(Object object, HierarchicalStreamWriter writer, MarshallingContext context) {
Point2D point = (Point2D) object; Point2D point = (Point2D) object;
writer.addAttribute("x", Double.toString(1d * point.getX() / Constants.PIXELS_PER_INCH)); writer.addAttribute("x", MathUtils.formatDouble(1d * point.getX() / Constants.PIXELS_PER_INCH));
writer.addAttribute("y", Double.toString(1d * point.getY() / Constants.PIXELS_PER_INCH)); writer.addAttribute("y", MathUtils.formatDouble(1d * point.getY() / Constants.PIXELS_PER_INCH));
} }
@Override @Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
double x; double x;
double y; double y;
if (reader.hasMoreChildren()) { if (reader.hasMoreChildren()) {
reader.moveDown(); reader.moveDown();
x = Double.parseDouble(reader.getValue()); x = MathUtils.parseDouble(reader.getValue());
reader.moveUp(); reader.moveUp();
reader.moveDown(); reader.moveDown();
y = Double.parseDouble(reader.getValue()); y = MathUtils.parseDouble(reader.getValue());
reader.moveUp(); reader.moveUp();
return new Point2D.Double(x, y); return new Point2D.Double(x, y);
} else { } else {
x = Double.parseDouble(reader.getAttribute("x")); x = MathUtils.round(Double.parseDouble(reader.getAttribute("x")) * Constants.PIXELS_PER_INCH);
y = Double.parseDouble(reader.getAttribute("y")); y = MathUtils.round(Double.parseDouble(reader.getAttribute("y")) * Constants.PIXELS_PER_INCH);
return new Point2D.Double(x * Constants.PIXELS_PER_INCH, y * Constants.PIXELS_PER_INCH); return new Point2D.Double(x, y);
} }
} }
@@ -0,0 +1,37 @@
/*
DIY Layout Creator (DIYLC).
Copyright (c) 2009-2025 held jointly by the individual authors.
This file is part of DIYLC.
DIYLC is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DIYLC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DIYLC. If not, see <http://www.gnu.org/licenses/>.
*/
package org.diylc.utils;
public class MathUtils {
public static String formatDouble(double value) {
return Double.toString(Math.round(value * 1e8) / 1e8);
}
public static Double round(double value) {
return Math.round(value * 1e8) / 1e8;
}
public static double parseDouble(String str) {
return Math.round(Double.parseDouble(str) * 1e8) / 1e8;
}
}
@@ -397,6 +397,10 @@
<changeType>NEW_FEATURE</changeType> <changeType>NEW_FEATURE</changeType>
<description>Detect the style of a treble bleed based on the topology and component values (e.g. Fender, DiMarzio, Kinman, etc)</description> <description>Detect the style of a treble bleed based on the topology and component values (e.g. Fender, DiMarzio, Kinman, etc)</description>
</org.diylc.appframework.update.Change> </org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change>
<changeType>IMPROVEMENT</changeType>
<description>Improved precision of rendering, in some cases there was a sub-pixel misalignment between the lines that should meet exactly</description>
</org.diylc.appframework.update.Change>
<org.diylc.appframework.update.Change> <org.diylc.appframework.update.Change>
<changeType>BUG_FIX</changeType> <changeType>BUG_FIX</changeType>
<description>Tone capacitor mistaken for treble bleed when connected to the input lug of the volume pot</description> <description>Tone capacitor mistaken for treble bleed when connected to the input lug of the volume pot</description>
@@ -158,7 +158,7 @@ public class MockDIYComponent extends AbstractComponent<Capacitance> {
public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project,
IDrawingObserver drawingObserver) { IDrawingObserver drawingObserver) {
g2d.setColor(componentState.equals(ComponentState.SELECTED) ? color : color.darker()); g2d.setColor(componentState.equals(ComponentState.SELECTED) ? color : color.darker());
g2d.fillRect((int)leftTopCorner.getX(), (int)leftTopCorner.getY(), 200, 50); g2d.fillRect((int) Math.round(leftTopCorner.getX()), (int) Math.round(leftTopCorner.getY()), 200, 50);
} }
@Override @Override
@@ -90,7 +90,7 @@ public abstract class AbstractBoard extends AbstractTransparentComponent<String>
Composite oldComposite = applyAlpha(g2d, componentState); Composite oldComposite = applyAlpha(g2d, componentState);
g2d.setColor(boardColor); g2d.setColor(boardColor);
g2d.fillRect((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY())); g2d.fillRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY()));
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
// Do not track any changes that follow because the whole board has been // Do not track any changes that follow because the whole board has been
@@ -98,7 +98,7 @@ public abstract class AbstractBoard extends AbstractTransparentComponent<String>
drawingObserver.stopTracking(); drawingObserver.stopTracking();
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: borderColor); : borderColor);
g2d.drawRect((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY())); g2d.drawRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY()));
} }
protected Point2D getFinalSecondPoint() { protected Point2D getFinalSecondPoint() {
@@ -178,7 +178,7 @@ public abstract class AbstractBoard extends AbstractTransparentComponent<String>
HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM); HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM);
if (getCoordinateDisplay() == CoordinateDisplay.Both_Sides) { if (getCoordinateDisplay() == CoordinateDisplay.Both_Sides) {
StringUtils.drawCenteredText(g2d, label, StringUtils.drawCenteredText(g2d, label,
x, (int) (finalSecondPoint.getY() - COORDINATE_FONT_SIZE), x, (int) Math.round(finalSecondPoint.getY() - COORDINATE_FONT_SIZE),
HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM); HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM);
} }
} }
@@ -73,9 +73,9 @@ public class BlankBoard extends AbstractBoard {
Composite oldComposite = applyAlpha(g2d, componentState); Composite oldComposite = applyAlpha(g2d, componentState);
g2d.setColor(boardColor); g2d.setColor(boardColor);
if (getType() == Type.SQUARE) if (getType() == Type.SQUARE)
g2d.fillRect((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY())); g2d.fillRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY()));
else else
g2d.fillOval((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY())); g2d.fillOval((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY()));
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
// } // }
// Do not track any changes that follow because the whole board has been // Do not track any changes that follow because the whole board has been
@@ -84,9 +84,9 @@ public class BlankBoard extends AbstractBoard {
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: borderColor); : borderColor);
if (getType() == Type.SQUARE) if (getType() == Type.SQUARE)
g2d.drawRect((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY())); g2d.drawRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY()));
else else
g2d.drawOval((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY())); g2d.drawOval((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(finalSecondPoint.getX() - firstPoint.getX()), (int)(finalSecondPoint.getY() - firstPoint.getY()));
} }
@Override @Override
@@ -122,15 +122,15 @@ public class Breadboard extends AbstractProtoBoard {
// draw lines // draw lines
g2d.setColor(PLUS_COLOR); g2d.setColor(PLUS_COLOR);
g2d.drawLine((int) (point.getX() + spacing), (int) (point.getY() + spacing), (int) (point.getX() + spacing), g2d.drawLine((int) Math.round(point.getX() + spacing), (int) Math.round(point.getY() + spacing), (int) Math.round(point.getX() + spacing),
(int) (point.getY() + holeCount * spacing)); (int) Math.round(point.getY() + holeCount * spacing));
g2d.drawLine((int) (point.getX() + 19 * spacing), (int) (point.getY() + spacing), (int) (point.getX() + 19 * spacing), g2d.drawLine((int) Math.round(point.getX() + 19 * spacing), (int) Math.round(point.getY() + spacing), (int) Math.round(point.getX() + 19 * spacing),
(int) (point.getY() + holeCount * spacing)); (int) Math.round(point.getY() + holeCount * spacing));
g2d.setColor(MINUS_COLOR); g2d.setColor(MINUS_COLOR);
g2d.drawLine((int) (point.getX() + 4 * spacing), (int) (point.getY() + spacing), (int) (point.getX() + 4 * spacing), g2d.drawLine((int) Math.round(point.getX() + 4 * spacing), (int) Math.round(point.getY() + spacing), (int) Math.round(point.getX() + 4 * spacing),
(int) (point.getY() + holeCount * spacing)); (int) Math.round(point.getY() + holeCount * spacing));
g2d.drawLine((int) (point.getX() + 22 * spacing), (int) (point.getY() + spacing), (int) (point.getX() + 22 * spacing), g2d.drawLine((int) Math.round(point.getX() + 22 * spacing), (int) Math.round(point.getY() + spacing), (int) Math.round(point.getX() + 22 * spacing),
(int) (point.getY() + holeCount * spacing)); (int) Math.round(point.getY() + holeCount * spacing));
int holeSize = getClosestOdd(HOLE_SIZE.convertToPixels()); int holeSize = getClosestOdd(HOLE_SIZE.convertToPixels());
int holeArc = (int) HOLE_ARC.convertToPixels(); int holeArc = (int) HOLE_ARC.convertToPixels();
@@ -146,9 +146,9 @@ public class Breadboard extends AbstractProtoBoard {
g2d.setColor(COORDINATE_COLOR); g2d.setColor(COORDINATE_COLOR);
int coordinateX; int coordinateX;
if (section == 0) { if (section == 0) {
coordinateX = (int) (point.getX() + offset + 5.5 * spacing); coordinateX = (int) Math.round(point.getX() + offset + 5.5 * spacing);
} else { } else {
coordinateX = (int) (point.getX() + offset + 10.5 * spacing); coordinateX = (int) Math.round(point.getX() + offset + 10.5 * spacing);
} }
StringUtils.drawCenteredText(g2d, String.valueOf(y + 1), coordinateX, (int) (point.getY() + (y + 1) * spacing), StringUtils.drawCenteredText(g2d, String.valueOf(y + 1), coordinateX, (int) (point.getY() + (y + 1) * spacing),
section == 0 ? HorizontalAlignment.RIGHT : HorizontalAlignment.LEFT, VerticalAlignment.CENTER); section == 0 ? HorizontalAlignment.RIGHT : HorizontalAlignment.LEFT, VerticalAlignment.CENTER);
@@ -163,9 +163,9 @@ public class Breadboard extends AbstractProtoBoard {
// Draw horizontal labels // Draw horizontal labels
if (y == 0) { if (y == 0) {
g2d.setColor(COORDINATE_COLOR); g2d.setColor(COORDINATE_COLOR);
StringUtils.drawCenteredText(g2d, new String(new byte[] {(byte) (a + x + 5 * section)}), holeX, (int) (point.getY() + COORDINATE_FONT_SIZE), StringUtils.drawCenteredText(g2d, new String(new byte[] {(byte) (a + x + 5 * section)}), holeX, (int) Math.round(point.getY() + COORDINATE_FONT_SIZE),
HorizontalAlignment.CENTER, VerticalAlignment.TOP); HorizontalAlignment.CENTER, VerticalAlignment.TOP);
StringUtils.drawCenteredText(g2d, new String(new byte[] {(byte) (a + x + 5 * section)}), holeX, (int) (point.getY() StringUtils.drawCenteredText(g2d, new String(new byte[] {(byte) (a + x + 5 * section)}), holeX, (int) Math.round(point.getY()
+ spacing * 31 - COORDINATE_FONT_SIZE / 2), HorizontalAlignment.CENTER, VerticalAlignment.TOP); + spacing * 31 - COORDINATE_FONT_SIZE / 2), HorizontalAlignment.CENTER, VerticalAlignment.TOP);
} }
} }
@@ -218,15 +218,15 @@ public class Breadboard extends AbstractProtoBoard {
g2d.setColor(COORDINATE_COLOR); g2d.setColor(COORDINATE_COLOR);
int coordinateX; int coordinateX;
if (section == 0) { if (section == 0) {
coordinateX = (int) (point.getX() + offset + 5.5 * spacing); coordinateX = (int) Math.round(point.getX() + offset + 5.5 * spacing);
} else { } else {
coordinateX = (int) (point.getX() + offset + 10.5 * spacing); coordinateX = (int) Math.round(point.getX() + offset + 10.5 * spacing);
} }
StringUtils.drawCenteredText(g2d, String.valueOf(y + 1), coordinateX, (int) (point.getY() + (y + 1) * spacing), StringUtils.drawCenteredText(g2d, String.valueOf(y + 1), coordinateX, (int) (point.getY() + (y + 1) * spacing),
section == 0 ? HorizontalAlignment.RIGHT : HorizontalAlignment.LEFT, VerticalAlignment.CENTER); section == 0 ? HorizontalAlignment.RIGHT : HorizontalAlignment.LEFT, VerticalAlignment.CENTER);
// for (int x = 0; x < 5; x++) { // for (int x = 0; x < 5; x++) {
int holeX1 = (int) (point.getX() + offset + 6 * spacing); int holeX1 = (int) Math.round(point.getX() + offset + 6 * spacing);
int holeX2 = (int) (point.getX() + offset + 10 * spacing); int holeX2 = (int) Math.round(point.getX() + offset + 10 * spacing);
int holeY = (int) (point.getY() + (y + 1) * spacing); int holeY = (int) (point.getY() + (y + 1) * spacing);
g2d.setColor(HOLE_COLOR); g2d.setColor(HOLE_COLOR);
g2d.fillRoundRect(holeX1 - holeSize / 2, holeY - holeSize / 2, holeSize + holeX2 - holeX1, holeSize, holeArc, holeArc); g2d.fillRoundRect(holeX1 - holeSize / 2, holeY - holeSize / 2, holeSize + holeX2 - holeX1, holeSize, holeArc, holeArc);
@@ -329,9 +329,9 @@ public class EurorackStripboard extends AbstractProtoBoard {
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4));
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
for (Point2D[] trace : potTraces) { for (Point2D[] trace : potTraces) {
int padX1 = (int) (x0 + trace[0].getX() * spacing); int padX1 = (int) Math.round(x0 + trace[0].getX() * spacing);
int padY1 = (int) (y0 + (trace[0].getY() + 8 * i) * spacing); int padY1 = (int) (y0 + (trace[0].getY() + 8 * i) * spacing);
int padX2 = (int) (x0 + trace[1].getX() * spacing); int padX2 = (int) Math.round(x0 + trace[1].getX() * spacing);
int padY2 = (int) (y0 + (trace[1].getY() + 8 * i) * spacing); int padY2 = (int) (y0 + (trace[1].getY() + 8 * i) * spacing);
g2d.drawLine(padX1, padY1, padX2, padY2); g2d.drawLine(padX1, padY1, padX2, padY2);
} }
@@ -225,12 +225,12 @@ public class ProtoBoard extends AbstractProtoBoard {
g2d.setColor(traceColor); g2d.setColor(traceColor);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4));
drawingObserver.startTrackingContinuityArea(true); drawingObserver.startTrackingContinuityArea(true);
g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing), (int) (point.getY() + 1 * spacing), g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing), (int) Math.round(point.getY() + 1 * spacing),
(int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing), (int) (point.getY() + 3.5 * spacing)); (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 0.5) * spacing), (int) Math.round(point.getY() + 3.5 * spacing));
g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing + miniPadSize / 2), (int) (point.getY() + 1 * spacing), g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing + miniPadSize / 2), (int) Math.round(point.getY() + 1 * spacing),
(int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing + miniPadSize / 2), (int) (point.getY() + 3.5 * spacing)); (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 1.5) * spacing + miniPadSize / 2), (int) Math.round(point.getY() + 3.5 * spacing));
g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), (int) (point.getY() + 1 * spacing), g2d.drawLine((int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), (int) Math.round(point.getY() + 1 * spacing),
(int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), (int) (point.getY() + 3.5 * spacing)); (int) (point.getX() + (1 + SEGMENTS_SUM[3] + 2.5) * spacing), (int) Math.round(point.getY() + 3.5 * spacing));
drawingObserver.stopTrackingContinuityArea(); drawingObserver.stopTrackingContinuityArea();
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
@@ -335,12 +335,12 @@ public class ProtoBoard extends AbstractProtoBoard {
g2d.setColor(SEPARATOR_COLOR); g2d.setColor(SEPARATOR_COLOR);
g2d.draw(new Rectangle2D.Double(point.getX() + width - 5.5 * spacing, point.getY() + 2, 5 * spacing, 2 * spacing)); g2d.draw(new Rectangle2D.Double(point.getX() + width - 5.5 * spacing, point.getY() + 2, 5 * spacing, 2 * spacing));
g2d.drawLine((int) (point.getX() + width - 5.5 * spacing), (int) (point.getY() + 2 * spacing) + 8, g2d.drawLine((int) Math.round(point.getX() + width - 5.5 * spacing), (int) Math.round(point.getY() + 2 * spacing) + 8,
(int) (point.getX() + width - 5.5 * spacing), (int) (point.getY() + 3.5 * spacing)); (int) Math.round(point.getX() + width - 5.5 * spacing), (int) Math.round(point.getY() + 3.5 * spacing));
g2d.drawLine((int) (point.getX() + width - 4.5 * spacing), (int) (point.getY() + 2 * spacing + 8), g2d.drawLine((int) Math.round(point.getX() + width - 4.5 * spacing), (int) Math.round(point.getY() + 2 * spacing + 8),
(int) (point.getX() + width - 4.5 * spacing), (int) (point.getY() + 3.5 * spacing)); (int) Math.round(point.getX() + width - 4.5 * spacing), (int) Math.round(point.getY() + 3.5 * spacing));
g2d.drawLine((int) (point.getX() + width - 1.5 * spacing), (int) (point.getY() + 2 * spacing + 8), g2d.drawLine((int) Math.round(point.getX() + width - 1.5 * spacing), (int) Math.round(point.getY() + 2 * spacing + 8),
(int) (point.getX() + width - 1.5 * spacing), (int) (point.getY() + 3.5 * spacing)); (int) Math.round(point.getX() + width - 1.5 * spacing), (int) Math.round(point.getY() + 3.5 * spacing));
g2d.setColor(traceColor); g2d.setColor(traceColor);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4));
@@ -348,8 +348,8 @@ public class ProtoBoard extends AbstractProtoBoard {
drawingObserver.startTrackingContinuityArea(true); drawingObserver.startTrackingContinuityArea(true);
// Draw two horizontal traces in the top-right section // Draw two horizontal traces in the top-right section
g2d.drawLine((int) (point.getX() + width - 4 * spacing), (int) (point.getY() + 0.5 * spacing), (int) (point.getX() + width - (2) * spacing), (int) (point.getY() + 0.5 * spacing)); g2d.drawLine((int) Math.round(point.getX() + width - 4 * spacing), (int) Math.round(point.getY() + 0.5 * spacing), (int) (point.getX() + width - (2) * spacing), (int) Math.round(point.getY() + 0.5 * spacing));
g2d.drawLine((int) (point.getX() + width - 4 * spacing), (int) (point.getY() + 1.5 * spacing), (int) (point.getX() + width - (2) * spacing), (int) (point.getY() + 1.5 * spacing)); g2d.drawLine((int) Math.round(point.getX() + width - 4 * spacing), (int) Math.round(point.getY() + 1.5 * spacing), (int) (point.getX() + width - (2) * spacing), (int) Math.round(point.getY() + 1.5 * spacing));
// Draw top-right pads // Draw top-right pads
for (int x = 0; x < 6; x++) { for (int x = 0; x < 6; x++) {
@@ -357,7 +357,7 @@ public class ProtoBoard extends AbstractProtoBoard {
g2d.setColor(traceColor); g2d.setColor(traceColor);
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize / 4));
g2d.drawLine(padX, (int) (point.getY() + 0.5 * spacing), padX, (int) (point.getY() + 3 * spacing)); g2d.drawLine(padX, (int) Math.round(point.getY() + 0.5 * spacing), padX, (int) Math.round(point.getY() + 3 * spacing));
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
@@ -433,22 +433,22 @@ public class ProtoBoard extends AbstractProtoBoard {
g2d.setColor(textColor); g2d.setColor(textColor);
// Draw top labels // Draw top labels
StringUtils.drawCenteredText(g2d, "+5V", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * spacing), (int) (point.getY() + 1 * spacing) + 1, StringUtils.drawCenteredText(g2d, "+5V", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * spacing), (int) Math.round(point.getY() + 1 * spacing) + 1,
HorizontalAlignment.RIGHT, VerticalAlignment.CENTER); HorizontalAlignment.RIGHT, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "+12V", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * spacing), (int) (point.getY() + 1.5 * spacing) + 1, StringUtils.drawCenteredText(g2d, "+12V", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * spacing), (int) Math.round(point.getY() + 1.5 * spacing) + 1,
HorizontalAlignment.RIGHT, VerticalAlignment.CENTER); HorizontalAlignment.RIGHT, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "GND", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * spacing), (int) (point.getY() + 2 * spacing) + 1, StringUtils.drawCenteredText(g2d, "GND", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * spacing), (int) Math.round(point.getY() + 2 * spacing) + 1,
HorizontalAlignment.RIGHT, VerticalAlignment.CENTER); HorizontalAlignment.RIGHT, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, "-12V", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * spacing), (int) (point.getY() + 2.5 * spacing) + 1, StringUtils.drawCenteredText(g2d, "-12V", (int) (point.getX() + (1 + SEGMENTS_SUM[3] - 0.3) * spacing), (int) Math.round(point.getY() + 2.5 * spacing) + 1,
HorizontalAlignment.RIGHT, VerticalAlignment.CENTER); HorizontalAlignment.RIGHT, VerticalAlignment.CENTER);
// Draw top-right labels // Draw top-right labels
int labelY = (int) (point.getY() + 3.8 * spacing) + 1; int labelY = (int) Math.round(point.getY() + 3.8 * spacing) + 1;
StringUtils.drawCenteredText(g2d, "+5V", (int) (point.getX() + width - 6 * spacing), labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP); StringUtils.drawCenteredText(g2d, "+5V", (int) Math.round(point.getX() + width - 6 * spacing), labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP);
StringUtils.drawCenteredText(g2d, "+", (int) (point.getX() + width - 5 * spacing) - 6, labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP); StringUtils.drawCenteredText(g2d, "+", (int) Math.round(point.getX() + width - 5 * spacing) - 6, labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP);
StringUtils.drawCenteredText(g2d, " 12V", (int) (point.getX() + width - 5 * spacing) + 2, labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP); StringUtils.drawCenteredText(g2d, " 12V", (int) Math.round(point.getX() + width - 5 * spacing) + 2, labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP);
StringUtils.drawCenteredText(g2d, "GND", (int) (point.getX() + width - 3 * spacing), labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP); StringUtils.drawCenteredText(g2d, "GND", (int) Math.round(point.getX() + width - 3 * spacing), labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP);
StringUtils.drawCenteredText(g2d, "-12V", (int) (point.getX() + width - 1 * spacing), labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP); StringUtils.drawCenteredText(g2d, "-12V", (int) Math.round(point.getX() + width - 1 * spacing), labelY, HorizontalAlignment.CENTER, VerticalAlignment.TOP);
// Draw vertical labels // Draw vertical labels
byte A = "A".getBytes()[0]; byte A = "A".getBytes()[0];
@@ -460,14 +460,14 @@ public class ProtoBoard extends AbstractProtoBoard {
label = new String(new byte[] {(byte) (a + y - 26)}); label = new String(new byte[] {(byte) (a + y - 26)});
else else
label = new String(new byte[] {(byte) (A + y)}); label = new String(new byte[] {(byte) (A + y)});
StringUtils.drawCenteredText(g2d, label, (int) (point.getX() + spacing * 0.35), padY, HorizontalAlignment.CENTER, VerticalAlignment.CENTER); StringUtils.drawCenteredText(g2d, label, (int) Math.round(point.getX() + spacing * 0.35), padY, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
StringUtils.drawCenteredText(g2d, label, (int) (point.getX() + width - spacing * 0.35), padY, HorizontalAlignment.CENTER, VerticalAlignment.CENTER); StringUtils.drawCenteredText(g2d, label, (int) Math.round(point.getX() + width - spacing * 0.35), padY, HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
} }
g2d.setColor(textColor); g2d.setColor(textColor);
g2d.setFont(LABEL_FONT.deriveFont(COORDINATE_FONT_SIZE + 2)); g2d.setFont(LABEL_FONT.deriveFont(COORDINATE_FONT_SIZE + 2));
StringUtils.drawCenteredText(g2d, "P-0+o by:\nKristian Bl�sol 2019", (int) (point.getX() + width * 0.70d), (int) (point.getY() + (yOffset + ROW_COUNT + 0.9) * spacing), StringUtils.drawCenteredText(g2d, "P-0+o by:\nKristian Bl�sol 2019", (int) Math.round(point.getX() + width * 0.70d), (int) (point.getY() + (yOffset + ROW_COUNT + 0.9) * spacing),
HorizontalAlignment.LEFT, VerticalAlignment.TOP); HorizontalAlignment.LEFT, VerticalAlignment.TOP);
// draw central mini pads // draw central mini pads
@@ -150,14 +150,14 @@ public class ProtoBoard780 extends AbstractProtoBoard {
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize - 2f)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize - 2f));
g2d.setColor(traceColor); g2d.setColor(traceColor);
int padX = (int) (point.getX() + width / 2 - 7 * spacing + i * spacing); int padX = (int) Math.round(point.getX() + width / 2 - 7 * spacing + i * spacing);
drawingObserver.startTrackingContinuityArea(true); drawingObserver.startTrackingContinuityArea(true);
g2d.drawLine(padX, (int) (point.getY() + offsetY), padX, g2d.drawLine(padX, (int) Math.round(point.getY() + offsetY), padX,
(int) (point.getY() + spacing + offsetY)); (int) Math.round(point.getY() + spacing + offsetY));
drawingObserver.stopTrackingContinuityArea(); drawingObserver.stopTrackingContinuityArea();
for (int j = 0; j < 2; j++) { for (int j = 0; j < 2; j++) {
int padY = (int) (point.getY() + spacing * j + offsetY); int padY = (int) Math.round(point.getY() + spacing * j + offsetY);
g2d.setColor(padColor); g2d.setColor(padColor);
@@ -180,8 +180,8 @@ public class ProtoBoard780 extends AbstractProtoBoard {
g2d.setColor(textColor); g2d.setColor(textColor);
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
int x = i == 0 ? 1 : i * 5; int x = i == 0 ? 1 : i * 5;
int padX = (int) (point.getX() + width / 2 - 8 * spacing + x * spacing); int padX = (int) Math.round(point.getX() + width / 2 - 8 * spacing + x * spacing);
int padY = (int) (point.getY() + spacing * 2); int padY = (int) Math.round(point.getY() + spacing * 2);
// // flip the coordinates for MPJA // // flip the coordinates for MPJA
// if (type == ProtoBoard780Type.MPJA) { // if (type == ProtoBoard780Type.MPJA) {
@@ -201,38 +201,38 @@ public class ProtoBoard780 extends AbstractProtoBoard {
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize - 2f)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize - 2f));
// the outer bus // the outer bus
g2d.drawLine((int) (point.getX() + width / 2 - 13 * spacing), g2d.drawLine((int) Math.round(point.getX() + width / 2 - 13 * spacing),
(int) (point.getY() - 2 * spacing + offsetY), (int) Math.round(point.getY() - 2 * spacing + offsetY),
(int) (point.getX() + width / 2 + 13 * spacing), (int) Math.round(point.getX() + width / 2 + 13 * spacing),
(int) (point.getY() - 2 * spacing + offsetY)); (int) Math.round(point.getY() - 2 * spacing + offsetY));
g2d.drawLine((int) (point.getX() + width / 2 - 13 * spacing), g2d.drawLine((int) Math.round(point.getX() + width / 2 - 13 * spacing),
(int) (point.getY() - 2 * spacing + offsetY), (int) Math.round(point.getY() - 2 * spacing + offsetY),
(int) (point.getX() + width / 2 - 13 * spacing), (int) Math.round(point.getX() + width / 2 - 13 * spacing),
(int) (point.getY() + (29 + (type == ProtoBoard780Type.RS ? 2 : 0)) * spacing + offsetY)); (int) (point.getY() + (29 + (type == ProtoBoard780Type.RS ? 2 : 0)) * spacing + offsetY));
g2d.drawLine((int) (point.getX() + width / 2 + 13 * spacing), g2d.drawLine((int) Math.round(point.getX() + width / 2 + 13 * spacing),
(int) (point.getY() - 2 * spacing + offsetY), (int) Math.round(point.getY() - 2 * spacing + offsetY),
(int) (point.getX() + width / 2 + 13 * spacing), (int) Math.round(point.getX() + width / 2 + 13 * spacing),
(int) (point.getY() + (29 + (type == ProtoBoard780Type.RS ? 2 : 0)) * spacing + offsetY)); (int) (point.getY() + (29 + (type == ProtoBoard780Type.RS ? 2 : 0)) * spacing + offsetY));
// horizontal long traces // horizontal long traces
g2d.drawLine((int) (point.getX() + width / 2 - 12 * spacing), (int) (point.getY() + offsetY), g2d.drawLine((int) Math.round(point.getX() + width / 2 - 12 * spacing), (int) Math.round(point.getY() + offsetY),
(int) (point.getX() + width / 2 + 12 * spacing), (int) (point.getY() + offsetY)); (int) Math.round(point.getX() + width / 2 + 12 * spacing), (int) Math.round(point.getY() + offsetY));
g2d.drawLine((int) (point.getX() + width / 2 - 12 * spacing), g2d.drawLine((int) Math.round(point.getX() + width / 2 - 12 * spacing),
(int) (point.getY() + spacing * 29 + offsetY), (int) Math.round(point.getY() + spacing * 29 + offsetY),
(int) (point.getX() + width / 2 + 12 * spacing), (int) Math.round(point.getX() + width / 2 + 12 * spacing),
(int) (point.getY() + spacing * 29 + offsetY)); (int) Math.round(point.getY() + spacing * 29 + offsetY));
for (int i = 0; i < 5; i++) { for (int i = 0; i < 5; i++) {
int padX = (int) (point.getX() + width / 2 - 12 * spacing + (i * 5 + 1) * spacing); int padX = (int) (point.getX() + width / 2 - 12 * spacing + (i * 5 + 1) * spacing);
// vertical traces // vertical traces
g2d.drawLine((int) (padX - spacing), (int) (point.getY() + offsetY), (int) (padX - spacing), g2d.drawLine((int) (padX - spacing), (int) Math.round(point.getY() + offsetY), (int) (padX - spacing),
(int) (point.getY() + spacing * 28 + offsetY)); (int) Math.round(point.getY() + spacing * 28 + offsetY));
g2d.drawLine((int) (padX + 3 * spacing), (int) (point.getY() + spacing + offsetY), g2d.drawLine((int) (padX + 3 * spacing), (int) Math.round(point.getY() + spacing + offsetY),
(int) (padX + 3 * spacing), (int) (point.getY() + spacing * 29 + offsetY)); (int) (padX + 3 * spacing), (int) Math.round(point.getY() + spacing * 29 + offsetY));
for (int j = 1; j < 29; j++) { for (int j = 1; j < 29; j++) {
int padY = (int) (point.getY() + spacing * j + offsetY); int padY = (int) Math.round(point.getY() + spacing * j + offsetY);
// 3-pad traces // 3-pad traces
g2d.drawLine(padX, padY, (int) (padX + 2 * spacing), padY); g2d.drawLine(padX, padY, (int) (padX + 2 * spacing), padY);
@@ -245,14 +245,14 @@ public class ProtoBoard780 extends AbstractProtoBoard {
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize - 2f)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(padSize - 2f));
g2d.setColor(padColor); g2d.setColor(padColor);
int padX = (int) (point.getX() + width / 2 - 12 * spacing + i * spacing); int padX = (int) Math.round(point.getX() + width / 2 - 12 * spacing + i * spacing);
// drawingObserver.startTrackingContinuityArea(true); // drawingObserver.startTrackingContinuityArea(true);
// g2d.drawLine(padX, (int)(point.getY() + offsetY), padX, (int)(point.getY() + spacing + // g2d.drawLine(padX, (int) Math.round(point.getY() + offsetY), padX, (int) Math.round(point.getY() + spacing +
// offsetY)); // offsetY));
// drawingObserver.stopTrackingContinuityArea(); // drawingObserver.stopTrackingContinuityArea();
for (int j = 0; j < 30; j++) { for (int j = 0; j < 30; j++) {
int padY = (int) (point.getY() + spacing * j + offsetY); int padY = (int) Math.round(point.getY() + spacing * j + offsetY);
g2d.setColor(padColor); g2d.setColor(padColor);
@@ -277,8 +277,8 @@ public class ProtoBoard780 extends AbstractProtoBoard {
// horizontal coordinates // horizontal coordinates
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
int x = i == 0 ? 1 : i * 5; int x = i == 0 ? 1 : i * 5;
int padX = (int) (point.getX() + width / 2 - 13 * spacing + x * spacing); int padX = (int) Math.round(point.getX() + width / 2 - 13 * spacing + x * spacing);
int padY = (int) (point.getY() - spacing + offsetY); int padY = (int) Math.round(point.getY() - spacing + offsetY);
String label = String.valueOf((char) ('A' + i)); String label = String.valueOf((char) ('A' + i));
@@ -293,7 +293,7 @@ public class ProtoBoard780 extends AbstractProtoBoard {
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
int y = i == 0 ? 1 : i * 5; int y = i == 0 ? 1 : i * 5;
int padX = (int) (point.getX() + width / 2 - 14 * spacing); int padX = (int) Math.round(point.getX() + width / 2 - 14 * spacing);
int padY = (int) (point.getY() + spacing * (y - 1) + offsetY); int padY = (int) (point.getY() + spacing * (y - 1) + offsetY);
StringUtils.drawCenteredText(g2d, Integer.toString(y), padX, padY, HorizontalAlignment.LEFT, StringUtils.drawCenteredText(g2d, Integer.toString(y), padX, padY, HorizontalAlignment.LEFT,
@@ -302,8 +302,8 @@ public class ProtoBoard780 extends AbstractProtoBoard {
// model name // model name
g2d.setFont(LABEL_FONT.deriveFont(COORDINATE_FONT_SIZE * 1.8f)); g2d.setFont(LABEL_FONT.deriveFont(COORDINATE_FONT_SIZE * 1.8f));
int x = (int) (point.getX() + width / 2); int x = (int) Math.round(point.getX() + width / 2);
int y = (int) (point.getY() + length - spacing * 1.5); int y = (int) Math.round(point.getY() + length - spacing * 1.5);
StringUtils.drawCenteredText(g2d, StringUtils.drawCenteredText(g2d,
type == ProtoBoard780Type.RS ? "Radio Shack 276-168B" : "MPJA.COM 33304 PB", x, y, type == ProtoBoard780Type.RS ? "Radio Shack 276-168B" : "MPJA.COM 33304 PB", x, y,
HorizontalAlignment.CENTER, VerticalAlignment.CENTER); HorizontalAlignment.CENTER, VerticalAlignment.CENTER);
@@ -315,32 +315,32 @@ public class ProtoBoard780 extends AbstractProtoBoard {
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1));
g2d.setColor(HOLE_COLOR); g2d.setColor(HOLE_COLOR);
g2d.fillOval((int) (point.getX() + width / 2) - dx - mountingHoleSize / 2, g2d.fillOval((int) Math.round(point.getX() + width / 2) - dx - mountingHoleSize / 2,
holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize); holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize);
g2d.fillOval((int) (point.getX() + width / 2) + dx - mountingHoleSize / 2, g2d.fillOval((int) Math.round(point.getX() + width / 2) + dx - mountingHoleSize / 2,
holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize); holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize);
g2d.setColor(finalBorderColor); g2d.setColor(finalBorderColor);
g2d.drawOval((int) (point.getX() + width / 2) - dx - mountingHoleSize / 2, g2d.drawOval((int) Math.round(point.getX() + width / 2) - dx - mountingHoleSize / 2,
holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize); holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize);
g2d.drawOval((int) (point.getX() + width / 2) + dx - mountingHoleSize / 2, g2d.drawOval((int) Math.round(point.getX() + width / 2) + dx - mountingHoleSize / 2,
holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize); holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize);
holeY = (int) (point.getY() + length - spacing); holeY = (int) Math.round(point.getY() + length - spacing);
g2d.setColor(HOLE_COLOR); g2d.setColor(HOLE_COLOR);
g2d.fillOval((int) (point.getX() + width / 2) - dx - mountingHoleSize / 2, g2d.fillOval((int) Math.round(point.getX() + width / 2) - dx - mountingHoleSize / 2,
holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize); holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize);
g2d.fillOval((int) (point.getX() + width / 2) + dx - mountingHoleSize / 2, g2d.fillOval((int) Math.round(point.getX() + width / 2) + dx - mountingHoleSize / 2,
holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize); holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize);
g2d.setColor(finalBorderColor); g2d.setColor(finalBorderColor);
g2d.drawOval((int) (point.getX() + width / 2) - dx - mountingHoleSize / 2, g2d.drawOval((int) Math.round(point.getX() + width / 2) - dx - mountingHoleSize / 2,
holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize); holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize);
g2d.drawOval((int) (point.getX() + width / 2) + dx - mountingHoleSize / 2, g2d.drawOval((int) Math.round(point.getX() + width / 2) + dx - mountingHoleSize / 2,
holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize); holeY - mountingHoleSize / 2, mountingHoleSize, mountingHoleSize);
} }
@@ -73,10 +73,10 @@ public class VeroBoard extends AbstractVeroBoard implements ILayeredComponent {
y += spacing; y += spacing;
g2d.setColor(stripColor); g2d.setColor(stripColor);
drawingObserver.startTrackingContinuityArea(true); drawingObserver.startTrackingContinuityArea(true);
g2d.fillRect((int)(x + spacing / 2), (int)(y - stripSize / 2), (int)(finalSecondPoint.getX() - spacing - x), stripSize); g2d.fillRect((int)(x + spacing / 2), (int)(y - stripSize / 2), (int) Math.round(finalSecondPoint.getX() - spacing - x), stripSize);
drawingObserver.stopTrackingContinuityArea(); drawingObserver.stopTrackingContinuityArea();
g2d.setColor(stripColor.darker()); g2d.setColor(stripColor.darker());
g2d.drawRect((int)(x + spacing / 2), (int)(y - stripSize / 2), (int)(finalSecondPoint.getX() - spacing - x), stripSize); g2d.drawRect((int)(x + spacing / 2), (int)(y - stripSize / 2), (int) Math.round(finalSecondPoint.getX() - spacing - x), stripSize);
while (x < finalSecondPoint.getX() - spacing - holeSize) { while (x < finalSecondPoint.getX() - spacing - holeSize) {
x += spacing; x += spacing;
g2d.setColor(Constants.CANVAS_COLOR); g2d.setColor(Constants.CANVAS_COLOR);
@@ -91,10 +91,10 @@ public class VeroBoard extends AbstractVeroBoard implements ILayeredComponent {
y = firstPoint.getY(); y = firstPoint.getY();
g2d.setColor(stripColor); g2d.setColor(stripColor);
drawingObserver.startTrackingContinuityArea(true); drawingObserver.startTrackingContinuityArea(true);
g2d.fillRect((int)(x - stripSize / 2), (int)(y + spacing / 2), stripSize, (int)(finalSecondPoint.getY() - spacing - y)); g2d.fillRect((int)(x - stripSize / 2), (int)(y + spacing / 2), stripSize, (int) Math.round(finalSecondPoint.getY() - spacing - y));
drawingObserver.stopTrackingContinuityArea(); drawingObserver.stopTrackingContinuityArea();
g2d.setColor(stripColor.darker()); g2d.setColor(stripColor.darker());
g2d.drawRect((int)(x - stripSize / 2), (int)(y + spacing / 2), stripSize, (int)(finalSecondPoint.getY() - spacing - y)); g2d.drawRect((int)(x - stripSize / 2), (int)(y + spacing / 2), stripSize, (int) Math.round(finalSecondPoint.getY() - spacing - y));
while (y < finalSecondPoint.getY() - spacing - holeSize) { while (y < finalSecondPoint.getY() - spacing - holeSize) {
y += spacing; y += spacing;
g2d.setColor(Constants.CANVAS_COLOR); g2d.setColor(Constants.CANVAS_COLOR);
@@ -62,11 +62,11 @@ public class ChassisPanel extends AbstractShape {
Composite oldComposite = applyAlpha(g2d, componentState); Composite oldComposite = applyAlpha(g2d, componentState);
g2d.setColor(color); g2d.setColor(color);
if (radius == 0) { if (radius == 0) {
g2d.fillRect((int) firstPoint.getX(), (int) firstPoint.getY(), g2d.fillRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
(int) (secondPoint.getX() - firstPoint.getX()), (int) (secondPoint.getX() - firstPoint.getX()),
(int) (secondPoint.getY() - firstPoint.getY())); (int) (secondPoint.getY() - firstPoint.getY()));
} else { } else {
g2d.fillRoundRect((int) firstPoint.getX(), (int) firstPoint.getY(), g2d.fillRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
(int) (secondPoint.getX() - firstPoint.getX()), (int) (secondPoint.getX() - firstPoint.getX()),
(int) (secondPoint.getY() - firstPoint.getY()), radius, radius); (int) (secondPoint.getY() - firstPoint.getY()), radius, radius);
} }
@@ -78,11 +78,11 @@ public class ChassisPanel extends AbstractShape {
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: borderColor); : borderColor);
if (radius == 0) { if (radius == 0) {
g2d.drawRect((int) (firstPoint.getX()), (int) (firstPoint.getY()), g2d.drawRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
(int) (secondPoint.getX() - firstPoint.getX()), (int) (secondPoint.getX() - firstPoint.getX()),
(int) (secondPoint.getY() - firstPoint.getY())); (int) (secondPoint.getY() - firstPoint.getY()));
} else { } else {
g2d.drawRoundRect((int) (firstPoint.getX()), (int) (firstPoint.getY()), g2d.drawRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()),
(int) (secondPoint.getX() - firstPoint.getX()), (int) (secondPoint.getX() - firstPoint.getX()),
(int) (secondPoint.getY() - firstPoint.getY()), radius, radius); (int) (secondPoint.getY() - firstPoint.getY()), radius, radius);
} }
@@ -50,7 +50,7 @@ public class EllipticalCutout extends AbstractShape {
if (componentState != ComponentState.DRAGGING) { if (componentState != ComponentState.DRAGGING) {
Composite oldComposite = applyAlpha(g2d, componentState); Composite oldComposite = applyAlpha(g2d, componentState);
g2d.setColor(color); g2d.setColor(color);
g2d.fillOval((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY())); g2d.fillOval((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()));
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
} }
// Do not track any changes that follow because the whole oval has been // Do not track any changes that follow because the whole oval has been
@@ -58,7 +58,7 @@ public class EllipticalCutout extends AbstractShape {
drawingObserver.stopTracking(); drawingObserver.stopTracking();
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: borderColor); : borderColor);
g2d.drawOval((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY())); g2d.drawOval((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()));
} }
@Override @Override
@@ -56,7 +56,7 @@ public class RectangularCutout extends AbstractShape {
if (componentState != ComponentState.DRAGGING) { if (componentState != ComponentState.DRAGGING) {
Composite oldComposite = applyAlpha(g2d, componentState); Composite oldComposite = applyAlpha(g2d, componentState);
g2d.setColor(color); g2d.setColor(color);
g2d.fillRoundRect((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()), radius, g2d.fillRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()), radius,
radius); radius);
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
} }
@@ -65,7 +65,7 @@ public class RectangularCutout extends AbstractShape {
drawingObserver.stopTracking(); drawingObserver.stopTracking();
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: borderColor); : borderColor);
g2d.drawRoundRect((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()), radius, g2d.drawRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()), radius,
radius); radius);
} }
@@ -67,9 +67,9 @@ public class CutLine extends AbstractTransparentComponent<Void> {
Composite oldComposite = applyAlpha(g2d); Composite oldComposite = applyAlpha(g2d);
if (getOrientation() == OrientationHV.HORIZONTAL) if (getOrientation() == OrientationHV.HORIZONTAL)
g2d.drawLine((int)point.getX(), (int)point.getY(), (int)point.getX() + l, (int)point.getY()); g2d.drawLine((int) Math.round(point.getX()), (int) Math.round(point.getY()), (int) Math.round(point.getX()) + l, (int) Math.round(point.getY()));
else else
g2d.drawLine((int)point.getX(), (int)point.getY(), (int)point.getX(), (int)point.getY() + l); g2d.drawLine((int) Math.round(point.getX()), (int) Math.round(point.getY()), (int) Math.round(point.getX()), (int) Math.round(point.getY()) + l);
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
} }
@@ -77,16 +77,16 @@ public class Eyelet extends AbstractTransparentComponent<String> {
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(1f));
g2d.setColor(color); g2d.setColor(color);
drawingObserver.startTrackingContinuityArea(true); drawingObserver.startTrackingContinuityArea(true);
g2d.fillOval((int)(point.getX() - diameter / 2), (int)(point.getY() - diameter / 2), diameter, diameter); g2d.fillOval((int) Math.round(point.getX() - diameter / 2), (int) Math.round(point.getY() - diameter / 2), diameter, diameter);
drawingObserver.stopTrackingContinuityArea(); drawingObserver.stopTrackingContinuityArea();
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: color.darker()); : color.darker());
g2d.drawOval((int)(point.getX() - diameter / 2), (int)(point.getY() - diameter / 2), diameter, diameter); g2d.drawOval((int) Math.round(point.getX() - diameter / 2), (int) Math.round(point.getY() - diameter / 2), diameter, diameter);
g2d.setColor(Constants.CANVAS_COLOR); g2d.setColor(Constants.CANVAS_COLOR);
g2d.fillOval((int)(point.getX() - holeDiameter / 2), (int)(point.getY() - holeDiameter / 2), holeDiameter, holeDiameter); g2d.fillOval((int) Math.round(point.getX() - holeDiameter / 2), (int) Math.round(point.getY() - holeDiameter / 2), holeDiameter, holeDiameter);
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: color.darker()); : color.darker());
g2d.drawOval((int)(point.getX() - holeDiameter / 2), (int)(point.getY() - holeDiameter / 2), holeDiameter, holeDiameter); g2d.drawOval((int) Math.round(point.getX() - holeDiameter / 2), (int) Math.round(point.getY() - holeDiameter / 2), holeDiameter, holeDiameter);
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
} }
@@ -130,7 +130,7 @@ public class Line extends AbstractLeadedComponent<Void> {
interpolate(endPoint, startPoint, getArrowSize().convertToPixels() * 0.9 / distance, endPoint); interpolate(endPoint, startPoint, getArrowSize().convertToPixels() * 0.9 / distance, endPoint);
} }
g2d.drawLine((int)startPoint.getX(), (int)startPoint.getY(), (int)endPoint.getX(), (int)endPoint.getY()); g2d.drawLine((int) Math.round(startPoint.getX()), (int) Math.round(startPoint.getY()), (int) Math.round(endPoint.getX()), (int) Math.round(endPoint.getY()));
} }
private void interpolate(Point2D p1, Point2D p2, double t, Point2D p) { private void interpolate(Point2D p1, Point2D p2, double t, Point2D p) {
@@ -82,7 +82,7 @@ public class MultimeterProbe extends AbstractTransparentComponent<Color> {
g2d.setColor(Constants.TRANSPARENT_COLOR); g2d.setColor(Constants.TRANSPARENT_COLOR);
drawingObserver.startTrackingContinuityArea(true); drawingObserver.startTrackingContinuityArea(true);
double sensitivity = SENSITIVITY.convertToPixels(); double sensitivity = SENSITIVITY.convertToPixels();
g2d.fillOval((int) (point.getX() - sensitivity), (int) (point.getY() - sensitivity), g2d.fillOval((int) Math.round(point.getX() - sensitivity), (int) Math.round(point.getY() - sensitivity),
(int) (sensitivity * 2), (int) (sensitivity * 2)); (int) (sensitivity * 2), (int) (sensitivity * 2));
drawingObserver.stopTrackingContinuityArea(); drawingObserver.stopTrackingContinuityArea();
@@ -240,14 +240,14 @@ public class PCBTerminalBlock extends AbstractTransparentComponent<PCBTerminalBl
if (outlineMode) { if (outlineMode) {
// g2d.setColor(Constants.TRANSPARENT_COLOR); // g2d.setColor(Constants.TRANSPARENT_COLOR);
// drawingObserver.startTrackingContinuityArea(true); // drawingObserver.startTrackingContinuityArea(true);
// g2d.fillRect((int)(p.getX() - lugWidth / 2), (int)(p.getY() - lugHeight / 2), lugWidth, // g2d.fillRect((int) Math.round(p.getX() - lugWidth / 2), (int) Math.round(p.getY() - lugHeight / 2), lugWidth,
// lugHeight); // lugHeight);
// drawingObserver.stopTrackingContinuityArea(); // drawingObserver.stopTrackingContinuityArea();
g2d.setColor(theme.getOutlineColor()); g2d.setColor(theme.getOutlineColor());
} else { } else {
g2d.setColor(CIRCLE_COLOR); g2d.setColor(CIRCLE_COLOR);
g2d.fillOval((int) (p.getX() - circleDiameter / 2), (int) (p.getY() - circleDiameter / 2), g2d.fillOval((int) Math.round(p.getX() - circleDiameter / 2), (int) Math.round(p.getY() - circleDiameter / 2),
circleDiameter, circleDiameter); circleDiameter, circleDiameter);
g2d.setColor(CIRCLE_COLOR.darker()); g2d.setColor(CIRCLE_COLOR.darker());
@@ -89,22 +89,22 @@ public class TraceCut extends AbstractTransparentComponent<Void> implements ILay
: getBoardColor()); : getBoardColor());
drawingObserver.startTrackingContinuityArea(false); drawingObserver.startTrackingContinuityArea(false);
if (getOrientation() == OrientationHV.VERTICAL) if (getOrientation() == OrientationHV.VERTICAL)
g2d.fillRect((int)(point.getX() - holeSpacing / 2 - cutWidth / 2), (int)(point.getY() - size / 2 - 1), cutWidth, size + 2); g2d.fillRect((int) Math.round(point.getX() - holeSpacing / 2 - cutWidth / 2), (int) Math.round(point.getY() - size / 2 - 1), cutWidth, size + 2);
else else
g2d.fillRect((int)(point.getX() - size / 2 - 1), (int)(point.getY() - holeSpacing / 2 - cutWidth / 2), size + 2, cutWidth); g2d.fillRect((int) Math.round(point.getX() - size / 2 - 1), (int) Math.round(point.getY() - holeSpacing / 2 - cutWidth / 2), size + 2, cutWidth);
drawingObserver.stopTrackingContinuityArea(); drawingObserver.stopTrackingContinuityArea();
} else { } else {
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: getBoardColor()); : getBoardColor());
drawingObserver.startTrackingContinuityArea(false); drawingObserver.startTrackingContinuityArea(false);
g2d.fillRoundRect((int)(point.getX() - size / 2), (int)(point.getY() - size / 2), size, size, size, size); g2d.fillRoundRect((int) Math.round(point.getX() - size / 2), (int) Math.round(point.getY() - size / 2), size, size, size, size);
drawingObserver.stopTrackingContinuityArea(); drawingObserver.stopTrackingContinuityArea();
g2d.setColor(Constants.CANVAS_COLOR); g2d.setColor(Constants.CANVAS_COLOR);
int holeSize = getClosestOdd((int) HOLE_SIZE.convertToPixels()); int holeSize = getClosestOdd((int) HOLE_SIZE.convertToPixels());
g2d.fillOval((int)(point.getX() - holeSize / 2), (int)(point.getY() - holeSize / 2), holeSize, holeSize); g2d.fillOval((int) Math.round(point.getX() - holeSize / 2), (int) Math.round(point.getY() - holeSize / 2), holeSize, holeSize);
g2d.setColor(getBoardColor().darker()); g2d.setColor(getBoardColor().darker());
g2d.drawOval((int)(point.getX() - holeSize / 2), (int)(point.getY() - holeSize / 2), holeSize, holeSize); g2d.drawOval((int) Math.round(point.getX() - holeSize / 2), (int) Math.round(point.getY() - holeSize / 2), holeSize, holeSize);
} }
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
} }
@@ -73,16 +73,16 @@ public class Turret extends AbstractTransparentComponent<String> {
g2d.setColor(color); g2d.setColor(color);
g2d.setStroke(ObjectCache.getInstance().fetchZoomableStroke(1f)); g2d.setStroke(ObjectCache.getInstance().fetchZoomableStroke(1f));
drawingObserver.startTrackingContinuityArea(true); drawingObserver.startTrackingContinuityArea(true);
g2d.fillOval((int)(point.getX() - diameter / 2), (int)(point.getY() - diameter / 2), diameter, diameter); g2d.fillOval((int) Math.round(point.getX() - diameter / 2), (int) Math.round(point.getY() - diameter / 2), diameter, diameter);
drawingObserver.stopTrackingContinuityArea(); drawingObserver.stopTrackingContinuityArea();
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: color.darker()); : color.darker());
g2d.drawOval((int)(point.getX() - diameter / 2), (int)(point.getY() - diameter / 2), diameter, diameter); g2d.drawOval((int) Math.round(point.getX() - diameter / 2), (int) Math.round(point.getY() - diameter / 2), diameter, diameter);
g2d.setColor(Constants.CANVAS_COLOR); g2d.setColor(Constants.CANVAS_COLOR);
g2d.fillOval((int)(point.getX() - holeDiameter / 2), (int)(point.getY() - holeDiameter / 2), holeDiameter, holeDiameter); g2d.fillOval((int) Math.round(point.getX() - holeDiameter / 2), (int) Math.round(point.getY() - holeDiameter / 2), holeDiameter, holeDiameter);
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: color.darker()); : color.darker());
g2d.drawOval((int)(point.getX() - holeDiameter / 2), (int)(point.getY() - holeDiameter / 2), holeDiameter, holeDiameter); g2d.drawOval((int) Math.round(point.getX() - holeDiameter / 2), (int) Math.round(point.getY() - holeDiameter / 2), holeDiameter, holeDiameter);
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
} }
@@ -338,10 +338,10 @@ public class DIPSwitch extends AbstractTransparentComponent<String> implements I
int pinHeight = getClosestOdd(pinSize int pinHeight = getClosestOdd(pinSize
/ (getOrientation() == Orientation.DEFAULT || getOrientation() == Orientation._180 ? 1f / (getOrientation() == Orientation.DEFAULT || getOrientation() == Orientation._180 ? 1f
: 2f)); : 2f));
g2d.fillRect((int) (point.getX() - pinWidth / 2), (int) (point.getY() - pinHeight / 2), g2d.fillRect((int) Math.round(point.getX() - pinWidth / 2), (int) Math.round(point.getY() - pinHeight / 2),
pinWidth, pinHeight); pinWidth, pinHeight);
g2d.setColor(PIN_BORDER_COLOR); g2d.setColor(PIN_BORDER_COLOR);
g2d.drawRect((int) (point.getX() - pinWidth / 2), (int) (point.getY() - pinHeight / 2), g2d.drawRect((int) Math.round(point.getX() - pinWidth / 2), (int) Math.round(point.getY() - pinHeight / 2),
pinWidth, pinHeight); pinWidth, pinHeight);
} }
} }
@@ -213,10 +213,10 @@ public class FuseHolderPanel extends AbstractMultiPartComponent<String> {
for (Point2D p : controlPoints) { for (Point2D p : controlPoints) {
if (outlineMode) { if (outlineMode) {
g2d.setColor(theme.getOutlineColor()); g2d.setColor(theme.getOutlineColor());
g2d.drawRect((int)(p.getX() - lugWidth / 2), (int)(p.getY() - lugHeight / 2), lugWidth, lugHeight); g2d.drawRect((int) Math.round(p.getX() - lugWidth / 2), (int) Math.round(p.getY() - lugHeight / 2), lugWidth, lugHeight);
} else { } else {
g2d.setColor(METAL_COLOR); g2d.setColor(METAL_COLOR);
g2d.fillRect((int)(p.getX() - lugWidth / 2), (int)(p.getY() - lugHeight / 2), lugWidth, lugHeight); g2d.fillRect((int) Math.round(p.getX() - lugWidth / 2), (int) Math.round(p.getY() - lugHeight / 2), lugWidth, lugHeight);
} }
} }
@@ -236,10 +236,10 @@ public class IECSocket extends AbstractMultiPartComponent<String> {
for (Point2D p : controlPoints) { for (Point2D p : controlPoints) {
if (outlineMode) { if (outlineMode) {
g2d.setColor(theme.getOutlineColor()); g2d.setColor(theme.getOutlineColor());
g2d.drawRect((int)(p.getX() - lugWidth / 2), (int)(p.getY() - lugHeight / 2), lugWidth, lugHeight); g2d.drawRect((int) Math.round(p.getX() - lugWidth / 2), (int) Math.round(p.getY() - lugHeight / 2), lugWidth, lugHeight);
} else { } else {
g2d.setColor(METAL_COLOR); g2d.setColor(METAL_COLOR);
g2d.fillRect((int)(p.getX() - lugWidth / 2), (int)(p.getY() - lugHeight / 2), lugWidth, lugHeight); g2d.fillRect((int) Math.round(p.getX() - lugWidth / 2), (int) Math.round(p.getY() - lugHeight / 2), lugWidth, lugHeight);
} }
} }
@@ -302,7 +302,7 @@ public class IECSocket extends AbstractMultiPartComponent<String> {
Point2D[] cutoutPoints = new Point2D[] { Point2D[] cutoutPoints = new Point2D[] {
new Point2D.Double(firstPoint.getX(), firstPoint.getY() + vSpacing / 2 - cutoutWidth / 2), new Point2D.Double(firstPoint.getX(), firstPoint.getY() + vSpacing / 2 - cutoutWidth / 2),
new Point2D.Double(firstPoint.getX() + cutoutLength / 2 - cutoutSlant, (int) (firstPoint.getY() + vSpacing / 2 - cutoutWidth / 2)), new Point2D.Double(firstPoint.getX() + cutoutLength / 2 - cutoutSlant, (int) Math.round(firstPoint.getY() + vSpacing / 2 - cutoutWidth / 2)),
new Point2D.Double(firstPoint.getX() + cutoutLength / 2, firstPoint.getY() + vSpacing / 2 - cutoutWidth / 2 + cutoutSlant), new Point2D.Double(firstPoint.getX() + cutoutLength / 2, firstPoint.getY() + vSpacing / 2 - cutoutWidth / 2 + cutoutSlant),
new Point2D.Double(firstPoint.getX() + cutoutLength / 2, firstPoint.getY() + vSpacing / 2 + cutoutWidth / 2), new Point2D.Double(firstPoint.getX() + cutoutLength / 2, firstPoint.getY() + vSpacing / 2 + cutoutWidth / 2),
new Point2D.Double(firstPoint.getX() - cutoutLength / 2, firstPoint.getY() + vSpacing / 2 + cutoutWidth / 2), new Point2D.Double(firstPoint.getX() - cutoutLength / 2, firstPoint.getY() + vSpacing / 2 + cutoutWidth / 2),
@@ -311,10 +311,10 @@ public class MiniRelay extends AbstractLabeledComponent<String> implements IGerb
for (Point2D point : controlPoints) { for (Point2D point : controlPoints) {
if (!outlineMode) { if (!outlineMode) {
g2d.setColor(PIN_COLOR); g2d.setColor(PIN_COLOR);
g2d.fillOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.fillOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR); g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR);
g2d.drawOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.drawOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
Color finalBorderColor; Color finalBorderColor;
@@ -317,21 +317,21 @@ public class MiniToggleSwitch extends AbstractTransparentComponent<ToggleSwitchT
if (outlineMode) { if (outlineMode) {
// g2d.setColor(Constants.TRANSPARENT_COLOR); // g2d.setColor(Constants.TRANSPARENT_COLOR);
// drawingObserver.startTrackingContinuityArea(true); // drawingObserver.startTrackingContinuityArea(true);
// g2d.fillRect((int)(p.getX() - lugWidth / 2), (int)(p.getY() - lugHeight / 2), lugWidth, lugHeight); // g2d.fillRect((int) Math.round(p.getX() - lugWidth / 2), (int) Math.round(p.getY() - lugHeight / 2), lugWidth, lugHeight);
// drawingObserver.stopTrackingContinuityArea(); // drawingObserver.stopTrackingContinuityArea();
g2d.setColor(theme.getOutlineColor()); g2d.setColor(theme.getOutlineColor());
g2d.drawRect((int)(p.getX() - lugWidth / 2d), (int)(p.getY() - lugHeight / 2d), lugWidth, lugHeight); g2d.drawRect((int) Math.round(p.getX() - lugWidth / 2d), (int) Math.round(p.getY() - lugHeight / 2d), lugWidth, lugHeight);
} else { } else {
g2d.setColor(getTerminalPadColor().darker()); g2d.setColor(getTerminalPadColor().darker());
g2d.drawOval((int)(p.getX() - circleDiameter / 2d), (int)(p.getY() - circleDiameter / 2d), circleDiameter, circleDiameter); g2d.drawOval((int) Math.round(p.getX() - circleDiameter / 2d), (int) Math.round(p.getY() - circleDiameter / 2d), circleDiameter, circleDiameter);
g2d.setColor(getTerminalPadColor()); g2d.setColor(getTerminalPadColor());
g2d.fillOval((int)(p.getX() - circleDiameter / 2d), (int)(p.getY() - circleDiameter / 2d), circleDiameter, circleDiameter); g2d.fillOval((int) Math.round(p.getX() - circleDiameter / 2d), (int) Math.round(p.getY() - circleDiameter / 2d), circleDiameter, circleDiameter);
g2d.setColor(getTerminalColor()); g2d.setColor(getTerminalColor());
// drawingObserver.startTrackingContinuityArea(true); // drawingObserver.startTrackingContinuityArea(true);
g2d.fillRect((int)(p.getX() - lugWidth / 2d), (int)(p.getY() - lugHeight / 2d), lugWidth, lugHeight); g2d.fillRect((int) Math.round(p.getX() - lugWidth / 2d), (int) Math.round(p.getY() - lugHeight / 2d), lugWidth, lugHeight);
// drawingObserver.stopTrackingContinuityArea(); // drawingObserver.stopTrackingContinuityArea();
} }
} }
@@ -168,7 +168,7 @@ public class OpenJack1_4 extends AbstractMultiPartComponent<OpenJackType> {
int springLength = (int) SPRING_LENGTH.convertToPixels(); int springLength = (int) SPRING_LENGTH.convertToPixels();
int holeToEdge = (int) HOLE_TO_EDGE.convertToPixels(); int holeToEdge = (int) HOLE_TO_EDGE.convertToPixels();
double centerY = controlPoints[0].getY() + springLength - holeToEdge; double centerY = controlPoints[0].getY() + springLength - holeToEdge;
Point2D tipLabel = new Point2D.Double(controlPoints[0].getX(), (int) (controlPoints[0].getY() + holeToEdge * 1.25)); Point2D tipLabel = new Point2D.Double(controlPoints[0].getX(), (int) Math.round(controlPoints[0].getY() + holeToEdge * 1.25));
AffineTransform ringTransform = AffineTransform.getRotateInstance(getValue() == OpenJackType.SWITCHED ? SWITCH_THETA : RING_THETA, controlPoints[0].getX(), centerY); AffineTransform ringTransform = AffineTransform.getRotateInstance(getValue() == OpenJackType.SWITCHED ? SWITCH_THETA : RING_THETA, controlPoints[0].getX(), centerY);
AffineTransform sleeveTransform = AffineTransform.getRotateInstance(getValue() == OpenJackType.SWITCHED ? SLEEVE_SWITCHED_THETA : SLEEVE_THETA, controlPoints[0].getX(), centerY); AffineTransform sleeveTransform = AffineTransform.getRotateInstance(getValue() == OpenJackType.SWITCHED ? SLEEVE_SWITCHED_THETA : SLEEVE_THETA, controlPoints[0].getX(), centerY);
Point2D ringOrSwitchLabel = new Point2D.Double(0, 0); Point2D ringOrSwitchLabel = new Point2D.Double(0, 0);
@@ -161,7 +161,7 @@ public class OpenJack1_8 extends AbstractMultiPartComponent<OpenJackType> {
int springLength = (int) SPRING_LENGTH.convertToPixels(); int springLength = (int) SPRING_LENGTH.convertToPixels();
int holeToEdge = (int) HOLE_TO_EDGE.convertToPixels(); int holeToEdge = (int) HOLE_TO_EDGE.convertToPixels();
double centerY = controlPoints[0].getY() + springLength - holeToEdge; double centerY = controlPoints[0].getY() + springLength - holeToEdge;
Point2D tipLabel = new Point2D.Double(controlPoints[0].getX(), (int) (controlPoints[0].getY() + holeToEdge * 1.25)); Point2D tipLabel = new Point2D.Double(controlPoints[0].getX(), (int) Math.round(controlPoints[0].getY() + holeToEdge * 1.25));
AffineTransform ringTransform = AffineTransform.getRotateInstance(getValue() == OpenJackType.SWITCHED ? SWITCH_THETA : RING_THETA, controlPoints[0].getX(), centerY); AffineTransform ringTransform = AffineTransform.getRotateInstance(getValue() == OpenJackType.SWITCHED ? SWITCH_THETA : RING_THETA, controlPoints[0].getX(), centerY);
AffineTransform sleeveTransform = AffineTransform.getRotateInstance(getValue() == OpenJackType.SWITCHED ? SLEEVE_SWITCHED_THETA : SLEEVE_THETA, controlPoints[0].getX(), centerY); AffineTransform sleeveTransform = AffineTransform.getRotateInstance(getValue() == OpenJackType.SWITCHED ? SLEEVE_SWITCHED_THETA : SLEEVE_THETA, controlPoints[0].getX(), centerY);
Point2D ringOrSwitchLabel = new Point2D.Double(0, 0); Point2D ringOrSwitchLabel = new Point2D.Double(0, 0);
@@ -239,10 +239,10 @@ public class PinHeader extends AbstractTransparentComponent<Void> {
for (Point2D point : controlPoints) { for (Point2D point : controlPoints) {
if (!outlineMode) { if (!outlineMode) {
g2d.setColor(PIN_COLOR); g2d.setColor(PIN_COLOR);
g2d.fillRect((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.fillRect((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR); g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR);
g2d.drawRect((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.drawRect((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
Color finalBorderColor; Color finalBorderColor;
@@ -284,14 +284,14 @@ public class SlideSwitch extends AbstractTransparentComponent<SlideSwitchType> i
Point2D p = controlPoints[i]; Point2D p = controlPoints[i];
if (outlineMode) { if (outlineMode) {
g2d.setColor(theme.getOutlineColor()); g2d.setColor(theme.getOutlineColor());
g2d.drawRect((int) (p.getX() - lugWidth / 2d), (int) (p.getY() - lugHeight / 2d), lugWidth, g2d.drawRect((int) Math.round(p.getX() - lugWidth / 2d), (int) Math.round(p.getY() - lugHeight / 2d), lugWidth,
lugHeight); lugHeight);
} else { } else {
g2d.setColor(TERMINAL_COLOR); g2d.setColor(TERMINAL_COLOR);
g2d.fillRect((int) (p.getX() - lugWidth / 2d), (int) (p.getY() - lugHeight / 2d), lugWidth, g2d.fillRect((int) Math.round(p.getX() - lugWidth / 2d), (int) Math.round(p.getY() - lugHeight / 2d), lugWidth,
lugHeight); lugHeight);
g2d.setColor(TERMINAL_COLOR.darker()); g2d.setColor(TERMINAL_COLOR.darker());
g2d.drawRect((int) (p.getX() - lugWidth / 2d), (int) (p.getY() - lugHeight / 2d), lugWidth, g2d.drawRect((int) Math.round(p.getX() - lugWidth / 2d), (int) Math.round(p.getY() - lugHeight / 2d), lugWidth,
lugHeight); lugHeight);
} }
} }
@@ -134,7 +134,7 @@ public class SwitchLatchingSymbol
Math.atan2(endPoint.getY() - startPoint.getY(), endPoint.getX() - startPoint.getX()); Math.atan2(endPoint.getY() - startPoint.getY(), endPoint.getX() - startPoint.getX());
int startAngle = (int) Math.toDegrees(-latchAngle) - ARC_ANGLE / 2; int startAngle = (int) Math.toDegrees(-latchAngle) - ARC_ANGLE / 2;
g2d.drawArc((int) (startPoint.getX() - d), (int) (startPoint.getY() - d), (int) (d * 2), g2d.drawArc((int) Math.round(startPoint.getX() - d), (int) Math.round(startPoint.getY() - d), (int) (d * 2),
(int) (d * 2), startAngle, ARC_ANGLE); (int) (d * 2), startAngle, ARC_ANGLE);
} }
} }
@@ -188,9 +188,9 @@ public class TactileMicroSwitch extends AbstractLabeledComponent<String> impleme
throw new RuntimeException("Unexpected orientation: " + orientation); throw new RuntimeException("Unexpected orientation: " + orientation);
} }
controlPoints[i] = controlPoints[i] =
new Point2D.Double((int) (firstPoint.getX() + dx1), (int) (firstPoint.getY() + dy1)); new Point2D.Double((int) Math.round(firstPoint.getX() + dx1), (int) Math.round(firstPoint.getY() + dy1));
controlPoints[i + PIN_COUNT / 2] = controlPoints[i + PIN_COUNT / 2] =
new Point2D.Double((int) (firstPoint.getX() + dx2), (int) (firstPoint.getY() + dy2)); new Point2D.Double((int) Math.round(firstPoint.getX() + dx2), (int) Math.round(firstPoint.getY() + dy2));
} }
} }
@@ -369,7 +369,7 @@ public class ThonkJack3_5 extends AbstractTransparentComponent<String> {
rotation.transform(textCenter, textCenter); rotation.transform(textCenter, textCenter);
} }
int drawX = (int) (textCenter.getX() - textWidth / 2); int drawX = (int) Math.round(textCenter.getX() - textWidth / 2);
int drawY = (int) (textCenter.getY() - textHeight / 2 + fontMetrics.getAscent()); int drawY = (int) (textCenter.getY() - textHeight / 2 + fontMetrics.getAscent());
g2d.drawString(label, drawX, drawY); g2d.drawString(label, drawX, drawY);
@@ -187,16 +187,16 @@ public class S1Switch extends AbstractTransparentComponent<Void> implements ISwi
Point2D p = controlPoints[i]; Point2D p = controlPoints[i];
if (outlineMode) { if (outlineMode) {
g2d.setColor(theme.getOutlineColor()); g2d.setColor(theme.getOutlineColor());
g2d.drawOval((int)(p.getX() - padDiameter / 2), (int)(p.getY() - padDiameter / 2), padDiameter, padDiameter); g2d.drawOval((int) Math.round(p.getX() - padDiameter / 2), (int) Math.round(p.getY() - padDiameter / 2), padDiameter, padDiameter);
} else { } else {
g2d.setColor(PAD_COLOR); g2d.setColor(PAD_COLOR);
drawingObserver.startTrackingContinuityArea(true); drawingObserver.startTrackingContinuityArea(true);
g2d.fillOval((int)(p.getX() - padDiameter / 2), (int)(p.getY() - padDiameter / 2), padDiameter, padDiameter); g2d.fillOval((int) Math.round(p.getX() - padDiameter / 2), (int) Math.round(p.getY() - padDiameter / 2), padDiameter, padDiameter);
drawingObserver.stopTrackingContinuityArea(); drawingObserver.stopTrackingContinuityArea();
g2d.setColor(PAD_COLOR.darker()); g2d.setColor(PAD_COLOR.darker());
g2d.drawOval((int)(p.getX() - padDiameter / 2), (int)(p.getY() - padDiameter / 2), padDiameter, padDiameter); g2d.drawOval((int) Math.round(p.getX() - padDiameter / 2), (int) Math.round(p.getY() - padDiameter / 2), padDiameter, padDiameter);
g2d.setColor(HOLE_COLOR); g2d.setColor(HOLE_COLOR);
g2d.fillOval((int)(p.getX() - holeDiameter / 2), (int)(p.getY() - holeDiameter / 2), holeDiameter, holeDiameter); g2d.fillOval((int) Math.round(p.getX() - holeDiameter / 2), (int) Math.round(p.getY() - holeDiameter / 2), holeDiameter, holeDiameter);
} }
if (!showMarkers || i % 3 == 2) { if (!showMarkers || i % 3 == 2) {
@@ -213,8 +213,8 @@ public class S1Switch extends AbstractTransparentComponent<Void> implements ISwi
Stroke stroke = g2d.getStroke(); Stroke stroke = g2d.getStroke();
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2f)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2f));
g2d.setColor(LINE_COLOR); g2d.setColor(LINE_COLOR);
g2d.drawLine((int)(p.getX() - padDiameter / 3), (int)(p.getY() + dy * padDiameter * 4 / 5), g2d.drawLine((int) Math.round(p.getX() - padDiameter / 3), (int) Math.round(p.getY() + dy * padDiameter * 4 / 5),
(int)(p.getX() + padDiameter / 3), (int)(p.getY() + dy * padDiameter * 4 / 5)); (int) Math.round(p.getX() + padDiameter / 3), (int) Math.round(p.getY() + dy * padDiameter * 4 / 5));
g2d.setStroke(stroke); g2d.setStroke(stroke);
} }
@@ -116,7 +116,7 @@ public class BOM extends AbstractComponent<Void> {
int columnWidth = (int) size.convertToPixels() / columnCount; int columnWidth = (int) size.convertToPixels() / columnCount;
int entriesPerColumn = (int) Math.ceil(1.d * bom.size() / columnCount); int entriesPerColumn = (int) Math.ceil(1.d * bom.size() / columnCount);
if (entriesPerColumn == 0) { if (entriesPerColumn == 0) {
g2d.drawString(DEFAULT_TEXT, (int)point.getX(), (int)point.getY()); g2d.drawString(DEFAULT_TEXT, (int) Math.round(point.getX()), (int) Math.round(point.getY()));
return; return;
} }
for (int i = 0; i < bom.size(); i++) { for (int i = 0; i < bom.size(); i++) {
@@ -129,8 +129,8 @@ public class BOM extends AbstractComponent<Void> {
} }
int columnIndex = i / entriesPerColumn; int columnIndex = i / entriesPerColumn;
int rowIndex = i % entriesPerColumn; int rowIndex = i % entriesPerColumn;
int x = (int)(point.getX() + columnIndex * columnWidth); int x = (int) Math.round(point.getX() + columnIndex * columnWidth);
int y = (int)(point.getY() + rowIndex * maxHeight); int y = (int) Math.round(point.getY() + rowIndex * maxHeight);
g2d.drawString(entry.getName(), x, y); g2d.drawString(entry.getName(), x, y);
x += maxNameWidth + SPACING.convertToPixels(); x += maxNameWidth + SPACING.convertToPixels();
g2d.drawString(valueStr, x, y); g2d.drawString(valueStr, x, y);
@@ -161,7 +161,7 @@ public class Image extends AbstractTransparentComponent<Void> {
@Override @Override
public void drawIcon(Graphics2D g2d, int width, int height) { public void drawIcon(Graphics2D g2d, int width, int height) {
g2d.drawImage(ICON.getImage(), (int)point.getX(), (int)point.getY(), null); g2d.drawImage(ICON.getImage(), (int) Math.round(point.getX()), (int) Math.round(point.getY()), null);
} }
@Override @Override
@@ -75,7 +75,7 @@ public class Loadline extends AbstractBoard {
Composite oldComposite = applyAlpha(g2d, componentState); Composite oldComposite = applyAlpha(g2d, componentState);
g2d.setColor(boardColor); g2d.setColor(boardColor);
g2d.fillRect((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(finalSecondPoint.getX() - firstPoint.getX()), g2d.fillRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(finalSecondPoint.getX() - firstPoint.getX()),
(int)(finalSecondPoint.getY() - firstPoint.getY())); (int)(finalSecondPoint.getY() - firstPoint.getY()));
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
@@ -88,7 +88,7 @@ public class Loadline extends AbstractBoard {
? SELECTION_COLOR ? SELECTION_COLOR
: borderColor); : borderColor);
g2d.drawRect((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(finalSecondPoint.getX() - firstPoint.getX()), g2d.drawRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(finalSecondPoint.getX() - firstPoint.getX()),
(int)(finalSecondPoint.getY() - firstPoint.getY())); (int)(finalSecondPoint.getY() - firstPoint.getY()));
} }
@@ -212,8 +212,8 @@ public class AudioTransformer extends AbstractMultiPartComponent<String> impleme
body = new Area[2]; body = new Area[2];
double leadSpacing = this.leadSpacing.convertToPixels(); double leadSpacing = this.leadSpacing.convertToPixels();
double windingSpacing = this.windingSpacing.convertToPixels(); double windingSpacing = this.windingSpacing.convertToPixels();
double centerX = (int) (controlPoints[0].getX() + windingSpacing / 2); double centerX = (int) Math.round(controlPoints[0].getX() + windingSpacing / 2);
double centerY = (int) (controlPoints[0].getY() + leadSpacing); double centerY = (int) Math.round(controlPoints[0].getY() + leadSpacing);
int coreWidth = getClosestOdd(this.coreWidth.convertToPixels()); int coreWidth = getClosestOdd(this.coreWidth.convertToPixels());
int coreThickness = getClosestOdd(this.coreThickness.convertToPixels()); int coreThickness = getClosestOdd(this.coreThickness.convertToPixels());
int coilWidth = getClosestOdd(this.coilWidth.convertToPixels()); int coilWidth = getClosestOdd(this.coilWidth.convertToPixels());
@@ -271,9 +271,9 @@ public class AudioTransformer extends AbstractMultiPartComponent<String> impleme
int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2; int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2;
for (Point2D point : controlPoints) { for (Point2D point : controlPoints) {
g2d.setColor(PIN_COLOR); g2d.setColor(PIN_COLOR);
g2d.fillOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.fillOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
g2d.setColor(PIN_BORDER_COLOR); g2d.setColor(PIN_BORDER_COLOR);
g2d.drawOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.drawOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
} }
Composite oldComposite = applyAlpha(g2d, componentState); Composite oldComposite = applyAlpha(g2d, componentState);
@@ -176,7 +176,7 @@ public class BoxTrimmer extends AbstractTransparentComponent<Resistance> {
// Draw pins // Draw pins
g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_COLOR); g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_COLOR);
for (Point2D p : controlPoints) { for (Point2D p : controlPoints) {
g2d.fillOval((int) p.getX() - 2, (int) p.getY() - 2, 4, 4); g2d.fillOval((int) Math.round(p.getX()) - 2, (int) Math.round(p.getY()) - 2, 4, 4);
} }
// Draw label - position outside body for readability // Draw label - position outside body for readability
@@ -425,7 +425,7 @@ public class MiniaturePotentiometer extends AbstractPotentiometer {
int x = (panelWidth - textWidth) / 2; int x = (panelWidth - textWidth) / 2;
int y = (panelHeight - textHeight) / 2 + fontMetrics.getAscent(); int y = (panelHeight - textHeight) / 2 + fontMetrics.getAscent();
g2d.drawString(label, (int) (bodyRect.getX() + x), (int) (bodyRect.getY() + y)); g2d.drawString(label, (int) Math.round(bodyRect.getX() + x), (int) Math.round(bodyRect.getY() + y));
} }
@Override @Override
@@ -381,10 +381,10 @@ public class MultiSectionCapacitor extends AbstractLabeledComponent<Capacitance[
for (Point2D point : controlPoints) { for (Point2D point : controlPoints) {
if (!outlineMode) { if (!outlineMode) {
g2d.setColor(pinColor); g2d.setColor(pinColor);
g2d.fillOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.fillOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
g2d.setColor(outlineMode ? theme.getOutlineColor() : pinColor.darker()); g2d.setColor(outlineMode ? theme.getOutlineColor() : pinColor.darker());
g2d.drawOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.drawOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
// Draw label. // Draw label.
@@ -345,7 +345,7 @@ public class PotentiometerPanel extends AbstractPotentiometer implements ILayere
int x = (panelWidth - textWidth) / 2; int x = (panelWidth - textWidth) / 2;
int y = panelHeight / 2 - textHeight + fontMetrics.getAscent(); int y = panelHeight / 2 - textHeight + fontMetrics.getAscent();
g2d.drawString(getName(), (int) (bodyRect.getX() + x), (int) (bodyRect.getY() + y)); g2d.drawString(getName(), (int) Math.round(bodyRect.getX() + x), (int) Math.round(bodyRect.getY() + y));
// Draw value. // Draw value.
rect = fontMetrics.getStringBounds(getValueForDisplay(), g2d); rect = fontMetrics.getStringBounds(getValueForDisplay(), g2d);
@@ -356,7 +356,7 @@ public class PotentiometerPanel extends AbstractPotentiometer implements ILayere
x = (panelWidth - textWidth) / 2; x = (panelWidth - textWidth) / 2;
y = panelHeight / 2 + fontMetrics.getAscent(); y = panelHeight / 2 + fontMetrics.getAscent();
g2d.drawString(getValueForDisplay(), (int) (bodyRect.getX() + x), (int) (bodyRect.getY() + y)); g2d.drawString(getValueForDisplay(), (int) Math.round(bodyRect.getX() + x), (int) Math.round(bodyRect.getY() + y));
// Draw markers if enabled. // Draw markers if enabled.
if (getShowMarkers()) { if (getShowMarkers()) {
@@ -141,7 +141,7 @@ public class PotentiometerSymbol extends Abstract3LegSymbol {
// return controlPoints[1].x - pinSpacing / 2 - (int) textRect.getWidth(); // return controlPoints[1].x - pinSpacing / 2 - (int) textRect.getWidth();
// if (controlPoints[0].y > controlPoints[1].y && controlPoints[0].y > controlPoints[2].y) // if (controlPoints[0].y > controlPoints[1].y && controlPoints[0].y > controlPoints[2].y)
// return controlPoints[0].x - (int) (textRect.getWidth() / 2); // return controlPoints[0].x - (int) (textRect.getWidth() / 2);
// return 2 * ((int) (shapeRect.getWidth() - textRect.getWidth()) / 2 + (int) shapeRect.getX()); // return 2 * ((int) (shapeRect.getWidth() - textRect.getWidth()) / 2 + (int) Math.round(shapeRect.getX()));
// } // }
// //
// @Override // @Override
@@ -405,10 +405,10 @@ public class TrimmerPotentiometer extends AbstractPotentiometer {
for (Point2D point : controlPoints) { for (Point2D point : controlPoints) {
if (!outlineMode) { if (!outlineMode) {
g2d.setColor(PIN_COLOR); g2d.setColor(PIN_COLOR);
g2d.fillOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.fillOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR); g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR);
g2d.drawOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.drawOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
// Draw label. // Draw label.
@@ -451,7 +451,7 @@ public class TrimmerPotentiometer extends AbstractPotentiometer {
int x = (panelWidth - textWidth) / 2; int x = (panelWidth - textWidth) / 2;
int y = (panelHeight - textHeight) / 2 + fontMetrics.getAscent(); int y = (panelHeight - textHeight) / 2 + fontMetrics.getAscent();
g2d.drawString(label, (int) (bodyRect.getX() + x), (int) (bodyRect.getY() + y)); g2d.drawString(label, (int) Math.round(bodyRect.getX() + x), (int) Math.round(bodyRect.getY() + y));
} }
@Override @Override
@@ -237,9 +237,9 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
throw new RuntimeException("Unexpected orientation: " + orientation); throw new RuntimeException("Unexpected orientation: " + orientation);
} }
controlPoints[i] = controlPoints[i] =
new Point2D.Double((int) (firstPoint.getX() + dx1), (int) (firstPoint.getY() + dy1)); new Point2D.Double((int) Math.round(firstPoint.getX() + dx1), (int) Math.round(firstPoint.getY() + dy1));
controlPoints[i + pinCount.getValue() / 2] = controlPoints[i + pinCount.getValue() / 2] =
new Point2D.Double((int) (firstPoint.getX() + dx2), (int) (firstPoint.getY() + dy2)); new Point2D.Double((int) Math.round(firstPoint.getX() + dx2), (int) Math.round(firstPoint.getY() + dy2));
} }
} }
@@ -431,10 +431,10 @@ public class DIL_IC extends AbstractLabeledComponent<String> implements IGerberC
Point2D point = controlPoints[i]; Point2D point = controlPoints[i];
// determine points relative to rotation // determine points relative to rotation
int textX1 = (int) (point.getX() - 2 * pinSize); int textX1 = (int) Math.round(point.getX() - 2 * pinSize);
int textY1 = (int) (point.getY() + pinSize / 2); int textY1 = (int) Math.round(point.getY() + pinSize / 2);
int textX2 = (int) (point.getX() + pinSize); int textX2 = (int) Math.round(point.getX() + pinSize);
int textY2 = (int) (point.getY() + pinSize / 2); int textY2 = (int) Math.round(point.getY() + pinSize / 2);
if (orientation == Orientation._90) { if (orientation == Orientation._90) {
textX2 = textX2 - pinSize - pinSize / 2; textX2 = textX2 - pinSize - pinSize / 2;
textY2 = textY2 + pinSize; textY2 = textY2 + pinSize;
@@ -202,7 +202,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
default: default:
throw new RuntimeException("Unexpected orientation: " + orientation); throw new RuntimeException("Unexpected orientation: " + orientation);
} }
controlPoints[i] = new Point2D.Double((int) (firstPoint.getX() + dx1), (int) (firstPoint.getY() + dy1)); controlPoints[i] = new Point2D.Double((int) Math.round(firstPoint.getX() + dx1), (int) Math.round(firstPoint.getY() + dy1));
} }
// Right side pins (second row, staggered - offset by half pin spacing) // Right side pins (second row, staggered - offset by half pin spacing)
@@ -227,7 +227,7 @@ public class MultiwattIC extends AbstractTransparentComponent<String> implements
default: default:
throw new RuntimeException("Unexpected orientation: " + orientation); throw new RuntimeException("Unexpected orientation: " + orientation);
} }
controlPoints[i + pinsLeft] = new Point2D.Double((int) (firstPoint.getX() + dx2), (int) (firstPoint.getY() + dy2)); controlPoints[i + pinsLeft] = new Point2D.Double((int) Math.round(firstPoint.getX() + dx2), (int) Math.round(firstPoint.getY() + dy2));
} }
} }
@@ -216,7 +216,7 @@ public class SIL_IC extends AbstractTransparentComponent<String> implements IGer
default: default:
throw new RuntimeException("Unexpected orientation: " + orientation); throw new RuntimeException("Unexpected orientation: " + orientation);
} }
controlPoints[i] = new Point2D.Double((int) (firstPoint.getX() + dx1), (int) (firstPoint.getY() + dy1)); controlPoints[i] = new Point2D.Double((int) Math.round(firstPoint.getX() + dx1), (int) Math.round(firstPoint.getY() + dy1));
} }
} }
@@ -293,9 +293,9 @@ public class SIL_IC extends AbstractTransparentComponent<String> implements IGer
int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2; int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2;
for (Point2D point : controlPoints) { for (Point2D point : controlPoints) {
g2d.setColor(PIN_COLOR); g2d.setColor(PIN_COLOR);
g2d.fillOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.fillOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
g2d.setColor(PIN_BORDER_COLOR); g2d.setColor(PIN_BORDER_COLOR);
g2d.drawOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.drawOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
} }
@@ -236,10 +236,10 @@ public class TransistorTO3 extends AbstractLabeledComponent<String> {
for (Point2D point : controlPoints) { for (Point2D point : controlPoints) {
if (!outlineMode) { if (!outlineMode) {
g2d.setColor(PIN_COLOR); g2d.setColor(PIN_COLOR);
g2d.fillOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.fillOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR); g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR);
g2d.drawOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.drawOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
Area mainArea = getBody()[0]; Area mainArea = getBody()[0];
@@ -49,7 +49,7 @@ public class Ellipse extends AbstractShapeWithDimensions {
Composite oldComposite = applyAlpha(g2d, componentState); Composite oldComposite = applyAlpha(g2d, componentState);
g2d.setColor(color); g2d.setColor(color);
g2d.fillOval((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY())); g2d.fillOval((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()));
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
// Do not track any changes that follow because the whole oval has been // Do not track any changes that follow because the whole oval has been
@@ -57,7 +57,7 @@ public class Ellipse extends AbstractShapeWithDimensions {
drawingObserver.stopTracking(); drawingObserver.stopTracking();
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: borderColor); : borderColor);
g2d.drawOval((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY())); g2d.drawOval((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()));
} }
@Override @Override
@@ -55,7 +55,7 @@ public class Rectangle extends AbstractShapeWithDimensions {
Composite oldComposite = applyAlpha(g2d, componentState); Composite oldComposite = applyAlpha(g2d, componentState);
g2d.setColor(color); g2d.setColor(color);
g2d.fillRoundRect((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()), radius, g2d.fillRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()), radius,
radius); radius);
g2d.setComposite(oldComposite); g2d.setComposite(oldComposite);
@@ -64,7 +64,7 @@ public class Rectangle extends AbstractShapeWithDimensions {
drawingObserver.stopTracking(); drawingObserver.stopTracking();
g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR
: borderColor); : borderColor);
g2d.drawRoundRect((int)firstPoint.getX(), (int)firstPoint.getY(), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()), radius, g2d.drawRoundRect((int) Math.round(firstPoint.getX()), (int) Math.round(firstPoint.getY()), (int)(secondPoint.getX() - firstPoint.getX()), (int)(secondPoint.getY() - firstPoint.getY()), radius,
radius); radius);
} }
@@ -158,11 +158,11 @@ public class TapeMeasure extends AbstractLeadedComponent<String> {
int legLength = (int) (getPoints()[0].distance(getPoints()[1]) - strWidth) / 2 - 6; int legLength = (int) (getPoints()[0].distance(getPoints()[1]) - strWidth) / 2 - 6;
// draw legs around the enter text // draw legs around the enter text
g2d.drawLine((int)startPoint.getX(), (int)startPoint.getY(), g2d.drawLine((int) Math.round(startPoint.getX()), (int) Math.round(startPoint.getY()),
(int)Math.round(startPoint.getX() + Math.cos(theta) * legLength), (int)Math.round(startPoint.getX() + Math.cos(theta) * legLength),
(int)Math.round(startPoint.getY() + Math.sin(theta) * legLength)); (int)Math.round(startPoint.getY() + Math.sin(theta) * legLength));
g2d.drawLine((int)endPoint.getX(), (int)endPoint.getY(), g2d.drawLine((int) Math.round(endPoint.getX()), (int) Math.round(endPoint.getY()),
(int)Math.round(endPoint.getX() - Math.cos(theta) * legLength), (int)Math.round(endPoint.getX() - Math.cos(theta) * legLength),
(int)Math.round(endPoint.getY() - Math.sin(theta) * legLength)); (int)Math.round(endPoint.getY() - Math.sin(theta) * legLength));
@@ -365,43 +365,43 @@ public class SubminiTube extends AbstractLabeledComponent<String> {
case DEFAULT: case DEFAULT:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor); g2d.setColor(finalPinBorderColor);
g2d.drawLine((int)point.getX(), (int)point.getY(), (int)(point.getX() - leadLength - leadThickness / 2), (int)(startY + increment * i)); g2d.drawLine((int) Math.round(point.getX()), (int) Math.round(point.getY()), (int) Math.round(point.getX() - leadLength - leadThickness / 2), (int)(startY + increment * i));
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor); g2d.setColor(finalPinColor);
g2d.drawLine((int)point.getX(), (int)point.getY(), (int)(point.getX() - leadLength - leadThickness / 2), (int)(startY + increment * i)); g2d.drawLine((int) Math.round(point.getX()), (int) Math.round(point.getY()), (int) Math.round(point.getX() - leadLength - leadThickness / 2), (int)(startY + increment * i));
break; break;
case _90: case _90:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor); g2d.setColor(finalPinBorderColor);
g2d.drawLine((int)point.getX(), (int)point.getY(), (int)(startX + increment * i), (int)(point.getY() - leadLength)); g2d.drawLine((int) Math.round(point.getX()), (int) Math.round(point.getY()), (int)(startX + increment * i), (int) Math.round(point.getY() - leadLength));
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor); g2d.setColor(finalPinColor);
g2d.drawLine((int)point.getX(), (int)point.getY(), (int)(startX + increment * i), (int)(point.getY() - leadLength)); g2d.drawLine((int) Math.round(point.getX()), (int) Math.round(point.getY()), (int)(startX + increment * i), (int) Math.round(point.getY() - leadLength));
break; break;
case _180: case _180:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor); g2d.setColor(finalPinBorderColor);
g2d.drawLine((int)point.getX(), (int)point.getY(), (int)(point.getX() + leadLength - leadThickness / 2), (int)(startY + increment * i)); g2d.drawLine((int) Math.round(point.getX()), (int) Math.round(point.getY()), (int) Math.round(point.getX() + leadLength - leadThickness / 2), (int)(startY + increment * i));
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor); g2d.setColor(finalPinColor);
g2d.drawLine((int)point.getX(), (int)point.getY(), (int)(point.getX() + leadLength - leadThickness / 2), (int)(startY + increment * i)); g2d.drawLine((int) Math.round(point.getX()), (int) Math.round(point.getY()), (int) Math.round(point.getX() + leadLength - leadThickness / 2), (int)(startY + increment * i));
break; break;
case _270: case _270:
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness));
g2d.setColor(finalPinBorderColor); g2d.setColor(finalPinBorderColor);
g2d.drawLine((int)point.getX(), (int)point.getY(), (int)(startX + increment * i), (int)(point.getY() + leadLength - leadThickness / 2)); g2d.drawLine((int) Math.round(point.getX()), (int) Math.round(point.getY()), (int)(startX + increment * i), (int) Math.round(point.getY() + leadLength - leadThickness / 2));
g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2)); g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(leadThickness - 2));
g2d.setColor(finalPinColor); g2d.setColor(finalPinColor);
g2d.drawLine((int)point.getX(), (int)point.getY(), (int)(startX + increment * i), (int)(point.getY() + leadLength - leadThickness / 2)); g2d.drawLine((int) Math.round(point.getX()), (int) Math.round(point.getY()), (int)(startX + increment * i), (int) Math.round(point.getY() + leadLength - leadThickness / 2));
break; break;
} }
} }
if (getTopLead()) { if (getTopLead()) {
Point2D point = controlPoints[controlPoints.length - 1]; Point2D point = controlPoints[controlPoints.length - 1];
g2d.setColor(PIN_COLOR); g2d.setColor(PIN_COLOR);
g2d.fillOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.fillOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR); g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR);
g2d.drawOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.drawOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
} else { } else {
if (!outlineMode) { if (!outlineMode) {
@@ -409,9 +409,9 @@ public class SubminiTube extends AbstractLabeledComponent<String> {
: 0; i < controlPoints.length; i++) { : 0; i < controlPoints.length; i++) {
Point2D point = controlPoints[i]; Point2D point = controlPoints[i];
g2d.setColor(PIN_COLOR); g2d.setColor(PIN_COLOR);
g2d.fillOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.fillOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR); g2d.setColor(outlineMode ? theme.getOutlineColor() : PIN_BORDER_COLOR);
g2d.drawOval((int)(point.getX() - pinSize / 2), (int)(point.getY() - pinSize / 2), pinSize, pinSize); g2d.drawOval((int) Math.round(point.getX() - pinSize / 2), (int) Math.round(point.getY() - pinSize / 2), pinSize, pinSize);
} }
} }
} }
@@ -122,8 +122,8 @@ public class FlexibleLeadsEditor implements IProjectEditor {
double dy = offsetY.convertToPixels() * (i - 1); double dy = offsetY.convertToPixels() * (i - 1);
// calculate lead position // calculate lead position
Point2D p1 = new Point2D.Double((int)(p0.getX() + dx / 2), (int)(p0.getY() + dy / 2)); Point2D p1 = new Point2D.Double((int) Math.round(p0.getX() + dx / 2), (int) Math.round(p0.getY() + dy / 2));
Point2D p2 = new Point2D.Double((int)(p0.getX() + dx), (int)(p0.getY() + dy)); Point2D p2 = new Point2D.Double((int) Math.round(p0.getX() + dx), (int) Math.round(p0.getY() + dy));
if (c.getOrientation() != Orientation.DEFAULT) { if (c.getOrientation() != Orientation.DEFAULT) {
AffineTransform tx = AffineTransform.getRotateInstance(c.getOrientation().toRadians(), p0.getX(), p0.getY()); AffineTransform tx = AffineTransform.getRotateInstance(c.getOrientation().toRadians(), p0.getX(), p0.getY());
@@ -182,7 +182,7 @@ public class FlexibleLeadsEditor implements IProjectEditor {
HookupWire w = new HookupWire(); HookupWire w = new HookupWire();
getInstantiationManager().fillWithDefaultProperties(w, null); getInstantiationManager().fillWithDefaultProperties(w, null);
for (int j = 0; j < w.getControlPointCount(); j++) { for (int j = 0; j < w.getControlPointCount(); j++) {
Point2D p = new Point2D.Double((int)(p0.getX() + dx * j), (int)(p0.getY() + dy * j)); Point2D p = new Point2D.Double((int) Math.round(p0.getX() + dx * j), (int) Math.round(p0.getY() + dy * j));
if (tx != null) if (tx != null)
tx.transform(p, p); tx.transform(p, p);
w.setControlPoint(p, j); w.setControlPoint(p, j);
@@ -213,7 +213,7 @@ public class FlexibleLeadsEditor implements IProjectEditor {
HookupWire w = new HookupWire(); HookupWire w = new HookupWire();
getInstantiationManager().fillWithDefaultProperties(w, null); getInstantiationManager().fillWithDefaultProperties(w, null);
for (int j = 0; j < w.getControlPointCount(); j++) { for (int j = 0; j < w.getControlPointCount(); j++) {
Point2D pw = new Point2D.Double((int)(p.getX() + dx * j), (int)(p.getY() + dy * j)); Point2D pw = new Point2D.Double((int) Math.round(p.getX() + dx * j), (int) Math.round(p.getY() + dy * j));
w.setControlPoint(pw, j); w.setControlPoint(pw, j);
} }
newSelection.add(w); newSelection.add(w);
@@ -248,7 +248,7 @@ public class FlexibleLeadsEditor implements IProjectEditor {
w.setValue(AWG._24); w.setValue(AWG._24);
getInstantiationManager().fillWithDefaultProperties(w, null); getInstantiationManager().fillWithDefaultProperties(w, null);
for (int j = 0; j < w.getControlPointCount(); j++) { for (int j = 0; j < w.getControlPointCount(); j++) {
Point2D p = new Point2D.Double((int)(p0.getX() + dx * j), (int)(p0.getY() + dy * j)); Point2D p = new Point2D.Double((int) Math.round(p0.getX() + dx * j), (int) Math.round(p0.getY() + dy * j));
if (tx != null) if (tx != null)
tx.transform(p, p); tx.transform(p, p);
w.setControlPoint(p, j); w.setControlPoint(p, j);
@@ -444,10 +444,10 @@ public class CanvasPlugin implements IPlugIn{
// center to cursor // center to cursor
int relativeX = (int) (mousePosBefore.getX() + locationBefore.getX()); int relativeX = (int) (mousePosBefore.getX() + locationBefore.getX());
int relativeY = (int) (mousePosBefore.getY() + locationBefore.getY()); int relativeY = (int) (mousePosBefore.getY() + locationBefore.getY());
Point desiredPos = new Point((int) (1d * mousePosBefore.getX() / oldZoom * newZoom), Point desiredPos = new Point((int) Math.round(1d * mousePosBefore.getX() / oldZoom * newZoom),
(int) (1d * mousePosBefore.getY() / oldZoom * newZoom)); (int) Math.round(1d * mousePosBefore.getY() / oldZoom * newZoom));
int newHorizontalPos = (int) (desiredPos.getX() - relativeX); int newHorizontalPos = (int) Math.round(desiredPos.getX() - relativeX);
int newVerticalPos = (int) (desiredPos.getY() - relativeY); int newVerticalPos = (int) Math.round(desiredPos.getY() - relativeY);
horizontal.setValue(newHorizontalPos < 0 ? 0 : newHorizontalPos); horizontal.setValue(newHorizontalPos < 0 ? 0 : newHorizontalPos);
vertical.setValue(newVerticalPos < 0 ? 0 : newVerticalPos); vertical.setValue(newVerticalPos < 0 ? 0 : newVerticalPos);
} else { } else {