package dasherJava.gui; import java.awt.BasicStroke; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.LineMetrics; import dasherJava.DasherJava; import dasherJava.core.world.WorldGraphics; public class SwingWorldGraphics extends WorldGraphics { @Override public void executeDrawCommand(WorldGraphicsDrawCommand drawCommand, Graphics output) { switch (DasherJava.getSettings().getAntialiasing()) { case "on": ((Graphics2D) output).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); break; case "default": ((Graphics2D) output).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_DEFAULT); break; case "off": ((Graphics2D) output).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); break; } switch (DasherJava.getSettings().getTextAntialiasing()) { case "on": ((Graphics2D) output).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); break; case "gasp": ((Graphics2D) output).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP); break; case "default": ((Graphics2D) output).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT); break; case "off": ((Graphics2D) output).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); break; } if (drawCommand instanceof WorldGraphicsFillRectCommand) { WorldGraphicsFillRectCommand fillRectCommand = (WorldGraphicsFillRectCommand) drawCommand; if (fillRectCommand.getColor()!=null && fillRectCommand.getColor().getAlpha()>0) { //fill area output.setColor(fillRectCommand.getColor().toAWTColor()); output.fillRect(fillRectCommand.getX(), fillRectCommand.getY(), fillRectCommand.getWidth(), fillRectCommand.getHeight()); } if (fillRectCommand.getOutlineColor()!=null && fillRectCommand.getOutlineColor().getAlpha()>0 && fillRectCommand.getOutlineThickness()>0.0f) { //draw outline output.setColor(fillRectCommand.getOutlineColor().toAWTColor()); ((Graphics2D) output).setStroke(new BasicStroke(fillRectCommand.getOutlineThickness())); output.drawRect(fillRectCommand.getX(), fillRectCommand.getY(), fillRectCommand.getWidth(), fillRectCommand.getHeight()); } } else if (drawCommand instanceof WorldGraphicsFillOvalCommand) { WorldGraphicsFillOvalCommand fillOvalCommand = (WorldGraphicsFillOvalCommand) drawCommand; if (fillOvalCommand.getColor()!=null && fillOvalCommand.getColor().getAlpha()>0) { //fill area output.setColor(fillOvalCommand.getColor().toAWTColor()); output.fillOval(fillOvalCommand.getX(), fillOvalCommand.getY(), fillOvalCommand.getWidth(), fillOvalCommand.getHeight()); } if (fillOvalCommand.getOutlineColor()!=null && fillOvalCommand.getOutlineColor().getAlpha()>0 && fillOvalCommand.getOutlineThickness()>0.0f) { //draw outline output.setColor(fillOvalCommand.getOutlineColor().toAWTColor()); ((Graphics2D) output).setStroke(new BasicStroke(fillOvalCommand.getOutlineThickness())); output.drawOval(fillOvalCommand.getX(), fillOvalCommand.getY(), fillOvalCommand.getWidth(), fillOvalCommand.getHeight()); } } else if (drawCommand instanceof WorldGraphicsDrawLineCommand) { WorldGraphicsDrawLineCommand drawLineCommand = (WorldGraphicsDrawLineCommand) drawCommand; output.setColor(drawLineCommand.getColor().toAWTColor()); ((Graphics2D) output).setStroke(new BasicStroke(drawLineCommand.getThickness())); output.drawLine(drawLineCommand.getX(), drawLineCommand.getY(), drawLineCommand.getX2(), drawLineCommand.getY2()); } else if (drawCommand instanceof WorldGraphicsDrawStringCommand) { WorldGraphicsDrawStringCommand drawStringCommand = (WorldGraphicsDrawStringCommand) drawCommand; output.setColor(drawStringCommand.getColor().toAWTColor()); output.setFont(new Font(output.getFont().getFontName(), Font.PLAIN, drawStringCommand.getFontSize())); //could use deriveFont() StringDrawMetrics stringDrawMetrics = drawStringCommand.getStringDrawMetrics(); if (stringDrawMetrics==null) { //first time executing this draw command drawStringCommand.computeLocationDueToParent(); stringDrawMetrics=getStringDrawMetrics(drawStringCommand.getString(), output); drawStringCommand.setStringDrawMetrics(stringDrawMetrics); } int x = 0; int y = 0; switch (drawStringCommand.getAnchor()) { case LEFT: x=drawStringCommand.getXDueToParent(); y=drawStringCommand.getYDueToParent()-stringDrawMetrics.getHeight()/2+stringDrawMetrics.getAscent(); break; case RIGHT: x=drawStringCommand.getXDueToParent()-stringDrawMetrics.getWidth(); y=drawStringCommand.getYDueToParent()-stringDrawMetrics.getHeight()/2+stringDrawMetrics.getAscent(); break; case TOP: x=drawStringCommand.getXDueToParent()-stringDrawMetrics.getWidth()/2; y=drawStringCommand.getYDueToParent()+stringDrawMetrics.getAscent(); break; case BOTTOM: x=drawStringCommand.getXDueToParent()-stringDrawMetrics.getWidth()/2; y=drawStringCommand.getYDueToParent()-stringDrawMetrics.getDescent(); break; } output.drawString(drawStringCommand.getString(), x, y); } } private static StringDrawMetrics getStringDrawMetrics(String s, Graphics output) { FontMetrics fontMetrics = output.getFontMetrics(); LineMetrics lineMetrics = fontMetrics.getLineMetrics(s, output); return new StringDrawMetrics(fontMetrics.stringWidth(s), Math.round(lineMetrics.getHeight()), Math.round(lineMetrics.getAscent()), Math.round(lineMetrics.getDescent())); } }