package com.weem.epicinventor.utility;
import com.weem.epicinventor.*;
import java.awt.*;
import java.awt.image.*;
import java.util.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
import java.awt.color.ColorSpace;
public class ImageLoader extends Thread {
private static HashMap imagesMap;
private static HashMap gNamesMap;
private GraphicsConfiguration gc;
private long period;
private static String CONFIG_FILE = "Images.dat";
public ImageLoader(long p) {
period = p;
initLoader();
}
public long getPeriod() {
return period;
}
private void initLoader() {
imagesMap = new HashMap();
gNamesMap = new HashMap();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
}
public void loadImagesFile(String fnm) /* Formats:
o <fnm> // a single image
n <fnm*.ext> <number> // a numbered sequence of images
s <fnm> <number> // an images strip
g <name> <fnm> [ <fnm> ]* // a group of images
and blank lines and comment lines.
*/ {
char ch;
String line;
String test = GameController.CONFIG_DIR + fnm;
try {
InputStream in = getClass().getResourceAsStream(GameController.CONFIG_DIR + fnm);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
while ((line = br.readLine()) != null) {
if (line.length() == 0) {
continue;
}
if (line.startsWith("//")) {
continue;
}
ch = Character.toLowerCase(line.charAt(0));
if (ch == 'o') {
getFileNameImage(line);
} else if (ch == 'n') {
getNumberedImages(line);
} else if (ch == 's') {
getStripImages(line);
} else if (ch == 'g') {
getGroupImages(line);
} else {
EIError.debugMsg("Do not recognize line: " + line, EIError.ErrorLevel.Error);
}
}
in.close();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
private void getFileNameImage(String line) {
StringTokenizer tokens = new StringTokenizer(line);
if (tokens.countTokens() == 2) {
tokens.nextToken(); // skip command label
loadSingleImage(GameController.IMAGES_DIR + tokens.nextToken(), "", 1.0f, (short) -1, (short) -1, (short) -1);
} else if (tokens.countTokens() == 7) {
tokens.nextToken(); // skip command label
String name = tokens.nextToken();
String img = tokens.nextToken();
float transperancy = Float.valueOf(tokens.nextToken());
short red = Short.valueOf(tokens.nextToken());
short green = Short.valueOf(tokens.nextToken());
short blue = Short.valueOf(tokens.nextToken());
loadSingleImage(GameController.IMAGES_DIR + img, name, transperancy, red, green, blue);
} else {
EIError.debugMsg("Wrong no. of arguments for " + line, EIError.ErrorLevel.Error);
}
}
public boolean loadSingleImage(String fnm, String name, float transperancy, short red, short green, short blue) {
if (name.equals("")) {
name = getPrefix(fnm);
}
if (imagesMap.containsKey(name)) {
EIError.debugMsg("Error: " + name + "already used", EIError.ErrorLevel.Error);
return false;
}
BufferedImage bi = loadImage(fnm);
bi = changeTransperancy(bi, transperancy);
if (red > -1 && green > -1 && blue > -1) {
bi = changeColor(bi, red, green, blue);
}
if (bi != null) {
ArrayList imsList = new ArrayList();
imsList.add(bi);
imagesMap.put(name.replace("/Images/", ""), imsList);
String imageName[] = name.split("/");
Game.loadingText = "Loading (" + imageName[imageName.length - 1] + ")";
return true;
} else {
return false;
}
}
private String getPrefix(String fnm) {
int pos;
if ((pos = fnm.lastIndexOf(".")) == -1) {
EIError.debugMsg("No prefix found for filename: ", EIError.ErrorLevel.Error);
return fnm;
} else {
return fnm.substring(0, pos);
}
}
private void getNumberedImages(String line) {
StringTokenizer tokens = new StringTokenizer(line);
if (tokens.countTokens() != 3) {
EIError.debugMsg("Wrong no. of arguments for " + line, EIError.ErrorLevel.Error);
} else {
tokens.nextToken(); // skip command label
String fnm = tokens.nextToken();
int number = -1;
try {
number = Integer.parseInt(tokens.nextToken());
} catch (Exception e) {
EIError.debugMsg("Number is incorrect for " + line, EIError.ErrorLevel.Error);
}
loadNumImages(GameController.IMAGES_DIR + fnm, number);
}
}
public int loadNumImages(String fnm, int number) {
String prefix = null;
String postfix = null;
int starPosn = fnm.lastIndexOf("*"); // find the '*'
if (starPosn == -1) {
EIError.debugMsg("No '*' in filename: " + fnm, EIError.ErrorLevel.Error);
prefix = getPrefix(fnm);
} else { // treat the fnm as prefix + "*" + postfix
prefix = fnm.substring(0, starPosn);
postfix = fnm.substring(starPosn + 1);
}
if (imagesMap.containsKey(prefix)) {
EIError.debugMsg("Error: " + prefix + "already used", EIError.ErrorLevel.Error);
return 0;
}
return loadNumImages(prefix, postfix, number);
}
private int loadNumImages(String prefix, String postfix, int number) {
String imFnm;
BufferedImage bi;
ArrayList imsList = new ArrayList();
int loadCount = 0;
if (number <= 0) {
EIError.debugMsg("Error: Number <= 0: ", EIError.ErrorLevel.Error);
imFnm = prefix + postfix;
if ((bi = loadImage(imFnm)) != null) {
loadCount++;
imsList.add(bi);
}
} else { // load prefix + <i> + postfix, where i = 0 to <number-1>
for (int i = 0; i < number; i++) {
imFnm = prefix + i + postfix;
if ((bi = loadImage(imFnm)) != null) {
loadCount++;
imsList.add(bi);
}
}
}
if (loadCount == 0) {
EIError.debugMsg("No images loaded for " + prefix, EIError.ErrorLevel.Warning);
} else {
imagesMap.put(prefix.replace("/Images/", ""), imsList);
}
return loadCount;
}
private void getStripImages(String line) {
StringTokenizer tokens = new StringTokenizer(line);
if (tokens.countTokens() != 3) {
EIError.debugMsg("Wrong no. of arguments for ", EIError.ErrorLevel.Error);
} else {
tokens.nextToken(); // skip command label
String fnm = tokens.nextToken();
int number = -1;
try {
number = Integer.parseInt(tokens.nextToken());
} catch (Exception e) {
EIError.debugMsg("Number is incorrect for " + line, EIError.ErrorLevel.Error);
}
loadStripImages(GameController.IMAGES_DIR + fnm, number);
}
}
public int loadStripImages(String fnm, int number) {
String name = getPrefix(fnm);
if (imagesMap.containsKey(name)) {
EIError.debugMsg("Error: " + name + "already used", EIError.ErrorLevel.Error);
return 0;
}
BufferedImage[] strip = loadStripImageArray(fnm, number);
if (strip == null) {
return 0;
}
ArrayList imsList = new ArrayList();
int loadCount = 0;
for (int i = 0; i < strip.length; i++) {
loadCount++;
imsList.add(strip[i]);
}
if (loadCount == 0) {
EIError.debugMsg("No images loaded for " + name, EIError.ErrorLevel.Warning);
} else {
imagesMap.put(name.replace("/Images/", ""), imsList);
String imageName[] = name.split("/");
Game.loadingText = "Loading (" + imageName[imageName.length - 1] + ")";
}
return loadCount;
}
private void getGroupImages(String line) {
StringTokenizer tokens = new StringTokenizer(line);
if (tokens.countTokens() < 3) {
EIError.debugMsg("Wrong no. of arguments for " + line, EIError.ErrorLevel.Error);
} else {
tokens.nextToken(); // skip command label
String name = tokens.nextToken();
ArrayList fnms = new ArrayList();
fnms.add(tokens.nextToken()); // read filenames
while (tokens.hasMoreTokens()) {
fnms.add(tokens.nextToken());
}
loadGroupImages(GameController.IMAGES_DIR + name, fnms);
}
}
public int loadGroupImages(String name, ArrayList fnms) {
if (imagesMap.containsKey(name)) {
EIError.debugMsg("Error: " + name + "already used", EIError.ErrorLevel.Error);
return 0;
}
if (fnms.isEmpty()) {
EIError.debugMsg("List of filenames is empty", EIError.ErrorLevel.Error);
return 0;
}
BufferedImage bi;
ArrayList nms = new ArrayList();
ArrayList imsList = new ArrayList();
String nm, fnm;
int loadCount = 0;
for (int i = 0; i < fnms.size(); i++) { // load the files
fnm = (String) fnms.get(i);
nm = getPrefix(fnm);
if ((bi = loadImage(fnm)) != null) {
loadCount++;
imsList.add(bi);
nms.add(nm);
}
}
if (loadCount == 0) {
EIError.debugMsg("No images loaded for " + name, EIError.ErrorLevel.Warning);
} else {
imagesMap.put(name.replace("/Images/", ""), imsList);
gNamesMap.put(name.replace("/Images/", ""), nms);
}
return loadCount;
}
public int loadGroupImages(String name, String[] fnms) {
ArrayList al = new ArrayList(Arrays.asList(fnms));
return loadGroupImages(name, al);
}
// ------------------ access methods -------------------
public BufferedImage getImage(String name) {
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null) {
//EIError.debugMsg("No image(s) stored under " + name, EIError.ErrorLevel.Warning);
return null;
}
return (BufferedImage) imsList.get(0);
}
public BufferedImage getImage(String name, int pos) {
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null) {
////EIError.debugMsg("No image(s) stored under " + name, EIError.ErrorLevel.Warning);
return null;
}
int size = imsList.size();
if (pos < 0) {
return (BufferedImage) imsList.get(0);
} else if (pos >= size) {
int newPos = pos % size; // modulo
return (BufferedImage) imsList.get(newPos);
}
return (BufferedImage) imsList.get(pos);
}
public BufferedImage getImage(String name, String fnmPrefix) {
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null) {
//EIError.debugMsg("No image(s) stored under " + name, EIError.ErrorLevel.Warning);
return null;
}
int posn = getGroupPosition(name, fnmPrefix);
if (posn < 0) {
return (BufferedImage) imsList.get(0);
}
return (BufferedImage) imsList.get(posn);
}
private int getGroupPosition(String name, String fnmPrefix) {
ArrayList groupNames = (ArrayList) gNamesMap.get(name);
if (groupNames == null) {
EIError.debugMsg("No group names for " + name, EIError.ErrorLevel.Error);
return -1;
}
String nm;
for (int i = 0; i < groupNames.size(); i++) {
nm = (String) groupNames.get(i);
if (nm.equals(fnmPrefix)) {
return i;
}
}
EIError.debugMsg("No " + fnmPrefix + " group name found for " + name, EIError.ErrorLevel.Error);
return -1;
}
public ArrayList getImages(String name) {
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null) {
//EIError.debugMsg("No image(s) stored under " + name, EIError.ErrorLevel.Warning);
return null;
}
EIError.debugMsg("Returning all images stored under " + name, EIError.ErrorLevel.Error);
return imsList;
}
public boolean isLoaded(String name) {
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null) {
return false;
}
return true;
}
public int numImages(String name) {
ArrayList imsList = (ArrayList) imagesMap.get(name);
if (imsList == null) {
//EIError.debugMsg("No image(s) stored under " + name, EIError.ErrorLevel.Warning);
return 0;
}
return imsList.size();
}
public BufferedImage loadImage(String fnm) {
try {
BufferedImage im = ImageIO.read(ImageLoader.class.getResource(fnm));
//ImageIO.read(Art.class.getResource(fileName));
int transparency = im.getColorModel().getTransparency();
BufferedImage copy = gc.createCompatibleImage(
im.getWidth(), im.getHeight(), transparency);
Graphics2D g2d = copy.createGraphics();
g2d.drawImage(im, 0, 0, null);
g2d.dispose();
return copy;
} catch (IOException e) {
EIError.debugMsg("Load Image error for " + fnm + ":\n" + e, EIError.ErrorLevel.Error);
return null;
}
}
private BufferedImage makeBIM(Image im, int width, int height) {
BufferedImage copy = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = copy.createGraphics();
g2d.drawImage(im, 0, 0, null);
g2d.dispose();
return copy;
}
public BufferedImage[] loadStripImageArray(String fnm, int number) {
if (number <= 0) {
EIError.debugMsg("number <= 0; returning null", EIError.ErrorLevel.Error);
return null;
}
BufferedImage stripIm;
if ((stripIm = loadImage(fnm)) == null) {
EIError.debugMsg("Returning null", EIError.ErrorLevel.Error);
return null;
}
int imWidth = (int) stripIm.getWidth() / number;
int height = stripIm.getHeight();
int transparency = stripIm.getColorModel().getTransparency();
BufferedImage[] strip = new BufferedImage[number];
Graphics2D stripGC;
for (int i = 0; i < number; i++) {
strip[i] = gc.createCompatibleImage(imWidth, height, transparency);
stripGC = strip[i].createGraphics();
stripGC.drawImage(stripIm,
0, 0, imWidth, height,
i * imWidth, 0, (i * imWidth) + imWidth, height,
null);
stripGC.dispose();
}
return strip;
}
public static BufferedImage changeTransperancy(BufferedImage loaded, float transperancy) {
BufferedImage img = new BufferedImage(loaded.getWidth(), loaded.getHeight(), BufferedImage.TRANSLUCENT);
Graphics2D g = img.createGraphics();
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, transperancy));
g.drawImage(loaded, null, 0, 0);
g.dispose();
return img;
}
public static BufferedImage changeToGrayscale(BufferedImage source) {
BufferedImageOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
return op.filter(source, null);
}
public static BufferedImage changeColor(BufferedImage img, short R1, short G1, short B1) {
BufferedImageOp colorizeFilter = createColorizeOp(R1, G1, B1);
img = colorizeFilter.filter(img, null);
return img;
}
public static LookupOp createColorizeOp(short R1, short G1, short B1) {
short[] alpha = new short[256];
short[] red = new short[256];
short[] green = new short[256];
short[] blue = new short[256];
for (short i = 0; i < 256; i++) {
alpha[i] = i;
red[i] = (short) ((R1 + i * 0.3) / 2);
green[i] = (short) ((G1 + i * 0.59) / 2);
blue[i] = (short) ((B1 + i * 0.11) / 2);
}
short[][] data = new short[][]{
red, green, blue, alpha
};
LookupTable lookupTable = new ShortLookupTable(0, data);
return new LookupOp(lookupTable, null);
}
}