* Makefile.am: Add GdkPixbufDecoder.java and
gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
* Makefile.in: Regenerate.
* gnu/java/awt/image/ImageDecoder.java (ImageDecoder(byte[],int,int)):
New constructor.
(startProduction): Create ByteArrayInputStream when url and filename are
null.
(produce): Declare stream parameter as InputStream.
* gnu/java/awt/image/XBMDecoder.java (produce): Declare stream parameter
as InputStream.
* gnu/java/awt/peer/gtk/GdkPixbufDecoder.java
(GdkPixbufDecoder(byte[],int,int)): New constructor.
(produce): Declare stream parameter as InputStream.
* gnu/java/awt/peer/gtk/GtkComponentPeer.java (prepareImage): Throw NPE
if image is null. Set image's observer before running PrepareImage
thread. Pass image to startProduction.
* gnu/java/awt/peer/gtk/GtkImage.java: Add null checks before calls to
source's member functions.
(observer): New field.
(setObserver): New method.
(setDimensions, setPixels, imageComplete): Call observer's imageUpdate.
* gnu/java/awt/peer/gtk/GtkToolkit.java (checkImage, getImage): Return
new GtkImage.
(prepareImage): Implement.
* java/awt/Component.java: Add static fields incrementalDraw and
redrawRate.
(imageUpdate): Implement.
(createImage): Call Toolkit's createImage if peer is null.
(prepareImage): Throw NPE if image is null.
* java/awt/MediaTracker.java: Fix return value.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@73476
138bc75d-0d04-0410-961f-
82ee72b054a4
2003-11-11 Thomas Fitzsimmons <fitzsim@redhat.com>
+ * Makefile.am: Add GdkPixbufDecoder.java and
+ gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
+ * Makefile.in: Regenerate.
+ * gnu/java/awt/image/ImageDecoder.java (ImageDecoder(byte[],int,int)):
+ New constructor.
+ (startProduction): Create ByteArrayInputStream when url and filename are
+ null.
+ (produce): Declare stream parameter as InputStream.
+ * gnu/java/awt/image/XBMDecoder.java (produce): Declare stream parameter
+ as InputStream.
+ * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java
+ (GdkPixbufDecoder(byte[],int,int)): New constructor.
+ (produce): Declare stream parameter as InputStream.
+ * gnu/java/awt/peer/gtk/GtkComponentPeer.java (prepareImage): Throw NPE
+ if image is null. Set image's observer before running PrepareImage
+ thread. Pass image to startProduction.
+ * gnu/java/awt/peer/gtk/GtkImage.java: Add null checks before calls to
+ source's member functions.
+ (observer): New field.
+ (setObserver): New method.
+ (setDimensions, setPixels, imageComplete): Call observer's imageUpdate.
+ * gnu/java/awt/peer/gtk/GtkToolkit.java (checkImage, getImage): Return
+ new GtkImage.
+ (prepareImage): Implement.
+ * java/awt/Component.java: Add static fields incrementalDraw and
+ redrawRate.
+ (imageUpdate): Implement.
+ (createImage): Call Toolkit's createImage if peer is null.
+ (prepareImage): Throw NPE if image is null.
+ * java/awt/MediaTracker.java: Fix return value.
+
+2003-11-11 Thomas Fitzsimmons <fitzsim@redhat.com>
+
* gnu/java/awt/peer/gtk/GtkLabelPeer.java (create()): Call new create.
(create(String, float)): New method.
(setText): Make native.
gtk_c_source_files = \
jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c \
+jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c \
gtk_awt_peer_sources = \
gnu/java/awt/peer/gtk/GdkFontMetrics.java \
gnu/java/awt/peer/gtk/GdkGraphics.java \
+gnu/java/awt/peer/gtk/GdkPixbufDecoder.java \
gnu/java/awt/peer/gtk/GtkArg.java \
gnu/java/awt/peer/gtk/GtkArgList.java \
gnu/java/awt/peer/gtk/GtkButtonPeer.java \
gtk_c_source_files = \
jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c \
+jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c \
gtk_awt_peer_sources = \
gnu/java/awt/peer/gtk/GdkFontMetrics.java \
gnu/java/awt/peer/gtk/GdkGraphics.java \
+gnu/java/awt/peer/gtk/GdkPixbufDecoder.java \
gnu/java/awt/peer/gtk/GtkArg.java \
gnu/java/awt/peer/gtk/GtkArgList.java \
gnu/java/awt/peer/gtk/GtkButtonPeer.java \
lib_gnu_java_awt_peer_gtk_la_DEPENDENCIES =
lib_gnu_java_awt_peer_gtk_la_OBJECTS = \
gnu/java/awt/peer/gtk/GdkFontMetrics.lo \
-gnu/java/awt/peer/gtk/GdkGraphics.lo gnu/java/awt/peer/gtk/GtkArg.lo \
-gnu/java/awt/peer/gtk/GtkArgList.lo \
+gnu/java/awt/peer/gtk/GdkGraphics.lo \
+gnu/java/awt/peer/gtk/GdkPixbufDecoder.lo \
+gnu/java/awt/peer/gtk/GtkArg.lo gnu/java/awt/peer/gtk/GtkArgList.lo \
gnu/java/awt/peer/gtk/GtkButtonPeer.lo \
gnu/java/awt/peer/gtk/GtkCanvasPeer.lo \
gnu/java/awt/peer/gtk/GtkCheckboxGroupPeer.lo \
gnu/java/awt/peer/gtk/GtkWindowPeer.lo \
jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.lo \
jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.lo \
+jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.lo \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.lo \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.lo \
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.lo \
.deps/gnu/java/awt/peer/GLightweightPeer.P \
.deps/gnu/java/awt/peer/gtk/GdkFontMetrics.P \
.deps/gnu/java/awt/peer/gtk/GdkGraphics.P \
+.deps/gnu/java/awt/peer/gtk/GdkPixbufDecoder.P \
.deps/gnu/java/awt/peer/gtk/GtkArg.P \
.deps/gnu/java/awt/peer/gtk/GtkArgList.P \
.deps/gnu/java/awt/peer/gtk/GtkButtonPeer.P \
.deps/jni/classpath/primlib.P \
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkFontMetrics.P \
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.P \
+.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.P \
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.P \
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.P \
.deps/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.P \
Vector consumers = new Vector ();
String filename;
URL url;
+ byte[] data;
+ int offset;
+ int length;
+ InputStream input;
public static ColorModel cm;
this.url = url;
}
+ public ImageDecoder (byte[] imagedata, int imageoffset, int imagelength)
+ {
+ data = imagedata;
+ offset = imageoffset;
+ length = imagelength;
+ }
+
public void addConsumer (ImageConsumer ic)
{
consumers.addElement (ic);
Vector list = (Vector) consumers.clone ();
try
{
- FileInputStream is = (url == null) ? new FileInputStream (filename) :
- (FileInputStream) url.openStream();
-
- produce (list, is);
- }
+ // Create the input stream here rather than in the
+ // ImageDecoder constructors so that exceptions cause
+ // imageComplete to be called with an appropriate error
+ // status.
+ if (url != null)
+ input = url.openStream();
+ else
+ {
+ if (filename != null)
+ input = new FileInputStream (filename);
+ else
+ input = new ByteArrayInputStream (data, offset, length);
+ }
+
+ produce (list, input);
+ }
catch (Exception e)
{
for (int i = 0; i < list.size (); i++)
{
}
- abstract void produce (Vector v, FileInputStream is) throws IOException;
+ abstract void produce (Vector v, InputStream is) throws IOException;
}
super (url);
}
- public void produce (Vector v, FileInputStream is) throws IOException
+ public void produce (Vector v, InputStream is) throws IOException
{
reader = new BufferedReader (new InputStreamReader (is));
int width = -1, height = -1;
import java.awt.image.*;
import java.io.FileDescriptor;
import java.io.FileInputStream;
+import java.io.InputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Vector;
initState ();
}
+ public GdkPixbufDecoder (byte[] imagedata, int imageoffset, int imagelength)
+ {
+ super (imagedata, imageoffset, imagelength);
+ initState ();
+ }
+
// called back by native side
void areaPrepared (int width, int height)
{
// this object, feeding back decoded pixel blocks, which we pass to each
// of the ImageConsumers in the provided Vector.
- void produce (Vector v, FileInputStream is) throws IOException
+ public void produce (Vector v, InputStream is) throws IOException
{
curr = v;
dec.startProduction (bb);
return bb.getBufferedImage ();
}
-
}
public boolean prepareImage (Image image, int width, int height,
ImageObserver observer)
{
+ if (image == null)
+ throw new NullPointerException ();
+
GtkImage i = (GtkImage) image;
if (i.isLoaded ()) return true;
PrepareImage (GtkImage image, ImageObserver observer)
{
this.image = image;
- this.observer = observer;
+ image.setObserver (observer);
}
public void run ()
{
- // XXX: need to return data to image observer
- image.source.startProduction (null);
+ image.source.startProduction (image);
}
}
Vector propertyObservers = new Vector ();
ImageProducer source;
+ ImageObserver observer;
Graphics g;
/* Variables in which we stored cached data, if possible.
source = producer;
this.g = g;
- source.addConsumer (this);
+ if (source != null)
+ source.addConsumer (this);
}
-
+
+ public void setObserver (ImageObserver observer)
+ {
+ this.observer = observer;
+ }
+
public synchronized int
getWidth (ImageObserver observer)
{
pixelCache = null;
model = null;
- source.removeConsumer (this);
- source.addConsumer (this);
+ if (source != null)
+ {
+ source.removeConsumer (this);
+ source.addConsumer (this);
+ }
}
public boolean
ImageObserver io = (ImageObserver) heightObservers.elementAt (i);
io.imageUpdate (this, ImageObserver.HEIGHT, -1, -1, width, height);
}
+
+ if (observer != null)
+ observer.imageUpdate (this,
+ (ImageObserver.WIDTH
+ | ImageObserver.HEIGHT),
+ -1, -1, width, height);
}
public synchronized void
{
setPixels (x, y, width, height, cm, convertPixels (pixels), offset,
scansize);
+
+ if (observer != null)
+ observer.imageUpdate (this,
+ ImageObserver.SOMEBITS,
+ x, y, width, height);
}
public synchronized void
if (status == ImageConsumer.SINGLEFRAMEDONE)
isCacheable = false;
- source.removeConsumer (this);
+ if (observer != null)
+ {
+ if (status == ImageConsumer.IMAGEERROR)
+ observer.imageUpdate (null,
+ ImageObserver.ERROR,
+ -1, -1, -1, -1);
+ else
+ observer.imageUpdate (null,
+ ImageObserver.ALLBITS,
+ -1, -1, -1, -1);
+ }
+
+ if (source != null)
+ source.removeConsumer (this);
}
public synchronized void
}
else
{
- source.startProduction (painter);
- source.removeConsumer (painter);
+ if (source != null)
+ {
+ source.startProduction (painter);
+ source.removeConsumer (painter);
+ }
}
}
import gnu.java.awt.EmbeddedWindowSupport;
import gnu.java.awt.peer.EmbeddedWindowPeer;
import gnu.classpath.Configuration;
+import gnu.java.awt.peer.gtk.GdkPixbufDecoder;
/* This class uses a deprecated method java.awt.peer.ComponentPeer.getPeer().
This merits comment. We are basically calling Sun's bluff on this one.
public int checkImage (Image image, int width, int height,
ImageObserver observer)
{
- return ImageObserver.ALLBITS;
-
-// GtkImage i = (GtkImage) image;
-// return i.checkImage ();
+ return ((GtkImage) image).checkImage ();
}
public Image createImage (String filename)
{
- // FIXME - gcj local: GdkPixbufDecoder doesn't work.
- // return new GtkImage (new GdkPixbufDecoder (filename), null);
- return null;
+ return new GtkImage (new GdkPixbufDecoder (filename), null);
}
public Image createImage (URL url)
{
- // FIXME - gcj local: GdkPixbufDecoder doesn't work.
- // return new GtkImage (new GdkPixbufDecoder (url), null);
- return null;
+ return new GtkImage (new GdkPixbufDecoder (url), null);
}
public Image createImage (ImageProducer producer)
}
public Image createImage (byte[] imagedata, int imageoffset,
- int imagelength)
+ int imagelength)
{
- // System.out.println ("createImage byte[] NOT SUPPORTED");
- return null;
+ return new GtkImage (new GdkPixbufDecoder (imagedata,
+ imageoffset,
+ imagelength),
+ null);
}
public ColorModel getColorModel ()
public Image getImage (String filename)
{
- // FIXME - gcj local: GdkPixbufDecoder doesn't work.
- // return new GtkImage (new GdkPixbufDecoder (filename), null);
- return null;
+ return new GtkImage (new GdkPixbufDecoder (filename), null);
}
public Image getImage (URL url)
{
- // FIXME - gcj local: GdkPixbufDecoder doesn't work.
- // return new GtkImage (new GdkPixbufDecoder (url), null);
- return null;
+ return new GtkImage (new GdkPixbufDecoder (url), null);
}
public PrintJob getPrintJob (Frame frame, String jobtitle, Properties props)
public boolean prepareImage (Image image, int width, int height,
ImageObserver observer)
{
+ if (image == null)
+ throw new NullPointerException ();
+
+ GtkImage i = (GtkImage) image;
+
+ if (i.isLoaded ()) return true;
+
+ class PrepareImage extends Thread
+ {
+ GtkImage image;
+ ImageObserver observer;
+
+ PrepareImage (GtkImage image, ImageObserver observer)
+ {
+ this.image = image;
+ image.setObserver (observer);
+ }
+
+ public void run ()
+ {
+ image.source.startProduction (image);
+ }
+ }
+
+ new PrepareImage (i, observer).start ();
return false;
}
*/
transient BufferStrategy bufferStrategy;
+ /**
+ * The system properties that affect image updating.
+ */
+ private static transient boolean incrementalDraw;
+ private static transient Long redrawRate;
+
+ static
+ {
+ incrementalDraw = Boolean.getBoolean ("awt.image.incrementalDraw");
+ redrawRate = Long.getLong ("awt.image.redrawrate");
+ }
\f
// Public and protected API.
* @param y the Y coordinate
* @param w the width
* @param h the height
- * @return true if the image has been fully loaded
+ * @return false if the image is completely loaded, loading has been
+ * aborted, or an error has occurred. true if more updates are
+ * required.
* @see ImageObserver
* @see Graphics#drawImage(Image, int, int, Color, ImageObserver)
* @see Graphics#drawImage(Image, int, int, ImageObserver)
*/
public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h)
{
- // XXX Implement.
- throw new Error("not implemented");
+ if ((flags & (FRAMEBITS | ALLBITS)) != 0)
+ repaint ();
+ else if ((flags & SOMEBITS) != 0)
+ {
+ if (incrementalDraw)
+ {
+ if (redrawRate != null)
+ {
+ long tm = redrawRate.longValue();
+ if (tm < 0)
+ tm = 0;
+ repaint (tm);
+ }
+ else
+ repaint (100);
+ }
+ }
+ return (flags & (ALLBITS | ABORT | ERROR)) == 0;
}
/**
*/
public Image createImage(ImageProducer producer)
{
- // XXX What if peer or producer is null?
- return peer.createImage(producer);
+ // Sun allows producer to be null.
+ if (peer != null)
+ return peer.createImage(producer);
+ else
+ return getToolkit().createImage(producer);
}
/**
*/
public boolean prepareImage(Image image, ImageObserver observer)
{
+ if (image == null)
+ throw new NullPointerException ();
+
return prepareImage(image, image.getWidth(observer),
image.getHeight(observer), observer);
}
{
MediaTracker.this.notifyAll();
}
-
- return ((status & COMPLETE) != 0);
+ // If status is not COMPLETE then we need more updates.
+ return (status & COMPLETE) == 0;
}
}