This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [gui] [PATCH] Implement GtkFramePeer.setIconImage()


On Fri, 2004-07-30 at 16:01, David Jee wrote:
> On Fri, 2004-07-30 at 15:37, Bryce McKinlay wrote:
> > What happens if img.getSource() isn't a GdkPixbufDecoder, or if it isn't 
> > loaded yet? Please add a FIXME to suggest that these cases need to be 
> > handled later.
> 
> I added a FIXME for now.  I'll take a look at what should happen in
> these cases.

Here is a patch which takes care of cases where img.getSource() is not a
GdkPixbufDecoder.  I committed it to the java-gui-branch.

-David Jee

2004-08-05  David Jee  <djee@redhat.com>

        PR AWT/16682
        * gnu/java/awt/peer/gtk/GtkFramePeer.java
        (nativeSetIconImage): Rename to nativeSetIconImageFromDecoder.
        (nativeSetIconImageFromData): New native method declaration.
        (setIconImage): Handle images not produced from GdkPixbufDecoder.
        * gnu/java/awt/peer/gtk/GtkImage.java
        (getPixelCache): New method.
        (getColorModel): New method.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
        (nativeSetIconImage): Rename to nativeSetIconImageFromDecoder.
        (free_pixbuf_data): New helper function.
        (nativeSetIconImageFromData): New function.


Index: gnu/java/awt/peer/gtk/GtkFramePeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java,v
retrieving revision 1.17.2.4
diff -u -r1.17.2.4 GtkFramePeer.java
--- gnu/java/awt/peer/gtk/GtkFramePeer.java	30 Jul 2004 20:00:15 -0000	1.17.2.4
+++ gnu/java/awt/peer/gtk/GtkFramePeer.java	5 Aug 2004 13:52:57 -0000
@@ -47,6 +47,7 @@
 import java.awt.Rectangle;
 import java.awt.Window;
 import java.awt.event.PaintEvent;
+import java.awt.image.ColorModel;
 import java.awt.peer.FramePeer;
 import java.awt.peer.MenuBarPeer;
 
@@ -146,16 +147,35 @@
     setIconImage(frame.getIconImage());
   }
 
-  native void nativeSetIconImage (GdkPixbufDecoder decoder);
+  native void nativeSetIconImageFromDecoder (GdkPixbufDecoder decoder);
+  native void nativeSetIconImageFromData (int[] pixels, int width, int height);
   public void setIconImage (Image image) 
   {
       if (image != null)
         {
           GtkImage img = (GtkImage) image;
           // FIXME: Image should be loaded, but if not, do image loading here.
-          // Also, can the image source be anything else than GdkPixbufDecoder?
-          if (img.isLoaded() && img.getSource() instanceof GdkPixbufDecoder)
-            nativeSetIconImage((GdkPixbufDecoder) img.getSource());
+          if (img.isLoaded())
+            {
+              if (img.getSource() instanceof GdkPixbufDecoder)
+                {
+                  nativeSetIconImageFromDecoder((GdkPixbufDecoder) img.getSource());
+                }
+              else
+                {
+                  int[] pixels = img.getPixelCache();
+                  ColorModel model = img.getColorModel();
+                  int[] data = new int[pixels.length * 4];
+                  for (int i = 0; i < pixels.length; i++)
+                    {
+                      data[i * 4] = model.getRed(pixels[i]);
+                      data[i * 4 + 1] = model.getGreen(pixels[i]);
+                      data[i * 4 + 2] = model.getBlue(pixels[i]);
+                      data[i * 4 + 3] = model.getAlpha(pixels[i]);
+                    }
+                  nativeSetIconImageFromData(data, img.getWidth(null), img.getHeight(null));
+                }
+            }
         }
   }
 
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.4.8.2
diff -u -r1.4.8.2 GtkImage.java
--- gnu/java/awt/peer/gtk/GtkImage.java	18 Jun 2004 16:33:23 -0000	1.4.8.2
+++ gnu/java/awt/peer/gtk/GtkImage.java	5 Aug 2004 13:52:57 -0000
@@ -89,6 +89,18 @@
     this.observer = observer;
   }
 
+  public synchronized int[]
+  getPixelCache ()
+  {
+    return pixelCache;
+  }
+
+  public synchronized ColorModel
+  getColorModel ()
+  {
+    return model;
+  }
+
   public synchronized int 
   getWidth (ImageObserver observer)
   {
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.24.2.12
diff -u -r1.24.2.12 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c	30 Jul 2004 17:56:45 -0000	1.24.2.12
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c	5 Aug 2004 13:52:57 -0000
@@ -538,7 +538,7 @@
 }
 
 JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImage
+Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromDecoder
   (JNIEnv *env, jobject obj, jobject decoder)
 {
   void *ptr;
@@ -560,6 +560,49 @@
   gdk_threads_leave ();
 }
 
+void free_pixbuf_data (guchar *pixels, gpointer data __attribute__((unused)))
+{
+  free(pixels);
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkFramePeer_nativeSetIconImageFromData
+  (JNIEnv *env, jobject obj, jintArray pixelArray, jint width, jint height)
+{
+  void *ptr;
+  GdkPixbuf *pixbuf;
+  jint *pixels;
+  int pixels_length, i;
+  guchar *data;
+
+  ptr = NSA_GET_PTR (env, obj);
+
+  pixels = (*env)->GetIntArrayElements (env, pixelArray, 0);
+  pixels_length = (*env)->GetArrayLength (env, pixelArray);
+
+  data = malloc (sizeof (guchar) * pixels_length);
+  for (i = 0; i < pixels_length; i++)
+    data[i] = (guchar) pixels[i];
+
+  gdk_threads_enter ();
+
+  pixbuf = gdk_pixbuf_new_from_data (data,
+                                     GDK_COLORSPACE_RGB,
+                                     TRUE,
+                                     8,
+                                     width,
+                                     height,
+                                     width*4,
+                                     free_pixbuf_data,
+                                     NULL);
+
+  gtk_window_set_icon (GTK_WINDOW (ptr), pixbuf);
+
+  gdk_threads_leave ();
+
+  (*env)->ReleaseIntArrayElements(env, pixelArray, pixels, 0);
+}
+
 static void
 window_get_frame_extents (GtkWidget *window,
                           int *top, int *left, int *bottom, int *right)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]