From 63f7a2e4df2a6e0410fa6616973e9d31b466033b Mon Sep 17 00:00:00 2001 From: hns Date: Wed, 27 Nov 2002 15:52:33 +0000 Subject: [PATCH] ImageGenerator does no longer extend java.awt.Window. Should work in headless mode now. --- src/helma/image/ImageGenerator.java | 211 +++++++++++++++------------ src/helma/image/SunImageWrapper.java | 8 +- 2 files changed, 121 insertions(+), 98 deletions(-) diff --git a/src/helma/image/ImageGenerator.java b/src/helma/image/ImageGenerator.java index 6abf650f..debf059a 100644 --- a/src/helma/image/ImageGenerator.java +++ b/src/helma/image/ImageGenerator.java @@ -6,134 +6,163 @@ package helma.image; import java.awt.*; import java.awt.image.*; import java.net.URL; +import java.net.MalformedURLException; /** * This creates an invisible frame in order to be able to create images * from Java. (Java needs a window context in order to user the Image class). */ -public class ImageGenerator extends Window { - +public class ImageGenerator { + public ImageGenerator () { - super (new Frame() { - public void setVisible (boolean b) { - // This frame can never be shown - } - public synchronized void dispose() { - try { - getToolkit().getSystemEventQueue(); - super.dispose(); - } catch (Exception e) { - // untrusted code not allowed to dispose - } - } - } - ); - setBounds (0, 0, 1, 1); - setVisible (true); + // nothing to do } - + public ImageWrapper createPaintableImage (int w, int h) { - Image img = createImage (w, h); + Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); Graphics g = img.getGraphics (); ImageWrapper rimg = null; - try { - rimg = new SunImageWrapper (img, g, w, h, this); - } catch (Exception x) { - System.err.println ("Can't create image: "+x); - } + rimg = new SunImageWrapper (img, g, w, h, this); return rimg; } public ImageWrapper createPaintableImage (byte src[]) { ImageWrapper rimg = null; - MediaTracker tracker = new MediaTracker (this); - try { - Image img1 = Toolkit.getDefaultToolkit ().createImage (src); - tracker.addImage (img1, 0); - tracker.waitForAll (); - int w = img1.getWidth (null); - int h = img1.getHeight (null); - Image img = createImage (w, h); - Graphics g = img.getGraphics (); - g.drawImage (img1, 0, 0, null); - rimg = new SunImageWrapper (img, g, w, h, this); - } catch (Exception x) { - System.err.println ("Can't create image: "+x); - } + Image img1 = Toolkit.getDefaultToolkit ().createImage (src); + ImageLoader loader = new ImageLoader (img1); + loader.load (); + int w = loader.getWidth (); + int h = loader.getHeight (); + Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); + Graphics g = img.getGraphics (); + g.drawImage (img1, 0, 0, null); + rimg = new SunImageWrapper (img, g, w, h, this); return rimg; } public ImageWrapper createImage (byte src[]) { ImageWrapper rimg = null; - MediaTracker tracker = new MediaTracker (this); - try { - Image img = Toolkit.getDefaultToolkit ().createImage (src); - tracker.addImage (img, 0); - tracker.waitForAll (); - int w = img.getWidth (null); - int h = img.getHeight (null); - rimg = new SunImageWrapper (img, null, w, h, this); - } catch (Exception x) { - System.err.println ("Can't create image: "+x); - } + Image img = Toolkit.getDefaultToolkit ().createImage (src); + ImageLoader loader = new ImageLoader (img); + loader.load (); + int w = loader.getWidth (); + int h = loader.getHeight (); + rimg = new SunImageWrapper (img, null, w, h, this); return rimg; } - public ImageWrapper createPaintableImage (String urlstring) { + public ImageWrapper createPaintableImage (String urlstring) throws MalformedURLException { ImageWrapper rimg = null; - MediaTracker tracker = new MediaTracker (this); - try { - URL url = new URL (urlstring); - Image img1 = Toolkit.getDefaultToolkit ().createImage (url); - tracker.addImage (img1, 0); - tracker.waitForAll (); - int w = img1.getWidth (null); - int h = img1.getHeight (null); - Image img = createImage (w, h); - Graphics g = img.getGraphics (); - g.drawImage (img1, 0, 0, null); - rimg = new SunImageWrapper (img, g, w, h, this); - } catch (Exception x) { - System.err.println ("Can't create image: "+x); - x.printStackTrace (); - } + URL url = new URL (urlstring); + Image img1 = Toolkit.getDefaultToolkit ().createImage (url); + ImageLoader loader = new ImageLoader (img1); + loader.load (); + int w = loader.getWidth (); + int h = loader.getHeight (); + Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); + Graphics g = img.getGraphics (); + g.drawImage (img1, 0, 0, null); + rimg = new SunImageWrapper (img, g, w, h, this); return rimg; } public ImageWrapper createPaintableImage (ImageWrapper iw, ImageFilter filter) { ImageWrapper rimg = null; - MediaTracker tracker = new MediaTracker (this); - try { - FilteredImageSource fis = new FilteredImageSource (iw.getSource(), filter); - Image img1 = createImage (fis); - tracker.addImage (img1, 0); - tracker.waitForAll (); - int w = img1.getWidth (null); - int h = img1.getHeight (null); - Image img = createImage (w, h); - Graphics g = img.getGraphics (); - g.drawImage (img1, 0, 0, null); - rimg = new SunImageWrapper (img, g, w, h, this); - } catch (Exception x) { - System.err.println ("Can't create image: "+x); - } + FilteredImageSource fis = new FilteredImageSource (iw.getSource(), filter); + Image img1 = Toolkit.getDefaultToolkit().createImage (fis); + ImageLoader loader = new ImageLoader (img1); + loader.load (); + int w = loader.getWidth (); + int h = loader.getHeight (); + Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); + Graphics g = img.getGraphics (); + g.drawImage (img1, 0, 0, null); + rimg = new SunImageWrapper (img, g, w, h, this); return rimg; } public Image createImage (String filename) { Image img = null; - MediaTracker tracker = new MediaTracker (this); - try { - img = Toolkit.getDefaultToolkit ().createImage (filename); - tracker.addImage (img, 0); - tracker.waitForAll (); - } catch (Exception x) { - System.err.println ("Can't create image: "+x); - x.printStackTrace (); - } + img = Toolkit.getDefaultToolkit ().createImage (filename); + ImageLoader loader = new ImageLoader (img); + loader.load (); return img; } + + public Image createImage (ImageProducer producer) { + Image img = null; + img = Toolkit.getDefaultToolkit ().createImage (producer); + ImageLoader loader = new ImageLoader (img); + loader.load (); + return img; + } + + class ImageLoader implements ImageObserver { + + Image img; + int w, h; + + ImageLoader (Image img) { + this.img = img; + } + + int getWidth () { + return w; + } + + int getHeight () { + return h; + } + + synchronized void load () { + w = img.getWidth(this); + h = img.getHeight (this); + if (w == -1 || h == -1) try { + wait (30000); + } catch (InterruptedException x) { + return; + } + // if width and height haven't been set, throw tantrum + if (w == -1 || h == -1) { + throw new RuntimeException ("Error loading image"); + } + } + + + public synchronized boolean imageUpdate(Image img, + int infoflags, + int x, + int y, + int width, + int height) { + if (w == -1 && (infoflags & WIDTH) > 0) + w = width; + if (h == -1 && (infoflags & HEIGHT) > 0) + h = height; + if (h > -1 && w > -1 && (infoflags & ALLBITS) > 0) { + // we know all we want to know. notify waiting thread that + // the image is loaded and ready to be used. + notifyAll (); + return false; + } + // check if there was an error + if ((infoflags & ERROR) > 0) { + notifyAll (); + return false; + } + // TODO: If image production was aborted, but no error was reported, + // we might want to start production again. For now, we just give up. + if ((infoflags & ABORT) > 0) { + notifyAll (); + return false; + } + return true; + } + + + } + } diff --git a/src/helma/image/SunImageWrapper.java b/src/helma/image/SunImageWrapper.java index 4e1f59fd..d4bc82a8 100644 --- a/src/helma/image/SunImageWrapper.java +++ b/src/helma/image/SunImageWrapper.java @@ -19,9 +19,8 @@ import java.io.FileOutputStream; public class SunImageWrapper extends ImageWrapper { public SunImageWrapper (Image img, Graphics g, int width, int height, - ImageGenerator imggen) throws ClassNotFoundException { + ImageGenerator imggen) { super (img, g, width, height, imggen); - Class.forName ("com.sun.jimi.core.Jimi"); } @@ -39,8 +38,6 @@ public class SunImageWrapper extends ImageWrapper { } } img = imggen.createImage (new MemoryImageSource(w, h, pix, 0, w)); - // ColorReducer redux = new ColorReducer (colors, true); - // img = redux.getColorReducedImage (img); } catch (Exception x) { // throw new RuntimeException (x.getMessage ()); } @@ -77,9 +74,6 @@ public class SunImageWrapper extends ImageWrapper { // Acme gif encoder GifEncoder enc = new GifEncoder (img, fout); enc.encode (); - // new alternative gif encoder - // GIFEncoder enc = new GIFEncoder (img); - // enc.Write (fout); fout.close (); } else { Jimi.putImage (img, filename);