comparison gui/util/bitmap.c @ 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 ef94d1d0e265
children 03a6ae3bee1e
comparison
equal deleted inserted replaced
34514:e421fb9bb0b9 34515:a9d2dcb0f435
112 112
113 case PIX_FMT_RGB24: 113 case PIX_FMT_RGB24:
114 img->Bpp = 24; 114 img->Bpp = 24;
115 break; 115 break;
116 116
117 case PIX_FMT_BGRA: 117 case PIX_FMT_RGBA:
118 case PIX_FMT_ARGB:
119 img->Bpp = 32; 118 img->Bpp = 32;
120 break; 119 break;
121 120
122 default: 121 default:
123 img->Bpp = 0; 122 img->Bpp = 0;
149 148
150 return !(decode_ok && img->Bpp); 149 return !(decode_ok && img->Bpp);
151 } 150 }
152 151
153 /** 152 /**
154 * @brief Convert a 24-bit color depth image into an 32-bit one. 153 * @brief Convert a 24-bit RGB or 32-bit RGBA image into a 32-bit ARGB image.
155 * 154 *
156 * @param img image to be converted 155 * @param img image to be converted
157 * 156 *
158 * @return 1 (ok) or 0 (error) 157 * @return 1 (ok) or 0 (error)
159 * 158 *
160 * @note This is an in-place conversion, new memory will be allocated for @a img. 159 * @note This is an in-place conversion,
161 */ 160 * new memory will be allocated for @a img if necessary.
162 static int Convert24to32(guiImage *img) 161 */
162 static int convert_ARGB(guiImage *img)
163 { 163 {
164 char *orgImage; 164 char *orgImage;
165 unsigned long i, c; 165 unsigned long i, c;
166 166
167 if (img->Bpp == 24) { 167 if (img->Bpp == 24) {
181 181
182 for (c = 0, i = 0; c < img->ImageSize; c += 4, i += 3) 182 for (c = 0, i = 0; c < img->ImageSize; c += 4, i += 3)
183 *(uint32_t *)&img->Image[c] = ALPHA_OPAQUE | AV_RB24(&orgImage[i]); 183 *(uint32_t *)&img->Image[c] = ALPHA_OPAQUE | AV_RB24(&orgImage[i]);
184 184
185 free(orgImage); 185 free(orgImage);
186 } 186 } else if (img->Bpp == 32) {
187 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[bitmap] 32 bpp ARGB conversion\n");
188
189 for (i = 0; i < img->ImageSize; i += 4)
190 *(uint32_t *)&img->Image[i] = (img->Image[i + 3] << 24) | AV_RB24(&img->Image[i]);
191 } else
192 return 0;
187 193
188 return 1; 194 return 1;
189 } 195 }
190 196
191 /** 197 /**
219 * 225 *
220 * @param fname filename (with path, but may lack extension) 226 * @param fname filename (with path, but may lack extension)
221 * @param img pointer suitable to store the image data 227 * @param img pointer suitable to store the image data
222 * 228 *
223 * @return 0 (ok), -1 (color depth too low), -2 (not accessible), 229 * @return 0 (ok), -1 (color depth too low), -2 (not accessible),
224 * -5 (#pngRead() error) or -8 (#Convert24to32() error) 230 * -5 (#pngRead() error) or -8 (#convert_ARGB() error)
225 */ 231 */
226 int bpRead(const char *fname, guiImage *img) 232 int bpRead(const char *fname, guiImage *img)
227 { 233 {
228 int r; 234 int r;
229 235
242 if (img->Bpp < 24) { 248 if (img->Bpp < 24) {
243 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[bitmap] bpp too low: %u\n", img->Bpp); 249 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[bitmap] bpp too low: %u\n", img->Bpp);
244 return -1; 250 return -1;
245 } 251 }
246 252
247 if (!Convert24to32(img)) 253 if (!convert_ARGB(img))
248 return -8; 254 return -8;
249 255
250 return 0; 256 return 0;
251 } 257 }
252 258