package games.strategy.triplea.image;
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ImageIcon;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.Resource;
import games.strategy.triplea.ResourceLoader;
import games.strategy.ui.Util;
public class ResourceImageFactory {
public static final int DEFAULT_RESOURCE_ICON_SIZE = 12;
public static final int LARGE_RESOURCE_ICON_SIZE = 24;
private static final String FILE_NAME_BASE = "resources/";
// maps Point -> Icon
private final Map<String, ImageIcon> m_icons = new HashMap<>();
// Scaling factor for images
private double m_scaleFactor;
private ResourceLoader m_resourceLoader;
/** Creates new ResourceImageFactory. */
public ResourceImageFactory() {}
public void setResourceLoader(final ResourceLoader loader, final double scaleFactor) {
m_scaleFactor = scaleFactor;
m_resourceLoader = loader;
clearImageCache();
}
/**
* Set the scaling factor.
*/
public void setScaleFactor(final double scaleFactor) {
if (m_scaleFactor != scaleFactor) {
m_scaleFactor = scaleFactor;
clearImageCache();
}
}
/**
* Return the scaling factor.
*/
public double getScaleFactor() {
return m_scaleFactor;
}
/**
* Return the width of scaled.
*/
public int getUnitImageWidth(final boolean large) {
return (int) (m_scaleFactor * (large ? LARGE_RESOURCE_ICON_SIZE : DEFAULT_RESOURCE_ICON_SIZE));
}
/**
* Return the height of scaled.
*/
public int getUnitImageHeight(final boolean large) {
return (int) (m_scaleFactor * (large ? LARGE_RESOURCE_ICON_SIZE : DEFAULT_RESOURCE_ICON_SIZE));
}
// Clear the image and icon cache
private void clearImageCache() {
m_icons.clear();
}
private Image getBaseImage(final String baseImageName) {
// URL uses '/' not '\'
final String fileName = FILE_NAME_BASE + baseImageName + ".png";
final URL url = m_resourceLoader.getResource(fileName);
if (url == null) {
throw new IllegalStateException("Cant load: " + baseImageName + " looking in: " + fileName);
}
final Image image = Toolkit.getDefaultToolkit().getImage(url);
Util.ensureImageLoaded(image);
return image;
}
/**
* Return a icon image.
*/
public ImageIcon getIcon(final Resource type, final GameData data, final boolean large) {
final String fullName = type.getName() + (large ? "_large" : "");
if (m_icons.containsKey(fullName)) {
return m_icons.get(fullName);
}
final Image img = getBaseImage(fullName);
final ImageIcon icon = new ImageIcon(img);
m_icons.put(fullName, icon);
return icon;
}
}