diff options
Diffstat (limited to 'src/jrummikub/view/impl/StonePainter.java')
-rw-r--r-- | src/jrummikub/view/impl/StonePainter.java | 79 |
1 files changed, 64 insertions, 15 deletions
diff --git a/src/jrummikub/view/impl/StonePainter.java b/src/jrummikub/view/impl/StonePainter.java index 0700966..68ab72c 100644 --- a/src/jrummikub/view/impl/StonePainter.java +++ b/src/jrummikub/view/impl/StonePainter.java @@ -6,9 +6,13 @@ import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Rectangle; +import java.awt.RenderingHints; import java.awt.Stroke; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.util.HashMap; +import java.util.Map; import jrummikub.model.Position; import jrummikub.model.Stone; @@ -31,6 +35,9 @@ class StonePainter { private static final float BRIGHTER_SCALE = 1.15f; + private Map<StoneColor, Map<Integer, BufferedImage>> defaultStones; + private Map<StoneColor, Map<Integer, BufferedImage>> selectedStones; + /** * The width of one pixel in the scale of 1.0 */ @@ -77,6 +84,7 @@ class StonePainter { */ public void setScale(float scale) { this.scale = scale; + prepaint(); } /** @@ -114,12 +122,59 @@ class StonePainter { return (int) (DEFAULT_WIDTH * scale / ASPECT_RATIO); } + private BufferedImage prepaintStone(Color fg, Color bg, int value) { + Rectangle r = new Rectangle(0, 0, getStoneWidth(), getStoneHeight()); + BufferedImage img = new BufferedImage(r.width, r.height, + BufferedImage.TYPE_INT_RGB); + Graphics2D g = img.createGraphics(); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + paintStoneBackground(g, r, bg); + + if (value == 0) { + paintJoker(g, r, fg); + } else { + paintStoneValue(g, r, fg, value); + } + + paintCircle(g, r, bg); + + return img; + } + + private Map<Integer, BufferedImage> prepaintColor(Color fg, Color bg) { + Map<Integer, BufferedImage> images = new HashMap<Integer, BufferedImage>(); + + for (int i = 0; i <= 13; ++i) { + images.put(i, prepaintStone(fg, bg, i)); + } + + return images; + } + + private void prepaint() { + defaultStones = new HashMap<StoneColor, Map<Integer, BufferedImage>>(); + selectedStones = new HashMap<StoneColor, Map<Integer, BufferedImage>>(); + + Color defaultBackground = BACKGROUND_COLOR; + Color selectedBackground = SELECTED_COLOR; + + for (StoneColor color : StoneColor.values()) { + Color defaultFg = getColor(color); + Color selectedFg = defaultFg.darker(); + + defaultStones.put(color, prepaintColor(defaultFg, defaultBackground)); + selectedStones.put(color, prepaintColor(selectedFg, selectedBackground)); + } + } + /** * @param scale * the scaling factor for the grid coordinates */ StonePainter(float scale) { - this.scale = scale; + setScale(scale); } private void paintStoneBackground(Graphics2D g, Rectangle r, Color background) { @@ -250,25 +305,19 @@ class StonePainter { * if selected is true the stone will be painted darker */ public void paintStone(Graphics2D g, Stone stone, Position p, boolean selected) { - Color background = selected ? SELECTED_COLOR : BACKGROUND_COLOR; + // Color background = selected ? SELECTED_COLOR : BACKGROUND_COLOR; int width = getStoneWidth(); int height = getStoneHeight(); - - Rectangle rect = new Rectangle((int) (p.getX() * width), - (int) (p.getY() * height), width, height); - - paintStoneBackground(g, rect, background); - - Color color = getColor(stone.getColor()); - if (selected) - color = color.darker(); + int x = (int) (p.getX() * width), y = (int) (p.getY() * height); if (stone.isJoker()) { - paintJoker(g, rect, color); + g.drawImage( + (selected ? selectedStones : defaultStones).get(stone.getColor()) + .get(0), x, y, null); } else { - paintStoneValue(g, rect, color, stone.getValue()); + g.drawImage( + (selected ? selectedStones : defaultStones).get(stone.getColor()) + .get(stone.getValue()), x, y, null); } - - paintCircle(g, rect, background); } } |