summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/view/impl/StonePainter.java
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2011-05-06 01:35:21 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2011-05-06 01:35:21 +0200
commit794e3573f6d96775b76cfeb1c833d343a52d2055 (patch)
tree7f1bb9d9cbdb9577910355774f9d7392f67921c1 /src/jrummikub/view/impl/StonePainter.java
parent193e9247fac9d10e3c32cc7cacb65406ef9d19c8 (diff)
downloadJRummikub-794e3573f6d96775b76cfeb1c833d343a52d2055.tar
JRummikub-794e3573f6d96775b76cfeb1c833d343a52d2055.zip
A lot of view performance optimizations
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@162 72836036-5685-4462-b002-a69064685172
Diffstat (limited to 'src/jrummikub/view/impl/StonePainter.java')
-rw-r--r--src/jrummikub/view/impl/StonePainter.java79
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);
}
}