X-Git-Url: http://git.megacz.com/?p=org.ibex.core.git;a=blobdiff_plain;f=src%2Forg%2Fxwt%2FPicture.java;h=eb32928e04cd42cb7b08b5137e28beb56d7822ff;hp=426266cb911111a21aade82e0762bc124ce71ba6;hb=2ccad2219888c9942f62ae8b4d4207f655690948;hpb=c191f0122fbd24c2df21c41affb0c039d59f16d8 diff --git a/src/org/xwt/Picture.java b/src/org/xwt/Picture.java index 426266c..eb32928 100644 --- a/src/org/xwt/Picture.java +++ b/src/org/xwt/Picture.java @@ -6,67 +6,46 @@ import org.xwt.util.*; import org.xwt.translators.*; /** - *

* The in-memory representation of a PNG or GIF image. It is * read-only. It is usually passed to PixelBuffer.drawPicture() - *

* - *

* Implementations of the Platform class should return objects * supporting this interface from the createPicture() method. These * implementations may choose to implement caching strategies (for * example, using a Pixmap on X11). - *

*/ -public abstract class Picture { +public class Picture { - /** the resource that created this Picture */ - public Res res = null; + public Picture() { this.res = null; } + public Picture(Res r) { this.res = r; } + private static Cache cache = new Cache(100); ///< Picture, keyed by the Res that loaded them - /** the height of the picture */ - public abstract int getHeight(); + public Res res = null; ///< the resource we were loaded from + public int width = -1; ///< the width of the image + public int height = -1; ///< the height of the image + public int[] data = null; ///< argb samples + public boolean isLoaded = false; ///< true iff the image is fully loaded - /** the width of the picture */ - public abstract int getWidth(); - - /** Pictures, cache keyed by Res instance */ - private static Cache cache = new Cache(100); - private static GIF gif = new GIF(); - - public static class Holder { - public Picture picture = null; - } - /** turns a resource into a Picture.Source and passes it to the callback */ - public static Holder fromRes(final Res r, final Scheduler.Task callback) { - Holder ret = (Holder)cache.get(r); - if (ret == null) { - ret = new Holder(); - cache.put(r, ret); - if (callback == null) return null; - } - final Holder holder = ret; - if (callback != null) + public static Picture load(final Res r, final Scheduler.Task callback) { + Picture ret = (Picture)cache.get(r); + if (ret == null) cache.put(r, ret = Platform.createPicture(r)); + if (!ret.isLoaded && callback != null) new java.lang.Thread() { public void run() { try { - final byte[] b = InputStreamToByteArray.convert(r.getInputStream()); - Scheduler.add(new Scheduler.Task() { public void perform() { - try { - Picture p = null; - InputStream pbis = new ByteArrayInputStream(b); - if ((b[0] & 0xff) == 'G') p = gif.fromInputStream(pbis, "some picture"); - else if ((b[0] & 0xff) == 137) p = new PNG().fromInputStream(pbis, "some picture"); - else if ((b[0] & 0xff) == 0xff) p = Platform.decodeJPEG(pbis, "some picture"); - else throw new JSExn("couldn't figure out image type from first byte"); - p.res = r; - holder.picture = p; - Scheduler.add(callback); - } catch (Exception e) { - Log.log(Picture.class, e); - } } }); - } catch (IOException e) { - Log.log(Picture.class, e); - return; + PushbackInputStream pbis = new PushbackInputStream(r.getInputStream()); + Picture p = null; + int firstByte = pbis.read(); + if (firstByte == -1) throw new JSExn("empty stream reading image"); + pbis.unread(firstByte); + if ((firstByte & 0xff) == 'G') GIF.load(pbis, p); + else if ((firstByte & 0xff) == 137) PNG.load(pbis, p); + else if ((firstByte & 0xff) == 0xff) Platform.decodeJPEG(pbis, p); + else throw new JSExn("couldn't figure out image type from first byte"); + Scheduler.add(callback); + } catch (Exception e) { + Log.log(this, "exception while loading image"); + Log.log(this, e); } } }.start(); return ret;