Mon Jan 2 22:43:49 2012 UTC ()
Update the png handling file in the included copy of vigra from pkgsrc
vigra (which is 1.8.0) to fix build with recent libpng.

I'm not sure if the resolution handling changes (search for "254") are
desirable or not. if something goes wrong, try reverting that.

The package should probably be changed to use pkgsrc vigra, but I
don't want to do that right now.


(dholland)
diff -r1.8 -r1.9 pkgsrc/graphics/hugin/distinfo
diff -r0 -r1.1 pkgsrc/graphics/hugin/patches/patch-src_foreign_vigra_vigra__impex_png_cxx

cvs diff -r1.8 -r1.9 pkgsrc/graphics/hugin/distinfo (expand / switch to unified diff)

--- pkgsrc/graphics/hugin/distinfo 2011/01/13 13:52:53 1.8
+++ pkgsrc/graphics/hugin/distinfo 2012/01/02 22:43:48 1.9
@@ -1,7 +1,8 @@ @@ -1,7 +1,8 @@
1$NetBSD: distinfo,v 1.8 2011/01/13 13:52:53 wiz Exp $ 1$NetBSD: distinfo,v 1.9 2012/01/02 22:43:48 dholland Exp $
2 2
3SHA1 (hugin-2010.4.0.tar.bz2) = 47f25c0a8b97c27108e567bcd22203c87f268d07 3SHA1 (hugin-2010.4.0.tar.bz2) = 47f25c0a8b97c27108e567bcd22203c87f268d07
4RMD160 (hugin-2010.4.0.tar.bz2) = f97b8d37470443eb81c3e915e5f5efa91227b135 4RMD160 (hugin-2010.4.0.tar.bz2) = f97b8d37470443eb81c3e915e5f5efa91227b135
5Size (hugin-2010.4.0.tar.bz2) = 11009978 bytes 5Size (hugin-2010.4.0.tar.bz2) = 11009978 bytes
6SHA1 (patch-ab) = 6faee5f634ff3af345f909b41f03d1a8cdc414b5 6SHA1 (patch-ab) = 6faee5f634ff3af345f909b41f03d1a8cdc414b5
7SHA1 (patch-ac) = aac60aa6d3b99a632fce03749660e10ea82ad028 7SHA1 (patch-ac) = aac60aa6d3b99a632fce03749660e10ea82ad028
 8SHA1 (patch-src_foreign_vigra_vigra__impex_png_cxx) = 43ee756664ca8232b3006b76f12fb8ef55711575

File Added: pkgsrc/graphics/hugin/patches/Attic/patch-src_foreign_vigra_vigra__impex_png_cxx
$NetBSD: patch-src_foreign_vigra_vigra__impex_png_cxx,v 1.1 2012/01/02 22:43:49 dholland Exp $

Update this file from pkgsrc vigra (1.8.0) to fix build with recent
libpng.

I'm not sure if the resolution handling changes (search for "254") are
desirable or not. if something goes wrong, try reverting that.

The package should probably be changed to use pkgsrc vigra, but I
don't want to do that right now.

