Hello all,

I got a mail from Assen Stoyanov <[EMAIL PROTECTED]> where he mentioned some speed problems in gnu.java.awt.peer.gtk.CairoSurface.java.

The recent fix I added for Big Endian systems causes some overhead which can be reduced.

He wanted to know if we could write the conversion routines in plain C. I'm not sure atm. But he also suggested to reorganise the code path to check for (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) only once and not for all pixels. Thanks Assen!

I attach a patch which does this. The improvement is not bad, around a factor 5 for a BufferedImage 816x616 RGBA.

Comments? Ok for head?

Andreas

2006-07-21  Andreas Tobler  <[EMAIL PROTECTED]>

        * gnu/java/awt/peer/gtk/CairoSurface.java (CairoSurface): Rearrange
        code for the pixel swap routine to be more efficient.

Index: gnu/java/awt/peer/gtk/CairoSurface.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/CairoSurface.java,v
retrieving revision 1.13
diff -u -r1.13 CairoSurface.java
--- gnu/java/awt/peer/gtk/CairoSurface.java 17 Jul 2006 22:41:03 -0000 1.13
+++ gnu/java/awt/peer/gtk/CairoSurface.java     21 Jul 2006 21:59:34 -0000
@@ -175,9 +175,9 @@
     int[] data = image.getPixels();

     // Swap ordering from GdkPixbuf to Cairo
-    for(int i = 0; i < data.length; i++ )
+    if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN)
       {
-       if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN)
+       for (int i = 0; i < data.length; i++ )
          {
            // On a big endian system we get a RRGGBBAA data array.
            int alpha = (data[i] & 0xFF);
@@ -195,25 +195,26 @@
                  | ( b  & 0x000000FF);
              }
          }
-       else
-         {
-           // 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);
-             }
-         }
-      }
+      } else {
+      for (int i = 0; i < data.length; i++ )
+       {
+         // 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);
+           }
+       }
+    }

     setPixels( data );
   }

Reply via email to