rpms/xv/devel xv-3.10a-libpng15.patch,NONE,1.1 xv.spec,1.7,1.8

Paul Howarth pghmcfc at rpmfusion.org
Fri Dec 9 15:17:10 CET 2011


Author: pghmcfc

Update of /cvs/nonfree/rpms/xv/devel
In directory se02.es.rpmfusion.net:/tmp/cvs-serv2840

Modified Files:
	xv.spec 
Added Files:
	xv-3.10a-libpng15.patch 
Log Message:
add patch from Gentoo for libpng 1.5 compatibility

xv-3.10a-libpng15.patch:
 xvinfo.c |    2 
 xvpng.c  |  194 +++++++++++++++++++++++++++++++++++++--------------------------
 2 files changed, 117 insertions(+), 79 deletions(-)

--- NEW FILE xv-3.10a-libpng15.patch ---
--- xvinfo.c
+++ xvinfo.c
@@ -26,7 +26,7 @@
 #define INFOHIGH 270
 
 /* max length of an Info String */
-#define ISTRLEN 80
+#define ISTRLEN 256
 
 /* baseline of top line of text */
 #define TOPBASE (36 + penn_height/2 + 4 + 8 + ASCENT)
--- 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,9 @@
 #define COMPRESSION   6     /* default zlib compression level, not max
                                (Z_BEST_COMPRESSION) */
 
-#define HAVE_tRNS  (info_ptr->valid & PNG_INFO_tRNS)
+/* old
+#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
@@ -444,6 +447,10 @@
   byte       *p, *png_line;
   char        software[256];
   char       *savecmnt;
+  /* for storing values until all are accumulated, so that the image header can be set in full */
+  int         _bit_depth,_color_type,_interlace_type,_compression_type,_filter_type;
+  png_uint_32 _width,_height;
+  png_time    _mod_time;
 
   if ((png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL,
        png_xv_error, png_xv_warning)) == NULL) {
@@ -458,7 +465,7 @@
     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 +496,8 @@
     png_set_filter(png_ptr, 0, filter);
   }
 
-  info_ptr->width = w;
-  info_ptr->height = h;
+  _width = w;
+  _height = h;
   if (w <= 0 || h <= 0) {
     SetISTR(ISTR_WARNING, "%s:  image dimensions out of range (%dx%d)",
       fbasename, w, h);
@@ -498,7 +505,7 @@
     return -1;
   }
 
-  info_ptr->interlace_type = interCB.val ? 1 : 0;
+  _interlace_type = interCB.val ? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE;
 
   linesize = 0;   /* quiet a compiler warning */
 
@@ -542,40 +549,44 @@
         png_destroy_write_struct(&png_ptr, &info_ptr);
         return -1;
       }
