package jrummikub.view; import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.geom.Rectangle2D; import jrummikub.model.Stone; import jrummikub.model.StoneColor; class StonePainter { private static final float ASPECT_RATIO = 0.75f; private static final float DEFAULT_WIDTH = 40; private static final float CIRCLE_WIDTH = 0.5f; private static final Color BACKGROUND_COLOR = new Color(0.9f, 0.9f, 0.6f); public static final float BOARD_SCALE = 75.0f*ASPECT_RATIO/DEFAULT_WIDTH; private static Color getColor(StoneColor color) { switch(color) { case BLACK: return Color.BLACK; case BLUE: return Color.BLUE; case ORANGE: return new Color(1.0f, 0.6f, 0); case RED: return Color.RED; } return null; } public static void paintStone(Graphics g, Stone stone, float x, float y, float scale) { if (g instanceof Graphics2D) { ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); } int width = (int)(DEFAULT_WIDTH*scale); int height = (int)(DEFAULT_WIDTH*scale/ASPECT_RATIO); int xpos = (int)(x*width); int ypos = (int)(y*height); // Paint background g.setColor(BACKGROUND_COLOR); g.fillRect(xpos, ypos, width, height); // Paint bevel border g.setColor(BACKGROUND_COLOR.brighter().brighter()); g.fillRect(xpos, ypos, 1, height); g.setColor(BACKGROUND_COLOR.brighter()); g.fillRect(xpos+1, ypos+1, 1, height-2); g.setColor(BACKGROUND_COLOR.brighter().brighter()); g.fillRect(xpos, ypos, width, 1); g.setColor(BACKGROUND_COLOR.brighter()); g.fillRect(xpos+1, ypos+1, width-2, 1); g.setColor(BACKGROUND_COLOR.darker().darker()); g.fillRect(xpos+width-1, ypos, 1, height); g.setColor(BACKGROUND_COLOR.darker()); g.fillRect(xpos+width-2, ypos+1, 1, height-2); g.setColor(BACKGROUND_COLOR.darker().darker()); g.fillRect(xpos, ypos+height-1, width, 1); g.setColor(BACKGROUND_COLOR.darker()); g.fillRect(xpos+1, ypos+height-2, width-2, 1); // Paint number g.setFont(new Font("SansSerif", Font.BOLD, height/4)); FontMetrics fm = g.getFontMetrics(); String value = Integer.toString(stone.getValue()); Rectangle2D stringRect = fm.getStringBounds(value, g); g.setColor(getColor(stone.getColor()).darker()); g.drawString(value, (int)(xpos+width/2-stringRect.getWidth()/2)+1, ypos+height/4+(fm.getAscent()-fm.getDescent())/2+1); g.setColor(getColor(stone.getColor())); g.drawString(value, (int)(xpos+width/2-stringRect.getWidth()/2), ypos+height/4+(fm.getAscent()-fm.getDescent())/2); // Paint circle g.setColor(BACKGROUND_COLOR.darker()); g.drawArc((int)(xpos+width/2-width*CIRCLE_WIDTH/2), (int)(ypos+height*0.65f-width*CIRCLE_WIDTH/2), (int)(width*CIRCLE_WIDTH), (int)(width*CIRCLE_WIDTH), 50, 170); g.setColor(BACKGROUND_COLOR.brighter()); g.drawArc((int)(xpos+width/2-width*CIRCLE_WIDTH/2), (int)(ypos+height*0.65f-width*CIRCLE_WIDTH/2), (int)(width*CIRCLE_WIDTH), (int)(width*CIRCLE_WIDTH), -130, 170); } }