diff options
author | Andreas Tobler <a.tobler@schweiz.org> | 2006-06-28 19:47:42 +0000 |
---|---|---|
committer | Andreas Tobler <a.tobler@schweiz.org> | 2006-06-28 19:47:42 +0000 |
commit | 7b560a35d02e2239dc60856edd351e2c28aed024 (patch) | |
tree | 3c54ce7b723c60f9bceb92b560b4f4604d64fdbb | |
parent | 823253efc205ac53d49c1a4860c1f1d1d056424c (diff) | |
download | classpath-7b560a35d02e2239dc60856edd351e2c28aed024.tar.gz |
2006-06-28 Andreas Tobler <a.tobler@schweiz.ch>
* gnu/java/awt/peer/gtk/CairoSurface.java: Swap the data from the
GdkPixbuf correctly on big endian systems. Fix a typo in the little
endian swapping code.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c
(Java_gnu_java_awt_peer_gtk_GtkImage_getPixels): Swap the pixeldata
without alpha information correctly on big endian systems.
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/CairoSurface.java | 48 | ||||
-rw-r--r-- | native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c | 22 |
3 files changed, 64 insertions, 16 deletions
@@ -1,3 +1,13 @@ +2006-06-28 Andreas Tobler <a.tobler@schweiz.ch> + + * gnu/java/awt/peer/gtk/CairoSurface.java: Swap the data from the + GdkPixbuf correctly on big endian systems. Fix a typo in the little + endian swapping code. + + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c + (Java_gnu_java_awt_peer_gtk_GtkImage_getPixels): Swap the pixeldata + without alpha information correctly on big endian systems. + 2006-06-28 Roman Kennke <kennke@aicas.com> * gnu/java/net/local/LocalSocket.java diff --git a/gnu/java/awt/peer/gtk/CairoSurface.java b/gnu/java/awt/peer/gtk/CairoSurface.java index 5ccd2e14e..b4d08c6ad 100644 --- a/gnu/java/awt/peer/gtk/CairoSurface.java +++ b/gnu/java/awt/peer/gtk/CairoSurface.java @@ -52,6 +52,7 @@ import java.awt.image.ColorModel; import java.awt.image.DirectColorModel; import java.io.File; import java.io.IOException; +import java.nio.ByteOrder; import java.util.Hashtable; import java.util.Vector; import java.io.ByteArrayOutputStream; @@ -177,28 +178,51 @@ public class CairoSurface extends DataBuffer height = image.height; create(width, height, width); - + if(surfacePointer == 0 || bufferPointer == 0) throw new Error("Could not allocate bitmap."); - + // Copy the pixel data from the GtkImage. int[] data = image.getPixels(); // Swap ordering from GdkPixbuf to Cairo for(int i = 0; i < data.length; i++ ) { - int alpha = (data[i] & 0xFF000000) >> 24; - if( alpha == 0 ) // I do not know why we need this, but it works. - data[i] = 0; + if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) + { + // On a big endian system we get a RRGGBBAA data array. + int alpha = (data[i] & 0xFF); + if( alpha == 0 ) // I do not know why we need this, but it works. + data[i] = 0; + else + { + int r = (((data[i] & 0xFF000000) >> 24)); + int g = (((data[i] & 0x00FF0000) >> 16)); + int b = (((data[i] & 0x0000FF00) >> 8)); + // Cairo needs a ARGB32 native array. + data[i] = (( alpha << 24 ) & 0xFF000000) + | (( r << 16 ) & 0x00FF0000) + | (( g << 8 ) & 0x0000FF00) + | ( b & 0x000000FF); + } + } else { - int r = (((data[i] & 0x00FF0000) >> 16) ); - int g = (((data[i] & 0x0000FF00) >> 8) ); - int b = ((data[i] & 0x000000FF) ); - data[i] = (( alpha << 24 ) & 0xFF000000) - | (( b << 16 ) & 0x00FF0000) - | (( g << 8 ) & 0x0000FF00) - | ( r & 0x000000FF); + // On a little endian system we get a AABBGGRR data array. + int alpha = (data[i] & 0xFF000000) >> 24; + if( alpha == 0 ) // I do not know why we need this, but it works. + data[i] = 0; + else + { + int b = (((data[i] & 0x00FF0000) >> 16)); + int g = (((data[i] & 0x0000FF00) >> 8)); + int r = ((data[i] & 0x000000FF)); + // Cairo needs a ARGB32 native array. + data[i] = (( alpha << 24 ) & 0xFF000000) + | (( r << 16 ) & 0x00FF0000) + | (( g << 8 ) & 0x0000FF00) + | ( b & 0x000000FF); + } } } 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 1168c6ec0..8805ae7b3 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 @@ -189,13 +189,27 @@ Java_gnu_java_awt_peer_gtk_GtkImage_getPixels(JNIEnv *env, jobject obj) pixeldata += rowstride; } } else { + + /* Add a default alpha value of 0xFF to the pixeldata without alpha + information and keep it in the same format as the pixeldata with alpha + information. On Little Endian systems: AABBGGRR and on Big Endian + systems: RRGGBBAA. */ + for(i = 0; i < height; i++) { for(j = 0; j < width; j++) - dst[j] = 0xFF000000 | - (pixeldata[j*3 + 2] & 0xFF) << 16 | - (pixeldata[j*3 + 1] & 0xFF) << 8 | - (pixeldata[j*3] & 0xFF); + +#ifndef WORDS_BIGENDIAN + dst[j] = 0xFF000000 + | (pixeldata[j*3 + 2] & 0xFF) << 16 + | (pixeldata[j*3 + 1] & 0xFF) << 8 + | (pixeldata[j*3] & 0xFF); +#else + dst[j] = (pixeldata[j*3] & 0xFF) << 24 + | (pixeldata[j*3 + 1] & 0xFF) << 16 + | (pixeldata[j*3 + 2] & 0xFF) << 8 + | 0xFF; +#endif dst += width; pixeldata += rowstride; } |