changeset 34515:a9d2dcb0f435

Fix skin PNG read errors. FFmpeg's PNG decoder no longer does transcoding, but returns 32 bpp images in RGBA format. Extend (and rename) the existing 24 bpp to 32 bpp conversion function to do 32 bpp ARGB conversion as well.
author ib
date Fri, 27 Jan 2012 00:07:45 +0000
parents e421fb9bb0b9
children 073ba421c82d
files gui/util/bitmap.c
diffstat 1 files changed, 14 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/gui/util/bitmap.c	Thu Jan 26 23:16:43 2012 +0000
+++ b/gui/util/bitmap.c	Fri Jan 27 00:07:45 2012 +0000
@@ -114,8 +114,7 @@
         img->Bpp = 24;
         break;
 
-    case PIX_FMT_BGRA:
-    case PIX_FMT_ARGB:
+    case PIX_FMT_RGBA:
         img->Bpp = 32;
         break;
 
@@ -151,15 +150,16 @@
 }
 
 /**
- * @brief Convert a 24-bit color depth image into an 32-bit one.
+ * @brief Convert a 24-bit RGB or 32-bit RGBA image into a 32-bit ARGB image.
  *
  * @param img image to be converted
  *
  * @return 1 (ok) or 0 (error)
  *
- * @note This is an in-place conversion, new memory will be allocated for @a img.
+ * @note This is an in-place conversion,
+ *       new memory will be allocated for @a img if necessary.
  */
-static int Convert24to32(guiImage *img)
+static int convert_ARGB(guiImage *img)
 {
     char *orgImage;
     unsigned long i, c;
@@ -183,7 +183,13 @@
             *(uint32_t *)&img->Image[c] = ALPHA_OPAQUE | AV_RB24(&orgImage[i]);
 
         free(orgImage);
-    }
+    } else if (img->Bpp == 32) {
+        mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[bitmap] 32 bpp ARGB conversion\n");
+
+        for (i = 0; i < img->ImageSize; i += 4)
+            *(uint32_t *)&img->Image[i] = (img->Image[i + 3] << 24) | AV_RB24(&img->Image[i]);
+    } else
+        return 0;
 
     return 1;
 }
@@ -221,7 +227,7 @@
  * @param img pointer suitable to store the image data
  *
  * @return 0 (ok), -1 (color depth too low), -2 (not accessible),
- *                 -5 (#pngRead() error) or -8 (#Convert24to32() error)
+ *                 -5 (#pngRead() error) or -8 (#convert_ARGB() error)
  */
 int bpRead(const char *fname, guiImage *img)
 {
@@ -244,7 +250,7 @@
         return -1;
     }
 
-    if (!Convert24to32(img))
+    if (!convert_ARGB(img))
         return -8;
 
     return 0;