This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Re: [patch] image processing fix for BE machine
Thomas Fitzsimmons wrote:
Shall I prepare a patch for gui-branch too ?
Yes, please.
Would look like this.
Untested.
Andreas
2004-09-22 Andreas Tobler <a.tobler@schweiz.ch>
* configure.ac: Introduce AC_C_BIGENDIAN_CROSS for WORDS_BIGENDIAN.
* configure: Regenerate.
* include/config.h.in: Likewise.
* jni/gtk-peer/gtkpeer.h (SWAPU32): Introduce macro to swap pixels.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c: Moved SWAPU32
macro to gtkpeer.h.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
(Java_gnu_java_awt_peer_gtk_GdkGraphics2D_getImagePixels): Convert
pixels from 0xBBGGRRAA to 0xAARRGGBB only on Little Endian
architectures.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c (area_updated):
Likewise.
Index: configure.in
===================================================================
RCS file: /cvs/gcc/gcc/libjava/Attic/configure.in,v
retrieving revision 1.181.2.1
diff -u -r1.181.2.1 configure.in
--- configure.in 24 Jun 2004 05:29:54 -0000 1.181.2.1
+++ configure.in 22 Sep 2004 21:10:13 -0000
@@ -1011,6 +1011,8 @@
AC_COMPILE_CHECK_SIZEOF(void *)
+AC_C_BIGENDIAN_CROSS
+
ZLIBS=
SYS_ZLIBS=
ZINCS=
Index: include/config.h.in
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/config.h.in,v
retrieving revision 1.52
diff -u -r1.52 config.h.in
--- include/config.h.in 2 Dec 2003 22:26:49 -0000 1.52
+++ include/config.h.in 22 Sep 2004 21:10:14 -0000
@@ -431,6 +431,16 @@
/* The number of bytes in type void * */
#undef SIZEOF_VOID_P
+/* whether byteorder is bigendian */
+#undef WORDS_BIGENDIAN
+
+/* Define if the host machine stores words of multi-word integers in
+ big-endian order. */
+#undef HOST_WORDS_BIG_ENDIAN
+
+/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */
+#undef BYTEORDER
+
/* Short GCJ version ID */
#undef GCJVERSION
Index: jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.12.8.7
diff -u -r1.12.8.7 gtkpeer.h
--- jni/gtk-peer/gtkpeer.h 2 Sep 2004 21:26:26 -0000 1.12.8.7
+++ jni/gtk-peer/gtkpeer.h 22 Sep 2004 21:10:14 -0000
@@ -107,6 +107,9 @@
#endif /* JVM_SUN */
+#define SWAPU32(w) \
+ (((w) << 24) | (((w) & 0xff00) << 8) | (((w) >> 8) & 0xff00) | ((w) >> 24))
+
struct graphics
{
GdkDrawable *drawable;
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c,v
retrieving revision 1.5.8.7
diff -u -r1.5.8.7 gnu_java_awt_peer_gtk_GdkGraphics2D.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c 2 Sep 2004 21:26:25 -0000 1.5.8.7
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c 22 Sep 2004 21:10:16 -0000
@@ -737,7 +737,7 @@
gint bits_per_sample = 8;
gboolean has_alpha = TRUE;
gint total_channels = 4;
- jint i, px;
+ jint i;
gdk_threads_enter();
if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return NULL; }
@@ -765,24 +765,14 @@
width, height);
native_pixels= gdk_pixbuf_get_pixels (buf);
-
-
- /* NOTE: The pixels we got in the pixbuf are stored
- in reversed order. i.e 0xBBGGRRAA.
- We need to convert them to 0xAARRGGBB. */
-
- for (i=0; i<width * height; i++)
- {
-
- /* convert pixels from 0xBBGGRRAA to 0xAARRGGBB */
-
- px = native_pixels[i];
- px = ((px >> 24) & 0xff) | ((px << 8) & 0xffffff00);
- px = ((px >> 8) & 0x00ff00ff) | ((px << 8) & 0xff00ff00);
- px = ((px >> 16) & 0x0000ffff) | ((px << 16) & 0xffff0000);
- native_pixels[i] = px;
-
+
+#ifndef WORDS_BIGENDIAN
+ /* convert pixels from 0xBBGGRRAA to 0xAARRGGBB */
+ for (i=0; i<width * height; i++)
+ {
+ native_pixels[i] = SWAPU32 ((unsigned)native_pixels[i]);
}
+#endif
java_pixels = (*env) -> NewIntArray (env, width * height);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c,v
retrieving revision 1.2.10.3
diff -u -r1.2.10.3 gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c 8 Aug 2004 22:08:49 -0000 1.2.10.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c 22 Sep 2004 21:10:16 -0000
@@ -99,7 +99,7 @@
JNIEnv *env;
union env_union e;
jint stride_bytes, stride_pixels, n_channels, n_pixels;
- int i, px;
+ int i;
jintArray jpixels;
jint *java_pixels;
guchar *gdk_pixels;
@@ -129,21 +129,13 @@
gdk_pixels + (y * stride_bytes),
(height * stride_bytes));
+#ifndef WORDS_BIGENDIAN
+ /* convert pixels from 0xBBGGRRAA to 0xAARRGGBB */
for (i = 0; i < n_pixels; ++i)
{
- px = java_pixels[i];
-
- /* move alpha around (GdkPixbufLoader results are AGBR not GBRA, in
- the lsb sense) */
- /* px = ((px >> 24) & 0xff) | ((px << 8) & 0xffffff00); */
-
- /* it appears to require a full byte swap, now, not just a shift to
- the A channel. why did this change? don't know. */
- px = ((px >> 8) & 0x00ff00ff) | ((px << 8) & 0xff00ff00);
- px = ((px >> 16) & 0x0000ffff) | ((px << 16) & 0xffff0000);
-
- java_pixels[i] = px;
+ java_pixels[i] = SWAPU32 ((unsigned)java_pixels[i]);
}
+#endif
g_object_unref (pixbuf);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c,v
retrieving revision 1.2.16.1
diff -u -r1.2.16.1 gnu_java_awt_peer_gtk_GtkImagePainter.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c 5 May 2004 19:27:03 -0000 1.2.16.1
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkImagePainter.c 22 Sep 2004 21:10:16 -0000
@@ -40,8 +40,6 @@
#include <libart_lgpl/art_misc.h>
#include <libart_lgpl/art_rgb_affine.h>
-#define SWAPU32(w) \
- (((w) << 24) | (((w) & 0xff00) << 8) | (((w) >> 8) & 0xff00) | ((w) >> 24))
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkImagePainter_drawPixels
(JNIEnv *env, jobject obj __attribute__((unused)), jobject gc_obj,