8c18b08ac5
All fixes from/via NetBSD pkgsrc. The people there did a lot of heavy lifting.
174 lines
5.8 KiB
Plaintext
174 lines
5.8 KiB
Plaintext
$OpenBSD: patch-lib_common_readPNG_c,v 1.1 2011/07/08 20:36:09 naddy Exp $
|
|
|
|
Fix build with png-1.5.
|
|
|
|
--- lib/common/readPNG.c.orig Mon Nov 16 15:56:19 1998
|
|
+++ lib/common/readPNG.c Wed Jul 6 12:16:51 2011
|
|
@@ -132,7 +132,11 @@ my_png_error(png_structp png_ptr, String msg)
|
|
|
|
_XmHTMLWarning(__WFUNC__(NULL, "png_error"), XMHTML_MSG_121, "png",
|
|
ib->file, msg);
|
|
+#if (PNG_LIBPNG_VER < 10500)
|
|
longjmp(png_ptr->jmpbuf, 1);
|
|
+#else
|
|
+ png_longjmp(png_ptr, 1);
|
|
+#endif
|
|
}
|
|
|
|
/*****
|
|
@@ -189,6 +193,10 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
png_bytep *row_ptrs;
|
|
char msg[128];
|
|
static XmHTMLRawImageData *img_data;
|
|
+ png_colorp palette;
|
|
+ int num_palette;
|
|
+ double png_gamma;
|
|
+ png_color_16p background;
|
|
|
|
img_data = NULL;
|
|
data = 0;
|
|
@@ -232,7 +240,7 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
return((XmHTMLRawImageData*)NULL);
|
|
}
|
|
/* now set error handler */
|
|
- if(setjmp(png_ptr->jmpbuf))
|
|
+ if(setjmp(png_jmpbuf(png_ptr)))
|
|
{
|
|
/*
|
|
* PNG signalled an error. Destroy image data, free any allocated
|
|
@@ -265,17 +273,18 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
ResetRawImage(img_data);
|
|
|
|
/* save width & height */
|
|
- width = img_data->width = info_ptr->width;
|
|
- height = img_data->height = info_ptr->height;
|
|
+ width = img_data->width = png_get_image_width(png_ptr, info_ptr);
|
|
+ height = img_data->height = png_get_image_height(png_ptr, info_ptr);
|
|
|
|
/* image depth */
|
|
- ib->depth = info_ptr->bit_depth;
|
|
+ ib->depth = png_get_bit_depth(png_ptr, info_ptr);
|
|
|
|
+ png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette);
|
|
/* no of colors */
|
|
- ncolors = img_data->cmapsize = info_ptr->num_palette;
|
|
+ ncolors = img_data->cmapsize = num_palette;
|
|
|
|
/* type of image */
|
|
- color_type = info_ptr->color_type;
|
|
+ color_type = png_get_color_type(png_ptr, info_ptr);
|
|
|
|
/*
|
|
* The fun stuff. This is based on readPNG by Greg Roelofs as found
|
|
@@ -306,7 +315,7 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
* Actual image creation is postponed until the image is
|
|
* needed.
|
|
*/
|
|
- if(info_ptr->valid & PNG_INFO_tRNS)
|
|
+ if(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
|
{
|
|
_XmHTMLDebug(15, ("readPNG.c: tRNS chunk present\n"));
|
|
png_set_expand(png_ptr);
|
|
@@ -319,9 +328,9 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
AllocRawImageCmap(img_data, ncolors);
|
|
for(i = 0; i < ncolors; i++)
|
|
{
|
|
- GETR(img_data->cmap[i]) = info_ptr->palette[i].red;
|
|
- GETG(img_data->cmap[i]) = info_ptr->palette[i].green;
|
|
- GETB(img_data->cmap[i]) = info_ptr->palette[i].blue;
|
|
+ GETR(img_data->cmap[i]) = palette[i].red;
|
|
+ GETG(img_data->cmap[i]) = palette[i].green;
|
|
+ GETB(img_data->cmap[i]) = palette[i].blue;
|
|
}
|
|
has_cmap = True;
|
|
data = (Byte*)malloc(width*height*sizeof(Byte));
|
|
@@ -355,7 +364,7 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
* grayscale with transparency is expanded to RGB with alpha
|
|
* channel.
|
|
*/
|
|
- if(info_ptr->valid & PNG_INFO_tRNS)
|
|
+ if(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
|
{
|
|
_XmHTMLDebug(15, ("readPNG.c: tRNS chunk present\n"));
|
|
png_set_gray_to_rgb(png_ptr);
|
|
@@ -434,7 +443,7 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
break;
|
|
default:
|
|
sprintf(msg, "bad PNG image: unknown color type (%d)",
|
|
- info_ptr->color_type);
|
|
+ png_get_color_type(png_ptr, info_ptr));
|
|
my_png_error(png_ptr, msg);
|
|
break;
|
|
}
|
|
@@ -444,16 +453,19 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
* Doing that for alpha channel images would change the colortype of the
|
|
* current image, leading to weird results.
|
|
*/
|
|
- if(!has_alpha && info_ptr->valid & PNG_INFO_bKGD)
|
|
+ if(!has_alpha && png_get_valid(png_ptr, info_ptr, PNG_INFO_bKGD))
|
|
{
|
|
- png_set_background(png_ptr, &(info_ptr->background),
|
|
+ png_get_bKGD(png_ptr, info_ptr, &background);
|
|
+ png_set_background(png_ptr, background,
|
|
PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
|
|
- img_data->bg = info_ptr->background.index;
|
|
+ img_data->bg = background->index;
|
|
}
|
|
|
|
+ png_get_gAMA(png_ptr, info_ptr, &png_gamma);
|
|
+
|
|
/* handle gamma correction */
|
|
- if(info_ptr->valid & PNG_INFO_gAMA)
|
|
- fg_gamma = info_ptr->gamma;
|
|
+ if(png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA))
|
|
+ fg_gamma = png_gamma;
|
|
else
|
|
fg_gamma = 0.45;
|
|
|
|
@@ -464,20 +476,20 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
/* dithering gets handled by caller */
|
|
|
|
/* one byte per pixel */
|
|
- if(info_ptr->bit_depth < 8)
|
|
+ if(png_get_bit_depth(png_ptr, info_ptr) < 8)
|
|
png_set_packing(png_ptr);
|
|
|
|
/* no tRNS chunk handling, we've expanded it to an alpha channel. */
|
|
|
|
/* handle interlacing */
|
|
- if(info_ptr->interlace_type)
|
|
+ if(png_get_interlace_type(png_ptr, info_ptr))
|
|
npass = png_set_interlace_handling(png_ptr);
|
|
|
|
/* and now update everything */
|
|
png_read_update_info(png_ptr, info_ptr);
|
|
|
|
/* has possibly changed if we have promoted GrayScale or tRNS chunks */
|
|
- color_type = info_ptr->color_type;
|
|
+ color_type = png_get_color_type(png_ptr, info_ptr);
|
|
|
|
/* new color_type? */
|
|
if(color_type == PNG_COLOR_TYPE_RGB_ALPHA)
|
|
@@ -497,10 +509,10 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
* will call doAlphaChannel to do the actual image creation.
|
|
*/
|
|
row_ptrs = (png_bytep*)malloc(height*sizeof(png_bytep));
|
|
- png_data = (png_bytep)malloc(height*info_ptr->rowbytes);
|
|
+ png_data = (png_bytep)malloc(height*png_get_rowbytes(png_ptr, info_ptr));
|
|
|
|
for(i = 0; i < height; i++)
|
|
- row_ptrs[i] = (png_bytep)png_data + i*info_ptr->rowbytes;
|
|
+ row_ptrs[i] = (png_bytep)png_data + i*png_get_rowbytes(png_ptr, info_ptr);
|
|
|
|
/* read it */
|
|
png_read_image(png_ptr, row_ptrs);
|
|
@@ -529,7 +541,7 @@ _XmHTMLReadPNG(Widget html, ImageBuffer *ib)
|
|
row_ptrs = (png_bytep*)malloc(height*sizeof(png_bytep));
|
|
|
|
for(i = 0; i < height; ++i)
|
|
- row_ptrs[i] = (png_bytep)data + i*info_ptr->rowbytes;
|
|
+ row_ptrs[i] = (png_bytep)data + i*png_get_rowbytes(png_ptr, info_ptr);
|
|
|
|
/* read it */
|
|
png_read_image(png_ptr, row_ptrs);
|