From: <oli...@us...> - 2009-04-04 08:23:55
|
Revision: 5253 http://freecol.svn.sourceforge.net/freecol/?rev=5253&view=rev Author: olivierschmitt Date: 2009-04-04 08:23:51 +0000 (Sat, 04 Apr 2009) Log Message: ----------- Performance optimization, added quick cache of string images Modified Paths: -------------- freecol/trunk/src/net/sf/freecol/client/gui/GUI.java Modified: freecol/trunk/src/net/sf/freecol/client/gui/GUI.java =================================================================== --- freecol/trunk/src/net/sf/freecol/client/gui/GUI.java 2009-04-04 08:21:50 UTC (rev 5252) +++ freecol/trunk/src/net/sf/freecol/client/gui/GUI.java 2009-04-04 08:23:51 UTC (rev 5253) @@ -1408,8 +1408,10 @@ */ public BufferedImage createStringImage(JComponent c, String nameString, Color color, int maxWidth, int preferredFontSize) { return createStringImage(c, null, nameString, color, maxWidth, preferredFontSize); - } + } + private HashMap<String, BufferedImage> stringImageCache = new HashMap<String, BufferedImage>(); + /** * Creates an image with a string of a given color and with * a black border around the glyphs. @@ -1427,29 +1429,38 @@ * @param preferredFontSize The preferred font size. * @return The image that was created. */ - private BufferedImage createStringImage(JComponent c, Graphics g, String nameString, Color color, int maxWidth, int preferredFontSize) { + private BufferedImage createStringImage(JComponent c, Graphics g, String nameString, Color color, int maxWidth, int preferredFontSize) { if (color == null) { logger.warning("createStringImage called with color null"); color = Color.WHITE; } + BufferedImage bi = null; + // Lookup in the cache if the image has been generated already + bi = stringImageCache.get(nameString); + if (bi!=null) { + return bi; + } + Font nameFont = (c != null) ? c.getFont() : g.getFont(); FontMetrics nameFontMetrics = (c != null) ? c.getFontMetrics(nameFont) : g.getFontMetrics(nameFont); - BufferedImage bi = null; + // create an image of the appropriate size int fontSize = preferredFontSize; do { - nameFont = nameFont.deriveFont(Font.BOLD, fontSize); + nameFont = nameFont.deriveFont(Font.BOLD, fontSize); nameFontMetrics = (c != null) ? c.getFontMetrics(nameFont) : g.getFontMetrics(nameFont); - bi = new BufferedImage(nameFontMetrics.stringWidth(nameString) + 4, nameFontMetrics.getMaxAscent() + nameFontMetrics.getMaxDescent(), BufferedImage.TYPE_INT_ARGB); + bi = new BufferedImage(nameFontMetrics.stringWidth(nameString) + 4, + nameFontMetrics.getMaxAscent() + nameFontMetrics.getMaxDescent(), BufferedImage.TYPE_INT_ARGB); fontSize -= 2; } while (bi.getWidth() > maxWidth); + // draw the string with selected color Graphics2D big = bi.createGraphics(); - big.setColor(color); big.setFont(nameFont); big.drawString(nameString, 2, nameFontMetrics.getMaxAscent()); + // draw the border around letters int playerColor = color.getRGB(); int borderColor = getStringBorderColor(color).getRGB(); for (int biX=0; biX<bi.getWidth(); biX++) { @@ -1470,7 +1481,7 @@ } } } - + this.stringImageCache.put(nameString, bi); return bi; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |