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<Graphics> {
@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()));
}
}