This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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,

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]