Commit d607e4d1 authored by Cyril Deguet's avatar Cyril Deguet

* sdl_image.c: fixed decoding of 24/32 bpp images (the color masks were not

 taken into account, which caused getting RGBA pictures instead of ARGB,
 or GBR instead of RGB). 8bpp is obviously broken too, I have not tested it.
 --> now BMP images (and other formats) can be used in skins, not only PNG!
  (of course the goal is to add a winamp skins loader ;-)
parent 13a000e7
......@@ -136,7 +136,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
p_rw = SDL_RWFromConstMem( p_block->p_buffer, p_block->i_buffer );
/* Decode picture. */
p_surface = IMG_LoadTyped_RW( p_rw, 1, p_sys->psz_sdl_type );
p_surface = IMG_LoadTyped_RW( p_rw, 1, (char*)p_sys->psz_sdl_type );
if ( p_surface == NULL )
{
msg_Warn( p_dec, "SDL_image couldn't load the image (%s)",
......@@ -170,7 +170,9 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
p_pic = p_dec->pf_vout_buffer_new( p_dec );
if ( p_pic == NULL ) goto error;
if ( p_surface->format->BitsPerPixel == 8 )
switch ( p_surface->format->BitsPerPixel )
{
case 8:
{
int i, j;
uint8_t *r = p_pic->p[0].p_pixels;
......@@ -192,8 +194,9 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
r += p_pic->p[0].i_pitch;
g += p_pic->p[0].i_pitch;
b += p_pic->p[0].i_pitch;
break;
}
else
case 16:
{
int i;
uint8_t *p_src = p_surface->pixels;
......@@ -207,6 +210,51 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
p_src += p_surface->pitch;
p_dst += p_pic->p[0].i_pitch;
}
break;
}
case 24:
{
int i, j;
uint8_t *p_src, *p_dst;
uint8_t r, g, b;
for ( i = 0; i < p_surface->h; i++ )
{
p_src = p_surface->pixels + i * p_surface->pitch;
p_dst = p_pic->p[0].p_pixels + i * p_pic->p[0].i_pitch;
for ( j = 0; j < p_surface->w; j++ )
{
SDL_GetRGB( *(uint32_t*)p_src, p_surface->format,
&r, &g, &b );
*(p_dst++) = r;
*(p_dst++) = g;
*(p_dst++) = b;
p_src += 3;
}
}
break;
}
case 32:
{
int i, j;
uint8_t *p_src, *p_dst;
uint8_t r, g, b, a;
for ( i = 0; i < p_surface->h; i++ )
{
p_src = p_surface->pixels + i * p_surface->pitch;
p_dst = p_pic->p[0].p_pixels + i * p_pic->p[0].i_pitch;
for ( j = 0; j < p_surface->w; j++ )
{
SDL_GetRGBA( *(uint32_t*)p_src, p_surface->format,
&r, &g, &b, &a );
*(p_dst++) = b;
*(p_dst++) = g;
*(p_dst++) = r;
*(p_dst++) = a;
p_src += 4;
}
}
break;
}
}
SDL_FreeSurface( p_surface );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment