[Top][All Lists]
[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);
- [commit-cp] classpath ChangeLog gnu/java/awt/peer/gtk/GdkPi...,
Mark Wielaard <=