Hello Mike,

I've tried your patch and IIUC you inadvertedly removed the calls to setjmp.
Making the conditions for the presence of the jmpbuf, which always returns
true.

> -     if (setjmp( data->png_ptr->jmpbuf )) {
> +     if (png_jmpbuf( data->png_ptr )) {

Making the following change it worked OK for me:

> -     if (setjmp( data->png_ptr->jmpbuf )) {
> +     if (setjmp(png_jmpbuf( data->png_ptr ))) {

Regards,

On Sun, Feb 20, 2011 at 9:21 PM, Mike Frysinger <vap...@gentoo.org> wrote:
> Signed-off-by: Mike Frysinger <vap...@gentoo.org>
> ---
>  .../idirectfbimageprovider_png.c                   |   56 ++++++++++++-------
>  1 files changed, 35 insertions(+), 21 deletions(-)
>
> diff --git a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c 
> b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c
> index 6d65ea3..7d82c5c 100644
> --- a/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c
> +++ b/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c
> @@ -207,7 +207,7 @@ Construct( IDirectFBImageProvider *thiz,
>      if (!data->png_ptr)
>           goto error;
>
> -     if (setjmp( data->png_ptr->jmpbuf )) {
> +     if (png_jmpbuf( data->png_ptr )) {
>           D_ERROR( "ImageProvider/PNG: Error reading header!\n" );
>           goto error;
>      }
> @@ -292,7 +292,7 @@ IDirectFBImageProvider_PNG_RenderTo( 
> IDirectFBImageProvider *thiz,
>           rect = dst_data->area.wanted;
>      }
>
> -     if (setjmp( data->png_ptr->jmpbuf )) {
> +     if (png_jmpbuf( data->png_ptr )) {
>           D_ERROR( "ImageProvider/PNG: Error during decoding!\n" );
>
>           if (data->stage < STAGE_IMAGE)
> @@ -327,6 +327,7 @@ IDirectFBImageProvider_PNG_RenderTo( 
> IDirectFBImageProvider *thiz,
>      }
>      else {
>           CoreSurfaceBufferLock lock;
> +          png_byte bit_depth = png_get_bit_depth( data->png_ptr, 
> data->info_ptr );
>
>           ret = dfb_surface_lock_buffer( dst_surface, CSBR_BACK, CSAID_CPU, 
> CSAF_WRITE, &lock );
>           if (ret)
> @@ -334,7 +335,7 @@ IDirectFBImageProvider_PNG_RenderTo( 
> IDirectFBImageProvider *thiz,
>
>           switch (data->color_type) {
>                case PNG_COLOR_TYPE_PALETTE:
> -                    if (dst_surface->config.format == DSPF_LUT8 && 
> data->info_ptr->bit_depth == 8) {
> +                    if (dst_surface->config.format == DSPF_LUT8 && bit_depth 
> == 8) {
>                          /*
>                           * Special indexed PNG to LUT8 loading.
>                           */
> @@ -377,7 +378,7 @@ IDirectFBImageProvider_PNG_RenderTo( 
> IDirectFBImageProvider *thiz,
>                     }
>                     else {
>                          if (data->color_type == PNG_COLOR_TYPE_GRAY) {
> -                              int num = 1 << data->info_ptr->bit_depth;
> +                              int num = 1 << bit_depth;
>
>                               for (x=0; x<num; x++) {
>                                    int value = x * 255 / (num - 1);
> @@ -386,7 +387,7 @@ IDirectFBImageProvider_PNG_RenderTo( 
> IDirectFBImageProvider *thiz,
>                               }
>                          }
>
> -                         switch (data->info_ptr->bit_depth) {
> +                         switch (bit_depth) {
>                               case 8:
>                                    for (y=0; y<data->height; y++) {
>                                         u8  *S = data->image + data->pitch * 
> y;
> @@ -441,7 +442,7 @@ IDirectFBImageProvider_PNG_RenderTo( 
> IDirectFBImageProvider *thiz,
>
>                               default:
>                                    D_ERROR( "ImageProvider/PNG: Unsupported 
> indexed bit depth %d!\n",
> -                                            data->info_ptr->bit_depth );
> +                                            bit_depth );
>                          }
>
>                          dfb_scale_linear_32( image_argb, data->width, 
> data->height,
> @@ -594,16 +595,26 @@ png_info_callback( png_structp png_read_ptr,
>                    NULL, NULL, NULL );
>
>      if (png_get_valid( data->png_ptr, data->info_ptr, PNG_INFO_tRNS )) {
> +          png_bytep     trans;
> +          png_color_16p trans_color;
> +          int           num_trans;
> +
> +          png_get_tRNS( data->png_ptr, data->info_ptr, &trans, &num_trans, 
> &trans_color );
> +
>           data->color_keyed = true;
>
>           /* generate color key based on palette... */
>           if (data->color_type == PNG_COLOR_TYPE_PALETTE) {
>                u32        key;
> -               png_colorp palette    = data->info_ptr->palette;
> -               png_bytep  trans      = data->info_ptr->trans_alpha;
> -               int        num_colors = MIN( MAXCOLORMAPSIZE,
> -                                            data->info_ptr->num_palette );
> -               u8         cmap[3][num_colors];
> +               png_colorp palette;
> +               int        num_colors;
> +               u8        *cmap[3];
> +
> +               png_get_PLTE( data->png_ptr, data->info_ptr, &palette, 
> &num_colors );
> +               num_colors = MIN( MAXCOLORMAPSIZE, num_colors );
> +               cmap[0] = alloca (num_colors);
> +               cmap[1] = alloca (num_colors);
> +               cmap[2] = alloca (num_colors);
>
>                for (i=0; i<num_colors; i++) {
>                     cmap[0][i] = palette[i].red;
> @@ -613,7 +624,7 @@ png_info_callback( png_structp png_read_ptr,
>
>                key = FindColorKey( num_colors, &cmap[0][0] );
>
> -               for (i=0; i<data->info_ptr->num_trans; i++) {
> +               for (i=0; i<num_trans; i++) {
>                     if (!trans[i]) {
>                          palette[i].red   = (key & 0xff0000) >> 16;
>                          palette[i].green = (key & 0x00ff00) >>  8;
> @@ -625,20 +636,23 @@ png_info_callback( png_structp png_read_ptr,
>           }
>           else {
>                /* ...or based on trans rgb value */
> -               png_color_16p trans = &data->info_ptr->trans_color;
> -
> -               data->color_key = (((trans->red & 0xff00) << 8) |
> -                                  ((trans->green & 0xff00)) |
> -                                  ((trans->blue & 0xff00) >> 8));
> +               data->color_key = (((trans_color->red & 0xff00) << 8) |
> +                                  ((trans_color->green & 0xff00)) |
> +                                  ((trans_color->blue & 0xff00) >> 8));
>           }
>      }
>
>      switch (data->color_type) {
>           case PNG_COLOR_TYPE_PALETTE: {
> -               png_colorp palette    = data->info_ptr->palette;
> -               png_bytep  trans      = data->info_ptr->trans_alpha;
> -               int        num_trans  = data->info_ptr->num_trans;
> -               int        num_colors = MIN( MAXCOLORMAPSIZE, 
> data->info_ptr->num_palette );
> +               png_colorp    palette;
> +               png_bytep     trans;
> +               png_color_16p trans_color;
> +               int           num_trans;
> +               int           num_colors;
> +
> +               png_get_PLTE( data->png_ptr, data->info_ptr, &palette, 
> &num_colors );
> +               num_colors = MIN( MAXCOLORMAPSIZE, num_colors );
> +               png_get_tRNS( data->png_ptr, data->info_ptr, &trans, 
> &num_trans, &trans_color );
>
>                for (i=0; i<num_colors; i++) {
>                     data->colors[i].a = (i < num_trans) ? trans[i] : 0xff;
> --
> 1.7.4.1
>
> _______________________________________________
> directfb-dev mailing list
> directfb-dev@directfb.org
> http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev



-- 
Felipe Magno de Almeida
_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to