-      info_ptr->color_type = PNG_COLOR_TYPE_RGB;
-      info_ptr->bit_depth = 8;
+      _color_type = PNG_COLOR_TYPE_RGB;
+      _bit_depth = 8;
     } else /* ptype == PIC8 */ {
       linesize = w;
-      info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;
+      _color_type = PNG_COLOR_TYPE_PALETTE;
       if (numuniqcols <= 2)
-        info_ptr->bit_depth = 1;
+        _bit_depth = 1;
       else
       if (numuniqcols <= 4)
-        info_ptr->bit_depth = 2;
+        _bit_depth = 2;
       else
       if (numuniqcols <= 16)
-        info_ptr->bit_depth = 4;
+        _bit_depth = 4;
       else
-        info_ptr->bit_depth = 8;
+        _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;
+/* cannot find a setter for this, unsure if it is necessary anymore...
       info_ptr->valid |= PNG_INFO_PLTE;
+*/
+      /* set the header just in case it's needed */
+      png_set_IHDR(png_ptr,info_ptr,_width,_height,_bit_depth,_color_type,
+        _interlace_type,PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT);
+      png_set_PLTE(png_ptr,info_ptr,palette,numuniqcols);
     }
   }
 
   else if (colorType == F_GREYSCALE || colorType == F_BWDITHER) {
-    info_ptr->color_type = PNG_COLOR_TYPE_GRAY;
+    _color_type = PNG_COLOR_TYPE_GRAY;
     if (colorType == F_BWDITHER) {
       /* shouldn't happen */
       if (ptype == PIC24) FatalError("PIC24 and B/W Stipple in WritePNG()");
 
-      info_ptr->bit_depth = 1;
+      _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 +606,7 @@
           png_destroy_write_struct(&png_ptr, &info_ptr);
           return -1;
         }
-        info_ptr->bit_depth = 8;
+        _bit_depth = 8;
       }
       else /* ptype == PIC8 */ {
         int low_precision;
@@ -617,7 +628,7 @@
         for (; i < 256; i++)
           remap[i]=0;  /* shouldn't be necessary, but... */
 
-        info_ptr->bit_depth = 8;
+        _bit_depth = 8;
 
         /* Note that this fails most of the time because of gamma */
            /* (and that would be a bug:  GRR FIXME) */
@@ -636,7 +647,7 @@
           for (i = 0; i < numuniqcols; i++) {
             remap[i] &= 0xf;
           }
-          info_ptr->bit_depth = 4;
+          _bit_depth = 4;
 
           /* try to adjust to 2-bit precision grayscale */
 
@@ -652,7 +663,7 @@
           for (i = 0; i < numuniqcols; i++) {
             remap[i] &= 3;
           }
-          info_ptr->bit_depth = 2;
+          _bit_depth = 2;
 
           /* try to adjust to 1-bit precision grayscale */
 
@@ -668,7 +679,7 @@
           for (i = 0; i < numuniqcols; i++) {
             remap[i] &= 1;
           }
-          info_ptr->bit_depth = 1;
+          _bit_depth = 1;
         }
       }
     }
@@ -677,6 +688,9 @@
   else
     png_error(png_ptr, "Unknown colorstyle in WritePNG");
 
+  png_set_IHDR(png_ptr,info_ptr,_width,_height,_bit_depth,_color_type,
+    _interlace_type,PNG_COMPRESSION_TYPE_DEFAULT,PNG_FILTER_TYPE_DEFAULT);
+
   if ((text = (png_textp)malloc(sizeof(png_text)))) {
     sprintf(software, "XV %s", REVDATE);
 
@@ -685,20 +699,22 @@
     text->text = software;
     text->text_length = strlen(text->text);
 
-    info_ptr->max_text = 1;
-    info_ptr->num_text = 1;
-    info_ptr->text = text;
+/* max_text seems to be internal only now, do not set
+    info_ptr->max_text = 1; */
+    png_set_text(png_ptr,info_ptr,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;
+  png_set_gAMA(png_ptr,info_ptr,1.0/gDial.val);
+/* doesn't seem to be a way to set valid directly anymore, unnecessary maybe.. 
+  info_ptr->valid |= PNG_INFO_gAMA; */
 
+/* might need to be png_write_info_before_PLTE() ... */
   png_write_info(png_ptr, info_ptr);
 
-  if (info_ptr->bit_depth < 8)
+  if (_bit_depth < 8)
     png_set_packing(png_ptr);
 
   pass=png_set_interlace_handling(png_ptr);
@@ -711,13 +727,13 @@
     int j;
     p = pic;
     for (j = 0; j < h; ++j) {
-      if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY) {
+      if (_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 (_color_type == PNG_COLOR_TYPE_PALETTE) {
         int k;
         for (k = 0; k < w; ++k)
           png_line[k] = pc2nc[p[k]];
@@ -739,28 +755,31 @@
         (savecmnt = (char *)malloc((strlen(picComments) + 1)*sizeof(char)))) {
       png_textp tp;
       char *comment, *key;
+      int nt;
+      int mt;
 
       strcpy(savecmnt, picComments);
       key = savecmnt;
+      png_get_text(png_ptr,info_ptr,&tp,&mt); /* to get 'max_text' */
       tp = text;
-      info_ptr->num_text = 0;
+      nt = 0;      
 
       comment = strchr(key, ':');
 
       do  {
         /* Allocate a larger structure for comments if necessary */
-        if (info_ptr->num_text >= info_ptr->max_text)
+        if (nt >= mt)
         {
           if ((tp =
-              realloc(text, (info_ptr->num_text + 2)*sizeof(png_text))) == NULL)
+              realloc(text, (nt + 2)*sizeof(png_text))) == NULL)
           {
             break;
           }
           else
           {
             text = tp;
-            tp = &text[info_ptr->num_text];
-            info_ptr->max_text += 2;
+            tp = &text[nt];
+            mt += 2;
           }
         }
 
@@ -810,7 +829,7 @@
             }
 
             tp->compression = tp->text_length > 640 ? 0 : -1;
-            info_ptr->num_text++;
+            nt++;
             tp++;
           }
         }
@@ -834,27 +853,29 @@
           tp->text = key;
           tp->text_length = q - key;
           tp->compression = tp->text_length > 750 ? 0 : -1;
-          info_ptr->num_text++;
+          nt++;
           key = NULL;
         }
       } while (key && *key);
