New version of the imaging library. ImageGenerator is now an abstract class, extended by ImageIOGeneartor and JimiGenerator
This commit is contained in:
parent
ddbf06f173
commit
1d8560ea28
1 changed files with 121 additions and 228 deletions
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue