Selaa lähdekoodia

Merge remote-tracking branch 'origin/LRW_saveImages' into BP_master
Added feature for saving of loaded images

Ludwig Tietze 7 vuotta sitten
vanhempi
commit
7ce99ae763
1 muutettua tiedostoa jossa 47 lisäystä ja 13 poistoa
  1. 47 13
      src/ui/view/Util.java

+ 47 - 13
src/ui/view/Util.java

@@ -7,6 +7,7 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.HashMap;
 
 import javax.imageio.ImageIO;
 
@@ -14,34 +15,51 @@ public class Util {
 	
 	/**
 	 * 30x30 pixel FileNotFound Icon, which can be shown without using I/O operations
+	 * a red cross.
 	 */
-	static private Image defaultImage = createDefaultImage();
-	
-	/**
-	 * creates the default Image 
-	 * @return 30x30 Image, showing a red cross
+	static private BufferedImage defaultImage;
+	/*
+	 * Save nothing: Reload every image whenever requested.
+	 * Save external: Only save images that were found as external file.
+	 * Save raw: Save all non-scaled images.
+	 * Save everything: self-explanatory.
 	 */
-	private static Image createDefaultImage() {
-		BufferedImage def = new BufferedImage(30,30,BufferedImage.TYPE_BYTE_INDEXED);
+	private static final byte SAVE_NOTHING=0, /*SAVE_EXTERNAL=1,*/ SAVE_RAW=2, SAVE_EVERYTHING=4,
+								SAVE_MODE=SAVE_EVERYTHING;
+	private static HashMap<String, Image> imgStorage;
+	
+	static{
+		/*
+		 * creates the default Image 
+		 */
+		defaultImage = new BufferedImage(30,30,BufferedImage.TYPE_BYTE_INDEXED);
 		for(int x = 0; x < 30; x++)
 			for(int y = 0; y < 30; y++){
 				if(x == 29 || y == 29)
 					//Border Bottom/Left -> Light Grey
-					def.setRGB(x, y, 13158600);
+					(defaultImage).setRGB(x, y, 13158600);
 				else if(x == 0 || y == 0)
 					//Border Top/Right -> Dark Grey
-					def.setRGB(x, y, 6316128);
+					(defaultImage).setRGB(x, y, 6316128);
 				else if((x == y || x == 31 - y) && 6 < x && x < 25)
 					//Red Cross in the middle
-					def.setRGB(x, y, 13107200);
+					(defaultImage).setRGB(x, y, 13107200);
 				else //all other Pixels are white
-					def.setRGB(x, y, 16777215);
-				
+					(defaultImage).setRGB(x, y, 16777215);
 			}
-		return def;
+		if(SAVE_MODE!=SAVE_NOTHING)imgStorage=new HashMap<String, Image>();
 	}
 	
 	static Image loadImage(Object origin, String url, int w, int h, int scale){
+		if(SAVE_MODE==SAVE_EVERYTHING){
+			String key=url+"?"+w+"?"+h+"?"+scale;
+			if(imgStorage.containsKey(key))return(imgStorage.get(key));
+			else{
+				Image img=loadImage(origin,url).getScaledInstance(w, h, scale);
+				imgStorage.put(key, img);
+				return img;
+			}
+		}
 		return loadImage(origin,url).getScaledInstance(w, h, scale);
 	}
 	
@@ -50,6 +68,21 @@ public class Util {
 	}
 	
 	static Image loadImage(Object origin, String url){
+		if(SAVE_MODE!=SAVE_NOTHING){
+			if(imgStorage.containsKey(url))return imgStorage.get(url);
+			else{
+				Image img;
+				try {
+					img= ImageIO.read(loadStream(origin, url));
+				} catch (IOException e) {
+					System.err.println("Warning: '" + url + "' loading failed!");
+					e.printStackTrace();
+					return defaultImage;
+				}
+				imgStorage.put(url, img);
+				return img;
+			}
+		}
 		try {
 			return ImageIO.read(loadStream(origin, url));
 		} catch (IOException e) {
@@ -60,6 +93,7 @@ public class Util {
 	}
 	
 	static InputStream loadStream(Object origin, String url){
+		System.out.println("Resource loaded!");
 		InputStream o=origin.getClass().getResourceAsStream(url);
 		if(o!=null)return o;
 		else{