+      png_set_text(png_ptr,info_ptr,text,nt);
     }
     else {
-      info_ptr->num_text = 0;
+      png_set_text(png_ptr,info_ptr,text,0);
     }
   }
-  info_ptr->text = text;
 
-  png_convert_from_time_t(&(info_ptr->mod_time), time(NULL));
-  info_ptr->valid |= PNG_INFO_tIME;
+  png_convert_from_time_t(&_mod_time, time(NULL));
+  png_set_tIME(png_ptr,info_ptr,&_mod_time);
+/* dunno how to set validity
+  info_ptr->valid |= PNG_INFO_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;
+    /* 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 +907,14 @@
   int pass;
   int gray_to_rgb;
   size_t commentsize;
+  /* temp storage vars for libpng15 migration */
+  int         _bit_depth,_color_type,_interlace_type,_compression_type,_filter_type,_num_text,_num_palette;
+  png_uint_32 _width,_height;
+  png_timep   _mod_time;
+  double      _gamma;
+  png_textp   _text;
+  png_colorp  _palette;
+  png_color_16p _background;
 
   fbasename = BaseName(fname);
 
@@ -921,7 +950,7 @@
     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 +974,10 @@
 #endif
   png_read_info(png_ptr, info_ptr);
 
-  pinfo->w = pinfo->normw = info_ptr->width;
-  pinfo->h = pinfo->normh = info_ptr->height;
+  png_get_IHDR(png_ptr,info_ptr,&_width,&_height,&_bit_depth,&_color_type,&_interlace_type,NULL,NULL);
+
+  pinfo->w = pinfo->normw = _width;
+  pinfo->h = pinfo->normh = _height;
   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 +988,9 @@
   pinfo->frmType = F_PNG;
 
   sprintf(pinfo->fullInfo, "PNG, %d bit ",
-          info_ptr->bit_depth * info_ptr->channels);
+          _bit_depth * png_get_channels(png_ptr,info_ptr));
 
