mirror of
git://slackware.nl/current.git
synced 2024-12-29 10:25:00 +01:00
d31c50870d
Thu Jun 30 20:26:57 UTC 2016 Slackware 14.2 x86_64 stable is released! The long development cycle (the Linux community has lately been living in "interesting times", as they say) is finally behind us, and we're proud to announce the release of Slackware 14.2. The new release brings many updates and modern tools, has switched from udev to eudev (no systemd), and adds well over a hundred new packages to the system. Thanks to the team, the upstream developers, the dedicated Slackware community, and everyone else who pitched in to help make this release a reality. The ISOs are off to be replicated, a 6 CD-ROM 32-bit set and a dual-sided 32-bit/64-bit x86/x86_64 DVD. Please consider supporting the Slackware project by picking up a copy from store.slackware.com. We're taking pre-orders now, and offer a discount if you sign up for a subscription. Have fun! :-)
543 lines
18 KiB
Diff
543 lines
18 KiB
Diff
$OpenBSD: patch-xvpng_c,v 1.2 2011/08/29 18:07:44 espie Exp $
|
|
|
|
Fix build with png-1.5.
|
|
|
|
--- xvpng.c.orig Mon May 14 02:53:28 2007
|
|
+++ xvpng.c Mon Aug 29 15:05:31 2011
|
|
@@ -31,6 +31,7 @@
|
|
|
|
#ifdef HAVE_PNG
|
|
|
|
+#include "zlib.h"
|
|
#include "png.h"
|
|
|
|
/*** Stuff for PNG Dialog box ***/
|
|
@@ -41,7 +42,7 @@
|
|
#define COMPRESSION 6 /* default zlib compression level, not max
|
|
(Z_BEST_COMPRESSION) */
|
|
|
|
-#define HAVE_tRNS (info_ptr->valid & PNG_INFO_tRNS)
|
|
+#define HAVE_tRNS (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))
|
|
|
|
#define DWIDE 86
|
|
#define DHIGH 104
|
|
@@ -435,6 +436,16 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
{
|
|
png_struct *png_ptr;
|
|
png_info *info_ptr;
|
|
+ struct {
|
|
+ /* IHDR */
|
|
+ png_uint_32 width;
|
|
+ png_uint_32 height;
|
|
+ int bit_depth;
|
|
+ int color_type;
|
|
+ int interlace_type;
|
|
+ /* PLTE */
|
|
+ int use_palette;
|
|
+ } info_tmp;
|
|
png_color palette[256];
|
|
png_textp text;
|
|
byte r1[256], g1[256], b1[256]; /* storage for deduped palette */
|
|
@@ -444,6 +455,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
byte *p, *png_line;
|
|
char software[256];
|
|
char *savecmnt;
|
|
+ int num_text, max_text;
|
|
|
|
if ((png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL,
|
|
png_xv_error, png_xv_warning)) == NULL) {
|
|
@@ -458,7 +470,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
FatalError(software);
|
|
}
|
|
|
|
- if (setjmp(png_ptr->jmpbuf)) {
|
|
+ if (setjmp(png_jmpbuf(png_ptr))) {
|
|
png_destroy_write_struct(&png_ptr, &info_ptr);
|
|
return -1;
|
|
}
|
|
@@ -489,8 +501,8 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
png_set_filter(png_ptr, 0, filter);
|
|
}
|
|
|
|
- info_ptr->width = w;
|
|
- info_ptr->height = h;
|
|
+ info_tmp.width = w;
|
|
+ info_tmp.height = h;
|
|
if (w <= 0 || h <= 0) {
|
|
SetISTR(ISTR_WARNING, "%s: image dimensions out of range (%dx%d)",
|
|
fbasename, w, h);
|
|
@@ -498,7 +510,8 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
return -1;
|
|
}
|
|
|
|
- info_ptr->interlace_type = interCB.val ? 1 : 0;
|
|
+ info_tmp.interlace_type =
|
|
+ interCB.val ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE;
|
|
|
|
linesize = 0; /* quiet a compiler warning */
|
|
|
|
@@ -542,40 +555,40 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
png_destroy_write_struct(&png_ptr, &info_ptr);
|
|
return -1;
|
|
}
|
|
- info_ptr->color_type = PNG_COLOR_TYPE_RGB;
|
|
- info_ptr->bit_depth = 8;
|
|
+ info_tmp.color_type = PNG_COLOR_TYPE_RGB;
|
|
+ info_tmp.bit_depth = 8;
|
|
+ info_tmp.use_palette = 0;
|
|
} else /* ptype == PIC8 */ {
|
|
linesize = w;
|
|
- info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;
|
|
+ info_tmp.color_type = PNG_COLOR_TYPE_PALETTE;
|
|
if (numuniqcols <= 2)
|
|
- info_ptr->bit_depth = 1;
|
|
+ info_tmp.bit_depth = 1;
|
|
else
|
|
if (numuniqcols <= 4)
|
|
- info_ptr->bit_depth = 2;
|
|
+ info_tmp.bit_depth = 2;
|
|
else
|
|
if (numuniqcols <= 16)
|
|
- info_ptr->bit_depth = 4;
|
|
+ info_tmp.bit_depth = 4;
|
|
else
|
|
- info_ptr->bit_depth = 8;
|
|
+ info_tmp.bit_depth = 8;
|
|
|
|
for (i = 0; i < numuniqcols; i++) {
|
|
palette[i].red = r1[i];
|
|
palette[i].green = g1[i];
|
|
palette[i].blue = b1[i];
|
|
}
|
|
- info_ptr->num_palette = numuniqcols;
|
|
- info_ptr->palette = palette;
|
|
- info_ptr->valid |= PNG_INFO_PLTE;
|
|
+ info_tmp.use_palette = 1;
|
|
}
|
|
}
|
|
|
|
else if (colorType == F_GREYSCALE || colorType == F_BWDITHER) {
|
|
- info_ptr->color_type = PNG_COLOR_TYPE_GRAY;
|
|
+ info_tmp.color_type = PNG_COLOR_TYPE_GRAY;
|
|
+ info_tmp.use_palette = 0;
|
|
if (colorType == F_BWDITHER) {
|
|
/* shouldn't happen */
|
|
if (ptype == PIC24) FatalError("PIC24 and B/W Stipple in WritePNG()");
|
|
|
|
- info_ptr->bit_depth = 1;
|
|
+ info_tmp.bit_depth = 1;
|
|
if (MONO(r1[0], g1[0], b1[0]) > MONO(r1[1], g1[1], b1[1])) {
|
|
remap[0] = 1;
|
|
remap[1] = 0;
|
|
@@ -595,7 +608,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
png_destroy_write_struct(&png_ptr, &info_ptr);
|
|
return -1;
|
|
}
|
|
- info_ptr->bit_depth = 8;
|
|
+ info_tmp.bit_depth = 8;
|
|
}
|
|
else /* ptype == PIC8 */ {
|
|
int low_precision;
|
|
@@ -617,7 +630,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
for (; i < 256; i++)
|
|
remap[i]=0; /* shouldn't be necessary, but... */
|
|
|
|
- info_ptr->bit_depth = 8;
|
|
+ info_tmp.bit_depth = 8;
|
|
|
|
/* Note that this fails most of the time because of gamma */
|
|
/* (and that would be a bug: GRR FIXME) */
|
|
@@ -636,7 +649,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
for (i = 0; i < numuniqcols; i++) {
|
|
remap[i] &= 0xf;
|
|
}
|
|
- info_ptr->bit_depth = 4;
|
|
+ info_tmp.bit_depth = 4;
|
|
|
|
/* try to adjust to 2-bit precision grayscale */
|
|
|
|
@@ -652,7 +665,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
for (i = 0; i < numuniqcols; i++) {
|
|
remap[i] &= 3;
|
|
}
|
|
- info_ptr->bit_depth = 2;
|
|
+ info_tmp.bit_depth = 2;
|
|
|
|
/* try to adjust to 1-bit precision grayscale */
|
|
|
|
@@ -668,7 +681,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
for (i = 0; i < numuniqcols; i++) {
|
|
remap[i] &= 1;
|
|
}
|
|
- info_ptr->bit_depth = 1;
|
|
+ info_tmp.bit_depth = 1;
|
|
}
|
|
}
|
|
}
|
|
@@ -677,6 +690,20 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
else
|
|
png_error(png_ptr, "Unknown colorstyle in WritePNG");
|
|
|
|
+ png_set_IHDR(png_ptr, info_ptr,
|
|
+ info_tmp.width, info_tmp.height,
|
|
+ info_tmp.bit_depth, info_tmp.color_type,
|
|
+ info_tmp.interlace_type, PNG_COMPRESSION_TYPE_BASE,
|
|
+ PNG_FILTER_TYPE_BASE);
|
|
+ if (info_tmp.use_palette) {
|
|
+ /*
|
|
+ * info_ptr->num_palette = numuniqcols;
|
|
+ * info_ptr->palette = palette;
|
|
+ * info_ptr->valid |= PNG_INFO_PLTE;
|
|
+ */
|
|
+ png_set_PLTE(png_ptr, info_ptr, palette, numuniqcols);
|
|
+ }
|
|
+
|
|
if ((text = (png_textp)malloc(sizeof(png_text)))) {
|
|
sprintf(software, "XV %s", REVDATE);
|
|
|
|
@@ -684,21 +711,29 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
text->key = "Software";
|
|
text->text = software;
|
|
text->text_length = strlen(text->text);
|
|
+ text->lang = NULL;
|
|
|
|
- info_ptr->max_text = 1;
|
|
- info_ptr->num_text = 1;
|
|
- info_ptr->text = text;
|
|
+ /*
|
|
+ * info_ptr->max_text = 1;
|
|
+ * info_ptr->num_text = 1;
|
|
+ * info_ptr->text = text;
|
|
+ */
|
|
+ png_set_text(png_ptr, info_ptr, text, 1);
|
|
+ num_text = max_text = 1;
|
|
}
|
|
|
|
Display_Gamma = gDial.val; /* Save the current gamma for loading */
|
|
|
|
// GRR FIXME: add .Xdefaults option to omit writing gamma (size, cumulative errors when editing)--alternatively, modify save box to include "omit" checkbox
|
|
- info_ptr->gamma = 1.0/gDial.val;
|
|
- info_ptr->valid |= PNG_INFO_gAMA;
|
|
+ /*
|
|
+ * info_ptr->gamma = 1.0/gDial.val;
|
|
+ * info_ptr->valid |= PNG_INFO_gAMA;
|
|
+ */
|
|
+ png_set_gAMA(png_ptr, info_ptr, 1.0/gDial.val);
|
|
|
|
png_write_info(png_ptr, info_ptr);
|
|
|
|
- if (info_ptr->bit_depth < 8)
|
|
+ if (info_tmp.bit_depth < 8)
|
|
png_set_packing(png_ptr);
|
|
|
|
pass=png_set_interlace_handling(png_ptr);
|
|
@@ -711,13 +746,13 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
int j;
|
|
p = pic;
|
|
for (j = 0; j < h; ++j) {
|
|
- if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY) {
|
|
+ if (info_tmp.color_type == PNG_COLOR_TYPE_GRAY) {
|
|
int k;
|
|
for (k = 0; k < w; ++k)
|
|
png_line[k] = ptype==PIC24 ? MONO(p[k*3], p[k*3+1], p[k*3+2]) :
|
|
remap[pc2nc[p[k]]];
|
|
png_write_row(png_ptr, png_line);
|
|
- } else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) {
|
|
+ } else if (info_tmp.color_type == PNG_COLOR_TYPE_PALETTE) {
|
|
int k;
|
|
for (k = 0; k < w; ++k)
|
|
png_line[k] = pc2nc[p[k]];
|
|
@@ -743,24 +778,26 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
strcpy(savecmnt, picComments);
|
|
key = savecmnt;
|
|
tp = text;
|
|
- info_ptr->num_text = 0;
|
|
|
|
+ png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1);
|
|
+ num_text = 0;
|
|
+
|
|
comment = strchr(key, ':');
|
|
|
|
do {
|
|
/* Allocate a larger structure for comments if necessary */
|
|
- if (info_ptr->num_text >= info_ptr->max_text)
|
|
+ if (num_text >= max_text)
|
|
{
|
|
if ((tp =
|
|
- realloc(text, (info_ptr->num_text + 2)*sizeof(png_text))) == NULL)
|
|
+ realloc(text, (num_text + 2)*sizeof(png_text))) == NULL)
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
text = tp;
|
|
- tp = &text[info_ptr->num_text];
|
|
- info_ptr->max_text += 2;
|
|
+ tp = &text[num_text];
|
|
+ max_text += 2;
|
|
}
|
|
}
|
|
|
|
@@ -810,7 +847,7 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
}
|
|
|
|
tp->compression = tp->text_length > 640 ? 0 : -1;
|
|
- info_ptr->num_text++;
|
|
+ num_text++;
|
|
tp++;
|
|
}
|
|
}
|
|
@@ -834,27 +871,29 @@ int WritePNG(fp, pic, ptype, w, h, rmap, gmap, bmap, n
|
|
tp->text = key;
|
|
tp->text_length = q - key;
|
|
tp->compression = tp->text_length > 750 ? 0 : -1;
|
|
- info_ptr->num_text++;
|
|
+ num_text++;
|
|
key = NULL;
|
|
}
|
|
} while (key && *key);
|
|
+ png_set_text(png_ptr, info_ptr, text, num_text);
|
|
}
|
|
else {
|
|
- info_ptr->num_text = 0;
|
|
+ png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1);
|
|
}
|
|
}
|
|
- info_ptr->text = text;
|
|
|
|
- png_convert_from_time_t(&(info_ptr->mod_time), time(NULL));
|
|
- info_ptr->valid |= PNG_INFO_tIME;
|
|
+ {
|
|
+ png_time mod_time;
|
|
|
|
+ png_convert_from_time_t(&mod_time, time(NULL));
|
|
+ png_set_tIME(png_ptr, info_ptr, &mod_time);
|
|
+ }
|
|
+
|
|
png_write_end(png_ptr, info_ptr);
|
|
fflush(fp); /* just in case we core-dump before finishing... */
|
|
|
|
if (text) {
|
|
free(text);
|
|
- /* must do this or png_destroy_write_struct() 0.97+ will free text again: */
|
|
- info_ptr->text = (png_textp)NULL;
|
|
if (savecmnt)
|
|
{
|
|
free(savecmnt);
|
|
@@ -886,6 +925,8 @@ int LoadPNG(fname, pinfo)
|
|
int pass;
|
|
int gray_to_rgb;
|
|
size_t commentsize;
|
|
+ png_textp text;
|
|
+ int num_text;
|
|
|
|
fbasename = BaseName(fname);
|
|
|
|
@@ -921,7 +962,7 @@ int LoadPNG(fname, pinfo)
|
|
FatalError("malloc failure in LoadPNG");
|
|
}
|
|
|
|
- if (setjmp(png_ptr->jmpbuf)) {
|
|
+ if (setjmp(png_jmpbuf(png_ptr))) {
|
|
fclose(fp);
|
|
png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
|
|
if (!read_anything) {
|
|
@@ -945,8 +986,8 @@ int LoadPNG(fname, pinfo)
|
|
#endif
|
|
png_read_info(png_ptr, info_ptr);
|
|
|
|
- pinfo->w = pinfo->normw = info_ptr->width;
|
|
- pinfo->h = pinfo->normh = info_ptr->height;
|
|
+ pinfo->w = pinfo->normw = png_get_image_width(png_ptr, info_ptr);
|
|
+ pinfo->h = pinfo->normh = png_get_image_height(png_ptr, info_ptr);
|
|
if (pinfo->w <= 0 || pinfo->h <= 0) {
|
|
SetISTR(ISTR_WARNING, "%s: image dimensions out of range (%dx%d)",
|
|
fbasename, pinfo->w, pinfo->h);
|
|
@@ -957,9 +998,9 @@ int LoadPNG(fname, pinfo)
|
|
pinfo->frmType = F_PNG;
|
|
|
|
sprintf(pinfo->fullInfo, "PNG, %d bit ",
|
|
- info_ptr->bit_depth * info_ptr->channels);
|
|
+ png_get_bit_depth(png_ptr,info_ptr) * png_get_channels(png_ptr, info_ptr));
|
|
|
|
- switch(info_ptr->color_type) {
|
|
+ switch(png_get_color_type(png_ptr, info_ptr)) {
|
|
case PNG_COLOR_TYPE_PALETTE:
|
|
strcat(pinfo->fullInfo, "palette color");
|
|
break;
|
|
@@ -983,15 +1024,20 @@ int LoadPNG(fname, pinfo)
|
|
|
|
sprintf(pinfo->fullInfo + strlen(pinfo->fullInfo),
|
|
", %sinterlaced. (%d bytes)",
|
|
- info_ptr->interlace_type ? "" : "non-", filesize);
|
|
+ png_get_interlace_type(png_ptr, info_ptr) ? "" : "non-", filesize);
|
|
|
|
- sprintf(pinfo->shrtInfo, "%lux%lu PNG", info_ptr->width, info_ptr->height);
|
|
+ sprintf(pinfo->shrtInfo, "%lux%lu PNG",
|
|
+ png_get_image_width(png_ptr, info_ptr),
|
|
+ png_get_image_height(png_ptr, info_ptr));
|
|
|
|
- if (info_ptr->bit_depth < 8)
|
|
+ if (png_get_bit_depth(png_ptr, info_ptr) < 8)
|
|
png_set_packing(png_ptr);
|
|
|
|
- if (info_ptr->valid & PNG_INFO_gAMA)
|
|
- png_set_gamma(png_ptr, Display_Gamma, info_ptr->gamma);
|
|
+ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_gAMA)) {
|
|
+ double gamma;
|
|
+ png_get_gAMA(png_ptr, info_ptr, &gamma);
|
|
+ png_set_gamma(png_ptr, Display_Gamma, gamma);
|
|
+ }
|
|
/*
|
|
*else
|
|
* png_set_gamma(png_ptr, Display_Gamma, 0.45);
|
|
@@ -1000,7 +1046,7 @@ int LoadPNG(fname, pinfo)
|
|
gray_to_rgb = 0; /* quiet a compiler warning */
|
|
|
|
if (have_imagebg) {
|
|
- if (info_ptr->bit_depth == 16) {
|
|
+ if (png_get_bit_depth(png_ptr, info_ptr) == 16) {
|
|
my_background.red = imagebgR;
|
|
my_background.green = imagebgG;
|
|
my_background.blue = imagebgB;
|
|
@@ -1013,8 +1059,8 @@ int LoadPNG(fname, pinfo)
|
|
}
|
|
png_set_background(png_ptr, &my_background, PNG_BACKGROUND_GAMMA_SCREEN,
|
|
0, Display_Gamma);
|
|
- if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA ||
|
|
- (info_ptr->color_type == PNG_COLOR_TYPE_GRAY && HAVE_tRNS)) &&
|
|
+ if ((png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY_ALPHA ||
|
|
+ (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY && HAVE_tRNS)) &&
|
|
(imagebgR != imagebgG || imagebgR != imagebgB)) /* i.e., colored bg */
|
|
{
|
|
png_set_gray_to_rgb(png_ptr);
|
|
@@ -1022,8 +1068,10 @@ int LoadPNG(fname, pinfo)
|
|
gray_to_rgb = 1;
|
|
}
|
|
} else {
|
|
- if (info_ptr->valid & PNG_INFO_bKGD) {
|
|
- png_set_background(png_ptr, &info_ptr->background,
|
|
+ if (png_get_valid(png_ptr, info_ptr, PNG_INFO_bKGD)) {
|
|
+ png_color_16p background;
|
|
+ png_get_bKGD(png_ptr, info_ptr, &background);
|
|
+ png_set_background(png_ptr, background,
|
|
PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
|
|
} else {
|
|
my_background.red = my_background.green = my_background.blue =
|
|
@@ -1033,13 +1081,13 @@ int LoadPNG(fname, pinfo)
|
|
}
|
|
}
|
|
|
|
- if (info_ptr->bit_depth == 16)
|
|
+ if (png_get_bit_depth(png_ptr, info_ptr) == 16)
|
|
png_set_strip_16(png_ptr);
|
|
|
|
- if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY ||
|
|
- info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
|
|
+ if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY ||
|
|
+ png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY_ALPHA)
|
|
{
|
|
- if (info_ptr->bit_depth == 1)
|
|
+ if (png_get_bit_depth(png_ptr, info_ptr) == 1)
|
|
pinfo->colType = F_BWDITHER;
|
|
else
|
|
pinfo->colType = F_GREYSCALE;
|
|
@@ -1050,8 +1098,8 @@ int LoadPNG(fname, pinfo)
|
|
|
|
png_read_update_info(png_ptr, info_ptr);
|
|
|
|
- if (info_ptr->color_type == PNG_COLOR_TYPE_RGB ||
|
|
- info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || gray_to_rgb)
|
|
+ if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB ||
|
|
+ png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB_ALPHA || gray_to_rgb)
|
|
{
|
|
linesize = 3 * pinfo->w;
|
|
if (linesize/3 < pinfo->w) { /* know pinfo->w > 0 (see above) */
|
|
@@ -1065,16 +1113,20 @@ int LoadPNG(fname, pinfo)
|
|
} else {
|
|
linesize = pinfo->w;
|
|
pinfo->type = PIC8;
|
|
- if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY ||
|
|
- info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
|
|
+ if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY ||
|
|
+ png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY_ALPHA) {
|
|
for (i = 0; i < 256; i++)
|
|
pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i;
|
|
} else {
|
|
+ png_colorp palette;
|
|
+ int num_palette;
|
|
+
|
|
+ png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette);
|
|
pinfo->colType = F_FULLCOLOR;
|
|
- for (i = 0; i < info_ptr->num_palette; i++) {
|
|
- pinfo->r[i] = info_ptr->palette[i].red;
|
|
- pinfo->g[i] = info_ptr->palette[i].green;
|
|
- pinfo->b[i] = info_ptr->palette[i].blue;
|
|
+ for (i = 0; i < num_palette; i++) {
|
|
+ pinfo->r[i] = palette[i].red;
|
|
+ pinfo->g[i] = palette[i].green;
|
|
+ pinfo->b[i] = palette[i].blue;
|
|
}
|
|
}
|
|
}
|
|
@@ -1092,7 +1144,17 @@ int LoadPNG(fname, pinfo)
|
|
png_error(png_ptr, "can't allocate space for PNG image");
|
|
}
|
|
|
|
- png_start_read_image(png_ptr);
|
|
+ /*
|
|
+ * In png 1.5 (or at least 1.5.1beta06) calling this after calling
|
|
+ * png_read_update_info() does nothing besides issue a misleading
|
|
+ * warning message. The png docs are not at all clear on what an
|
|
+ * application is *supposed* to do, so I'm not sure if this is a
|
|
+ * problem with xv or with libpng. However, for now I'll comment
|
|
+ * this out as according to the png source that should be harmless
|
|
+ * and we don't want to see the warning message every time someone
|
|
+ * opens a png.
|
|
+ */
|
|
+ /*png_start_read_image(png_ptr);*/
|
|
|
|
for (i = 0; i < pass; i++) {
|
|
byte *p = pinfo->pic;
|
|
@@ -1106,22 +1168,24 @@ int LoadPNG(fname, pinfo)
|
|
|
|
png_read_end(png_ptr, info_ptr);
|
|
|
|
- if (info_ptr->num_text > 0) {
|
|
+ png_get_text(png_ptr, info_ptr, &text, &num_text);
|
|
+ if (num_text > 0) {
|
|
commentsize = 1;
|
|
|
|
- for (i = 0; i < info_ptr->num_text; i++)
|
|
- commentsize += strlen(info_ptr->text[i].key) + 1 +
|
|
- info_ptr->text[i].text_length + 2;
|
|
+ for (i = 0; i < num_text; i++)
|
|
+ commentsize += strlen(text[i].key) + 1 +
|
|
+ text[i].text_length + 2;
|
|
|
|
if ((pinfo->comment = malloc(commentsize)) == NULL) {
|
|
png_warning(png_ptr,"can't allocate comment string");
|
|
}
|
|
else {
|
|
pinfo->comment[0] = '\0';
|
|
- for (i = 0; i < info_ptr->num_text; i++) {
|
|
- strcat(pinfo->comment, info_ptr->text[i].key);
|
|
+ for (i = 0; i < num_text; i++) {
|
|
+ strcat(pinfo->comment, text[i].key);
|
|
strcat(pinfo->comment, "::");
|
|
- strcat(pinfo->comment, info_ptr->text[i].text);
|
|
+ if (text[i].text_length != 0)
|
|
+ strcat(pinfo->comment, text[i].text);
|
|
strcat(pinfo->comment, "\n");
|
|
}
|
|
}
|
|
@@ -1143,7 +1207,7 @@ png_xv_error(png_ptr, message)
|
|
{
|
|
SetISTR(ISTR_WARNING,"%s: libpng error: %s", fbasename, message);
|
|
|
|
- longjmp(png_ptr->jmpbuf, 1);
|
|
+ longjmp(png_jmpbuf(png_ptr), 1);
|
|
}
|
|
|
|
|