Mercurial > mplayer.hg
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 |