Speed up image loading by splitting it up into getting the image's dimensions and

waiting for all bits to be loaded.
This commit is contained in:
hns 2003-01-29 16:31:33 +00:00
parent af2a5e9793
commit 0c62b57c26

View file

@ -20,10 +20,9 @@ public class ImageGenerator {
} }
public ImageWrapper createPaintableImage (int w, int h) { public ImageWrapper createPaintableImage (int w, int h) {
Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); BufferedImage img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics (); Graphics g = img.getGraphics ();
ImageWrapper rimg = null; ImageWrapper rimg = new SunImageWrapper (img, g, w, h, this);
rimg = new SunImageWrapper (img, g, w, h, this);
return rimg; return rimg;
} }
@ -31,12 +30,13 @@ public class ImageGenerator {
ImageWrapper rimg = null; ImageWrapper rimg = null;
Image img1 = Toolkit.getDefaultToolkit ().createImage (src); Image img1 = Toolkit.getDefaultToolkit ().createImage (src);
ImageLoader loader = new ImageLoader (img1); ImageLoader loader = new ImageLoader (img1);
loader.load (); loader.getDimensions ();
int w = loader.getWidth (); int w = loader.getWidth ();
int h = loader.getHeight (); int h = loader.getHeight ();
Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics (); Graphics g = img.getGraphics ();
g.drawImage (img1, 0, 0, null); if (!g.drawImage (img1, 0, 0, loader))
loader.getBits ();
rimg = new SunImageWrapper (img, g, w, h, this); rimg = new SunImageWrapper (img, g, w, h, this);
return rimg; return rimg;
} }
@ -45,7 +45,7 @@ public class ImageGenerator {
ImageWrapper rimg = null; ImageWrapper rimg = null;
Image img = Toolkit.getDefaultToolkit ().createImage (src); Image img = Toolkit.getDefaultToolkit ().createImage (src);
ImageLoader loader = new ImageLoader (img); ImageLoader loader = new ImageLoader (img);
loader.load (); loader.getDimensions ();
int w = loader.getWidth (); int w = loader.getWidth ();
int h = loader.getHeight (); int h = loader.getHeight ();
rimg = new SunImageWrapper (img, null, w, h, this); rimg = new SunImageWrapper (img, null, w, h, this);
@ -58,12 +58,13 @@ public class ImageGenerator {
URL url = new URL (urlstring); URL url = new URL (urlstring);
Image img1 = Toolkit.getDefaultToolkit ().createImage (url); Image img1 = Toolkit.getDefaultToolkit ().createImage (url);
ImageLoader loader = new ImageLoader (img1); ImageLoader loader = new ImageLoader (img1);
loader.load (); loader.getDimensions ();
int w = loader.getWidth (); int w = loader.getWidth ();
int h = loader.getHeight (); int h = loader.getHeight ();
Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics (); Graphics g = img.getGraphics ();
g.drawImage (img1, 0, 0, null); if(!g.drawImage (img1, 0, 0, loader))
loader.getBits ();
rimg = new SunImageWrapper (img, g, w, h, this); rimg = new SunImageWrapper (img, g, w, h, this);
return rimg; return rimg;
} }
@ -73,12 +74,13 @@ public class ImageGenerator {
FilteredImageSource fis = new FilteredImageSource (iw.getSource(), filter); FilteredImageSource fis = new FilteredImageSource (iw.getSource(), filter);
Image img1 = Toolkit.getDefaultToolkit().createImage (fis); Image img1 = Toolkit.getDefaultToolkit().createImage (fis);
ImageLoader loader = new ImageLoader (img1); ImageLoader loader = new ImageLoader (img1);
loader.load (); loader.getDimensions ();
int w = loader.getWidth (); int w = loader.getWidth ();
int h = loader.getHeight (); int h = loader.getHeight ();
Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB); Image img = new BufferedImage (w, h, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics (); Graphics g = img.getGraphics ();
g.drawImage (img1, 0, 0, null); if (!g.drawImage (img1, 0, 0, loader))
loader.getBits ();
rimg = new SunImageWrapper (img, g, w, h, this); rimg = new SunImageWrapper (img, g, w, h, this);
return rimg; return rimg;
} }
@ -88,7 +90,7 @@ public class ImageGenerator {
Image img = null; Image img = null;
img = Toolkit.getDefaultToolkit ().createImage (filename); img = Toolkit.getDefaultToolkit ().createImage (filename);
ImageLoader loader = new ImageLoader (img); ImageLoader loader = new ImageLoader (img);
loader.load (); loader.getDimensions ();
return img; return img;
} }
@ -96,7 +98,7 @@ public class ImageGenerator {
Image img = null; Image img = null;
img = Toolkit.getDefaultToolkit ().createImage (producer); img = Toolkit.getDefaultToolkit ().createImage (producer);
ImageLoader loader = new ImageLoader (img); ImageLoader loader = new ImageLoader (img);
loader.load (); loader.getDimensions ();
return img; return img;
} }
@ -113,19 +115,11 @@ public class ImageGenerator {
firstFrameLoaded = false; firstFrameLoaded = false;
} }
int getWidth () { synchronized void getDimensions () {
return w;
}
int getHeight () {
return h;
}
synchronized void load () {
w = img.getWidth(this); w = img.getWidth(this);
h = img.getHeight (this); h = img.getHeight (this);
if (w == -1 || h == -1) try { if (w == -1 || h == -1) try {
wait (30000); wait (45000);
} catch (InterruptedException x) { } catch (InterruptedException x) {
waiting = false; waiting = false;
return; return;
@ -138,6 +132,24 @@ public class ImageGenerator {
} }
} }
synchronized void getBits () {
if (!firstFrameLoaded) try {
wait (45000);
} catch (InterruptedException x) {
waiting = false;
return;
} finally {
waiting = false;
}
}
int getWidth () {
return w;
}
int getHeight () {
return h;
}
public synchronized boolean imageUpdate(Image img, public synchronized boolean imageUpdate(Image img,
int infoflags, int infoflags,
@ -145,19 +157,18 @@ public class ImageGenerator {
int y, int y,
int width, int width,
int height) { int height) {
if (w == -1 && (infoflags & WIDTH) > 0) if ((infoflags & WIDTH) > 0 || (infoflags & HEIGHT) > 0) {
w = width; if ((infoflags & WIDTH) > 0)
if (h == -1 && (infoflags & HEIGHT) > 0) w = width;
h = height; if ((infoflags & HEIGHT) > 0)
if ((infoflags & ALLBITS) > 0 || h = height;
(infoflags & FRAMEBITS) > 0) if (w > -1 && h > -1) {
notifyAll ();
return false;
}
}
if ((infoflags & ALLBITS) > 0 || (infoflags & FRAMEBITS) > 0) {
firstFrameLoaded = true; firstFrameLoaded = true;
// check if we have everything we need
if (w > -1 && h > -1 && firstFrameLoaded) {
// we know both the width and the height of the image and
// the bits of the first frame have been loaded. notify waiting thread that
// the image is loaded and ready to be used and tell the loader thread
// that we need no further updates.
notifyAll (); notifyAll ();
return false; return false;
} }