Make sure all BufferedImages are compatible to current settings.
This commit is contained in:
parent
cdee2a5f3d
commit
7023f5322b
|
@ -25,7 +25,7 @@ public class Main {
|
||||||
* @param args Command line arguments.
|
* @param args Command line arguments.
|
||||||
*/
|
*/
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
final GraphicsSettings gs = new GraphicsSettings(); // Get settings
|
final GraphicsSettings gs = GraphicsSettings.instance; // Get settings
|
||||||
|
|
||||||
// Initialize SuperScreen and add to GameFrame, so we can call doPaint()
|
// Initialize SuperScreen and add to GameFrame, so we can call doPaint()
|
||||||
// on it.
|
// on it.
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
package de.teamteamteam.spacescooter.utility;
|
package de.teamteamteam.spacescooter.utility;
|
||||||
|
|
||||||
import java.awt.DisplayMode;
|
import java.awt.DisplayMode;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
import java.awt.GraphicsDevice;
|
import java.awt.GraphicsDevice;
|
||||||
import java.awt.GraphicsEnvironment;
|
import java.awt.GraphicsEnvironment;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.awt.image.ColorModel;
|
||||||
|
|
||||||
import de.teamteamteam.spacescooter.brain.GameConfig;
|
import de.teamteamteam.spacescooter.brain.GameConfig;
|
||||||
|
|
||||||
|
@ -32,11 +35,30 @@ public class GraphicsSettings {
|
||||||
*/
|
*/
|
||||||
private int bitDepth;
|
private int bitDepth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ScreenDevice this game is supposed to be run on.
|
||||||
|
* Probably just the primary screen device.
|
||||||
|
*/
|
||||||
|
private GraphicsDevice screenDevice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor. Just retrieve the settings once.
|
* Instance holder for GraphicsSettings.
|
||||||
*/
|
*/
|
||||||
public GraphicsSettings() {
|
public static GraphicsSettings instance;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the instance and store it in the instance holder.
|
||||||
|
*/
|
||||||
|
static {
|
||||||
|
GraphicsSettings.instance = new GraphicsSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private Constructor. Just retrieve the settings once and
|
||||||
|
* storing the instance in GraphicsSettings.instance.
|
||||||
|
*/
|
||||||
|
private GraphicsSettings() {
|
||||||
this.retrieveSettings();
|
this.retrieveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +95,7 @@ public class GraphicsSettings {
|
||||||
this.bitDepth = dm.getBitDepth();
|
this.bitDepth = dm.getBitDepth();
|
||||||
this.height = dm.getHeight();
|
this.height = dm.getHeight();
|
||||||
this.width = dm.getWidth();
|
this.width = dm.getWidth();
|
||||||
|
this.screenDevice = gs[i];
|
||||||
}
|
}
|
||||||
if(GameConfig.DEBUG) {
|
if(GameConfig.DEBUG) {
|
||||||
System.out.println("Display Mode " + i + ": " + this.width + "x" + this.height+ "@" + this.refreshRate + "Hz, " + this.bitDepth + " bit");
|
System.out.println("Display Mode " + i + ": " + this.width + "x" + this.height+ "@" + this.refreshRate + "Hz, " + this.bitDepth + " bit");
|
||||||
|
@ -80,4 +103,25 @@ public class GraphicsSettings {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the ColorModel of the screen device the game is supposed to be run on.
|
||||||
|
*/
|
||||||
|
public ColorModel getColorModel() {
|
||||||
|
return this.screenDevice.getDefaultConfiguration().getColorModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a compatible BufferedImage from a given BufferedImage and returns it.
|
||||||
|
*/
|
||||||
|
public BufferedImage createCompatibleBufferedImage(BufferedImage originalImage) {
|
||||||
|
BufferedImage compatibleImage = this.screenDevice.getDefaultConfiguration()
|
||||||
|
.createCompatibleImage(originalImage.getWidth(), originalImage.getHeight(), originalImage.getTransparency());
|
||||||
|
//Transfer the actual image content by simply drawing.
|
||||||
|
Graphics2D g = (Graphics2D) compatibleImage.getGraphics();
|
||||||
|
g.drawImage(originalImage, 0, 0, null);
|
||||||
|
g.dispose();
|
||||||
|
//We're done.
|
||||||
|
return compatibleImage;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -164,11 +164,13 @@ public class Loader {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load a BufferedImage by relative filename.
|
* Load a BufferedImage by relative filename, creating a compatible
|
||||||
|
* BufferedImage using the GraphicsSettings ColorModel.
|
||||||
*/
|
*/
|
||||||
private static void addBufferedImageByFilename(String filename) {
|
private static void addBufferedImageByFilename(String filename) {
|
||||||
try {
|
try {
|
||||||
BufferedImage image = ImageIO.read(Loader.class.getClassLoader().getResourceAsStream(filename));
|
BufferedImage storedImage = ImageIO.read(Loader.class.getClassLoader().getResourceAsStream(filename));
|
||||||
|
BufferedImage image = Loader.createCompatibleImage(storedImage);
|
||||||
Loader.images.put(filename, image);
|
Loader.images.put(filename, image);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.err.println("Unable to load BufferedImage: " + filename);
|
System.err.println("Unable to load BufferedImage: " + filename);
|
||||||
|
@ -177,6 +179,20 @@ public class Loader {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method creating a compatible BufferedImage from a
|
||||||
|
* given BufferedImage taking into account the current ColorModel of the
|
||||||
|
* current ScreenDevice.
|
||||||
|
*/
|
||||||
|
private static BufferedImage createCompatibleImage(BufferedImage storedImage) {
|
||||||
|
if(GraphicsSettings.instance.getColorModel().equals(storedImage.getColorModel())) {
|
||||||
|
return storedImage;
|
||||||
|
} else {
|
||||||
|
return GraphicsSettings.instance.createCompatibleBufferedImage(storedImage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load an AudioInputStream by relative filename.
|
* Load an AudioInputStream by relative filename.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue