OSDN Git Service

2003-11-11 Thomas Fitzsimmons <fitzsim@redhat.com>
authorfitzsim <fitzsim@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Nov 2003 00:37:34 +0000 (00:37 +0000)
committerfitzsim <fitzsim@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Nov 2003 00:37:34 +0000 (00:37 +0000)
* 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

libjava/ChangeLog
libjava/Makefile.am
libjava/Makefile.in
libjava/gnu/java/awt/image/ImageDecoder.java
libjava/gnu/java/awt/image/XBMDecoder.java
libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java
libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java
libjava/gnu/java/awt/peer/gtk/GtkImage.java
libjava/gnu/java/awt/peer/gtk/GtkToolkit.java
libjava/java/awt/Component.java
libjava/java/awt/MediaTracker.java

index 0027b92..70402e9 100644 (file)
@@ -1,5 +1,38 @@
 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.
index 569babb..352294a 100644 (file)
@@ -170,6 +170,7 @@ libgcj_la_LINK = $(LIBLINK)
 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 @@ jni/classpath/primlib.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 \
index da479ca..34cb413 100644 (file)
@@ -261,6 +261,7 @@ libgcj_la_LINK = $(LIBLINK)
 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 \
@@ -297,6 +298,7 @@ jni/classpath/primlib.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 \
@@ -2624,8 +2626,9 @@ lib_gnu_java_awt_peer_gtk_la_LDFLAGS =
 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 \
@@ -2662,6 +2665,7 @@ gnu/java/awt/peer/gtk/GtkToolkit.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 \
@@ -2827,6 +2831,7 @@ DEP_FILES =  .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
 .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 \
@@ -4284,6 +4289,7 @@ DEP_FILES =  .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.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 \
index 4d3fbec..d44efce 100644 (file)
@@ -48,6 +48,10 @@ public abstract class ImageDecoder implements ImageProducer
   Vector consumers = new Vector ();
   String filename;
   URL url;
+  byte[] data;
+  int offset;
+  int length;
+  InputStream input;
 
   public static ColorModel cm;
 
@@ -69,6 +73,13 @@ public abstract class ImageDecoder implements ImageProducer
     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 @@ public abstract class ImageDecoder implements ImageProducer
     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 @@ public abstract class ImageDecoder implements ImageProducer
   { 
   }
 
-  abstract void produce (Vector v, FileInputStream is) throws IOException;
+  abstract void produce (Vector v, InputStream is) throws IOException;
 }
index 2505b3d..b80fd55 100644 (file)
@@ -62,7 +62,7 @@ public class XBMDecoder extends ImageDecoder
     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 55f3338..3cc42cb 100644 (file)
@@ -41,6 +41,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 +86,12 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder
     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 +129,7 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder
   // 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;
 
@@ -213,5 +220,4 @@ public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder
     dec.startProduction (bb);
     return bb.getBufferedImage ();
   }
-
 }
index f3676f3..f4c143b 100644 (file)
@@ -230,6 +230,9 @@ public class GtkComponentPeer extends GtkGenericPeer
   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 @@ public class GtkComponentPeer extends GtkGenericPeer
       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 6252a50..5f8d223 100644 (file)
@@ -60,6 +60,7 @@ public class GtkImage extends Image implements ImageConsumer
   Vector propertyObservers = new Vector ();
 
   ImageProducer source;
+  ImageObserver observer;
   Graphics g;
 
   /* Variables in which we stored cached data, if possible.
@@ -79,9 +80,15 @@ public class GtkImage extends Image implements ImageConsumer
     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 @@ public class GtkImage extends Image implements ImageConsumer
     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 @@ public class GtkImage extends Image implements ImageConsumer
        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 @@ public class GtkImage extends Image implements ImageConsumer
   {
     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 @@ public class GtkImage extends Image implements ImageConsumer
     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 @@ public class GtkImage extends Image implements ImageConsumer
       }
     else
       {
-       source.startProduction (painter);
-       source.removeConsumer (painter);
+       if (source != null)
+         {
+           source.startProduction (painter);
+           source.removeConsumer (painter);
+         }
       }
   }
 
index 9f669ac..7f8ae2e 100644 (file)
@@ -56,6 +56,7 @@ import gnu.java.awt.EmbeddedWindow;
 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 class GtkToolkit extends Toolkit
   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 class GtkToolkit extends Toolkit
   }
 
   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 class GtkToolkit extends Toolkit
 
   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 class GtkToolkit extends Toolkit
   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 d70ed50..74b4dae 100644 (file)
@@ -555,6 +555,17 @@ public abstract class Component
    */
   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.
 
@@ -1832,7 +1843,9 @@ public abstract class Component
    * @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)
@@ -1842,8 +1855,24 @@ public abstract class Component
    */
   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;
   }
 
   /**
@@ -1854,8 +1883,11 @@ public abstract class Component
    */
   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 +1962,9 @@ public abstract class Component
    */
   public boolean prepareImage(Image image, ImageObserver observer)
   {
+    if (image == null)
+      throw new NullPointerException ();
+
     return prepareImage(image, image.getWidth(observer),
                         image.getHeight(observer), observer);
   }
index 0f4e1c3..b115734 100644 (file)
@@ -88,8 +88,8 @@ public class MediaTracker implements java.io.Serializable
       {
        MediaTracker.this.notifyAll();
       }
-      
-      return ((status & COMPLETE) != 0);
+      // If status is not COMPLETE then we need more updates.
+      return (status & COMPLETE) == 0;
     }
   }