summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Fitzsimmons <fitzsim@redhat.com>2005-09-02 03:15:15 +0000
committerThomas Fitzsimmons <fitzsim@redhat.com>2005-09-02 03:15:15 +0000
commit81d7d8bbd79aa1d873f56d36f2b6ca56ae1e6c52 (patch)
tree0ad4c3de21ffebf772c0271554f58195e2ef4d56
parent8faa85f61199b13dd5a37adf6f0cbdcf89ed8471 (diff)
downloadclasspath-81d7d8bbd79aa1d873f56d36f2b6ca56ae1e6c52.tar.gz
2005-09-01 Thomas Fitzsimmons <fitzsim@redhat.com>
PR awt/23536 * gnu/java/awt/peer/gtk/GtkImage.java, gnu_java_awt_peer_gtk_GtkImage.c (GtkImage(URL)): New constructor. (GtkImage(byte[])) New constructor. (loadImageFromData): New method. * gnu/java/awt/peer/gtk/GtkToolkit.java (createImage(URL)): Call GtkImage(URL) constructor. (createImage(byte[],int,int)): Call GtkImage(byte[]) constructor. * include/gnu_java_awt_peer_gtk_GtkImage.h: Regenerate.
-rw-r--r--ChangeLog12
-rw-r--r--gnu/java/awt/peer/gtk/GtkImage.java62
-rw-r--r--gnu/java/awt/peer/gtk/GtkToolkit.java14
-rw-r--r--include/gnu_java_awt_peer_gtk_GtkImage.h1
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c48
5 files changed, 126 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 4935957e6..9ae1bced1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2005-09-01 Thomas Fitzsimmons <fitzsim@redhat.com>
+
+ PR awt/23536
+ * gnu/java/awt/peer/gtk/GtkImage.java,
+ gnu_java_awt_peer_gtk_GtkImage.c (GtkImage(URL)): New constructor.
+ (GtkImage(byte[])) New constructor.
+ (loadImageFromData): New method.
+ * gnu/java/awt/peer/gtk/GtkToolkit.java (createImage(URL)): Call
+ GtkImage(URL) constructor.
+ (createImage(byte[],int,int)): Call GtkImage(byte[]) constructor.
+ * include/gnu_java_awt_peer_gtk_GtkImage.h: Regenerate.
+
2005-09-01 Mark Wielaard <mark@klomp.org>
* gnu/java/awt/ClasspathToolkit.java (getFont): Get non-public
diff --git a/gnu/java/awt/peer/gtk/GtkImage.java b/gnu/java/awt/peer/gtk/GtkImage.java
index b1e72bb8c..a3ed97b3b 100644
--- a/gnu/java/awt/peer/gtk/GtkImage.java
+++ b/gnu/java/awt/peer/gtk/GtkImage.java
@@ -51,6 +51,9 @@ import java.io.File;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Vector;
+import java.io.ByteArrayOutputStream;
+import java.io.BufferedInputStream;
+import java.net.URL;
import gnu.classpath.Pointer;
/**
@@ -129,11 +132,16 @@ public class GtkImage extends Image
private native void setPixels(int[] pixels);
/**
- * Loads an image using gdk-pixbuf.
+ * Loads an image using gdk-pixbuf from a file.
*/
private native boolean loadPixbuf(String name);
/**
+ * Loads an image using gdk-pixbuf from data.
+ */
+ private native boolean loadImageFromData(byte[] data);
+
+ /**
* Allocates a Gtk Pixbuf or pixmap
*/
private native void createPixmap();
@@ -211,6 +219,58 @@ public class GtkImage extends Image
}
/**
+ * Constructs a GtkImage from a byte array of an image file.
+ *
+ * @throws IllegalArgumentException if the image could not be
+ * loaded.
+ */
+ public GtkImage (byte[] data)
+ {
+ if (loadImageFromData (data) != true)
+ throw new IllegalArgumentException ("Couldn't load image.");
+
+ isLoaded = true;
+ observers = null;
+ offScreen = false;
+ props = new Hashtable();
+ errorLoading = false;
+ }
+
+ /**
+ * Constructs a GtkImage from a URL. May result in an error image.
+ */
+ public GtkImage (URL url)
+ {
+ isLoaded = false;
+ observers = new Vector();
+ errorLoading = false;
+ if( url == null)
+ return;
+ ByteArrayOutputStream baos = new ByteArrayOutputStream (5000);
+ try
+ {
+ BufferedInputStream bis = new BufferedInputStream (url.openStream());
+
+ byte[] buf = new byte[5000];
+ int n = 0;
+
+ while ((n = bis.read(buf)) != -1)
+ baos.write(buf, 0, n);
+ bis.close();
+ }
+ catch(IOException e)
+ {
+ throw new IllegalArgumentException ("Couldn't load image.");
+ }
+ if (loadImageFromData (baos.toByteArray()) != true)
+ throw new IllegalArgumentException ("Couldn't load image.");
+
+ isLoaded = true;
+ observers = null;
+ props = new Hashtable();
+ }
+
+ /**
* Constructs an empty GtkImage.
*/
public GtkImage (int width, int height)
diff --git a/gnu/java/awt/peer/gtk/GtkToolkit.java b/gnu/java/awt/peer/gtk/GtkToolkit.java
index 65e38f0fa..f0df54cdb 100644
--- a/gnu/java/awt/peer/gtk/GtkToolkit.java
+++ b/gnu/java/awt/peer/gtk/GtkToolkit.java
@@ -266,11 +266,7 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit
if (useGraphics2D())
return bufferedImageOrError(GdkPixbufDecoder.createBufferedImage (url));
else
- {
- GdkPixbufDecoder d = new GdkPixbufDecoder (url);
- GtkImage image = new GtkImage (d);
- return image;
- }
+ return new GtkImage (url);
}
public Image createImage (ImageProducer producer)
@@ -290,11 +286,9 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit
imagelength));
else
{
- GdkPixbufDecoder d = new GdkPixbufDecoder (imagedata,
- imageoffset,
- imagelength);
- GtkImage image = new GtkImage (d);
- return image;
+ byte[] datacopy = new byte[imagelength];
+ System.arraycopy (imagedata, imageoffset, datacopy, 0, imagelength);
+ return new GtkImage (datacopy);
}
}
diff --git a/include/gnu_java_awt_peer_gtk_GtkImage.h b/include/gnu_java_awt_peer_gtk_GtkImage.h
index 8ac0a75c3..48940a1ca 100644
--- a/include/gnu_java_awt_peer_gtk_GtkImage.h
+++ b/include/gnu_java_awt_peer_gtk_GtkImage.h
@@ -13,6 +13,7 @@ extern "C"
JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GtkImage_getPixels (JNIEnv *env, jobject);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkImage_setPixels (JNIEnv *env, jobject, jintArray);
JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GtkImage_loadPixbuf (JNIEnv *env, jobject, jstring);
+JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GtkImage_loadImageFromData (JNIEnv *env, jobject, jbyteArray);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkImage_createPixmap (JNIEnv *env, jobject);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkImage_freePixmap (JNIEnv *env, jobject);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkImage_createScaledPixmap (JNIEnv *env, jobject, jobject, jint);
diff --git a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
index 7e0b1a7af..fff50d373 100644
--- a/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
+++ b/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
@@ -97,6 +97,54 @@ Java_gnu_java_awt_peer_gtk_GtkImage_loadPixbuf
return JNI_TRUE;
}
+/*
+ * Creates the image from an array of java bytes.
+ */
+JNIEXPORT jboolean JNICALL
+Java_gnu_java_awt_peer_gtk_GtkImage_loadImageFromData
+ (JNIEnv *env, jobject obj, jbyteArray data)
+{
+ jbyte *src;
+ GdkPixbuf* pixbuf;
+ GdkPixbufLoader* loader;
+ int len;
+ int width;
+ int height;
+
+ gdk_threads_enter ();
+
+ src = (*env)->GetByteArrayElements (env, data, NULL);
+ len = (*env)->GetArrayLength (env, data);
+
+ loader = gdk_pixbuf_loader_new ();
+
+ gdk_pixbuf_loader_write (loader, (guchar *)src, len, NULL);
+ gdk_pixbuf_loader_close (loader, NULL);
+
+ (*env)->ReleaseByteArrayElements (env, data, src, 0);
+
+ pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+
+ if (pixbuf == NULL)
+ {
+ createRawData (env, obj, NULL);
+
+ gdk_threads_leave ();
+
+ return JNI_FALSE;
+ }
+
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+
+ createRawData (env, obj, pixbuf);
+ setWidthHeight(env, obj, width, height);
+
+ gdk_threads_leave ();
+
+ return JNI_TRUE;
+}
+
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkImage_createFromPixbuf
(JNIEnv *env, jobject obj)