diff options
author | Thomas Fitzsimmons <fitzsim@redhat.com> | 2005-09-02 03:15:15 +0000 |
---|---|---|
committer | Thomas Fitzsimmons <fitzsim@redhat.com> | 2005-09-02 03:15:15 +0000 |
commit | 81d7d8bbd79aa1d873f56d36f2b6ca56ae1e6c52 (patch) | |
tree | 0ad4c3de21ffebf772c0271554f58195e2ef4d56 | |
parent | 8faa85f61199b13dd5a37adf6f0cbdcf89ed8471 (diff) | |
download | classpath-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-- | ChangeLog | 12 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkImage.java | 62 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkToolkit.java | 14 | ||||
-rw-r--r-- | include/gnu_java_awt_peer_gtk_GtkImage.h | 1 | ||||
-rw-r--r-- | native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c | 48 |
5 files changed, 126 insertions, 11 deletions
@@ -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) |