New version of the imaging library. ImageGenerator is now an abstract class, extended by ImageIOGeneartor and JimiGenerator

This commit is contained in:
lehni 2004-06-17 09:46:26 +00:00
parent ddbf06f173
commit 1d8560ea28

View file

@ -16,8 +16,11 @@
package helma.image; package helma.image;
import helma.main.Server;
import java.awt.*; import java.awt.*;
import java.awt.image.*; import java.awt.image.*;
import java.io.IOException;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
@ -25,271 +28,161 @@ import java.net.URL;
* Factory class for generating Image objects from various sources. * Factory class for generating Image objects from various sources.
* *
*/ */
public class ImageGenerator { public abstract class ImageGenerator {
protected static ImageGenerator generator = null;
/** /**
* Creates a new ImageGenerator object. * @return
*/ */
public ImageGenerator() { public static ImageGenerator getInstance() {
// nothing to do if (generator == null) {
// first see wether an image wrapper class was specified in
// server.properties:
String className = Server.getServer().getProperty("imageGenerator");
Class generatorClass = null;
if (className == null) {
// if no class is defined, try the default ones:
try {
Class.forName("com.sun.jimi.core.Jimi");
// if we're still here, JimiWrapper can be used
className = "helma.image.jimi.JimiGenerator";
} catch (ClassNotFoundException e1) {
try {
Class.forName("javax.imageio.ImageIO");
// if we're still here, ImageIOWrapper can be used
className = "helma.image.imageio.ImageIOGenerator";
} catch (ClassNotFoundException e2) {
}
}
}
// now let's get the generator class and create an instance:
try {
generatorClass = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new RuntimeException(
"The imageGenerator class cannot be found: " + className);
}
try {
generator = (ImageGenerator)generatorClass.newInstance();
} catch (Exception e) {
throw new RuntimeException(
"The ImageGenerator instance could not be created: "
+ className);
}
}
return generator;
} }
/** /**
*
*
* @param w ... * @param w ...
* @param h ... * @param h ...
* *
* @return ... * @return ...
*/ */
public ImageWrapper createPaintableImage(int w, int h) { public ImageWrapper createImage(int w, int h) {
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics(); return new ImageWrapper(img, w, h, this);
ImageWrapper rimg = new SunImageWrapper(img, g, w, h, this);
return rimg;
} }
/** /**
*
*
* @param src ... * @param src ...
* *
* @return ... * @return ...
* @throws IOException
*/ */
public ImageWrapper createPaintableImage(byte[] src) { public ImageWrapper createImage(byte[] src) throws IOException {
ImageWrapper rimg = null; Image img = read(src);
Image img1 = Toolkit.getDefaultToolkit().createImage(src); return img != null ? new ImageWrapper(img, this) : null;
ImageLoader loader = new ImageLoader(img1);
try {
loader.getDimensions();
int w = loader.getWidth();
int h = loader.getHeight();
Image img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.drawImage(img1, 0, 0, null);
rimg = new SunImageWrapper(img, g, w, h, this);
} finally {
loader.done();
}
return rimg;
} }
/** /**
* * @param urlString ...
*
* @param src ...
* *
* @return ... * @return ...
*/ * @throws MalformedURLException
public ImageWrapper createImage(byte[] src) { * @throws IOException
ImageWrapper rimg = null;
Image img = Toolkit.getDefaultToolkit().createImage(src);
ImageLoader loader = new ImageLoader(img);
try {
loader.getDimensions();
int w = loader.getWidth();
int h = loader.getHeight();
rimg = new SunImageWrapper(img, null, w, h, this);
} finally {
loader.done();
}
return rimg;
}
/**
*
*
* @param urlstring ...
*
* @return ...
*
* @throws MalformedURLException ... * @throws MalformedURLException ...
*/ */
public ImageWrapper createPaintableImage(String urlstring) public ImageWrapper createImage(String urlString)
throws MalformedURLException { throws MalformedURLException, IOException {
ImageWrapper rimg = null; Image img = read(new URL(urlString));
URL url = new URL(urlstring); return img != null ? new ImageWrapper(img, this) : null;
Image img1 = Toolkit.getDefaultToolkit().createImage(url);
ImageLoader loader = new ImageLoader(img1);
try {
loader.getDimensions();
int w = loader.getWidth();
int h = loader.getHeight();
Image img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.drawImage(img1, 0, 0, null);
rimg = new SunImageWrapper(img, g, w, h, this);
} finally {
loader.done();
}
return rimg;
} }
/** /**
*
*
* @param iw ... * @param iw ...
* @param filter ... * @param filter ...
* *
* @return ... * @return ...
*/ */
public ImageWrapper createPaintableImage(ImageWrapper iw, ImageFilter filter) { public ImageWrapper createImage(ImageWrapper iw, ImageFilter filter) {
ImageWrapper rimg = null; // use the ImagFilterOp wrapper for ImageFilters that works directly
FilteredImageSource fis = new FilteredImageSource(iw.getSource(), filter); // on BufferedImages. The filtering is much faster like that.
Image img1 = Toolkit.getDefaultToolkit().createImage(fis); // Attention: needs testing with all the filters!
ImageLoader loader = new ImageLoader(img1);
try { return createImage(iw, new ImageFilterOp(filter));
loader.getDimensions(); // Image img = ImageWaiter.waitForImage(
// Toolkit.getDefaultToolkit().createImage(
int w = loader.getWidth(); // new FilteredImageSource(iw.getSource(), filter)));
int h = loader.getHeight(); // return img != null ? new ImageWrapper(img, this) : null;
Image img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.drawImage(img1, 0, 0, null);
rimg = new SunImageWrapper(img, g, w, h, this);
} finally {
loader.done();
}
return rimg;
} }
/** /**
* * @param iw ...
* * @param imageOp ...
* @param filename ...
* *
* @return ... * @return ...
*/ */
public Image createImage(String filename) { public ImageWrapper createImage(ImageWrapper iw, BufferedImageOp imageOp) {
Image img = null; Image img = imageOp.filter(iw.getBufferedImage(), null);
return img != null ? new ImageWrapper(img, this) : null;
img = Toolkit.getDefaultToolkit().createImage(filename);
ImageLoader loader = new ImageLoader(img);
loader.getDimensions();
loader.done();
return img;
} }
/** /**
* @param file the filename the filename of the image to create
* *
* * @return the newly created image
* @param producer ... * @throws IOException
*
* @return ...
*/ */
public Image createImage(ImageProducer producer) { public Image read(String filename) throws IOException {
Image img = null; return ImageWaiter.waitForImage(
Toolkit.getDefaultToolkit().createImage(filename)
img = Toolkit.getDefaultToolkit().createImage(producer); );
ImageLoader loader = new ImageLoader(img);
loader.getDimensions();
loader.done();
return img;
} }
class ImageLoader implements ImageObserver { /**
Image img; * @param url the URL the filename of the image to create
int w; *
int h; * @return the newly created image
boolean waiting; * @throws IOException
boolean firstFrameLoaded; */
public Image read(URL url) throws IOException {
ImageLoader(Image img) { return ImageWaiter.waitForImage(
this.img = img; Toolkit.getDefaultToolkit().createImage(url)
waiting = true; );
firstFrameLoaded = false;
} }
synchronized void getDimensions() { /**
w = img.getWidth(this); * @param src the data of the image to create
h = img.getHeight(this); *
* @return the newly created image
if ((w == -1) || (h == -1)) { * @throws IOException
try { */
wait(45000); public Image read(byte[] src) throws IOException {
} catch (InterruptedException x) { return ImageWaiter.waitForImage(
waiting = false; Toolkit.getDefaultToolkit().createImage(src)
);
return;
} finally {
waiting = false;
}
} }
// if width and height haven't been set, throw tantrum /**
if ((w == -1) || (h == -1)) { * Saves the image. Image format is deduced from filename.
throw new RuntimeException("Error loading image"); *
} * @param image
} * @param filename
* @param quality
synchronized void done() { * @param alpha
waiting = false; * @throws IOException
notifyAll(); */
} public abstract void write(ImageWrapper wrapper, String filename,
float quality, boolean alpha) throws IOException;
int getWidth() {
return w;
}
int getHeight() {
return h;
}
public synchronized boolean imageUpdate(Image img, int infoflags, int x, int y,
int width, int height) {
// check if there was an error
if (!waiting || ((infoflags & ERROR) > 0) || ((infoflags & ABORT) > 0)) {
// we either timed out or there was an error.
notifyAll();
return false;
}
if (((infoflags & WIDTH) > 0) || ((infoflags & HEIGHT) > 0)) {
if ((infoflags & WIDTH) > 0) {
w = width;
}
if ((infoflags & HEIGHT) > 0) {
h = height;
}
if ((w > -1) && (h > -1) && firstFrameLoaded) {
notifyAll();
return false;
}
}
if (((infoflags & ALLBITS) > 0) || ((infoflags & FRAMEBITS) > 0)) {
firstFrameLoaded = true;
notifyAll();
return false;
}
return true;
}
}
} }