tag 648138 patch thanks Hi,
I create a patch which revise FTBFS with libpng 1.5. Could you check and apply this patch? Best regards, Nobuhiro -- Nobuhiro Iwamatsu iwamatsu at {nigauri.org / debian.org} GPG ID: 40AD1FA6
Description: Upstream changes introduced in version 1.2.10.0-4.1 This patch has been created by dpkg-source during the package build. Here's the last changelog entry, hopefully it gives details on why those changes were made: . directfb (1.2.10.0-4.1) unstable; urgency=low . * Non-maintainer upload. * libpng transition. * Fix FTBFS. . The person named in the Author field signed this changelog entry. Author: Nobuhiro Iwamatsu <iwama...@nigauri.org> --- The information above should follow the Patch Tagging Guidelines, please checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here are templates for supplementary fields that you might want to add: Origin: <vendor|upstream|other>, <url of original patch> Bug: <url in upstream bugtracker> Bug-Debian: http://bugs.debian.org/<bugnumber> Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber> Forwarded: <no|not-needed|url proving that it has been forwarded> Reviewed-By: <name and email of someone who approved the patch> Last-Update: <YYYY-MM-DD> --- directfb-1.2.10.0.orig/tools/directfb-csource.c +++ directfb-1.2.10.0/tools/directfb-csource.c @@ -299,8 +299,11 @@ static DFBResult load_image (const char NULL, NULL, NULL); if (!png_ptr) goto cleanup; - - if (setjmp (png_ptr->jmpbuf)) { +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + if (setjmp(png_jmpbuf((png_ptr)))) { +#else + if (setjmp (png_ptr->jmpbuf)) { +#endif if (desc->preallocated[0].data) { free (desc->preallocated[0].data); desc->preallocated[0].data = NULL; @@ -368,6 +371,23 @@ static DFBResult load_image (const char switch (src_format) { case DSPF_LUT8: + { +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + png_colorp png_palette; + int png_num_palette; + png_get_PLTE(png_ptr, info_ptr, &png_palette, &png_num_palette); + if (png_num_palette) { + png_byte *alpha; + int i, num; + + *palette_size = MIN (png_num_palette, 256); + for (i = 0; i < *palette_size; i++) { + palette[i].a = 0xFF; + palette[i].r = png_palette[i].red; + palette[i].g = png_palette[i].green; + palette[i].b = png_palette[i].blue; + } +#else if (info_ptr->num_palette) { png_byte *alpha; int i, num; @@ -379,13 +399,16 @@ static DFBResult load_image (const char palette[i].g = info_ptr->palette[i].green; palette[i].b = info_ptr->palette[i].blue; } +#endif if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS)) { png_get_tRNS (png_ptr, info_ptr, &alpha, &num, NULL); for (i = 0; i < MIN (num, *palette_size); i++) palette[i].a = alpha[i]; } } + break; + } case DSPF_RGB32: png_set_filler (png_ptr, 0xFF, #ifdef WORDS_BIGENDIAN --- directfb-1.2.10.0.orig/tools/mkdfiff.c +++ directfb-1.2.10.0/tools/mkdfiff.c @@ -96,8 +96,11 @@ load_image (const char *filen NULL, NULL, NULL); if (!png_ptr) goto cleanup; - +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + if (setjmp(png_jmpbuf((png_ptr)))) { +#else if (setjmp (png_ptr->jmpbuf)) { +#endif if (desc->preallocated[0].data) { free (desc->preallocated[0].data); desc->preallocated[0].data = NULL; --- directfb-1.2.10.0.orig/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c +++ directfb-1.2.10.0/interfaces/IDirectFBImageProvider/idirectfbimageprovider_png.c @@ -204,7 +204,11 @@ Construct( IDirectFBImageProvider *thiz, if (!data->png_ptr) goto error; +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + if (setjmp(png_jmpbuf((data->png_ptr)))) { +#else if (setjmp( data->png_ptr->jmpbuf )) { +#endif D_ERROR( "ImageProvider/PNG: Error reading header!\n" ); goto error; } @@ -331,7 +335,11 @@ IDirectFBImageProvider_PNG_RenderTo( IDi rect = dst_data->area.wanted; } +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + if (setjmp(png_jmpbuf((data->png_ptr)))) { +#else if (setjmp( data->png_ptr->jmpbuf )) { +#endif D_ERROR( "ImageProvider/PNG: Error during decoding!\n" ); if (data->stage < STAGE_IMAGE) @@ -357,7 +365,12 @@ IDirectFBImageProvider_PNG_RenderTo( IDi switch (data->color_type) { case PNG_COLOR_TYPE_PALETTE: +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + if (dst_surface->config.format == DSPF_LUT8 && png_get_bit_depth(data->png_ptr, info) == 8) { + +#else if (dst_surface->config.format == DSPF_LUT8 && data->info_ptr->bit_depth == 8) { +#endif /* * Special indexed PNG to LUT8 loading. */ @@ -379,7 +392,6 @@ IDirectFBImageProvider_PNG_RenderTo( IDi } } /* fall through */ - case PNG_COLOR_TYPE_GRAY: { /* * Convert to ARGB and use generic loading code. @@ -400,8 +412,11 @@ IDirectFBImageProvider_PNG_RenderTo( IDi } else { if (data->color_type == PNG_COLOR_TYPE_GRAY) { +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + int num = 1 << png_get_bit_depth(data->png_ptr, info); +#else int num = 1 << data->info_ptr->bit_depth; - +#endif for (x=0; x<num; x++) { int value = x * 255 / (num - 1); @@ -409,7 +424,11 @@ IDirectFBImageProvider_PNG_RenderTo( IDi } } +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + switch (png_get_bit_depth(data->png_ptr, info)) { +#else switch (data->info_ptr->bit_depth) { +#endif case 8: for (y=0; y<data->height; y++) { u8 *S = data->image + data->pitch * y; @@ -464,8 +483,12 @@ IDirectFBImageProvider_PNG_RenderTo( IDi default: D_ERROR( "ImageProvider/PNG: Unsupported indexed bit depth %d!\n", +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + png_get_bit_depth(data->png_ptr, info)); +#else data->info_ptr->bit_depth ); - } +#endif + } dfb_scale_linear_32( image_argb, data->width, data->height, lock.addr, lock.pitch, &rect, dst_surface, &clip ); @@ -635,12 +658,30 @@ png_info_callback( png_structp png_read_ /* generate color key based on palette... */ if (data->color_type == PNG_COLOR_TYPE_PALETTE) { u32 key; +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + png_colorp palette; + png_bytep trans; + int num_colors; + int num_palette; + int num_trans; + u8 **cmap; + + png_get_PLTE(data->png_ptr, data->info_ptr, + &palette, &num_palette); + png_get_tRNS(data->png_ptr, data->info_ptr, + &trans, &num_trans, NULL); + num_colors = MIN( MAXCOLORMAPSIZE, num_palette ); + + cmap = malloc(sizeof(u8*)*3); + for(i = 0 ; i < 3; i++) + cmap[i] = malloc(sizeof(u8) * num_colors); +#else png_colorp palette = data->info_ptr->palette; png_bytep trans = data->info_ptr->trans; int num_colors = MIN( MAXCOLORMAPSIZE, data->info_ptr->num_palette ); u8 cmap[3][num_colors]; - +#endif for (i=0; i<num_colors; i++) { cmap[0][i] = palette[i].red; cmap[1][i] = palette[i].green; @@ -649,7 +690,11 @@ png_info_callback( png_structp png_read_ key = FindColorKey( num_colors, &cmap[0][0] ); +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + for (i=0; i<num_trans; i++) { +#else for (i=0; i<data->info_ptr->num_trans; i++) { +#endif if (!trans[i]) { palette[i].red = (key & 0xff0000) >> 16; palette[i].green = (key & 0x00ff00) >> 8; @@ -658,11 +703,20 @@ png_info_callback( png_structp png_read_ } data->color_key = key; +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + for(i = 0 ; i < 3; i++) + free(cmap[i]); + free(cmap); +#endif } else { /* ...or based on trans rgb value */ +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + png_color_16p trans; + png_get_tRNS(data->png_ptr, data->info_ptr, NULL, NULL, &trans); +#else png_color_16p trans = &data->info_ptr->trans_values; - +#endif data->color_key = (((trans->red & 0xff00) << 8) | ((trans->green & 0xff00)) | ((trans->blue & 0xff00) >> 8)); @@ -671,11 +725,25 @@ png_info_callback( png_structp png_read_ switch (data->color_type) { case PNG_COLOR_TYPE_PALETTE: { +#if PNG_LIBPNG_VER_MAJOR >= 1 && PNG_LIBPNG_VER_MINOR >= 4 + png_colorp palette; + png_bytep trans; + int num_colors; + int num_palette; + int num_trans; + + png_get_PLTE(data->png_ptr, data->info_ptr, + &palette, &num_palette); + png_get_tRNS(data->png_ptr, data->info_ptr, + &trans, &num_trans, NULL); + num_colors = MIN( MAXCOLORMAPSIZE, num_palette ); +#else + png_colorp palette = data->info_ptr->palette; png_bytep trans = data->info_ptr->trans; int num_trans = data->info_ptr->num_trans; int num_colors = MIN( MAXCOLORMAPSIZE, data->info_ptr->num_palette ); - +#endif for (i=0; i<num_colors; i++) { data->colors[i].a = (i < num_trans) ? trans[i] : 0xff; data->colors[i].r = palette[i].red;