diff --git a/src/main/java/de/neemann/digital/draw/graphics/GraphicSwing.java b/src/main/java/de/neemann/digital/draw/graphics/GraphicSwing.java index 96a08c3a9..1631d1460 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/GraphicSwing.java +++ b/src/main/java/de/neemann/digital/draw/graphics/GraphicSwing.java @@ -49,7 +49,7 @@ public class GraphicSwing implements Graphic { if (p.isClosed()) path.closePath(); - if (style.isFilled()) + if (style.isFilled() && p.isClosed()) gr.fill(path); gr.draw(path); } diff --git a/src/main/java/de/neemann/digital/draw/graphics/GraphicsImage.java b/src/main/java/de/neemann/digital/draw/graphics/GraphicsImage.java index a1c9f3cb3..12315327d 100644 --- a/src/main/java/de/neemann/digital/draw/graphics/GraphicsImage.java +++ b/src/main/java/de/neemann/digital/draw/graphics/GraphicsImage.java @@ -26,8 +26,9 @@ public final class GraphicsImage extends GraphicSwing implements Closeable { public static GraphicsImage create(OutputStream out, Vector min, Vector max, String format) { int thickness = Style.NORMAL.getThickness(); BufferedImage bi - = new BufferedImage(max.x - min.x + thickness * 2, - max.y - min.y + thickness * 2, + = new BufferedImage( + (max.x - min.x + thickness * 2) * 2, + (max.y - min.y + thickness * 2) * 2, BufferedImage.TYPE_INT_ARGB); Graphics2D gr = bi.createGraphics(); gr.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); @@ -38,6 +39,7 @@ public final class GraphicsImage extends GraphicSwing implements Closeable { gr.setColor(new Color(255, 255, 255, 0)); gr.fillRect(0, 0, bi.getWidth(), bi.getHeight()); + gr.scale(2, 2); gr.translate(thickness - min.x, thickness - min.y); return new GraphicsImage(out, gr, bi, format); diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 5a9111721..19cf9cce7 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -33,6 +33,7 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.Closeable; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -197,6 +198,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E JMenu export = new JMenu(Lang.get("menu_export")); export.add(new ExportAction(Lang.get("menu_exportSVG"), "svg", GraphicSVGIndex::new)); export.add(new ExportAction(Lang.get("menu_exportSVGLaTex"), "svg", GraphicSVGLaTeX::new)); + export.add(new ExportAction(Lang.get("menu_exportPNG"), "png", (file, min, max) -> GraphicsImage.create(new FileOutputStream(file), min, max, "PNG"))); JMenu file = new JMenu(Lang.get("menu_file")); bar.add(file); diff --git a/src/main/resources/lang/lang_de.properties b/src/main/resources/lang/lang_de.properties index c75d9a9ae..0ae33b2aa 100644 --- a/src/main/resources/lang/lang_de.properties +++ b/src/main/resources/lang/lang_de.properties @@ -230,6 +230,7 @@ menu_editAttributes_tt=Diese Attribute beeinflussen das Modell, wenn es in ander menu_fast=Schneller Lauf menu_fast_tt=F\u00FChrt das Modell aus, bis ein Stopsignal \u00FCber ein BRK-Element detektiert wird. menu_export=Export +menu_exportPNG=Export PNG menu_exportSVG=Export SVG menu_exportSVGLaTex=Export SVG+LaTeX menu_delete=L\u00F6schen diff --git a/src/main/resources/lang/lang_en.properties b/src/main/resources/lang/lang_en.properties index 05f27b92e..0f8f2a4d8 100644 --- a/src/main/resources/lang/lang_en.properties +++ b/src/main/resources/lang/lang_en.properties @@ -218,6 +218,7 @@ menu_fast_tt=Runs the model until a break is detected by the BRK element. menu_export=Export menu_exportSVG=Export SVG menu_exportSVGLaTex=Export SVG+LaTeX +menu_exportPNG=Export PNG menu_delete=Delete elements menu_delete_tt=Delete selected single element or group of elements menu_editRunAttributes=Simulation Settings