X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FPicture.java;h=44565d571a0b76872f8800143a691326e22a6cec;hb=de378041d5ca2aca1a2b5a31ef15ae90a86c977f;hp=4d563e0c1c747fe645f700a75b4f0facaee4718a;hpb=ef61babe77a94eba181c95a52c0069a612276dff;p=org.ibex.core.git diff --git a/src/org/xwt/Picture.java b/src/org/xwt/Picture.java index 4d563e0..44565d5 100644 --- a/src/org/xwt/Picture.java +++ b/src/org/xwt/Picture.java @@ -1,4 +1,4 @@ -// Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL] +// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL] package org.xwt; import java.io.*; import org.xwt.js.*; @@ -16,46 +16,34 @@ import org.xwt.translators.*; */ public class Picture { - 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 + public Picture() { this.stream = null; } + public Picture(JS r) { this.stream = r; } + private static Cache cache = new Cache(100); ///< Picture, keyed by the Stream that loaded them - public Res res = null; ///< the resource we were loaded from + public JS stream = null; ///< the stream 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 - - /** turns a resource into a Picture.Source and passes it to the callback */ - 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)); + + /** invoked when an image is fully loaded; subclasses can use this to initialize platform-specific constructs */ + protected void loaded() { isLoaded = true; } + + /** turns a stream into a Picture.Source and passes it to the callback */ + public static Picture load(final JS stream, final Scheduler.Task callback) { + Picture ret = (Picture)cache.get(stream); + if (ret == null) cache.put(stream, ret = Platform.createPicture(stream)); final Picture p = ret; - if (!ret.isLoaded && callback != null) + if (!ret.isLoaded && callback != null) { + final XWT.Blessing b = XWT.Blessing.getBlessing(stream); new java.lang.Thread() { public void run() { - // get the InputStream for the image InputStream in = null; try { - 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; } - } - } + in = b == null ? Stream.getInputStream(stream) : b.getImage(); + } catch (IOException e) { Log.error(Picture.class, stream); + } catch (JSExn e) { Log.error(Picture.class, stream); } - - // could not find image - if (in == null) { Log.info(Picture.class, "couldn't load image for resource " + r); return; } - + if (in == null) { Log.warn(Picture.class, "couldn't load image for stream " + stream); return; } try { PushbackInputStream pbis = new PushbackInputStream(in); int firstByte = pbis.read(); @@ -65,14 +53,14 @@ public class Picture { 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; + p.loaded(); Scheduler.add(callback); } catch (Exception e) { Log.info(this, "exception while loading image"); Log.info(this, e); } } }.start(); - + } return ret; } }