[maemo-commits] [maemo-commits] r17409 - in projects/haf/trunk/clutter: clutter/cogl/common debian

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Thu Feb 12 17:16:11 EET 2009
Author: gw
Date: 2009-02-12 17:16:07 +0200 (Thu, 12 Feb 2009)
New Revision: 17409

Modified:
   projects/haf/trunk/clutter/clutter/cogl/common/cogl-bitmap-fallback.c
   projects/haf/trunk/clutter/clutter/cogl/common/cogl-bitmap-pixbuf.c
   projects/haf/trunk/clutter/debian/changelog
Log:
  * Fixed RGBA texture pixmaps in X11-texture-pixmap (format conversion hell)


Modified: projects/haf/trunk/clutter/clutter/cogl/common/cogl-bitmap-fallback.c
===================================================================
--- projects/haf/trunk/clutter/clutter/cogl/common/cogl-bitmap-fallback.c	2009-02-12 12:34:59 UTC (rev 17408)
+++ projects/haf/trunk/clutter/clutter/cogl/common/cogl-bitmap-fallback.c	2009-02-12 15:16:07 UTC (rev 17409)
@@ -184,7 +184,7 @@
 _cogl_unpremult_alpha_last (const guchar *src, guchar *dst)
 {
   guchar alpha = src[3];
-  
+
   dst[0] = ((((gulong) src[0] >> 16) & 0xff) * 255 ) / alpha;
   dst[1] = ((((gulong) src[1] >> 8) & 0xff) * 255 ) / alpha;
   dst[2] = ((((gulong) src[2] >> 0) & 0xff) * 255 ) / alpha;
@@ -195,7 +195,7 @@
 _cogl_unpremult_alpha_first (const guchar *src, guchar *dst)
 {
   guchar alpha = src[0];
-  
+
   dst[0] = alpha;
   dst[1] = ((((gulong) src[1] >> 16) & 0xff) * 255 ) / alpha;
   dst[2] = ((((gulong) src[2] >> 8) & 0xff) * 255 ) / alpha;
@@ -207,24 +207,24 @@
 {
   if (src == dst)
     return FALSE;
-  
+
   switch (src & COGL_UNORDERED_MASK)
     {
     case COGL_PIXEL_FORMAT_G_8:
     case COGL_PIXEL_FORMAT_RGB_888:
     case COGL_PIXEL_FORMAT_RGBA_8888:
     case COGL_PIXEL_FORMAT_RGB_565:
-      
-      if ((dst & COGL_UNORDERED_MASK) != COGL_PIXEL_FORMAT_24 &&
-	  (dst & COGL_UNORDERED_MASK) != COGL_PIXEL_FORMAT_32 &&
-	  (dst & COGL_UNORDERED_MASK) != COGL_PIXEL_FORMAT_G_8)
+
+      if ((dst & COGL_PIXEL_SIZE_MASK) != COGL_PIXEL_FORMAT_24 &&
+	  (dst & COGL_PIXEL_SIZE_MASK) != COGL_PIXEL_FORMAT_32 &&
+	  (dst & COGL_PIXEL_SIZE_MASK) != COGL_PIXEL_FORMAT_G_8)
 	return FALSE;
       break;
-      
+
     default:
       return FALSE;
     }
-  
+
   return TRUE;
 }
 
@@ -245,11 +245,11 @@
   gint     dst_bpp;
   gint     x,y;
   guchar   temp_rgba[4] = {0,0,0,0};
-  
+
   /* Make sure conversion supported */
   if (!_cogl_bitmap_fallback_can_convert (bmp->format, dst_format))
     return FALSE;
-  
+
   src_bpp = _cogl_get_format_bpp (bmp->format);
   dst_bpp = _cogl_get_format_bpp (dst_format);
 
@@ -258,18 +258,18 @@
   dst_bmp->rowstride = sizeof(guchar) * dst_bpp * dst_bmp->width;
   dst_bmp->format = ((bmp->format & COGL_PREMULT_BIT) |
 		     (dst_format & COGL_UNPREMULT_MASK));
-  
+
   /* Allocate a new buffer to hold converted data */
   dst_bmp->data = g_malloc (sizeof(guchar)
 			    * dst_bmp->height
 			    * dst_bmp->rowstride);
-  
+
   /* FIXME: Optimize */
   for (y = 0; y < bmp->height; y++)
     {
       src = (guchar*)bmp->data      + y * bmp->rowstride;
       dst = (guchar*)dst_bmp->data  + y * dst_bmp->rowstride;
-      
+
       for (x = 0; x < bmp->width; x++)
 	{
 	  /* FIXME: Would be nice to at least remove this inner
@@ -298,7 +298,7 @@
 	    default:
 	      break;
 	    }
-	  
+
 	  switch (dst_format & COGL_UNPREMULT_MASK)
 	    {
 	    case COGL_PIXEL_FORMAT_G_8:
@@ -318,12 +318,12 @@
 	    default:
 	      break;
 	    }
-	  
+
 	  src += src_bpp;
 	  dst += dst_bpp;
 	}
     }
-  
+
   return TRUE;
 }
 
@@ -335,28 +335,28 @@
   guchar  *dst;
   gint     bpp;
   gint     x,y;
-  
+
   /* Make sure format supported for un-premultiplication */
   if (!_cogl_bitmap_fallback_can_unpremult (bmp->format))
     return FALSE;
-  
+
   bpp = _cogl_get_format_bpp (bmp->format);
-  
+
   /* Initialize destination bitmap */
   *dst_bmp = *bmp;
   dst_bmp->format = (bmp->format & COGL_UNPREMULT_MASK);
-  
+
   /* Allocate a new buffer to hold converted data */
   dst_bmp->data = g_malloc (sizeof(guchar)
 			    * dst_bmp->height
 			    * dst_bmp->rowstride);
-  
+
   /* FIXME: Optimize */
   for (y = 0; y < bmp->height; y++)
     {
       src = (guchar*)bmp->data      + y * bmp->rowstride;
       dst = (guchar*)dst_bmp->data  + y * dst_bmp->rowstride;
-      
+
       for (x = 0; x < bmp->width; x++)
 	{
 	  /* FIXME: Would be nice to at least remove this inner
@@ -376,12 +376,12 @@
 	      else
 		_cogl_unpremult_alpha_last (src, dst);
 	    }
-	  
+
 	  src += bpp;
 	  dst += bpp;
 	}
     }
-  
+
   return TRUE;
 }
 

Modified: projects/haf/trunk/clutter/clutter/cogl/common/cogl-bitmap-pixbuf.c
===================================================================
--- projects/haf/trunk/clutter/clutter/cogl/common/cogl-bitmap-pixbuf.c	2009-02-12 12:34:59 UTC (rev 17408)
+++ projects/haf/trunk/clutter/clutter/cogl/common/cogl-bitmap-pixbuf.c	2009-02-12 15:16:07 UTC (rev 17409)
@@ -60,35 +60,45 @@
   gint     src_bpp;
   gint     dst_bpp;
   gboolean swap_bgr;
-      
-  swap_bgr = (bmp->format & COGL_BGR_BIT) != (dst_format & COGL_BGR_BIT);   
+
+  /* FIXME: we could do some fancy preprocessor magic here so
+   * support formats in a much more sensible way?
+   *
+   * #define RGB888_GREEN(X) (x[1])
+   * #define RGB888_SET(X,R,G,B) X[0]=R;X[1]=G;X[2]=B;
+   * #define ...
+   * #define SWAP(A,B,FMT_FROM,FMT_TO) \
+   *    for (x...) FMT_TO##_SET(X, FMT_FROM##GREEN, etc.)
+   */
+
+  swap_bgr = (bmp->format & COGL_BGR_BIT) != (dst_format & COGL_BGR_BIT);
   src_bpp = _cogl_get_format_bpp (bmp->format);
   dst_bpp = _cogl_get_format_bpp (dst_format);
-  
+
   /* special case for 16-bit X canvas that is faster than fallback */
-  if ((bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGB_565 && 
-      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGB_888) 
+  if ((bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGB_565 &&
+      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGB_888)
     {
-      
+
       /* Initialize destination bitmap */
       *dst_bmp = *bmp;
       dst_bmp->rowstride = sizeof(guchar) * dst_bpp * dst_bmp->width;
       dst_bmp->format = ((bmp->format & COGL_PREMULT_BIT) |
                          (dst_format & COGL_UNPREMULT_MASK));
-          
+
       /* Allocate a new buffer to hold converted data */
       dst_bmp->data = g_malloc (sizeof(guchar)
                                 * dst_bmp->height
-                                * dst_bmp->rowstride);  
+                                * dst_bmp->rowstride);
 
       if (swap_bgr) {
-        for (ypos=0; ypos<bmp->height; ypos++) 
+        for (ypos=0; ypos<bmp->height; ypos++)
         {
           guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
           guchar *dst = (guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride;
           for (xpos=0; xpos<bmp->width; xpos++)
             {
-              gushort *c = (gushort*)src;              
+              gushort *c = (gushort*)src;
               dst[0] = (((*c >> 8) & 0xf8) | ((*c >> 5) & 0x7));
               dst[1] = (((*c >> 3) & 0xfc) | ((*c >> 9) & 0x3));
               dst[2] = (((*c << 3) & 0xf8) | ((*c >> 2) & 0x7));
@@ -97,7 +107,7 @@
             }
         }
       } else {
-        for (ypos=0; ypos<bmp->height; ypos++) 
+        for (ypos=0; ypos<bmp->height; ypos++)
         {
           guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
           guchar *dst = (guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride;
@@ -111,184 +121,184 @@
               dst += 3;
             }
         }
-      }      
+      }
       return TRUE;
     }
   /* to 16 bit conversion without alpha */
   if (((bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGB_888 ||
-       (bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_8888) && 
-      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGB_565) 
+       (bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_8888) &&
+      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGB_565)
     {
       /* Initialize destination bitmap */
       *dst_bmp = *bmp;
       dst_bmp->rowstride = sizeof(guchar) * dst_bpp * dst_bmp->width;
       dst_bmp->format = ((bmp->format & COGL_PREMULT_BIT) |
                          (dst_format & COGL_UNPREMULT_MASK));
-          
+
       /* Allocate a new buffer to hold converted data */
       dst_bmp->data = g_malloc (sizeof(guchar)
                                 * dst_bmp->height
-                                * dst_bmp->rowstride);  
+                                * dst_bmp->rowstride);
 
       if (!swap_bgr) {
-        for (ypos=0; ypos<bmp->height; ypos++) 
+        for (ypos=0; ypos<bmp->height; ypos++)
         {
           guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
           gushort *dst = (gushort*)((guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride);
           for (xpos=0; xpos<bmp->width; xpos++)
-            {       
-              *dst =  (src[2] >> 3) | 
+            {
+              *dst =  (src[2] >> 3) |
                      ((src[1] & 0xFC) << 3) |
-                     ((src[0] & 0xF8) << 8);      
+                     ((src[0] & 0xF8) << 8);
               src += src_bpp;
               dst ++;
             }
         }
       } else {
-        for (ypos=0; ypos<bmp->height; ypos++) 
+        for (ypos=0; ypos<bmp->height; ypos++)
         {
           guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
           gushort *dst = (gushort*)((guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride);
           for (xpos=0; xpos<bmp->width; xpos++)
-            {       
-              *dst =  (src[0] >> 3) | 
+            {
+              *dst =  (src[0] >> 3) |
                      ((src[1] & 0xFC) << 3) |
-                     ((src[2] & 0xF8) << 8);      
+                     ((src[2] & 0xF8) << 8);
               src += src_bpp;
               dst ++;
             }
         }
-      }   
-      return TRUE;   
+      }
+      return TRUE;
     }
   /* to 16 bit conversion WITH alpha */
-  if ((bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_8888 && 
-      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_4444) 
+  if ((bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_8888 &&
+      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_4444)
     {
       /* Initialize destination bitmap */
       *dst_bmp = *bmp;
       dst_bmp->rowstride = sizeof(guchar) * dst_bpp * dst_bmp->width;
       dst_bmp->format = ((bmp->format & COGL_PREMULT_BIT) |
                          (dst_format & COGL_UNPREMULT_MASK));
-          
+
       /* Allocate a new buffer to hold converted data */
       dst_bmp->data = g_malloc (sizeof(guchar)
                                 * dst_bmp->height
-                                * dst_bmp->rowstride);  
+                                * dst_bmp->rowstride);
 
       if (!swap_bgr) {
-        for (ypos=0; ypos<bmp->height; ypos++) 
+        for (ypos=0; ypos<bmp->height; ypos++)
         {
           guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
           gushort *dst = (gushort*)((guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride);
           for (xpos=0; xpos<bmp->width; xpos++)
             {
-              *dst = (src[3] >> 4) | 
+              *dst = (src[3] >> 4) |
                      (src[2] & 0xF0) |
-                     ((src[1] & 0xF0) << 4) |      
+                     ((src[1] & 0xF0) << 4) |
                      ((src[0] & 0xF0) << 8);
               src += 4;
               dst ++;
             }
         }
       } else {
-        for (ypos=0; ypos<bmp->height; ypos++) 
+        for (ypos=0; ypos<bmp->height; ypos++)
         {
           guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
           gushort *dst = (gushort*)((guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride);
           for (xpos=0; xpos<bmp->width; xpos++)
-            {       
-              *dst =  (src[1] >> 4) | 
+            {
+              *dst =  (src[1] >> 4) |
                       (src[2] & 0xF0) |
-                     ((src[3] & 0xF0) << 4) |      
+                     ((src[3] & 0xF0) << 4) |
                      ((src[0] & 0xF0) << 8);
               src += 4;
               dst ++;
             }
         }
-      }   
-      return TRUE;   
+      }
+      return TRUE;
     }
 /* to 16 bit conversion WITH 1 bit alpha */
-  if ((bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_8888 && 
-      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_5551) 
+  if ((bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_8888 &&
+      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_5551)
     {
       /* Initialize destination bitmap */
       *dst_bmp = *bmp;
       dst_bmp->rowstride = sizeof(guchar) * dst_bpp * dst_bmp->width;
       dst_bmp->format = ((bmp->format & COGL_PREMULT_BIT) |
                          (dst_format & COGL_UNPREMULT_MASK));
-          
+
       /* Allocate a new buffer to hold converted data */
       dst_bmp->data = g_malloc (sizeof(guchar)
                                 * dst_bmp->height
-                                * dst_bmp->rowstride);  
+                                * dst_bmp->rowstride);
 
       if (!swap_bgr) {
-        for (ypos=0; ypos<bmp->height; ypos++) 
+        for (ypos=0; ypos<bmp->height; ypos++)
         {
           guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
           gushort *dst = (gushort*)((guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride);
           for (xpos=0; xpos<bmp->width; xpos++)
             {
               /* for reversed bit pattern in 5551
-              *dst = (src[3] >> 3) | 
+              *dst = (src[3] >> 3) |
                      ((src[2] & 0xF8) << 2) |
-                     ((src[1] & 0xF8) << 7) |      
+                     ((src[1] & 0xF8) << 7) |
                      ((src[0] & 0x80) << 8);*/
-              *dst = ((src[0] & 0xF8) << 8) | 
+              *dst = ((src[0] & 0xF8) << 8) |
                      ((src[1] & 0xF8) << 3) |
-                     ((src[2] & 0xF8) >> 2) |      
+                     ((src[2] & 0xF8) >> 2) |
                      (src[3] >> 7);
               src += 4;
               dst ++;
             }
         }
       } else {
-        for (ypos=0; ypos<bmp->height; ypos++) 
+        for (ypos=0; ypos<bmp->height; ypos++)
         {
           guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
           gushort *dst = (gushort*)((guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride);
           for (xpos=0; xpos<bmp->width; xpos++)
-            {       
+            {
               /*for reversed bit pattern in 5551
-              *dst = (src[1] >> 3) | 
+              *dst = (src[1] >> 3) |
                      ((src[2] & 0xF8) << 2) |
-                     ((src[3] & 0xF8) << 7) |      
+                     ((src[3] & 0xF8) << 7) |
                      ((src[0] & 0x80) << 8);*/
-              *dst = ((src[2] & 0xF8) << 8) | 
+              *dst = ((src[2] & 0xF8) << 8) |
                      ((src[1] & 0xF8) << 3) |
-                     ((src[0] & 0xF8) >> 2) |      
+                     ((src[0] & 0xF8) >> 2) |
                      (src[3] >> 7);
               src += 4;
               dst ++;
             }
         }
-      }   
-      return TRUE;   
-    }    
+      }
+      return TRUE;
+    }
   /* special case for RGBA -> RGB (used in hildon-desktop at least once) */
-  if ((bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_8888 && 
-      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGB_888) 
+  if ((bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_8888 &&
+      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGB_888)
     {
       /* Initialize destination bitmap */
       *dst_bmp = *bmp;
       dst_bmp->rowstride = sizeof(guchar) * dst_bpp * dst_bmp->width;
       dst_bmp->format = ((bmp->format & COGL_PREMULT_BIT) |
                          (dst_format & COGL_UNPREMULT_MASK));
-          
+
       /* Allocate a new buffer to hold converted data */
       dst_bmp->data = g_malloc (sizeof(guchar)
                                 * dst_bmp->height
-                                * dst_bmp->rowstride);  
+                                * dst_bmp->rowstride);
 
       if (!swap_bgr) {
-        for (ypos=0; ypos<bmp->height; ypos++) 
+        for (ypos=0; ypos<bmp->height; ypos++)
         {
           guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
           guchar *dst = (guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride;
           for (xpos=0; xpos<bmp->width; xpos++)
-            {                            
+            {
               dst[0] = src[0];
               dst[1] = src[1];
               dst[2] = src[2];
@@ -297,7 +307,7 @@
             }
         }
       } else {
-        for (ypos=0; ypos<bmp->height; ypos++) 
+        for (ypos=0; ypos<bmp->height; ypos++)
         {
           guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
           guchar *dst = (guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride;
@@ -310,9 +320,42 @@
               dst += dst_bpp;
             }
         }
-      }      
+      }
       return TRUE;
     }
+  /* case for RGBA->BGRA swapping */
+  if ((bmp->format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_8888 &&
+      (dst_format & COGL_UNORDERED_MASK)==COGL_PIXEL_FORMAT_RGBA_8888 &&
+      (bmp->format & COGL_BGR_BIT) != (dst_format & COGL_BGR_BIT))
+    {
+      /* Initialize destination bitmap */
+      *dst_bmp = *bmp;
+      dst_bmp->rowstride = sizeof(guchar) * dst_bpp * dst_bmp->width;
+      dst_bmp->format = ((bmp->format & COGL_PREMULT_BIT) |
+                         (dst_format & COGL_UNPREMULT_MASK));
+
+      /* Allocate a new buffer to hold converted data */
+      dst_bmp->data = g_malloc (sizeof(guchar)
+                                * dst_bmp->height
+                                * dst_bmp->rowstride);
+
+      for (ypos=0; ypos<bmp->height; ypos++)
+      {
+        guchar *src = (guchar*)bmp->data      + ypos * bmp->rowstride;
+        guchar *dst = (guchar*)dst_bmp->data  + ypos * dst_bmp->rowstride;
+        for (xpos=0; xpos<bmp->width; xpos++)
+          {
+            dst[0] = src[2];
+            dst[1] = src[1];
+            dst[2] = src[0];
+            dst[3] = src[3];
+            src += src_bpp;
+            dst += dst_bpp;
+          }
+      }
+
+      return TRUE;
+    }
   return FALSE;
 }
 
@@ -327,16 +370,16 @@
  * image */
 void
 _cogl_bitmap_check_alpha(CoglBitmap  *bmp,
-                        gboolean *has_transparent,                        
+                        gboolean *has_transparent,
                         gboolean *has_semi,
                         gboolean *has_opaque)
 {
-  gulong   ctransparent = 0;                        
+  gulong   ctransparent = 0;
   gulong   csemi = 0;
   gulong   copaque = 0;
   gulong   ctotal = 0;
   guint    xpos, ypos;
-  
+
   if (!bmp)
     {
       if (has_transparent) *has_transparent = TRUE;
@@ -345,7 +388,7 @@
       return;
     }
 
-  if ((bmp->format & COGL_AFIRST_BIT) || (bmp->format & COGL_PREMULT_BIT)) 
+  if ((bmp->format & COGL_AFIRST_BIT) || (bmp->format & COGL_PREMULT_BIT))
     {
       g_warning("%s: Cannot cope with strangely ordered bitmaps", G_STRLOC);
       if (has_transparent) *has_transparent = TRUE;
@@ -359,42 +402,42 @@
       if (has_transparent) *has_transparent = FALSE;
       if (has_semi) *has_semi = FALSE;
       if (has_opaque) *has_opaque = TRUE;
-    }  
-    
-  if (_cogl_get_format_bpp (bmp->format) != 4) 
+    }
+
+  if (_cogl_get_format_bpp (bmp->format) != 4)
     {
       g_warning("%s: Expecting only 32 bit bitmaps here", G_STRLOC);
       return;
     }
-  
-  for (ypos=0; ypos<bmp->height; ypos++) 
+
+  for (ypos=0; ypos<bmp->height; ypos++)
    {
      guchar *src = (guchar*)(bmp->data) + ypos * bmp->rowstride + 3;
      for (xpos=0; xpos<bmp->width; xpos++)
        {
-         /* If we're doing this, we'd be using 4 bit alpha anyway, 
+         /* If we're doing this, we'd be using 4 bit alpha anyway,
           * so allow ourselves some leeway in what we call transparent
           * and opaque.
           * as far as I know, C standard doesn't say a bool has to be
           * between 0 and 1, so I use ternary to make sure. I *hope*
-          * this gets optimised out */ 
+          * this gets optimised out */
          ctransparent += ((*src) < 32) ? 1 : 0;
          copaque += ((*src) >= 224) ? 1 : 0;
          src += 4;
        }
    }
-  
+
   /* Now another fudge check... we only say we have something
    * if there are >2% of the pixels set in that way */
-   
+
   ctotal = bmp->width*bmp->height;
   csemi = ctotal - (ctransparent + copaque);
-  
-  if (has_transparent) 
+
+  if (has_transparent)
     *has_transparent = ctransparent > ctotal/50;
-  if (has_semi) 
+  if (has_semi)
     *has_semi = csemi > ctotal/50;
-  if (has_opaque) 
+  if (has_opaque)
     *has_opaque = copaque > ctotal/50;
 }
 
@@ -403,14 +446,14 @@
 CoglPixelFormat
 _cogl_bitmap_get_16bit_format(CoglBitmap *bmp)
 {
-  if (bmp->format & COGL_A_BIT) 
+  if (bmp->format & COGL_A_BIT)
     {
       /* kinda slow and ugly, but we have multiple formats we could use.
        * we need to look at the image and see what pixel format
        * suits it best, to get the max colour bits */
       gboolean has_transparent, has_semi, has_opaque;
-      _cogl_bitmap_check_alpha(bmp, 
-                               &has_transparent,                        
+      _cogl_bitmap_check_alpha(bmp,
+                               &has_transparent,
                                &has_semi,
                                &has_opaque);
       if (has_semi)
@@ -550,15 +593,15 @@
   gint              last_row_size;
   guchar           *pixels;
   guchar           *out_data;
-  
+
   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
   if (bmp == NULL) return FALSE;
-  
+
   /* Load from file using GdkPixbuf */
   pixbuf = gdk_pixbuf_new_from_file (filename, error);
   if (pixbuf == NULL) return FALSE;
-  
+
   /* Get pixbuf properties */
   has_alpha       = gdk_pixbuf_get_has_alpha (pixbuf);
   color_space     = gdk_pixbuf_get_colorspace (pixbuf);
@@ -567,10 +610,10 @@
   rowstride       = gdk_pixbuf_get_rowstride (pixbuf);
   bits_per_sample = gdk_pixbuf_get_bits_per_sample (pixbuf);
   n_channels      = gdk_pixbuf_get_n_channels (pixbuf);
-  
+
   /* The docs say this is the right way */
   last_row_size = width * ((n_channels * bits_per_sample + 7) / 8);
-  
+
   /* According to current docs this should be true and so
    * the translation to cogl pixel format below valid */
   g_assert (bits_per_sample == 8);
@@ -579,7 +622,7 @@
     g_assert (n_channels == 4);
   else
     g_assert (n_channels == 3);
-  
+
   /* Translate to cogl pixel format */
   switch (color_space)
     {
@@ -589,24 +632,24 @@
 	COGL_PIXEL_FORMAT_RGBA_8888 :
 	COGL_PIXEL_FORMAT_RGB_888;
       break;
-      
+
     default:
       /* Ouch, spec changed! */
       g_object_unref (pixbuf);
       return FALSE;
     }
-  
+
   /* FIXME: Any way to destroy pixbuf but retain pixel data? */
-  
+
   pixels   = gdk_pixbuf_get_pixels (pixbuf);
   out_data = (guchar*) g_malloc (height * rowstride);
-  
+
   /* Copy the data... we need to do special things for the last row */
   memcpy (out_data, pixels, rowstride*(height-1) + last_row_size);
-  
+
   /* Destroy GdkPixbuf object */
   g_object_unref (pixbuf);
-  
+
   /* Store bitmap info */
   bmp->data = out_data; /* The stored data the same alignment constraints as a
                          * gdkpixbuf but stores a full rowstride in the last
@@ -616,7 +659,7 @@
   bmp->width = width;
   bmp->height = height;
   bmp->rowstride = rowstride;
-  
+
   return TRUE;
 }
 
@@ -633,15 +676,15 @@
   gint              width;
   gint              height;
   guchar           *pixels;
-  
+
   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
   if (bmp == NULL) return FALSE;
-  
+
   /* Load from file using stb */
   pixels = stbi_load (filename, &width, &height, &stb_pixel_format, STBI_rgb_alpha);
   if (pixels == NULL) return FALSE;
- 
+
   /* Store bitmap info */
   bmp->data = g_memdup (pixels, height * width * 4);
   bmp->format = COGL_PIXEL_FORMAT_RGBA_8888;

Modified: projects/haf/trunk/clutter/debian/changelog
===================================================================
--- projects/haf/trunk/clutter/debian/changelog	2009-02-12 12:34:59 UTC (rev 17408)
+++ projects/haf/trunk/clutter/debian/changelog	2009-02-12 15:16:07 UTC (rev 17409)
@@ -1,6 +1,7 @@
 clutter (0.8.2-0maemo17~unreleased) unstable; urgency=low
 
   * Removed needless print for scratchbox
+  * Fixed RGBA texture pixmaps in X11-texture-pixmap (format conversion hell)
 
  -- Gordon Williams <gordon.williams at collabora.co.uk>  Wed, 11 Feb 2009 09:24:53 +0200
 


More information about the maemo-commits mailing list