I also added checks to CairoSurface.setPixels. Avoid segfaults.
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c
===================================================================
RCS file: /sources/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c,v
retrieving revision 1.11
diff -U3 -r1.11 gnu_java_awt_peer_gtk_CairoSurface.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c 1 Jun 2006 04:26:40 -0000 1.11
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c 2 Jun 2006 18:27:18 -0000
@@ -145,12 +145,29 @@
{
jint *pixeldata, *jpixdata;
int size;
+ int width, height;
+ jclass cls;
+ jfieldID field;
+
+ if( jpixels == NULL )
+ return;
+
+ cls = (*env)->GetObjectClass (env, obj);
+ field = (*env)->GetFieldID (env, cls, "width", "I");
+ g_assert (field != 0);
+ width = (*env)->GetIntField (env, obj, field);
+
+ field = (*env)->GetFieldID (env, cls, "height", "I");
+ g_assert (field != 0);
+ height = (*env)->GetIntField (env, obj, field);
pixeldata = (jint *)getNativeObject(env, obj, BUFFER);
g_assert(pixeldata != NULL);
-
+
jpixdata = (*env)->GetIntArrayElements (env, jpixels, NULL);
size = (*env)->GetArrayLength( env, jpixels );
+ if( size > width * height ) size = width * height; // stop overflows.
+
memcpy (pixeldata, jpixdata, size * sizeof( jint ));
(*env)->ReleaseIntArrayElements (env, jpixels, jpixdata, 0);
@@ -223,17 +240,17 @@
jint *pixeldata = (jint *)getNativeObject(env, obj, BUFFER);
g_assert( pixeldata != NULL );
- temp = g_malloc( w * 4 );
+ temp = g_malloc( w * sizeof( jint ) );
g_assert( temp != NULL );
- srcOffset = x + y * (stride >> 2);
- dstOffset = (x + dx) + (y + dy) * (stride >> 2);
+ srcOffset = x + y * stride;
+ dstOffset = (x + dx) + (y + dy) * stride;
for( row = 0; row < h; row++)
{
- memcpy( temp, pixeldata + srcOffset, w * 4 );
- memcpy( pixeldata + dstOffset, temp, w * 4 );
- srcOffset += (stride >> 2);
- dstOffset += (stride >> 2);
+ memcpy( temp, pixeldata + srcOffset, w * sizeof(jint) );
+ memcpy( pixeldata + dstOffset, temp, w * sizeof(jint) );
+ srcOffset += stride;
+ dstOffset += stride;
}
g_free( temp );