-  switch(info_ptr->color_type) {
+  switch(_color_type) {
     case PNG_COLOR_TYPE_PALETTE:
       strcat(pinfo->fullInfo, "palette color");
       break;
@@ -983,15 +1014,17 @@
 
   sprintf(pinfo->fullInfo + strlen(pinfo->fullInfo),
 	  ", %sinterlaced. (%d bytes)",
-	  info_ptr->interlace_type ? "" : "non-", filesize);
+	  _interlace_type ? "" : "non-", filesize);
 
-  sprintf(pinfo->shrtInfo, "%lux%lu PNG", info_ptr->width, info_ptr->height);
+  sprintf(pinfo->shrtInfo, "%lux%lu PNG", _width, _height);
 
-  if (info_ptr->bit_depth < 8)
+  if (_bit_depth < 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)) {
+    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 +1033,7 @@
   gray_to_rgb = 0;   /* quiet a compiler warning */
 
   if (have_imagebg) {
-    if (info_ptr->bit_depth == 16) {
+    if (_bit_depth == 16) {
       my_background.red   = imagebgR;
       my_background.green = imagebgG;
       my_background.blue  = imagebgB;
@@ -1013,8 +1046,8 @@
     }
     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 ((_color_type == PNG_COLOR_TYPE_GRAY_ALPHA ||
+         (_color_type == PNG_COLOR_TYPE_GRAY && HAVE_tRNS)) &&
         (imagebgR != imagebgG || imagebgR != imagebgB))  /* i.e., colored bg */
     {
       png_set_gray_to_rgb(png_ptr);
@@ -1022,8 +1055,9 @@
       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_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 +1067,13 @@
     }
   }
 
-  if (info_ptr->bit_depth == 16)
+  if (_bit_depth == 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 (_color_type == PNG_COLOR_TYPE_GRAY ||
+      _color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
   {
-    if (info_ptr->bit_depth == 1)
+    if (_bit_depth == 1)
       pinfo->colType = F_BWDITHER;
     else
       pinfo->colType = F_GREYSCALE;
@@ -1049,9 +1083,11 @@
   pass=png_set_interlace_handling(png_ptr);
 
   png_read_update_info(png_ptr, info_ptr);
+  /* get HIDR again just in case the info_ptr changed */
+  png_get_IHDR(png_ptr,info_ptr,&_width,&_height,&_bit_depth,&_color_type,&_interlace_type,NULL,NULL);
 
-  if (info_ptr->color_type == PNG_COLOR_TYPE_RGB ||
-     info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || gray_to_rgb)
+  if (_color_type == PNG_COLOR_TYPE_RGB ||
+     _color_type == 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 +1101,17 @@
   } 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 (_color_type == PNG_COLOR_TYPE_GRAY ||
+       _color_type == PNG_COLOR_TYPE_GRAY_ALPHA) {
       for (i = 0; i < 256; i++)
         pinfo->r[i] = pinfo->g[i] = pinfo->b[i] = i;
     } else {
       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;
+      png_get_PLTE(png_ptr,info_ptr,&_palette,&_num_palette);
+      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 +1129,7 @@
     png_error(png_ptr, "can't allocate space for PNG image");
   }
 
-  png_start_read_image(png_ptr);
+  /*png_start_read_image(png_ptr); -- causes a warning and seems to be unnecessary */
 
   for (i = 0; i < pass; i++) {
     byte *p = pinfo->pic;
@@ -1106,22 +1143,23 @@
 
   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 +1181,7 @@
 {
   SetISTR(ISTR_WARNING,"%s:  libpng error: %s", fbasename, message);
 
-  longjmp(png_ptr->jmpbuf, 1);
+  longjmp(png_jmpbuf(png_ptr), 1);
 }
 
 


Index: xv.spec
===================================================================
RCS file: /cvs/nonfree/rpms/xv/devel/xv.spec,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- xv.spec	8 Sep 2011 00:47:27 -0000	1.7
+++ xv.spec	9 Dec 2011 14:17:10 -0000	1.8
@@ -3,7 +3,7 @@
 
 Name: xv
 Version: %{vprog}.jumbopatch.%{vjumbo}
-Release: 12%{?dist}
+Release: 13%{?dist}
 Summary: Interactive image display program for X
 Summary(de.UTF-8): X-basierender Bild-Viewer für praktische sämtliche Grafiken
 Summary(es.UTF-8): Visualizador de imágenes para X para cuasi todos los formatos de imágenes
@@ -28,6 +28,7 @@
 Patch2: xv-3.10a-cleanup.patch
 Patch3: xv-FLmask.v2.1.patch
 Patch4: xv-wait.patch
+Patch5: xv-3.10a-libpng15.patch
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires: libtiff-devel libpng-devel jasper-devel desktop-file-utils
 %if "%{?rhel}" != "4"
@@ -138,6 +139,9 @@
 # replace CLK_TCK with sysconf(_SC_CLK_TCK)
 %patch4 -p1
 
+# libpng 1.5 compatibility
+%patch5 -p0
+
 # Include permission to distribute
 %{__install} -m 0644 -p %{SOURCE2} .
 
@@ -273,6 +277,9 @@
 %doc %{_docdir}/%{name}-%{vprog}/manuals/
 
 %changelog
+* Fri Dec  9 2011 Paul Howarth <paul at city-fan.org> 3.10a.jumbopatch.20070520-13
+- add patch from Gentoo for libpng 1.5 compatibility
+
 * Wed Sep 07 2011 Gabriel Somlo <somlo at cmu.edu> 3.10a.jumbopatch.20070520-12
 - fix wait timer (BZ 1929, thanks to Sjoerd Mullender <sjoerd at acm.org>)
 



More information about the rpmfusion-commits mailing list