Hi,

This patch fixes various problems related to image loading.  It also
implements Component.imageUpdate, GtkToolkit.prepareImage and the
byte-array GtkToolkit.createImage method.

Comments?

Tom

2003-11-06  Thomas Fitzsimmons  <[EMAIL PROTECTED]>

        * 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 (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.

Index: Makefile.am
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Makefile.am,v
retrieving revision 1.334
diff -u -r1.334 Makefile.am
--- Makefile.am	29 Oct 2003 16:07:58 -0000	1.334
+++ Makefile.am	6 Nov 2003 19:46:29 -0000
@@ -170,6 +170,7 @@
 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 \
@@ -206,6 +207,7 @@
 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 \
Index: gnu/java/awt/image/ImageDecoder.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/image/ImageDecoder.java,v
retrieving revision 1.1
diff -u -r1.1 ImageDecoder.java
--- gnu/java/awt/image/ImageDecoder.java	9 Aug 2002 04:32:43 -0000	1.1
+++ gnu/java/awt/image/ImageDecoder.java	6 Nov 2003 19:46:31 -0000
@@ -48,6 +48,10 @@
   Vector consumers = new Vector ();
   String filename;
   URL url;
+  byte[] data;
+  int offset;
+  int length;
+  InputStream input;
 
   public static ColorModel cm;
 
@@ -69,6 +73,13 @@
     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);
@@ -90,11 +101,22 @@
     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++)
@@ -109,5 +131,5 @@
   { 
   }
 
-  abstract void produce (Vector v, FileInputStream is) throws IOException;
+  abstract void produce (Vector v, InputStream is) throws IOException;
 }
Index: gnu/java/awt/image/XBMDecoder.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/image/XBMDecoder.java,v
retrieving revision 1.1
diff -u -r1.1 XBMDecoder.java
--- gnu/java/awt/image/XBMDecoder.java	9 Aug 2002 04:32:43 -0000	1.1
+++ gnu/java/awt/image/XBMDecoder.java	6 Nov 2003 19:46:31 -0000
@@ -62,7 +62,7 @@
     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;
Index: gnu/java/awt/peer/gtk/GdkPixbufDecoder.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java,v
retrieving revision 1.1
diff -u -r1.1 GdkPixbufDecoder.java
--- gnu/java/awt/peer/gtk/GdkPixbufDecoder.java	17 Sep 2003 20:03:02 -0000	1.1
+++ gnu/java/awt/peer/gtk/GdkPixbufDecoder.java	6 Nov 2003 19:46:31 -0000
@@ -39,8 +39,7 @@
 package gnu.java.awt.peer.gtk;
 
 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;
@@ -85,6 +84,12 @@
     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)
   {
@@ -122,7 +127,7 @@
   // 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
+  void produce (Vector v, InputStream is) throws IOException
   {
     curr = v;
 
Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v
retrieving revision 1.7
diff -u -r1.7 GtkComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkComponentPeer.java	8 Oct 2003 23:38:44 -0000	1.7
+++ gnu/java/awt/peer/gtk/GtkComponentPeer.java	6 Nov 2003 19:46:31 -0000
@@ -230,6 +230,9 @@
   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;
@@ -242,13 +245,12 @@
       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);
       }
     }
 
Index: gnu/java/awt/peer/gtk/GtkImage.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkImage.java,v
retrieving revision 1.2
diff -u -r1.2 GtkImage.java
--- gnu/java/awt/peer/gtk/GtkImage.java	13 Jul 2003 15:09:20 -0000	1.2
+++ gnu/java/awt/peer/gtk/GtkImage.java	6 Nov 2003 19:46:31 -0000
@@ -60,6 +60,7 @@
   Vector propertyObservers = new Vector ();
 
   ImageProducer source;
+  ImageObserver observer;
   Graphics g;
 
   /* Variables in which we stored cached data, if possible.
@@ -79,9 +80,15 @@
     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)
   {
@@ -135,8 +142,11 @@
     pixelCache = null;
     model = null;
 
-    source.removeConsumer (this);
-    source.addConsumer (this);
+    if (source != null)
+      {
+	source.removeConsumer (this);
+	source.addConsumer (this);
+      }
   }
 
   public boolean
@@ -166,6 +176,12 @@
 	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 
@@ -200,6 +216,11 @@
   {
     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 
@@ -241,7 +262,20 @@
     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
@@ -254,8 +288,11 @@
       }
     else
       {
-	source.startProduction (painter);
-	source.removeConsumer (painter);
+	if (source != null)
+	  {
+	    source.startProduction (painter);
+	    source.removeConsumer (painter);
+	  }
       }
   }
 
Index: gnu/java/awt/peer/gtk/GtkToolkit.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java,v
retrieving revision 1.3
diff -u -r1.3 GtkToolkit.java
--- gnu/java/awt/peer/gtk/GtkToolkit.java	27 Jul 2003 19:04:42 -0000	1.3
+++ gnu/java/awt/peer/gtk/GtkToolkit.java	6 Nov 2003 19:46:31 -0000
@@ -56,6 +56,7 @@
 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.
@@ -91,24 +92,17 @@
   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) 
@@ -117,10 +111,12 @@
   }
 
   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 () 
@@ -144,16 +140,12 @@
 
   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) 
@@ -177,6 +169,31 @@
   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;
   }
 
Index: java/awt/Component.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Component.java,v
retrieving revision 1.29
diff -u -r1.29 Component.java
--- java/awt/Component.java	20 Sep 2003 21:30:39 -0000	1.29
+++ java/awt/Component.java	6 Nov 2003 19:46:31 -0000
@@ -1842,8 +1842,27 @@
    */
   public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h)
   {
-    // XXX Implement.
-    throw new Error("not implemented");
+    boolean incrementalDraw = Boolean.getBoolean ("awt.image.incrementalDraw");
+    Long redrawRate = Long.getLong ("awt.image.redrawrate");
+
+    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;
   }
 
   /**
@@ -1854,8 +1873,11 @@
    */
   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);
   }
 
   /**
@@ -1930,6 +1952,9 @@
    */
   public boolean prepareImage(Image image, ImageObserver observer)
   {
+    if (image == null)
+      throw new NullPointerException ();
+
     return prepareImage(image, image.getWidth(observer),
                         image.getHeight(observer), observer);
   }
Index: java/awt/MediaTracker.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/MediaTracker.java,v
retrieving revision 1.4
diff -u -r1.4 MediaTracker.java
--- java/awt/MediaTracker.java	25 Jul 2003 12:50:44 -0000	1.4
+++ java/awt/MediaTracker.java	6 Nov 2003 19:46:31 -0000
@@ -88,8 +88,8 @@
       {
 	MediaTracker.this.notifyAll();
       }
-      
-      return ((status & COMPLETE) != 0);
+      // If status is not COMPLETE then we need more updates.
+      return (status & COMPLETE) == 0;
     }
   }
 
_______________________________________________
Classpath mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/classpath

Reply via email to