DasherJava / src / dasherJava / gui / SwingWorldGraphics.java
SwingWorldGraphics.java
Raw
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()));
	}
}