summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Tobler <a.tobler@schweiz.org>2006-06-28 19:47:42 +0000
committerAndreas Tobler <a.tobler@schweiz.org>2006-06-28 19:47:42 +0000
commit7b560a35d02e2239dc60856edd351e2c28aed024 (patch)
tree3c54ce7b723c60f9bceb92b560b4f4604d64fdbb
parent823253efc205ac53d49c1a4860c1f1d1d056424c (diff)
downloadclasspath-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--ChangeLog10
-rw-r--r--gnu/java/awt/peer/gtk/CairoSurface.java48
-rw-r--r--native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImage.c22
3 files changed, 64 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 081e677fa..0475e5d6a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;
}