CVSROOT: /cvsroot/classpath Module name: classpath Changes by: Mark Wielaard <mark> 06/06/11 22:02:14
Modified files: . : ChangeLog gnu/java/awt/peer/gtk: GdkPixbufDecoder.java native/jni/gtk-peer: gnu_java_awt_peer_gtk_GdkPixbufDecoder.c Log message: * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java (streamImage): Takes GdkPixbufWriter. (GdkPixbufWriter): Implements Runnable. (write(IIOMetadata,IIOImage,ImageWriteParam)): Start Thread for data processing. (DATADONE): New static final field. (data): New field. (write(byte[])): New method. (run): Likewise. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initStaticState): Get dataOutputWriteID from writeClass. (stream_save_request): Change stream field to writer. (save_to_stream): Remove FIXME, call writer. (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage): Store writer. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/classpath/ChangeLog?cvsroot=classpath&r1=1.7772&r2=1.7773 http://cvs.savannah.gnu.org/viewcvs/classpath/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java?cvsroot=classpath&r1=1.22&r2=1.23 http://cvs.savannah.gnu.org/viewcvs/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c?cvsroot=classpath&r1=1.22&r2=1.23 Patches: Index: ChangeLog =================================================================== RCS file: /cvsroot/classpath/classpath/ChangeLog,v retrieving revision 1.7772 retrieving revision 1.7773 diff -u -b -r1.7772 -r1.7773 --- ChangeLog 11 Jun 2006 21:57:14 -0000 1.7772 +++ ChangeLog 11 Jun 2006 22:02:13 -0000 1.7773 @@ -1,3 +1,22 @@ +2006-06-11 Mark Wielaard <[EMAIL PROTECTED]> + + * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java (streamImage): + Takes GdkPixbufWriter. + (GdkPixbufWriter): Implements Runnable. + (write(IIOMetadata,IIOImage,ImageWriteParam)): Start Thread for + data processing. + (DATADONE): New static final field. + (data): New field. + (write(byte[])): New method. + (run): Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c + (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initStaticState): + Get dataOutputWriteID from writeClass. + (stream_save_request): Change stream field to writer. + (save_to_stream): Remove FIXME, call writer. + (Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage): + Store writer. + 2006-06-11 Andrew John Hughes <[EMAIL PROTECTED]> * NEWS: Index: gnu/java/awt/peer/gtk/GdkPixbufDecoder.java =================================================================== RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -b -r1.22 -r1.23 --- gnu/java/awt/peer/gtk/GdkPixbufDecoder.java 30 May 2006 22:36:32 -0000 1.22 +++ gnu/java/awt/peer/gtk/GdkPixbufDecoder.java 11 Jun 2006 22:02:14 -0000 1.23 @@ -103,7 +103,14 @@ native void pumpBytes (byte[] bytes, int len) throws IOException; native void pumpDone () throws IOException; native void finish (boolean needsClose); - static native void streamImage(int[] bytes, String format, int width, int height, boolean hasAlpha, DataOutput sink); + + /** + * Converts given image to bytes. + * Will call the GdkPixbufWriter for each chunk. + */ + static native void streamImage(int[] bytes, String format, + int width, int height, + boolean hasAlpha, GdkPixbufWriter writer); // gdk-pixbuf provids data in RGBA format static final ColorModel cm = new DirectColorModel (32, 0xff000000, @@ -461,7 +468,7 @@ } private static class GdkPixbufWriter - extends ImageWriter + extends ImageWriter implements Runnable { String ext; public GdkPixbufWriter(GdkPixbufWriterSpi ownerSpi, Object ext) @@ -519,11 +526,77 @@ model = img.getColorModel(); } + new Thread(this, "GdkPixbufWriter").start(); processImageStarted(1); synchronized(pixbufLock) { streamImage(pixels, this.ext, width, height, model.hasAlpha(), - (DataOutput) this.getOutput()); + this); + } + synchronized(data) + { + data.add(DATADONE); + } + } + + /** + * Object marking end of data from native streamImage code. + */ + private static final Object DATADONE = new Object(); + + /** + * Holds the data gotten from the native streamImage code. + * A worker thread will pull data out. + * Needs to be synchronized for access. + * The special object DATADONE is added when all data has been delivered. + */ + private ArrayList data = new ArrayList(); + + /** Callback for streamImage native code. **/ + private void write(byte[] bs) + { + synchronized(data) + { + data.add(bs); + data.notifyAll(); + } + } + + public void run() + { + boolean done = false; + while (!done) + { + synchronized(data) + { + while (data.isEmpty()) + { + try + { + data.wait(); + } + catch (InterruptedException ie) + { + /* ignore */ + } + } + + Object o = data.remove(0); + if (o == DATADONE) + done = true; + else + { + DataOutput out = (DataOutput) getOutput(); + try + { + out.write((byte[]) o); + } + catch (IOException ioe) + { + // Not much we can do now... + } + } + } } processImageComplete(); } Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -b -r1.22 -r1.23 --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c 20 Mar 2006 14:42:37 -0000 1.22 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c 11 Jun 2006 22:02:14 -0000 1.23 @@ -278,7 +278,7 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_initStaticState (JNIEnv *env, jclass clazz) { - jclass dataOutputClass; + jclass writerClass; (*env)->GetJavaVM(env, &vm); @@ -296,9 +296,9 @@ "(Ljava/lang/String;Z)" "Lgnu/java/awt/peer/gtk/GdkPixbufDecoder$ImageFormatSpec;"); - - dataOutputClass = (*env)->FindClass(env, "java/io/DataOutput"); - dataOutputWriteID = (*env)->GetMethodID (env, dataOutputClass, + writerClass = (*env)->FindClass + (env, "gnu/java/awt/peer/gtk/GdkPixbufDecoder$GdkPixbufWriter"); + dataOutputWriteID = (*env)->GetMethodID (env, writerClass, "write", "([B)V"); query_formats (env, clazz); @@ -344,7 +344,7 @@ struct stream_save_request { JNIEnv *env; - jobject *stream; + jobject *writer; }; static gboolean @@ -358,21 +358,14 @@ jbyteArray jbuf; jbyte *cbuf; - /* FIXME. Don't call user code directly on this thread. - Store bytes and signal a "pump" thread to deliver to user code. - Then we don't have to drop/acquire any locks. */ - gdk_threads_leave (); - jbuf = (*(ssr->env))->NewByteArray ((ssr->env), count); cbuf = (*(ssr->env))->GetByteArrayElements ((ssr->env), jbuf, NULL); memcpy (cbuf, buf, count); (*(ssr->env))->ReleaseByteArrayElements ((ssr->env), jbuf, cbuf, 0); - (*(ssr->env))->CallVoidMethod ((ssr->env), *(ssr->stream), + (*(ssr->env))->CallVoidMethod ((ssr->env), *(ssr->writer), dataOutputWriteID, jbuf); (*(ssr->env))->DeleteLocalRef((ssr->env), jbuf); - gdk_threads_enter (); - return TRUE; } @@ -381,7 +374,7 @@ Java_gnu_java_awt_peer_gtk_GdkPixbufDecoder_streamImage (JNIEnv *env, jclass clazz __attribute__((unused)), jintArray jarr, jstring jenctype, jint width, jint height, - jboolean hasAlpha, jobject stream) + jboolean hasAlpha, jobject writer) { GdkPixbuf* pixbuf; jint *ints; @@ -391,7 +384,7 @@ int i; struct stream_save_request ssr; - ssr.stream = &stream; + ssr.writer = &writer; ssr.env = env; ints = (*env)->GetIntArrayElements (env, jarr, NULL);