commit-classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[commit-cp] classpath ChangeLog gnu/java/awt/peer/gtk/GdkPi...


From: Mark Wielaard
Subject: [commit-cp] classpath ChangeLog gnu/java/awt/peer/gtk/GdkPi...
Date: Sun, 11 Jun 2006 22:02:14 +0000

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  <address@hidden>
+
+       * 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  <address@hidden>
 
        * 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);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]