From 1d8560ea28db7b23bca4c9901671c42f898a9888 Mon Sep 17 00:00:00 2001 From: lehni Date: Thu, 17 Jun 2004 09:46:26 +0000 Subject: [PATCH] New version of the imaging library. ImageGenerator is now an abstract class, extended by ImageIOGeneartor and JimiGenerator --- src/helma/image/ImageGenerator.java | 349 ++++++++++------------------ 1 file changed, 121 insertions(+), 228 deletions(-) diff --git a/src/helma/image/ImageGenerator.java b/src/helma/image/ImageGenerator.java index 2ba6b8e2..6b5e0ebf 100644 --- a/src/helma/image/ImageGenerator.java +++ b/src/helma/image/ImageGenerator.java @@ -16,280 +16,173 @@ package helma.image; +import helma.main.Server; + import java.awt.*; import java.awt.image.*; +import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; /** * 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() { - // nothing to do + public static ImageGenerator getInstance() { + 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 h ... - * + * * @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); - Graphics g = img.getGraphics(); - ImageWrapper rimg = new SunImageWrapper(img, g, w, h, this); - - return rimg; + return new ImageWrapper(img, w, h, this); } /** - * - * * @param src ... - * + * * @return ... + * @throws IOException */ - public ImageWrapper createPaintableImage(byte[] src) { - ImageWrapper rimg = null; - Image img1 = Toolkit.getDefaultToolkit().createImage(src); - 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; + public ImageWrapper createImage(byte[] src) throws IOException { + Image img = read(src); + return img != null ? new ImageWrapper(img, this) : null; } /** - * - * - * @param src ... - * + * @param urlString ... + * * @return ... - */ - public ImageWrapper createImage(byte[] src) { - 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 IOException * @throws MalformedURLException ... */ - public ImageWrapper createPaintableImage(String urlstring) - throws MalformedURLException { - ImageWrapper rimg = null; - URL url = new URL(urlstring); - 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; + public ImageWrapper createImage(String urlString) + throws MalformedURLException, IOException { + Image img = read(new URL(urlString)); + return img != null ? new ImageWrapper(img, this) : null; } /** - * - * * @param iw ... * @param filter ... - * + * * @return ... */ - public ImageWrapper createPaintableImage(ImageWrapper iw, ImageFilter filter) { - ImageWrapper rimg = null; - FilteredImageSource fis = new FilteredImageSource(iw.getSource(), filter); - Image img1 = Toolkit.getDefaultToolkit().createImage(fis); - 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; + public ImageWrapper createImage(ImageWrapper iw, ImageFilter filter) { + // use the ImagFilterOp wrapper for ImageFilters that works directly + // on BufferedImages. The filtering is much faster like that. + // Attention: needs testing with all the filters! + + return createImage(iw, new ImageFilterOp(filter)); +// Image img = ImageWaiter.waitForImage( +// Toolkit.getDefaultToolkit().createImage( +// new FilteredImageSource(iw.getSource(), filter))); +// return img != null ? new ImageWrapper(img, this) : null; } /** - * - * - * @param filename ... - * + * @param iw ... + * @param imageOp ... + * * @return ... */ - public Image createImage(String filename) { - Image img = null; - - img = Toolkit.getDefaultToolkit().createImage(filename); - - ImageLoader loader = new ImageLoader(img); - - loader.getDimensions(); - loader.done(); - - return img; + public ImageWrapper createImage(ImageWrapper iw, BufferedImageOp imageOp) { + Image img = imageOp.filter(iw.getBufferedImage(), null); + return img != null ? new ImageWrapper(img, this) : null; } /** - * - * - * @param producer ... - * - * @return ... + * @param file the filename the filename of the image to create + * + * @return the newly created image + * @throws IOException */ - public Image createImage(ImageProducer producer) { - Image img = null; - - img = Toolkit.getDefaultToolkit().createImage(producer); - - ImageLoader loader = new ImageLoader(img); - - loader.getDimensions(); - loader.done(); - - return img; + public Image read(String filename) throws IOException { + return ImageWaiter.waitForImage( + Toolkit.getDefaultToolkit().createImage(filename) + ); } - class ImageLoader implements ImageObserver { - Image img; - int w; - int h; - boolean waiting; - boolean firstFrameLoaded; - - ImageLoader(Image img) { - this.img = img; - waiting = true; - firstFrameLoaded = false; - } - - synchronized void getDimensions() { - w = img.getWidth(this); - h = img.getHeight(this); - - if ((w == -1) || (h == -1)) { - try { - wait(45000); - } catch (InterruptedException x) { - waiting = false; - - return; - } finally { - waiting = false; - } - } - - // if width and height haven't been set, throw tantrum - if ((w == -1) || (h == -1)) { - throw new RuntimeException("Error loading image"); - } - } - - synchronized void done() { - waiting = false; - notifyAll(); - } - - 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; - } + /** + * @param url the URL the filename of the image to create + * + * @return the newly created image + * @throws IOException + */ + public Image read(URL url) throws IOException { + return ImageWaiter.waitForImage( + Toolkit.getDefaultToolkit().createImage(url) + ); } -} + + /** + * @param src the data of the image to create + * + * @return the newly created image + * @throws IOException + */ + public Image read(byte[] src) throws IOException { + return ImageWaiter.waitForImage( + Toolkit.getDefaultToolkit().createImage(src) + ); + } + + /** + * Saves the image. Image format is deduced from filename. + * + * @param image + * @param filename + * @param quality + * @param alpha + * @throws IOException + */ + public abstract void write(ImageWrapper wrapper, String filename, + float quality, boolean alpha) throws IOException; +} \ No newline at end of file