summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuli Suominen <ssuominen@gentoo.org>2011-08-07 09:55:19 +0000
committerSamuli Suominen <ssuominen@gentoo.org>2011-08-07 09:55:19 +0000
commitcc5a1053d0df968fa1cac2642a82bf9367d0fdf3 (patch)
treedf77ad4a67a613cf88ff85d30c1b247e36e36b39 /media-gfx/xv
parentFix building with libpng15 wrt #368315 with NetBSD patch. (diff)
downloadgentoo-2-cc5a1053d0df968fa1cac2642a82bf9367d0fdf3.tar.gz
gentoo-2-cc5a1053d0df968fa1cac2642a82bf9367d0fdf3.tar.bz2
gentoo-2-cc5a1053d0df968fa1cac2642a82bf9367d0fdf3.zip
Fix building with libpng15 wrt #355883 by Mike Frysinger
(Portage version: 2.2.0_alpha47/cvs/Linux x86_64)
Diffstat (limited to 'media-gfx/xv')
-rw-r--r--media-gfx/xv/ChangeLog8
-rw-r--r--media-gfx/xv/files/xv-3.10a-libpng15.patch538
-rw-r--r--media-gfx/xv/xv-3.10a-r16.ebuild90
3 files changed, 635 insertions, 1 deletions
diff --git a/media-gfx/xv/ChangeLog b/media-gfx/xv/ChangeLog
index 4b2101c0695e..228e7054e37c 100644
--- a/media-gfx/xv/ChangeLog
+++ b/media-gfx/xv/ChangeLog
@@ -1,6 +1,12 @@
# ChangeLog for media-gfx/xv
# Copyright 1999-2011 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/media-gfx/xv/ChangeLog,v 1.102 2011/02/26 18:31:17 signals Exp $
+# $Header: /var/cvsroot/gentoo-x86/media-gfx/xv/ChangeLog,v 1.103 2011/08/07 09:55:19 ssuominen Exp $
+
+*xv-3.10a-r16 (07 Aug 2011)
+
+ 07 Aug 2011; Samuli Suominen <ssuominen@gentoo.org> +xv-3.10a-r16.ebuild,
+ +files/xv-3.10a-libpng15.patch:
+ Fix building with libpng15 wrt #355883 by Mike Frysinger
26 Feb 2011; Kevin McCarthy <signals@gentoo.org> xv-3.10a-r15.ebuild:
Updated depends from media-libs/jpeg to virtual/jpeg
diff --git a/media-gfx/xv/files/xv-3.10a-libpng15.patch b/media-gfx/xv/files/xv-3.10a-libpng15.patch
new file mode 100644
index 000000000000..94502c1528d2
--- /dev/null
+++ b/media-gfx/xv/files/xv-3.10a-libpng15.patch
@@ -0,0 +1,538 @@
+--- xvpng.c
++++ xvpng.c
+@@ -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,
+ {
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ 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,
+ }
+
+ 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,
+ 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,23 @@ 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);
++ strcat(pinfo->comment, text[i].text);
+ strcat(pinfo->comment, "\n");
+ }
+ }
+@@ -1143,7 +1206,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);
+ }
+
+
diff --git a/media-gfx/xv/xv-3.10a-r16.ebuild b/media-gfx/xv/xv-3.10a-r16.ebuild
new file mode 100644
index 000000000000..d22e6f4506a7
--- /dev/null
+++ b/media-gfx/xv/xv-3.10a-r16.ebuild
@@ -0,0 +1,90 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/media-gfx/xv/xv-3.10a-r16.ebuild,v 1.1 2011/08/07 09:55:19 ssuominen Exp $
+
+EAPI=2
+inherit eutils flag-o-matic
+
+JUMBOV=20070520
+DESCRIPTION="An interactive image manipulation program that supports a wide variety of image formats"
+HOMEPAGE="http://www.trilon.com/xv/index.html http://www.sonic.net/~roelofs/greg_xv.html"
+SRC_URI="mirror://sourceforge/png-mng/${P}-jumbo-patches-${JUMBOV}.tar.gz ftp://ftp.cis.upenn.edu/pub/xv/${P}.tar.gz"
+
+LICENSE="xv"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~sparc ~x86 ~x86-fbsd"
+IUSE="jpeg tiff png"
+
+DEPEND="x11-libs/libXt
+ jpeg? ( virtual/jpeg )
+ tiff? ( >=media-libs/tiff-3.6.1-r2 )
+ png? ( >=media-libs/libpng-1.2 >=sys-libs/zlib-1.1.4 )"
+RDEPEND="${DEPEND}"
+
+src_prepare() {
+ # Apply the jumbo patch
+ epatch "${WORKDIR}"/${P}-jumbo-fix-enh-patch-${JUMBOV}.txt
+
+ # OSX and BSD xv.h define patches
+ epatch "${FILESDIR}"/${P}-osx-bsd-${JUMBOV}.patch
+
+ # OSX malloc patch
+ epatch "${FILESDIR}"/${P}-vdcomp-osx-${JUMBOV}.patch
+
+ # Disable JP2K (i.e. use system JPEG libs)
+ epatch "${FILESDIR}"/${P}-disable-jp2k-${JUMBOV}.patch
+
+ # Fix -wait option (do not rely on obsolete CLK_TCK)
+ epatch "${FILESDIR}"/${P}-fix-wait-${JUMBOV}.patch
+
+ # Use LDFLAGS on link lines
+ epatch "${FILESDIR}"/${P}-add-ldflags-${JUMBOV}.patch
+
+ epatch "${FILESDIR}"/${P}-libpng15.patch
+
+ # Link with various image libraries depending on use flags
+ IMAGE_LIBS=""
+ use jpeg && IMAGE_LIBS="${IMAGE_LIBS} -ljpeg"
+ use png && IMAGE_LIBS="${IMAGE_LIBS} -lz -lpng"
+ use tiff && IMAGE_LIBS="${IMAGE_LIBS} -ltiff"
+
+ sed -i \
+ -e 's/\(^JPEG.*\)/#\1/g' \
+ -e 's/\(^PNG.*\)/#\1/g' \
+ -e 's/\(^TIFF.*\)/#\1/g' \
+ -e "s/\(^LIBS = .*\)/\1${IMAGE_LIBS}/g" Makefile
+
+ # /usr/bin/gzip => /bin/gzip
+ sed -i -e 's#/usr\(/bin/gzip\)#\1#g' config.h
+
+ # Fix installation of ps docs
+ sed -i -e 's#$(DESTDIR)$(LIBDIR)#$(LIBDIR)#g' Makefile
+}
+
+src_compile() {
+ append-flags -DUSE_GETCWD -DLINUX -DUSLEEP
+ use jpeg && append-flags -DDOJPEG
+ use png && append-flags -DDOPNG
+ use tiff && append-flags -DDOTIFF -DUSE_TILED_TIFF_BOTLEFT_FIX
+
+ emake \
+ CC="$(tc-getCC)" CCOPTS="${CFLAGS}" LDFLAGS="${LDFLAGS}" \
+ PREFIX=/usr \
+ DOCDIR=/usr/share/doc/${PF} \
+ LIBDIR="${T}" || die
+}
+
+src_install() {
+ dodir /usr/bin
+ dodir /usr/share/man/man1
+
+ emake \
+ DESTDIR="${D}" \
+ PREFIX=/usr \
+ DOCDIR=/usr/share/doc/${PF} \
+ LIBDIR="${T}" install || die
+
+ dodoc CHANGELOG BUGS IDEAS
+ doicon "${FILESDIR}"/${PN}.png
+ make_desktop_entry xv "" "" "Graphics;Viewer"
+}