import org.ibex.js.*;
import org.ibex.plat.*;
import org.ibex.util.*;
-import org.ibex.core.*;
/**
* The in-memory representation of a PNG or GIF image. It is
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
+ private static Cache cache = new Cache(100, true); ///< Picture, keyed by the Stream that loaded them
public JS stream = null; ///< the stream we were loaded from
public int width = -1; ///< the width of the image
public int[] data = null; ///< argb samples
public boolean isLoaded = false; ///< true iff the image is fully loaded
+ public Picture(InputStream is) throws IOException { load(this, is); }
+
+ public static void load(Picture p, InputStream in) throws IOException {
+ PushbackInputStream pbis = new PushbackInputStream(in);
+ int firstByte = pbis.read();
+ if (firstByte == -1) throw new IOException("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 IOException("couldn't figure out image type from first byte");
+ p.loaded();
+ }
+
/** 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 Task callback) {
+ public static Picture load(final JS stream, final Callable callback) {
if(stream == null) throw new NullPointerException();
Picture ret = (Picture)cache.get(stream);
if (ret == null) {
}
final Picture p = ret;
if (!ret.isLoaded && callback != null) {
- // FEATURE: This is kind of ugly - shouldn't need a blessing
- final Ibex.Blessing b = Ibex.Blessing.getBlessing(stream);
new java.lang.Thread() { public void run() {
InputStream in = null;
try {
- in = b == null ? stream.getInputStream() : b.getImage();
+ in = JSU.getInputStream(stream);
} catch (IOException e) { Log.error(Picture.class, e);
- } catch (JSExn e) { Log.error(Picture.class, e);
+ //} catch (JSExn e) { Log.error(Picture.class, e);
}
if (in == null) { Log.warn(Picture.class, "couldn't load image for stream " + stream.unclone()); 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.loaded();
- Scheduler.add(callback);
+ load(p, in);
+ Platform.Scheduler.add(callback);
} catch (Exception e) {
Log.info(this, "exception while loading image");
Log.info(this, e);