From 83180b25e90721e717bf37c5332c22713508786e Mon Sep 17 00:00:00 2001 From: Mike Frysinger <vapier@gentoo.org> Date: Sun, 20 Feb 2011 19:18:19 -0500 Subject: [PATCH] png: add support for libpng 1.5.x Signed-off-by: Mike Frysinger <vapier@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 (setjmp( 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 (setjmp( 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 From 7a2a36fada3ecdd7f48fcfd782a552598477a8f5 Mon Sep 17 00:00:00 2001 From: Mike Frysinger <vapier@gentoo.org> Date: Sun, 20 Feb 2011 19:38:50 -0500 Subject: [PATCH] tools: add support for libpng 1.5.x Signed-off-by: Mike Frysinger <vapier@gentoo.org> --- tools/directfb-csource.c | 20 +++++++++++++------- tools/mkdfiff.c | 2 +- tools/mkdgifft.cpp | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/tools/directfb-csource.c b/tools/directfb-csource.c index 8f2cbf0..487ea3c 100644 --- a/tools/directfb-csource.c +++ b/tools/directfb-csource.c @@ -338,7 +338,7 @@ static DFBResult load_image (const char *filename, if (!png_ptr) goto cleanup; - if (setjmp (png_ptr->jmpbuf)) { + if (setjmp (png_jmpbuf (png_ptr))) { if (desc->preallocated[0].data) { free (desc->preallocated[0].data); desc->preallocated[0].data = NULL; @@ -405,17 +405,22 @@ static DFBResult load_image (const char *filename, } switch (src_format) { - case DSPF_LUT8: - if (info_ptr->num_palette) { + case DSPF_LUT8: { + png_colorp png_palette; + int num_palette; + + png_get_PLTE( png_ptr, info_ptr, &png_palette, &num_palette ); + + if (num_palette) { png_byte *alpha; int i, num; - *palette_size = MIN (info_ptr->num_palette, 256); + *palette_size = MIN (num_palette, 256); for (i = 0; i < *palette_size; i++) { palette[i].a = 0xFF; - palette[i].r = info_ptr->palette[i].red; - palette[i].g = info_ptr->palette[i].green; - palette[i].b = info_ptr->palette[i].blue; + palette[i].r = png_palette[i].red; + palette[i].g = png_palette[i].green; + palette[i].b = png_palette[i].blue; } if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) { png_get_tRNS (png_ptr, info_ptr, &alpha, &num, NULL); @@ -424,6 +429,7 @@ static DFBResult load_image (const char *filename, } } break; + } case DSPF_RGB32: png_set_filler (png_ptr, 0xFF, #ifdef WORDS_BIGENDIAN diff --git a/tools/mkdfiff.c b/tools/mkdfiff.c index 68a3b4f..edb58a7 100644 --- a/tools/mkdfiff.c +++ b/tools/mkdfiff.c @@ -97,7 +97,7 @@ load_image (const char *filename, if (!png_ptr) goto cleanup; - if (setjmp (png_ptr->jmpbuf)) { + if (setjmp (png_jmpbuf (png_ptr))) { if (desc->preallocated[0].data) { free (desc->preallocated[0].data); desc->preallocated[0].data = NULL; diff --git a/tools/mkdgifft.cpp b/tools/mkdgifft.cpp index 96e4220..d4b6bf4 100644 --- a/tools/mkdgifft.cpp +++ b/tools/mkdgifft.cpp @@ -595,7 +595,7 @@ load_image (const char *filename, if (!png_ptr) goto cleanup; - if (setjmp (png_ptr->jmpbuf)) { + if (setjmp (png_jmpbuf (png_ptr))) { if (desc->preallocated[0].data) { free (desc->preallocated[0].data); desc->preallocated[0].data = NULL; -- 1.7.4.1