--- src/foreign/vigra/vigra_impex/png.cxx.super	2012-01-02 22:34:57.000000000 +0000
+++ src/foreign/vigra/vigra_impex/png.cxx
@@ -78,7 +78,7 @@ extern "C" {
 static void PngError( png_structp png_ptr, png_const_charp error_msg )
 {
     png_error_message = std::string(error_msg);
-    longjmp( png_ptr->jmpbuf, 1 );
+    longjmp( png_jmpbuf(png_ptr), 1 );
 }
 
 // called on non-fatal errors
@@ -200,9 +200,9 @@ namespace vigra {
         // check if the file is a png file
         const unsigned int sig_size = 8;
         png_byte sig[sig_size];
-        std::fread( sig, sig_size, 1, file.get() );
+        std::size_t readCount = std::fread( sig, sig_size, 1, file.get() );
         const int no_png = png_sig_cmp( sig, 0, sig_size );
-        vigra_precondition( !no_png, "given file is not a png file.");
+        vigra_precondition( (readCount == 1) && !no_png, "given file is not a png file.");
 
         // create png read struct with user defined handlers
         png = png_create_read_struct( PNG_LIBPNG_VER_STRING, NULL,
@@ -210,7 +210,7 @@ namespace vigra {
         vigra_postcondition( png != 0, "could not create the read struct." );
 
         // create info struct
-        if (setjmp(png->jmpbuf)) {
+        if (setjmp(png_jmpbuf(png))) {
             png_destroy_read_struct( &png, &info, NULL );
             vigra_postcondition( false, png_error_message.insert(0, "error in png_create_info_struct(): ").c_str() );
         }
@@ -218,14 +218,14 @@ namespace vigra {
         vigra_postcondition( info != 0, "could not create the info struct." );
 
         // init png i/o
-        if (setjmp(png->jmpbuf)) {
+        if (setjmp(png_jmpbuf(png))) {
             png_destroy_read_struct( &png, &info, NULL );
             vigra_postcondition( false, png_error_message.insert(0, "error in png_init_io(): ").c_str() );
         }
         png_init_io( png, file.get() );
 
         // specify that the signature was already read
-        if (setjmp(png->jmpbuf)) {
+        if (setjmp(png_jmpbuf(png))) {
             png_destroy_read_struct( &png, &info, NULL );
             vigra_postcondition( false, png_error_message.insert(0, "error in png_set_sig_bytes(): ").c_str() );
         }
@@ -241,13 +241,13 @@ namespace vigra {
     void PngDecoderImpl::init()
     {
         // read all chunks up to the image data
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false, png_error_message.insert(0, "error in png_read_info(): ").c_str() );
         png_read_info( png, info );
 
         // pull over the header fields
         int interlace_method, compression_method, filter_method;
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false, png_error_message.insert(0, "error in png_get_IHDR(): ").c_str() );
         png_get_IHDR( png, info, &width, &height, &bit_depth, &color_type,
                       &interlace_method, &compression_method, &filter_method );
@@ -261,7 +261,7 @@ namespace vigra {
 
         // transform palette to rgb
         if ( color_type == PNG_COLOR_TYPE_PALETTE) {
-            if (setjmp(png->jmpbuf))
+            if (setjmp(png_jmpbuf(png)))
                 vigra_postcondition( false, png_error_message.insert(0, "error in png_palette_to_rgb(): ").c_str() );
             png_set_palette_to_rgb(png);
             color_type = PNG_COLOR_TYPE_RGB;
@@ -270,15 +270,10 @@ namespace vigra {
 
         // expand gray values to at least one byte size
         if ( color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8 ) {
-#if (PNG_LIBPNG_VER >= 10400)
-            if (setjmp(png->jmpbuf))
-                vigra_postcondition( false,png_error_message.insert(0, "error in png_set_expand_gray_1_2_4_to_8(): ").c_str());
+            if (setjmp(png_jmpbuf(png)))
+                vigra_postcondition(false,
+                                    png_error_message.insert(0, "error in png_set_expand_gray_1_2_4_to_8(): ").c_str());
             png_set_expand_gray_1_2_4_to_8(png);
-#else
-            if (setjmp(png->jmpbuf))
-                vigra_postcondition( false,png_error_message.insert(0, "error in png_set_gray_1_2_4_to_8(): ").c_str());
-            png_set_gray_1_2_4_to_8(png);
-#endif
             bit_depth = 8;
         }
 
@@ -286,7 +281,7 @@ namespace vigra {
 #if 0
         // strip alpha channel
         if ( color_type & PNG_COLOR_MASK_ALPHA ) {
-            if (setjmp(png->jmpbuf))
+            if (setjmp(png_jmpbuf(png)))
                 vigra_postcondition( false, png_error_message.insert(0, "error in png_set_strip_alpha(): ").c_str() );
             png_set_strip_alpha(png);
             color_type ^= PNG_COLOR_MASK_ALPHA;
@@ -317,8 +312,8 @@ namespace vigra {
         }
 
         // read resolution
-        x_resolution = png_get_x_pixels_per_meter( png, info ) / 254.0;
-        y_resolution = png_get_y_pixels_per_meter( png, info ) / 254.0;
+        x_resolution = png_get_x_pixels_per_meter( png, info ) * 0.0254f;
+        y_resolution = png_get_y_pixels_per_meter( png, info ) * 0.0254f;
 
         // read offset
         position.x = png_get_x_offset_pixels( png, info );
@@ -328,9 +323,13 @@ namespace vigra {
 #if (PNG_LIBPNG_VER > 10008) && defined(PNG_READ_iCCP_SUPPORTED)
         char * dummyName;
         int dummyCompType;
+#if (PNG_LIBPNG_VER < 10500)
         char * profilePtr;
+#else
+        png_byte * profilePtr;
+#endif
         png_uint_32 profileLen;
-        if (info->valid & PNG_INFO_iCCP) {
+        if (png_get_valid( png, info, PNG_INFO_iCCP )) {
             png_get_iCCP(png, info, &dummyName, &dummyCompType, &profilePtr, &profileLen) ;
             iccProfilePtr = (unsigned char *) profilePtr;
             iccProfileLength = profileLen;
@@ -343,7 +342,7 @@ namespace vigra {
         // image gamma
         double image_gamma = 0.45455;
         if ( png_get_valid( png, info, PNG_INFO_gAMA ) ) {
-            if (setjmp(png->jmpbuf))
+            if (setjmp(png_jmpbuf(png)))
                 vigra_postcondition( false, png_error_message.insert(0, "error in png_get_gAMA(): ").c_str() );
             png_get_gAMA( png, info, &image_gamma );
         }
@@ -352,26 +351,26 @@ namespace vigra {
         double screen_gamma = 2.2;
 
         // set gamma correction
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false, png_error_message.insert(0, "error in png_set_gamma(): ").c_str() );
         png_set_gamma( png, screen_gamma, image_gamma );
 #endif
 
         // interlace handling, get number of read passes needed
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false,png_error_message.insert(0, "error in png_set_interlace_handling(): ").c_str());
         n_interlace_passes = png_set_interlace_handling(png);
 
         // update png library state to reflect any changes that were made
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false, png_error_message.insert(0, "error in png_read_update_info(): ").c_str() );
         png_read_update_info( png, info );
 
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false,png_error_message.insert(0, "error in png_get_channels(): ").c_str());
         n_channels = png_get_channels(png, info);
 
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false,png_error_message.insert(0, "error in png_get_rowbytes(): ").c_str());
         rowsize = png_get_rowbytes(png, info);
 
@@ -381,9 +380,10 @@ namespace vigra {
 
     void PngDecoderImpl::nextScanline()
     {
-        for (int i=0; i < n_interlace_passes; i++) {
-        if (setjmp(png->jmpbuf))
-                vigra_postcondition( false,png_error_message.insert(0, "error in png_read_row(): ").c_str());
+        if (setjmp(png_jmpbuf(png)))
+            vigra_postcondition( false,png_error_message.insert(0, "error in png_read_row(): ").c_str());        
+        for (int i=0; i < n_interlace_passes; i++) 
+        {
             png_read_row(png, row_data.begin(), NULL);
         }
     }
@@ -548,7 +548,7 @@ namespace vigra {
         vigra_postcondition( png != 0, "could not create the write struct." );
 
         // create info struct
-        if (setjmp(png->jmpbuf)) {
+        if (setjmp(png_jmpbuf(png))) {
             png_destroy_write_struct( &png, &info );
             vigra_postcondition( false, png_error_message.insert(0, "error in png_info_struct(): ").c_str() );
         }
@@ -559,7 +559,7 @@ namespace vigra {
         }
 
         // init png i/o
-        if (setjmp(png->jmpbuf)) {
+        if (setjmp(png_jmpbuf(png))) {
             png_destroy_write_struct( &png, &info );
             vigra_postcondition( false, png_error_message.insert(0, "error in png_init_io(): ").c_str() );
         }
@@ -574,7 +574,7 @@ namespace vigra {
     void PngEncoderImpl::finalize()
     {
         // write the IHDR
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false, png_error_message.insert(0, "error in png_set_IHDR(): ").c_str() );
         png_set_IHDR( png, info, width, height, bit_depth, color_type,
                       PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT,
@@ -582,16 +582,16 @@ namespace vigra {
 
         // set resolution
         if (x_resolution > 0 && y_resolution > 0) {
-            if (setjmp(png->jmpbuf))
+            if (setjmp(png_jmpbuf(png)))
                 vigra_postcondition( false, png_error_message.insert(0, "error in png_set_pHYs(): ").c_str() );
-            png_set_pHYs(png, info, (png_uint_32) (x_resolution * 254 + 0.5),
-                         (png_uint_32) (y_resolution * 254 + 0.5),
+            png_set_pHYs(png, info, (png_uint_32) (x_resolution / 0.0254 + 0.5),
+                         (png_uint_32) (y_resolution / 0.0254 + 0.5),
                          PNG_RESOLUTION_METER);
         }
 
         // set offset
         if (position.x > 0 && position.y > 0) {
-            if (setjmp(png->jmpbuf))
+            if (setjmp(png_jmpbuf(png)))
                 vigra_postcondition( false, png_error_message.insert(0, "error in png_set_oFFs(): ").c_str() );
             png_set_oFFs(png, info, position.x, position.y, PNG_OFFSET_PIXEL);
         }
@@ -599,13 +599,17 @@ namespace vigra {
 #if (PNG_LIBPNG_VER > 10008) && defined(PNG_WRITE_iCCP_SUPPORTED)
         // set icc profile
         if (iccProfile.size() > 0) {
-            png_set_iCCP(png, info, "icc", 0,
-                         (char *)iccProfile.begin(), iccProfile.size());
+            png_set_iCCP(png, info, (png_charp)("icc"), 0,
+#if (PNG_LIBPNG_VER < 10500)
+                         (png_charp)iccProfile.begin(), (png_uint_32)iccProfile.size());
+#else
+                         (png_byte*)iccProfile.begin(), (png_uint_32)iccProfile.size());
+#endif
         }
 #endif
 
         // write the info struct
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false, png_error_message.insert(0, "error in png_write_info(): ").c_str() );
         png_write_info( png, info );
 
@@ -637,10 +641,10 @@ namespace vigra {
         }
 
         // write the whole image
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false, png_error_message.insert(0, "error in png_write_image(): ").c_str() );
         png_write_image( png, row_pointers.begin() );
-        if (setjmp(png->jmpbuf))
+        if (setjmp(png_jmpbuf(png)))
             vigra_postcondition( false, png_error_message.insert(0, "error in png_write_end(): ").c_str() );
         png_write_end(png, info);
     }
@@ -688,8 +692,7 @@ namespace vigra {
         pimpl->components = bands;
     }
 
-    void PngEncoder::setCompressionType( const std::string & comp,
-                                         int quality )
+    void PngEncoder::setCompressionType( const std::string & /* comp */, int /* quality */)
     {
         // nothing is settable => do nothing
     }