From e2c6d1903bddc3de086424efdf29993df0bb0c49 Mon Sep 17 00:00:00 2001 From: hns Date: Mon, 3 Feb 2003 16:59:24 +0000 Subject: [PATCH] More tweaking of the image loading and generating process. --- src/helma/image/ImageGenerator.java | 119 +++++++++++++++------------- 1 file changed, 65 insertions(+), 54 deletions(-) diff --git a/src/helma/image/ImageGenerator.java b/src/helma/image/ImageGenerator.java index f32428f1..3602c822 100644 --- a/src/helma/image/ImageGenerator.java +++ b/src/helma/image/ImageGenerator.java @@ -9,10 +9,10 @@ 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). + * Factory class for generating Image objects from various sources. + * */ - + public class ImageGenerator { public ImageGenerator () { @@ -30,14 +30,17 @@ public class ImageGenerator { ImageWrapper rimg = null; Image img1 = Toolkit.getDefaultToolkit ().createImage (src); ImageLoader loader = new ImageLoader (img1); - loader.getDimensions (); - int w = loader.getWidth (); - int h = loader.getHeight (); - Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); - Graphics g = img.getGraphics (); - if (!g.drawImage (img1, 0, 0, loader)) - loader.getBits (); - rimg = new SunImageWrapper (img, g, w, h, this); + try { + loader.getDimensions (); + 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); + } finally { + loader.done(); + } return rimg; } @@ -45,10 +48,14 @@ public class ImageGenerator { ImageWrapper rimg = null; Image img = Toolkit.getDefaultToolkit ().createImage (src); ImageLoader loader = new ImageLoader (img); - loader.getDimensions (); - int w = loader.getWidth (); - int h = loader.getHeight (); - rimg = new SunImageWrapper (img, null, w, h, this); + try { + loader.getDimensions (); + int w = loader.getWidth (); + int h = loader.getHeight (); + rimg = new SunImageWrapper (img, null, w, h, this); + } finally { + loader.done(); + } return rimg; } @@ -58,14 +65,17 @@ public class ImageGenerator { URL url = new URL (urlstring); Image img1 = Toolkit.getDefaultToolkit ().createImage (url); ImageLoader loader = new ImageLoader (img1); - loader.getDimensions (); - int w = loader.getWidth (); - int h = loader.getHeight (); - Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); - Graphics g = img.getGraphics (); - if(!g.drawImage (img1, 0, 0, loader)) - loader.getBits (); - rimg = new SunImageWrapper (img, g, w, h, this); + try { + loader.getDimensions (); + 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); + } finally { + loader.done(); + } return rimg; } @@ -74,14 +84,17 @@ public class ImageGenerator { FilteredImageSource fis = new FilteredImageSource (iw.getSource(), filter); Image img1 = Toolkit.getDefaultToolkit().createImage (fis); ImageLoader loader = new ImageLoader (img1); - loader.getDimensions (); - int w = loader.getWidth (); - int h = loader.getHeight (); - Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); - Graphics g = img.getGraphics (); - if (!g.drawImage (img1, 0, 0, loader)) - loader.getBits (); - rimg = new SunImageWrapper (img, g, w, h, this); + try { + loader.getDimensions (); + 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); + } finally { + loader.done(); + } return rimg; } @@ -91,6 +104,7 @@ public class ImageGenerator { img = Toolkit.getDefaultToolkit ().createImage (filename); ImageLoader loader = new ImageLoader (img); loader.getDimensions (); + loader.done(); return img; } @@ -99,6 +113,7 @@ public class ImageGenerator { img = Toolkit.getDefaultToolkit ().createImage (producer); ImageLoader loader = new ImageLoader (img); loader.getDimensions (); + loader.done(); return img; } @@ -118,13 +133,15 @@ public class ImageGenerator { 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 (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) { @@ -132,15 +149,9 @@ public class ImageGenerator { } } - synchronized void getBits () { - if (!firstFrameLoaded) try { - wait (45000); - } catch (InterruptedException x) { - waiting = false; - return; - } finally { - waiting = false; - } + synchronized void done () { + waiting = false; + notifyAll (); } int getWidth () { @@ -157,12 +168,18 @@ public class ImageGenerator { 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) { + if (w > -1 && h > -1 && firstFrameLoaded) { notifyAll (); return false; } @@ -172,12 +189,6 @@ public class ImageGenerator { notifyAll (); return false; } - // 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; - } return true; }