package games.strategy.triplea.ui.screen.drawable;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import games.strategy.engine.data.GameData;
import games.strategy.triplea.ui.IUIContext;
import games.strategy.triplea.ui.mapdata.MapData;
import games.strategy.triplea.ui.screen.TileManager;
public abstract class MapTileDrawable implements IDrawable {
protected boolean m_noImage = false;
protected final int m_x;
protected final int m_y;
protected final IUIContext m_uiContext;
protected boolean m_unscaled;
public MapTileDrawable(final int x, final int y, final IUIContext uiContext) {
m_x = x;
m_y = y;
m_uiContext = uiContext;
m_unscaled = false;
}
public abstract MapTileDrawable getUnscaledCopy();
protected abstract Image getImage();
@Override
public void draw(final Rectangle bounds, final GameData data, final Graphics2D graphics, final MapData mapData,
final AffineTransform unscaled, final AffineTransform scaled) {
final Image img = getImage();
if (img == null) {
return;
}
final Object oldRenderingValue = graphics.getRenderingHint(RenderingHints.KEY_RENDERING);
final Object oldAlphaValue = graphics.getRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION);
final Object oldInterpolationValue = graphics.getRenderingHint(RenderingHints.KEY_INTERPOLATION);
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
graphics.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED);
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
// the tile images are already scaled
if (unscaled != null) {
graphics.setTransform(unscaled);
}
graphics.drawImage(img, m_x * TileManager.TILE_SIZE - bounds.x, m_y * TileManager.TILE_SIZE - bounds.y, null);
if (unscaled != null) {
graphics.setTransform(scaled);
}
if (oldAlphaValue == null) {
graphics.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);
} else {
graphics.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, oldAlphaValue);
}
if (oldRenderingValue == null) {
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_DEFAULT);
} else {
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, oldRenderingValue);
}
if (oldInterpolationValue == null) {
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
} else {
graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, oldInterpolationValue);
}
}
}