package aimax.osm.gui.fx.viewer; import aimax.osm.viewer.UColor; import aimax.osm.viewer.UnifiedImageBuilder; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; import javafx.scene.shape.StrokeLineJoin; import javafx.scene.text.Font; /** * Specialized image builder for the FX canvas. * * @author Ruediger Lunde */ public class FXImageBuilder implements UnifiedImageBuilder<Canvas> { private Canvas result; private GraphicsContext gc; boolean areaFillMode; @Override public void initialize(Canvas canvas) { result = canvas; gc = canvas.getGraphicsContext2D(); initStroke(); } /** Returns the width of the image under construction. */ @Override public int getWidth() { return (int) result.getWidth(); } /** Returns the height of the image under construction. */ @Override public int getHeight() { return (int) result.getHeight(); } @Override public void drawLine(int x1, int y1, int x2, int y2) { gc.strokeLine(x1, y1, x2, y2); } @Override public void drawRect(int x, int y, int width, int height) { initStroke(); if (areaFillMode) gc.fillRect(x, y, width, height); else gc.strokeRect(x, y, width, height); } @Override public void drawOval(int x, int y, int width, int height) { initStroke(); if (areaFillMode) gc.fillOval(x, y, width, height); else gc.strokeOval(x, y, width, height); } @Override public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) { double[] xPts = new double[nPoints]; double[] yPts = new double[nPoints]; for (int i = 0; i < nPoints; i++) { xPts[i] = xPoints[i]; yPts[i] = yPoints[i]; } initStroke(); gc.strokePolyline(xPts, yPts, nPoints); } @Override public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) { double[] xPts = new double[nPoints]; double[] yPts = new double[nPoints]; for (int i = 0; i < nPoints; i++) { xPts[i] = xPoints[i]; yPts[i] = yPoints[i]; } initStroke(); if (areaFillMode) gc.fillPolygon(xPts, yPts, nPoints); else gc.strokePolygon(xPts, yPts, nPoints); } @Override public void drawString(String text, int x, int y) { gc.fillText(text, x, y); } @Override public Canvas getResult() { return result; } @Override public void setColor(UColor color) { gc.setStroke(Color.rgb(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha() / 255.0)); gc.setFill(Color.rgb(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha() / 255.0)); } @Override public void setLineStyle(boolean dashed, float width) { gc.setLineWidth(width); gc.setLineDashes(new double[] {width * 2, width * 2}); gc.setLineJoin(StrokeLineJoin.ROUND); } @Override public void setAreaFilled(boolean value) { areaFillMode = value; } @Override public void setFontSize(float size) { gc.setFont(new Font(gc.getFont().getName(), size)); } @Override public float getFontSize() { return (float) gc.getFont().getSize(); } private void initStroke() { //gc.setLineWidth(1); gc.setLineDashes(null); gc.setLineJoin(StrokeLineJoin.ROUND); } }