X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Forg%2Fxwt%2FPicture.java;h=4d563e0c1c747fe645f700a75b4f0facaee4718a;hb=e1da86ef35e219b79c3de0c099cf82b2500dc448;hp=38f9c0a73b74ef7cd444b2fc9e476d912ef7a91b;hpb=214fe5c02d3f0fb9c3c61128a100e6a3cb01668e;p=org.ibex.core.git diff --git a/src/org/xwt/Picture.java b/src/org/xwt/Picture.java index 38f9c0a..4d563e0 100644 --- a/src/org/xwt/Picture.java +++ b/src/org/xwt/Picture.java @@ -6,59 +6,73 @@ 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(); - private static GIF gif = new GIF(); - - // FIXME: return a Picture that gets filled in later /** turns a resource into a Picture.Source and passes it to the callback */ - public static Picture fromRes(final Res r, final Callback callback) { + public static Picture load(final Res r, final Scheduler.Task callback) { Picture ret = (Picture)cache.get(r); - if (ret != null) return ret; - try { - Platform.inputStreamToByteArray(r.getInputStream(), new Callback() { public Object call(Object o) { + if (ret == null) cache.put(r, ret = Platform.createPicture(r)); + final Picture p = ret; + if (!ret.isLoaded && callback != null) + new java.lang.Thread() { public void run() { + // get the InputStream for the image + InputStream in = null; try { - Picture ret = null; - byte[] b = (byte[])o; - InputStream pbis = new ByteArrayInputStream(b); - if ((b[0] & 0xff) == 'G') ret = gif.fromInputStream(pbis, r.getDescriptiveName()); - else if ((b[0] & 0xff) == 137) ret = new PNG().fromInputStream(pbis, r.getDescriptiveName()); - else if ((b[0] & 0xff) == 0xff) ret = Platform.decodeJPEG(pbis, r.getDescriptiveName()); - else throw new JS.Exn("couldn't figure out image type from first byte"); - ret.res = r; - cache.put(r, ret); - callback.call(ret); + in = r.getInputStream(); + } catch (IOException e) { + in = null; + if (r instanceof Res.Ref) { + // add extensions to the resource, looking for the image + Res.Ref ref = (Res.Ref)r; + Res newr; + + String[] exts = new String[] { ".png", ".jpeg", ".gif" }; + for (int i=0; i < exts.length && in == null; i++) { + newr = ref.addExtension(exts[i]); + try { in = newr.getInputStream(); } + catch (IOException f) { in = null; } + } + } + } + + // could not find image + if (in == null) { Log.info(Picture.class, "couldn't load image for resource " + r); return; } + + try { + PushbackInputStream pbis = new PushbackInputStream(in); + 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"); + p.isLoaded = true; + Scheduler.add(callback); } catch (Exception e) { - Log.log(Picture.class, e); + Log.info(this, "exception while loading image"); + Log.info(this, e); } - return null; - }}); - } catch (Exception e) { - Log.log(Picture.class, e); - } - return null; + } }.start(); + + return ret; } }