PNG re-work: provide perl level access to the libpng version number
authorTony Cook <tony@develop-help.com>
Tue, 14 Jun 2011 13:34:11 +0000 (23:34 +1000)
committerTony Cook <tony@develop-help.com>
Sun, 29 Apr 2012 03:40:55 +0000 (13:40 +1000)
PNG/PNG.xs
PNG/impng.c
PNG/impng.h
PNG/t/10png.t

index af23586..cc90923 100644 (file)
@@ -22,5 +22,8 @@ i_writepng_wiol(im, ig)
     Imager::ImgRaw     im
         Imager::IO     ig
 
+unsigned
+i_png_lib_version()
+
 BOOT:
        PERL_INITIALIZE_IMAGER_CALLBACKS;
index d831eb3..a42c3d2 100644 (file)
@@ -29,7 +29,10 @@ static int CC2C[PNG_COLOR_MASK_PALETTE|PNG_COLOR_MASK_COLOR|PNG_COLOR_MASK_ALPHA
 
 #define PNG_BYTES_TO_CHECK 4
  
-
+unsigned
+i_png_lib_version(void) {
+  return png_access_version_number();
+}
 
 static void
 wiol_read_data(png_structp png_ptr, png_bytep data, png_size_t length) {
@@ -115,6 +118,7 @@ i_writepng_wiol(i_img *im, io_glue *ig) {
    * implementation ever matches the documentation.
    *
    * https://sourceforge.net/tracker/?func=detail&atid=105624&aid=3314943&group_id=5624
+   * fixed in libpng 1.5.3
   */
   if (width > PNG_DIM_MAX || height > PNG_DIM_MAX) {
     i_push_error(0, "Image too large for PNG");
@@ -251,6 +255,8 @@ i_readpng_wiol(io_glue *ig) {
   int channels,pass;
   unsigned int sig_read;
   i_png_read_state rs;
+  i_img_dim wmax, hmax;
+  size_t bytes;
 
   rs.warnings = NULL;
   sig_read  = 0;
@@ -280,6 +286,9 @@ i_readpng_wiol(io_glue *ig) {
     cleanup_read_state(&rs);
     return NULL;
   }
+  
+  /* we do our own limit checks */
+  png_set_user_limits(png_ptr, PNG_DIM_MAX, PNG_DIM_MAX);
 
   png_set_sig_bytes(png_ptr, sig_read);
   png_read_info(png_ptr, info_ptr);
index afd5af1..ed4f180 100644 (file)
@@ -5,5 +5,6 @@
 
 i_img    *i_readpng_wiol(io_glue *ig);
 undef_int i_writepng_wiol(i_img *im, io_glue *ig);
+unsigned i_png_lib_version(void);
 
 #endif
index 759a266..1d3b3e4 100644 (file)
@@ -15,6 +15,8 @@ $Imager::formats{"png"}
 
 plan tests => 39;
 
+diag("Library version " . Imager::File::PNG::i_png_lib_version());
+
 my $green  = i_color_new(0,   255, 0,   255);
 my $blue   = i_color_new(0,   0,   255, 255);
 my $red    = i_color_new(255, 0,   0,   255);