diff options
Diffstat (limited to 'src/libpng')
| -rw-r--r-- | src/libpng/png.c | 560 | ||||
| -rw-r--r-- | src/libpng/png.h | 227 | ||||
| -rw-r--r-- | src/libpng/pngconf.h | 61 | ||||
| -rw-r--r-- | src/libpng/pngerror.c | 108 | ||||
| -rw-r--r-- | src/libpng/pnggccrd.c | 4 | ||||
| -rw-r--r-- | src/libpng/pngget.c | 206 | ||||
| -rw-r--r-- | src/libpng/pngmem.c | 123 | ||||
| -rw-r--r-- | src/libpng/pngpread.c | 292 | ||||
| -rw-r--r-- | src/libpng/pngread.c | 376 | ||||
| -rw-r--r-- | src/libpng/pngrio.c | 63 | ||||
| -rw-r--r-- | src/libpng/pngrtran.c | 646 | ||||
| -rw-r--r-- | src/libpng/pngrutil.c | 867 | ||||
| -rw-r--r-- | src/libpng/pngset.c | 785 | ||||
| -rw-r--r-- | src/libpng/pngtrans.c | 102 | ||||
| -rw-r--r-- | src/libpng/pngwio.c | 124 | ||||
| -rw-r--r-- | src/libpng/pngwrite.c | 420 | ||||
| -rw-r--r-- | src/libpng/pngwtran.c | 34 | ||||
| -rw-r--r-- | src/libpng/pngwutil.c | 916 | 
18 files changed, 3336 insertions, 2578 deletions
| diff --git a/src/libpng/png.c b/src/libpng/png.c index 40dd854..62b86e1 100644 --- a/src/libpng/png.c +++ b/src/libpng/png.c @@ -1,9 +1,9 @@  /* png.c - location for general purpose libpng functions   * - * Last changed in libpng 1.2.21 October 4, 2007 + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   */ @@ -13,7 +13,7 @@  #include "png.h"  /* Generate a compiler error if there is an old png.h in the search path. */ -typedef version_1_2_22 Your_png_h_is_not_version_1_2_22; +typedef version_1_2_37 Your_png_h_is_not_version_1_2_37;  /* Version information for C files.  This had better match the version   * string defined in png.h.  */ @@ -53,18 +53,18 @@ PNG_tRNS;  PNG_zTXt;  #ifdef PNG_READ_SUPPORTED -/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ +/* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ -/* start of interlace block */ +/* Start of interlace block */  PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; -/* offset to next interlace block */ +/* Offset to next interlace block */  PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; -/* start of interlace block in the y direction */ +/* Start of interlace block in the y direction */  PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; -/* offset to next interlace block in the y direction */ +/* Offset to next interlace block in the y direction */  PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};  /* Height of interlace block.  This is not currently used - if you need @@ -92,8 +92,9 @@ PNG_CONST int FARDATA png_pass_dsp_mask[]  void PNGAPI  png_set_sig_bytes(png_structp png_ptr, int num_bytes)  { -   if(png_ptr == NULL) return; -   png_debug(1, "in png_set_sig_bytes\n"); +   if (png_ptr == NULL) +      return; +   png_debug(1, "in png_set_sig_bytes");     if (num_bytes > 8)        png_error(png_ptr, "Too many bytes for PNG signature."); @@ -153,7 +154,8 @@ png_zalloc(voidpf png_ptr, uInt items, uInt size)     png_uint_32 save_flags=p->flags;     png_uint_32 num_bytes; -   if(png_ptr == NULL) return (NULL); +   if (png_ptr == NULL) +      return (NULL);     if (items > PNG_UINT_32_MAX/size)     {       png_warning (p, "Potential overflow in png_zalloc()"); @@ -183,7 +185,7 @@ png_zalloc(voidpf png_ptr, uInt items, uInt size)     return ((voidpf)ptr);  } -/* function to free memory for zlib */ +/* Function to free memory for zlib */  #ifdef PNG_1_0_X  void PNGAPI  #else @@ -240,8 +242,9 @@ png_create_info_struct(png_structp png_ptr)  {     png_infop info_ptr; -   png_debug(1, "in png_create_info_struct\n"); -   if(png_ptr == NULL) return (NULL); +   png_debug(1, "in png_create_info_struct"); +   if (png_ptr == NULL) +      return (NULL);  #ifdef PNG_USER_MEM_SUPPORTED     info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,        png_ptr->malloc_fn, png_ptr->mem_ptr); @@ -263,9 +266,10 @@ void PNGAPI  png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)  {     png_infop info_ptr = NULL; -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return; -   png_debug(1, "in png_destroy_info_struct\n"); +   png_debug(1, "in png_destroy_info_struct");     if (info_ptr_ptr != NULL)        info_ptr = *info_ptr_ptr; @@ -302,19 +306,20 @@ png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)  {     png_infop info_ptr = *ptr_ptr; -   if(info_ptr == NULL) return; +   if (info_ptr == NULL) +      return; -   png_debug(1, "in png_info_init_3\n"); +   png_debug(1, "in png_info_init_3"); -   if(png_sizeof(png_info) > png_info_struct_size) -     { -       png_destroy_struct(info_ptr); -       info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); -       *ptr_ptr = info_ptr; -     } +   if (png_sizeof(png_info) > png_info_struct_size) +   { +      png_destroy_struct(info_ptr); +      info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); +      *ptr_ptr = info_ptr; +   } -   /* set everything to 0 */ -   png_memset(info_ptr, 0, png_sizeof (png_info)); +   /* Set everything to 0 */ +   png_memset(info_ptr, 0, png_sizeof(png_info));  }  #ifdef PNG_FREE_ME_SUPPORTED @@ -322,12 +327,12 @@ void PNGAPI  png_data_freer(png_structp png_ptr, png_infop info_ptr,     int freer, png_uint_32 mask)  { -   png_debug(1, "in png_data_freer\n"); +   png_debug(1, "in png_data_freer");     if (png_ptr == NULL || info_ptr == NULL)        return; -   if(freer == PNG_DESTROY_WILL_FREE_DATA) +   if (freer == PNG_DESTROY_WILL_FREE_DATA)        info_ptr->free_me |= mask; -   else if(freer == PNG_USER_WILL_FREE_DATA) +   else if (freer == PNG_USER_WILL_FREE_DATA)        info_ptr->free_me &= ~mask;     else        png_warning(png_ptr, @@ -339,249 +344,250 @@ void PNGAPI  png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,     int num)  { -   png_debug(1, "in png_free_data\n"); +   png_debug(1, "in png_free_data");     if (png_ptr == NULL || info_ptr == NULL)        return;  #if defined(PNG_TEXT_SUPPORTED) -/* free text item num or (if num == -1) all text items */ +   /* Free text item num or (if num == -1) all text items */  #ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) +   if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)  #else -if (mask & PNG_FREE_TEXT) +   if (mask & PNG_FREE_TEXT)  #endif -{ -   if (num != -1) -   { -     if (info_ptr->text && info_ptr->text[num].key) -     { -         png_free(png_ptr, info_ptr->text[num].key); -         info_ptr->text[num].key = NULL; -     } -   } -   else     { -       int i; -       for (i = 0; i < info_ptr->num_text; i++) -           png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); -       png_free(png_ptr, info_ptr->text); -       info_ptr->text = NULL; -       info_ptr->num_text=0; +      if (num != -1) +      { +         if (info_ptr->text && info_ptr->text[num].key) +         { +            png_free(png_ptr, info_ptr->text[num].key); +            info_ptr->text[num].key = NULL; +         } +      } +      else +      { +         int i; +         for (i = 0; i < info_ptr->num_text; i++) +             png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); +         png_free(png_ptr, info_ptr->text); +         info_ptr->text = NULL; +         info_ptr->num_text=0; +      }     } -}  #endif  #if defined(PNG_tRNS_SUPPORTED) -/* free any tRNS entry */ +   /* Free any tRNS entry */  #ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) +   if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)  #else -if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS)) +   if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))  #endif -{ -    png_free(png_ptr, info_ptr->trans); -    info_ptr->valid &= ~PNG_INFO_tRNS; +   { +      png_free(png_ptr, info_ptr->trans); +      info_ptr->trans = NULL; +      info_ptr->valid &= ~PNG_INFO_tRNS;  #ifndef PNG_FREE_ME_SUPPORTED -    png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; +      png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;  #endif -    info_ptr->trans = NULL; -} +   }  #endif  #if defined(PNG_sCAL_SUPPORTED) -/* free any sCAL entry */ +   /* Free any sCAL entry */  #ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) +   if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)  #else -if (mask & PNG_FREE_SCAL) +   if (mask & PNG_FREE_SCAL)  #endif -{ +   {  #if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) -    png_free(png_ptr, info_ptr->scal_s_width); -    png_free(png_ptr, info_ptr->scal_s_height); -    info_ptr->scal_s_width = NULL; -    info_ptr->scal_s_height = NULL; +      png_free(png_ptr, info_ptr->scal_s_width); +      png_free(png_ptr, info_ptr->scal_s_height); +      info_ptr->scal_s_width = NULL; +      info_ptr->scal_s_height = NULL;  #endif -    info_ptr->valid &= ~PNG_INFO_sCAL; -} +      info_ptr->valid &= ~PNG_INFO_sCAL; +   }  #endif  #if defined(PNG_pCAL_SUPPORTED) -/* free any pCAL entry */ +   /* Free any pCAL entry */  #ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) +   if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)  #else -if (mask & PNG_FREE_PCAL) +   if (mask & PNG_FREE_PCAL)  #endif -{ -    png_free(png_ptr, info_ptr->pcal_purpose); -    png_free(png_ptr, info_ptr->pcal_units); -    info_ptr->pcal_purpose = NULL; -    info_ptr->pcal_units = NULL; -    if (info_ptr->pcal_params != NULL) -    { -        int i; -        for (i = 0; i < (int)info_ptr->pcal_nparams; i++) -        { -          png_free(png_ptr, info_ptr->pcal_params[i]); -          info_ptr->pcal_params[i]=NULL; -        } -        png_free(png_ptr, info_ptr->pcal_params); -        info_ptr->pcal_params = NULL; -    } -    info_ptr->valid &= ~PNG_INFO_pCAL; -} +   { +      png_free(png_ptr, info_ptr->pcal_purpose); +      png_free(png_ptr, info_ptr->pcal_units); +      info_ptr->pcal_purpose = NULL; +      info_ptr->pcal_units = NULL; +      if (info_ptr->pcal_params != NULL) +         { +            int i; +            for (i = 0; i < (int)info_ptr->pcal_nparams; i++) +            { +               png_free(png_ptr, info_ptr->pcal_params[i]); +               info_ptr->pcal_params[i]=NULL; +            } +            png_free(png_ptr, info_ptr->pcal_params); +            info_ptr->pcal_params = NULL; +         } +      info_ptr->valid &= ~PNG_INFO_pCAL; +   }  #endif  #if defined(PNG_iCCP_SUPPORTED) -/* free any iCCP entry */ +   /* Free any iCCP entry */  #ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) +   if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)  #else -if (mask & PNG_FREE_ICCP) +   if (mask & PNG_FREE_ICCP)  #endif -{ -    png_free(png_ptr, info_ptr->iccp_name); -    png_free(png_ptr, info_ptr->iccp_profile); -    info_ptr->iccp_name = NULL; -    info_ptr->iccp_profile = NULL; -    info_ptr->valid &= ~PNG_INFO_iCCP; -} +   { +      png_free(png_ptr, info_ptr->iccp_name); +      png_free(png_ptr, info_ptr->iccp_profile); +      info_ptr->iccp_name = NULL; +      info_ptr->iccp_profile = NULL; +      info_ptr->valid &= ~PNG_INFO_iCCP; +   }  #endif  #if defined(PNG_sPLT_SUPPORTED) -/* free a given sPLT entry, or (if num == -1) all sPLT entries */ +   /* Free a given sPLT entry, or (if num == -1) all sPLT entries */  #ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) +   if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)  #else -if (mask & PNG_FREE_SPLT) +   if (mask & PNG_FREE_SPLT)  #endif -{ -   if (num != -1)     { -      if(info_ptr->splt_palettes) +      if (num != -1)        { -          png_free(png_ptr, info_ptr->splt_palettes[num].name); -          png_free(png_ptr, info_ptr->splt_palettes[num].entries); -          info_ptr->splt_palettes[num].name = NULL; -          info_ptr->splt_palettes[num].entries = NULL; +         if (info_ptr->splt_palettes) +         { +            png_free(png_ptr, info_ptr->splt_palettes[num].name); +            png_free(png_ptr, info_ptr->splt_palettes[num].entries); +            info_ptr->splt_palettes[num].name = NULL; +            info_ptr->splt_palettes[num].entries = NULL; +         } +      } +      else +      { +         if (info_ptr->splt_palettes_num) +         { +            int i; +            for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) +               png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i); + +            png_free(png_ptr, info_ptr->splt_palettes); +            info_ptr->splt_palettes = NULL; +            info_ptr->splt_palettes_num = 0; +         } +         info_ptr->valid &= ~PNG_INFO_sPLT;        }     } -   else -   { -       if(info_ptr->splt_palettes_num) -       { -         int i; -         for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) -            png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i); - -         png_free(png_ptr, info_ptr->splt_palettes); -         info_ptr->splt_palettes = NULL; -         info_ptr->splt_palettes_num = 0; -       } -       info_ptr->valid &= ~PNG_INFO_sPLT; -   } -}  #endif  #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -  if(png_ptr->unknown_chunk.data) -  { -    png_free(png_ptr, png_ptr->unknown_chunk.data); -    png_ptr->unknown_chunk.data = NULL; -  } +   if (png_ptr->unknown_chunk.data) +   { +      png_free(png_ptr, png_ptr->unknown_chunk.data); +      png_ptr->unknown_chunk.data = NULL; +   } +  #ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) +   if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)  #else -if (mask & PNG_FREE_UNKN) +   if (mask & PNG_FREE_UNKN)  #endif -{ -   if (num != -1)     { -       if(info_ptr->unknown_chunks) -       { -          png_free(png_ptr, info_ptr->unknown_chunks[num].data); -          info_ptr->unknown_chunks[num].data = NULL; -       } -   } -   else -   { -       int i; +      if (num != -1) +      { +          if (info_ptr->unknown_chunks) +          { +             png_free(png_ptr, info_ptr->unknown_chunks[num].data); +             info_ptr->unknown_chunks[num].data = NULL; +          } +      } +      else +      { +         int i; -       if(info_ptr->unknown_chunks_num) -       { -         for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++) -            png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); +         if (info_ptr->unknown_chunks_num) +         { +            for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++) +               png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); -         png_free(png_ptr, info_ptr->unknown_chunks); -         info_ptr->unknown_chunks = NULL; -         info_ptr->unknown_chunks_num = 0; -       } +            png_free(png_ptr, info_ptr->unknown_chunks); +            info_ptr->unknown_chunks = NULL; +            info_ptr->unknown_chunks_num = 0; +         } +      }     } -}  #endif  #if defined(PNG_hIST_SUPPORTED) -/* free any hIST entry */ +   /* Free any hIST entry */  #ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_HIST)  & info_ptr->free_me) +   if ((mask & PNG_FREE_HIST)  & info_ptr->free_me)  #else -if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST)) +   if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))  #endif -{ -    png_free(png_ptr, info_ptr->hist); -    info_ptr->hist = NULL; -    info_ptr->valid &= ~PNG_INFO_hIST; +   { +      png_free(png_ptr, info_ptr->hist); +      info_ptr->hist = NULL; +      info_ptr->valid &= ~PNG_INFO_hIST;  #ifndef PNG_FREE_ME_SUPPORTED -    png_ptr->flags &= ~PNG_FLAG_FREE_HIST; +      png_ptr->flags &= ~PNG_FLAG_FREE_HIST;  #endif -} +   }  #endif -/* free any PLTE entry that was internally allocated */ +   /* Free any PLTE entry that was internally allocated */  #ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) +   if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)  #else -if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE)) +   if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))  #endif -{ -    png_zfree(png_ptr, info_ptr->palette); -    info_ptr->palette = NULL; -    info_ptr->valid &= ~PNG_INFO_PLTE; +   { +      png_zfree(png_ptr, info_ptr->palette); +      info_ptr->palette = NULL; +      info_ptr->valid &= ~PNG_INFO_PLTE;  #ifndef PNG_FREE_ME_SUPPORTED -    png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; +      png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;  #endif -    info_ptr->num_palette = 0; -} +      info_ptr->num_palette = 0; +   }  #if defined(PNG_INFO_IMAGE_SUPPORTED) -/* free any image bits attached to the info structure */ +   /* Free any image bits attached to the info structure */  #ifdef PNG_FREE_ME_SUPPORTED -if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) +   if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)  #else -if (mask & PNG_FREE_ROWS) +   if (mask & PNG_FREE_ROWS)  #endif -{ -    if(info_ptr->row_pointers) -    { -       int row; -       for (row = 0; row < (int)info_ptr->height; row++) -       { -          png_free(png_ptr, info_ptr->row_pointers[row]); -          info_ptr->row_pointers[row]=NULL; -       } -       png_free(png_ptr, info_ptr->row_pointers); -       info_ptr->row_pointers=NULL; -    } -    info_ptr->valid &= ~PNG_INFO_IDAT; -} +   { +      if (info_ptr->row_pointers) +      { +         int row; +         for (row = 0; row < (int)info_ptr->height; row++) +         { +            png_free(png_ptr, info_ptr->row_pointers[row]); +            info_ptr->row_pointers[row]=NULL; +         } +         png_free(png_ptr, info_ptr->row_pointers); +         info_ptr->row_pointers=NULL; +      } +      info_ptr->valid &= ~PNG_INFO_IDAT; +   }  #endif  #ifdef PNG_FREE_ME_SUPPORTED -   if(num == -1) -     info_ptr->free_me &= ~mask; +   if (num == -1) +      info_ptr->free_me &= ~mask;     else -     info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL); +      info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);  #endif  } @@ -592,16 +598,16 @@ if (mask & PNG_FREE_ROWS)  void /* PRIVATE */  png_info_destroy(png_structp png_ptr, png_infop info_ptr)  { -   png_debug(1, "in png_info_destroy\n"); +   png_debug(1, "in png_info_destroy");     png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);  #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)     if (png_ptr->num_chunk_list)     { -       png_free(png_ptr, png_ptr->chunk_list); -       png_ptr->chunk_list=NULL; -       png_ptr->num_chunk_list=0; +      png_free(png_ptr, png_ptr->chunk_list); +      png_ptr->chunk_list=NULL; +      png_ptr->num_chunk_list = 0;     }  #endif @@ -616,7 +622,8 @@ png_info_destroy(png_structp png_ptr, png_infop info_ptr)  png_voidp PNGAPI  png_get_io_ptr(png_structp png_ptr)  { -   if(png_ptr == NULL) return (NULL); +   if (png_ptr == NULL) +      return (NULL);     return (png_ptr->io_ptr);  } @@ -631,8 +638,9 @@ png_get_io_ptr(png_structp png_ptr)  void PNGAPI  png_init_io(png_structp png_ptr, png_FILE_p fp)  { -   png_debug(1, "in png_init_io\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_init_io"); +   if (png_ptr == NULL) +      return;     png_ptr->io_ptr = (png_voidp)fp;  }  #endif @@ -648,7 +656,8 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)          {"Jan", "Feb", "Mar", "Apr", "May", "Jun",           "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; -   if(png_ptr == NULL) return (NULL); +   if (png_ptr == NULL) +      return (NULL);     if (png_ptr->time_buffer == NULL)     {        png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29* @@ -669,7 +678,7 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)  #ifdef USE_FAR_KEYWORD     {        char near_time_buf[29]; -      png_snprintf6(near_time_buf,29,"%d %s %d %02d:%02d:%02d +0000", +      png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000",            ptime->day % 32, short_months[(ptime->month - 1) % 12],            ptime->year, ptime->hour % 24, ptime->minute % 60,            ptime->second % 61); @@ -677,7 +686,7 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)            29*png_sizeof(char));     }  #else -   png_snprintf6(png_ptr->time_buffer,29,"%d %s %d %02d:%02d:%02d +0000", +   png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000",         ptime->day % 32, short_months[(ptime->month - 1) % 12],         ptime->year, ptime->hour % 24, ptime->minute % 60,         ptime->second % 61); @@ -692,9 +701,9 @@ png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)  png_charp PNGAPI  png_get_copyright(png_structp png_ptr)  { -   png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */ -   return ((png_charp) "\n libpng version 1.2.22 - October 13, 2007\n\ -   Copyright (c) 1998-2007 Glenn Randers-Pehrson\n\ +   png_ptr = png_ptr;  /* Silence compiler warning about unused png_ptr */ +   return ((png_charp) "\n libpng version 1.2.37 - June 4, 2009\n\ +   Copyright (c) 1998-2009 Glenn Randers-Pehrson\n\     Copyright (c) 1996-1997 Andreas Dilger\n\     Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n");  } @@ -711,7 +720,7 @@ png_charp PNGAPI  png_get_libpng_ver(png_structp png_ptr)  {     /* Version of *.c files used when building libpng */ -   png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */ +   png_ptr = png_ptr;  /* Silence compiler warning about unused png_ptr */     return ((png_charp) PNG_LIBPNG_VER_STRING);  } @@ -719,7 +728,7 @@ png_charp PNGAPI  png_get_header_ver(png_structp png_ptr)  {     /* Version of *.h files used when building libpng */ -   png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */ +   png_ptr = png_ptr;  /* Silence compiler warning about unused png_ptr */     return ((png_charp) PNG_LIBPNG_VER_STRING);  } @@ -727,7 +736,7 @@ png_charp PNGAPI  png_get_header_version(png_structp png_ptr)  {     /* Returns longer string containing both version and date */ -   png_ptr = png_ptr;  /* silence compiler warning about unused png_ptr */ +   png_ptr = png_ptr;  /* Silence compiler warning about unused png_ptr */     return ((png_charp) PNG_HEADER_VERSION_STRING  #ifndef PNG_READ_SUPPORTED     "     (NO READ SUPPORT)" @@ -740,15 +749,15 @@ png_get_header_version(png_structp png_ptr)  int PNGAPI  png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name)  { -   /* check chunk_name and return "keep" value if it's on the list, else 0 */ +   /* Check chunk_name and return "keep" value if it's on the list, else 0 */     int i;     png_bytep p; -   if(png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0) +   if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0)        return 0; -   p=png_ptr->chunk_list+png_ptr->num_chunk_list*5-5; -   for (i = png_ptr->num_chunk_list; i; i--, p-=5) +   p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5; +   for (i = png_ptr->num_chunk_list; i; i--, p -= 5)        if (!png_memcmp(chunk_name, p, 4)) -        return ((int)*(p+4)); +        return ((int)*(p + 4));     return 0;  }  #endif @@ -757,7 +766,8 @@ png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name)  int PNGAPI  png_reset_zstream(png_structp png_ptr)  { -   if (png_ptr == NULL) return Z_STREAM_ERROR; +   if (png_ptr == NULL) +      return Z_STREAM_ERROR;     return (inflateReset(&png_ptr->zstream));  }  #endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ @@ -773,11 +783,11 @@ png_access_version_number(void)  #if defined(PNG_READ_SUPPORTED) && defined(PNG_ASSEMBLER_CODE_SUPPORTED)  #if !defined(PNG_1_0_X) -/* this function was added to libpng 1.2.0 */ +/* This function was added to libpng 1.2.0 */  int PNGAPI  png_mmx_support(void)  { -   /* obsolete, to be removed from libpng-1.4.0 */ +   /* Obsolete, to be removed from libpng-1.4.0 */      return -1;  }  #endif /* PNG_1_0_X */ @@ -790,9 +800,123 @@ png_mmx_support(void)  png_size_t PNGAPI  png_convert_size(size_t size)  { -  if (size > (png_size_t)-1) -     PNG_ABORT();  /* We haven't got access to png_ptr, so no png_error() */ -  return ((png_size_t)size); +   if (size > (png_size_t)-1) +      PNG_ABORT();  /* We haven't got access to png_ptr, so no png_error() */ +   return ((png_size_t)size);  }  #endif /* PNG_SIZE_T */ + +/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */ +#if defined(PNG_cHRM_SUPPORTED) +#if !defined(PNG_NO_CHECK_cHRM) + +/* + *    Multiply two 32-bit numbers, V1 and V2, using 32-bit + *    arithmetic, to produce a 64 bit result in the HI/LO words. + * + *                  A B + *                x C D + *               ------ + *              AD || BD + *        AC || CB || 0 + * + *    where A and B are the high and low 16-bit words of V1, + *    C and D are the 16-bit words of V2, AD is the product of + *    A and D, and X || Y is (X << 16) + Y. +*/ + +void png_64bit_product (long v1, long v2, unsigned long *hi_product, +   unsigned long *lo_product) +{ +   int a, b, c, d; +   long lo, hi, x, y; + +   a = (v1 >> 16) & 0xffff; +   b = v1 & 0xffff; +   c = (v2 >> 16) & 0xffff; +   d = v2 & 0xffff; + +   lo = b * d;                   /* BD */ +   x = a * d + c * b;            /* AD + CB */ +   y = ((lo >> 16) & 0xffff) + x; + +   lo = (lo & 0xffff) | ((y & 0xffff) << 16); +   hi = (y >> 16) & 0xffff; + +   hi += a * c;                  /* AC */ + +   *hi_product = (unsigned long)hi; +   *lo_product = (unsigned long)lo; +} + +int /* private */ +png_check_cHRM_fixed(png_structp png_ptr, +   png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, +   png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, +   png_fixed_point blue_x, png_fixed_point blue_y) +{ +   int ret = 1; +   unsigned long xy_hi,xy_lo,yx_hi,yx_lo; + +   png_debug(1, "in function png_check_cHRM_fixed"); +   if (png_ptr == NULL) +      return 0; + +   if (white_x < 0 || white_y <= 0 || +         red_x < 0 ||   red_y <  0 || +       green_x < 0 || green_y <  0 || +        blue_x < 0 ||  blue_y <  0) +   { +      png_warning(png_ptr, +        "Ignoring attempt to set negative chromaticity value"); +      ret = 0; +   } +   if (white_x > (png_fixed_point) PNG_UINT_31_MAX || +       white_y > (png_fixed_point) PNG_UINT_31_MAX || +         red_x > (png_fixed_point) PNG_UINT_31_MAX || +         red_y > (png_fixed_point) PNG_UINT_31_MAX || +       green_x > (png_fixed_point) PNG_UINT_31_MAX || +       green_y > (png_fixed_point) PNG_UINT_31_MAX || +        blue_x > (png_fixed_point) PNG_UINT_31_MAX || +        blue_y > (png_fixed_point) PNG_UINT_31_MAX ) +   { +      png_warning(png_ptr, +        "Ignoring attempt to set chromaticity value exceeding 21474.83"); +      ret = 0; +   } +   if (white_x > 100000L - white_y) +   { +      png_warning(png_ptr, "Invalid cHRM white point"); +      ret = 0; +   } +   if (red_x > 100000L - red_y) +   { +      png_warning(png_ptr, "Invalid cHRM red point"); +      ret = 0; +   } +   if (green_x > 100000L - green_y) +   { +      png_warning(png_ptr, "Invalid cHRM green point"); +      ret = 0; +   } +   if (blue_x > 100000L - blue_y) +   { +      png_warning(png_ptr, "Invalid cHRM blue point"); +      ret = 0; +   } + +   png_64bit_product(green_x - red_x, blue_y - red_y, &xy_hi, &xy_lo); +   png_64bit_product(green_y - red_y, blue_x - red_x, &yx_hi, &yx_lo); + +   if (xy_hi == yx_hi && xy_lo == yx_lo) +   { +      png_warning(png_ptr, +         "Ignoring attempt to set cHRM RGB triangle with zero area"); +      ret = 0; +   } + +   return ret; +} +#endif /* NO_PNG_CHECK_cHRM */ +#endif /* PNG_cHRM_SUPPORTED */  #endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ diff --git a/src/libpng/png.h b/src/libpng/png.h index 81af541..8092989 100644 --- a/src/libpng/png.h +++ b/src/libpng/png.h @@ -1,15 +1,14 @@ -  /* png.h - header file for PNG reference library   * - * libpng version 1.2.22 - October 13, 2007 - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * libpng version 1.2.37 - June 4, 2009 + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   *   * Authors and maintainers:   *  libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat   *  libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - *  libpng versions 0.97, January 1998, through 1.2.22 - October 13, 2007: Glenn + *  libpng versions 0.97, January 1998, through 1.2.37 - June 4, 2009: Glenn   *  See also "Contributing Authors", below.   *   * Note about libpng version numbers: @@ -169,6 +168,67 @@   *    1.2.22rc1               13    10222  12.so.0.22[.0]   *    1.0.30                  10    10030  10.so.0.30[.0]   *    1.2.22                  13    10222  12.so.0.22[.0] + *    1.2.23beta01-05         13    10223  12.so.0.23[.0] + *    1.2.23rc01              13    10223  12.so.0.23[.0] + *    1.2.23                  13    10223  12.so.0.23[.0] + *    1.2.24beta01-02         13    10224  12.so.0.24[.0] + *    1.2.24rc01              13    10224  12.so.0.24[.0] + *    1.2.24                  13    10224  12.so.0.24[.0] + *    1.2.25beta01-06         13    10225  12.so.0.25[.0] + *    1.2.25rc01-02           13    10225  12.so.0.25[.0] + *    1.0.31                  10    10031  10.so.0.31[.0] + *    1.2.25                  13    10225  12.so.0.25[.0] + *    1.2.26beta01-06         13    10226  12.so.0.26[.0] + *    1.2.26rc01              13    10226  12.so.0.26[.0] + *    1.2.26                  13    10226  12.so.0.26[.0] + *    1.0.32                  10    10032  10.so.0.32[.0] + *    1.2.27beta01-06         13    10227  12.so.0.27[.0] + *    1.2.27rc01              13    10227  12.so.0.27[.0] + *    1.0.33                  10    10033  10.so.0.33[.0] + *    1.2.27                  13    10227  12.so.0.27[.0] + *    1.0.34                  10    10034  10.so.0.34[.0] + *    1.2.28                  13    10228  12.so.0.28[.0] + *    1.2.29beta01-03         13    10229  12.so.0.29[.0] + *    1.2.29rc01              13    10229  12.so.0.29[.0] + *    1.0.35                  10    10035  10.so.0.35[.0] + *    1.2.29                  13    10229  12.so.0.29[.0] + *    1.0.37                  10    10037  10.so.0.37[.0] + *    1.2.30beta01-04         13    10230  12.so.0.30[.0] + *    1.0.38rc01-08           10    10038  10.so.0.38[.0] + *    1.2.30rc01-08           13    10230  12.so.0.30[.0] + *    1.0.38                  10    10038  10.so.0.38[.0] + *    1.2.30                  13    10230  12.so.0.30[.0] + *    1.0.39rc01-03           10    10039  10.so.0.39[.0] + *    1.2.31rc01-03           13    10231  12.so.0.31[.0] + *    1.0.39                  10    10039  10.so.0.39[.0] + *    1.2.31                  13    10231  12.so.0.31[.0] + *    1.2.32beta01-02         13    10232  12.so.0.32[.0] + *    1.0.40rc01              10    10040  10.so.0.40[.0] + *    1.2.32rc01              13    10232  12.so.0.32[.0] + *    1.0.40                  10    10040  10.so.0.40[.0] + *    1.2.32                  13    10232  12.so.0.32[.0] + *    1.2.33beta01-02         13    10233  12.so.0.33[.0] + *    1.2.33rc01-02           13    10233  12.so.0.33[.0] + *    1.0.41rc01              10    10041  10.so.0.41[.0] + *    1.2.33                  13    10233  12.so.0.33[.0] + *    1.0.41                  10    10041  10.so.0.41[.0] + *    1.2.34beta01-07         13    10234  12.so.0.34[.0] + *    1.0.42rc01              10    10042  10.so.0.42[.0] + *    1.2.34rc01              13    10234  12.so.0.34[.0] + *    1.0.42                  10    10042  10.so.0.42[.0] + *    1.2.34                  13    10234  12.so.0.34[.0] + *    1.2.35beta01-03         13    10235  12.so.0.35[.0] + *    1.0.43rc01-02           10    10043  10.so.0.43[.0] + *    1.2.35rc01-02           13    10235  12.so.0.35[.0] + *    1.0.43                  10    10043  10.so.0.43[.0] + *    1.2.35                  13    10235  12.so.0.35[.0] + *    1.2.36beta01-05         13    10236  12.so.0.36[.0] + *    1.2.36rc01              13    10236  12.so.0.36[.0] + *    1.0.44                  10    10044  10.so.0.44[.0] + *    1.2.36                  13    10236  12.so.0.36[.0] + *    1.2.37beta01-03         13    10237  12.so.0.37[.0] + *    1.2.37rc01              13    10237  12.so.0.37[.0] + *    1.2.37                  13    10237  12.so.0.37[.0]   *   *    Henceforth the source version will match the shared-library major   *    and minor numbers; the shared-library major version number will be @@ -178,7 +238,7 @@   *    to the source version x.y.z (leading zeros in y and z).  Beta versions   *    were given the previous public release number plus a letter, until   *    version 1.0.6j; from then on they were given the upcoming public - *    release number plus "betaNN" or "rcN". + *    release number plus "betaNN" or "rcNN".   *   *    Binary incompatibility exists only when applications make direct access   *    to the info_ptr or png_ptr members through png.h, and the compiled @@ -198,8 +258,8 @@   * If you modify libpng you may insert additional notices immediately following   * this sentence.   * - * libpng versions 1.2.6, August 15, 2004, through 1.2.22, October 13, 2007, are - * Copyright (c) 2004, 2006-2007 Glenn Randers-Pehrson, and are + * libpng versions 1.2.6, August 15, 2004, through 1.2.37, June 4, 2009, are + * Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are   * distributed according to the same disclaimer and license as libpng-1.2.5   * with the following individual added to the list of Contributing Authors:   * @@ -310,13 +370,13 @@   * Y2K compliance in libpng:   * =========================   * - *    October 13, 2007 + *    June 4, 2009   *   *    Since the PNG Development group is an ad-hoc body, we can't make   *    an official declaration.   *   *    This is your unofficial assurance that libpng from version 0.71 and - *    upward through 1.2.22 are Y2K compliant.  It is my belief that earlier + *    upward through 1.2.37 are Y2K compliant.  It is my belief that earlier   *    versions were also Y2K compliant.   *   *    Libpng only has three year fields.  One is a 2-byte unsigned integer @@ -372,9 +432,9 @@   */  /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.2.22" +#define PNG_LIBPNG_VER_STRING "1.2.37"  #define PNG_HEADER_VERSION_STRING \ -   " libpng version 1.2.22 - October 13, 2007\n" +   " libpng version 1.2.37 - June 4, 2009\n"  #define PNG_LIBPNG_VER_SONUM   0  #define PNG_LIBPNG_VER_DLLNUM  13 @@ -382,7 +442,7 @@  /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */  #define PNG_LIBPNG_VER_MAJOR   1  #define PNG_LIBPNG_VER_MINOR   2 -#define PNG_LIBPNG_VER_RELEASE 22 +#define PNG_LIBPNG_VER_RELEASE 37  /* This should match the numeric part of the final component of   * PNG_LIBPNG_VER_STRING, omitting any leading zero: */ @@ -410,7 +470,7 @@   * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only   * version 1.0.0 was mis-numbered 100 instead of 10000).  From   * version 1.0.1 it's    xxyyzz, where x=major, y=minor, z=release */ -#define PNG_LIBPNG_VER 10222 /* 1.2.22 */ +#define PNG_LIBPNG_VER 10237 /* 1.2.37 */  #ifndef PNG_VERSION_INFO_ONLY  /* include the compression library's header */ @@ -651,9 +711,10 @@ typedef png_time FAR * FAR * png_timepp;   * up private chunks for output even though the library doesn't actually   * know about their semantics.   */ +#define PNG_CHUNK_NAME_LENGTH 5  typedef struct png_unknown_chunk_t  { -    png_byte name[5]; +    png_byte name[PNG_CHUNK_NAME_LENGTH];      png_byte *data;      png_size_t size; @@ -1110,7 +1171,10 @@ typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp));  #define PNG_TRANSFORM_SWAP_ALPHA     0x0100    /* read and write */  #define PNG_TRANSFORM_SWAP_ENDIAN    0x0200    /* read and write */  #define PNG_TRANSFORM_INVERT_ALPHA   0x0400    /* read and write */ -#define PNG_TRANSFORM_STRIP_FILLER   0x0800    /* WRITE only */ +#define PNG_TRANSFORM_STRIP_FILLER   0x0800    /* WRITE only, deprecated */ +/* Added to libpng-1.2.34 */ +#define PNG_TRANSFORM_STRIP_FILLER_BEFORE 0x0800  /* WRITE only */ +#define PNG_TRANSFORM_STRIP_FILLER_AFTER  0x1000  /* WRITE only */  /* Flags for MNG supported features */  #define PNG_FLAG_MNG_EMPTY_PLTE     0x01 @@ -1180,10 +1244,12 @@ struct png_struct_def     png_uint_32 row_number;    /* current row in interlace pass */     png_bytep prev_row;        /* buffer to save previous (unfiltered) row */     png_bytep row_buf;         /* buffer to save current (unfiltered) row */ +#ifndef PNG_NO_WRITE_FILTER     png_bytep sub_row;         /* buffer to save "sub" row when filtering */     png_bytep up_row;          /* buffer to save "up" row when filtering */     png_bytep avg_row;         /* buffer to save "avg" row when filtering */     png_bytep paeth_row;       /* buffer to save "Paeth" row when filtering */ +#endif     png_row_info row_info;     /* used for transformation routines */     png_uint_32 idat_size;     /* current IDAT size for read */ @@ -1415,13 +1481,20 @@ struct png_struct_def     /* storage for unknown chunk that the library doesn't recognize. */     png_unknown_chunk unknown_chunk;  #endif + +/* New members added in libpng-1.2.26 */ +  png_uint_32 old_big_row_buf_size, old_prev_row_size; + +/* New member added in libpng-1.2.30 */ +  png_charp chunkdata;  /* buffer for reading chunk data */ +  };  /* This triggers a compiler error in png.c, if png.c and png.h   * do not agree upon the version number.   */ -typedef png_structp version_1_2_22; +typedef png_structp version_1_2_37;  typedef png_struct FAR * FAR * png_structpp; @@ -1921,6 +1994,11 @@ extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr));   * If buffered output is not used, then output_flush_fn can be set to NULL.   * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time   * output_flush_fn will be ignored (and thus can be NULL). + * It is probably a mistake to use NULL for output_flush_fn if + * write_data_fn is not also NULL unless you have built libpng with + * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's + * default flush function, which uses the standard *FILE structure, will + * be used.   */  extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr,     png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); @@ -2473,34 +2551,89 @@ extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr,  #if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER)  #include <crtdbg.h>  #if (PNG_DEBUG > 1) -#define png_debug(l,m)  _RPT0(_CRT_WARN,m) -#define png_debug1(l,m,p1)  _RPT1(_CRT_WARN,m,p1) -#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2) +#ifndef _DEBUG +#  define _DEBUG +#endif +#ifndef png_debug +#define png_debug(l,m)  _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) +#endif +#ifndef png_debug1 +#define png_debug1(l,m,p1)  _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) +#endif +#ifndef png_debug2 +#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) +#endif  #endif  #else /* PNG_DEBUG_FILE || !_MSC_VER */  #ifndef PNG_DEBUG_FILE  #define PNG_DEBUG_FILE stderr  #endif /* PNG_DEBUG_FILE */ +  #if (PNG_DEBUG > 1) -#define png_debug(l,m) \ -{ \ -     int num_tabs=l; \ -     fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ -       (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ -} -#define png_debug1(l,m,p1) \ -{ \ -     int num_tabs=l; \ -     fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ -       (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ -} -#define png_debug2(l,m,p1,p2) \ -{ \ -     int num_tabs=l; \ -     fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ -       (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ -} +/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on + * non-ISO compilers */ +#  ifdef __STDC__ +#    ifndef png_debug +#      define png_debug(l,m) \ +       { \ +       int num_tabs=l; \ +       fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ +         (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ +       } +#    endif +#    ifndef png_debug1 +#      define png_debug1(l,m,p1) \ +       { \ +       int num_tabs=l; \ +       fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ +         (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ +       } +#    endif +#    ifndef png_debug2 +#      define png_debug2(l,m,p1,p2) \ +       { \ +       int num_tabs=l; \ +       fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ +         (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ +       } +#    endif +#  else /* __STDC __ */ +#    ifndef png_debug +#      define png_debug(l,m) \ +       { \ +       int num_tabs=l; \ +       char format[256]; \ +       snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ +         (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ +         m,PNG_STRING_NEWLINE); \ +       fprintf(PNG_DEBUG_FILE,format); \ +       } +#    endif +#    ifndef png_debug1 +#      define png_debug1(l,m,p1) \ +       { \ +       int num_tabs=l; \ +       char format[256]; \ +       snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ +         (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ +         m,PNG_STRING_NEWLINE); \ +       fprintf(PNG_DEBUG_FILE,format,p1); \ +       } +#    endif +#    ifndef png_debug2 +#      define png_debug2(l,m,p1,p2) \ +       { \ +       int num_tabs=l; \ +       char format[256]; \ +       snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ +         (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ +         m,PNG_STRING_NEWLINE); \ +       fprintf(PNG_DEBUG_FILE,format,p1,p2); \ +       } +#    endif +#  endif /* __STDC __ */  #endif /* (PNG_DEBUG > 1) */ +  #endif /* _MSC_VER */  #endif /* (PNG_DEBUG > 0) */  #endif /* PNG_DEBUG */ @@ -2595,6 +2728,7 @@ extern PNG_EXPORT(void,png_set_mmx_thresholds)  #if !defined(PNG_1_0_X)  /* png.c, pnggccrd.c, or pngvcrd.c */  extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); +#endif /* PNG_1_0_X */  #endif /* PNG_ASSEMBLER_CODE_SUPPORTED */  /* Strip the prepended error numbers ("#nnn ") from error and warning @@ -2604,8 +2738,6 @@ extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp     png_ptr, png_uint_32 strip_mode));  #endif -#endif /* PNG_1_0_X */ -  /* Added at libpng-1.2.6 */  #ifdef PNG_SET_USER_LIMITS_SUPPORTED  extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp @@ -2616,6 +2748,7 @@ extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp     png_ptr));  #endif +  /* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */  #ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED @@ -2997,8 +3130,8 @@ PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf,  /* Decompress data in a chunk that uses compression */  #if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \      defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) -PNG_EXTERN png_charp png_decompress_chunk PNGARG((png_structp png_ptr, -   int comp_type, png_charp chunkdata, png_size_t chunklength, +PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr, +   int comp_type, png_size_t chunklength,     png_size_t prefix_length, png_size_t *data_length));  #endif @@ -3527,6 +3660,18 @@ png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type));  #endif /* PNG_pHYs_SUPPORTED */  #endif  /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ +/* Read the chunk header (length + type name) */ +PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr)); + +/* Added at libpng version 1.2.34 */ +#if defined(PNG_cHRM_SUPPORTED) +PNG_EXTERN int png_check_cHRM_fixed  PNGARG((png_structp png_ptr, +   png_fixed_point int_white_x, png_fixed_point int_white_y, +   png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point +   int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, +   png_fixed_point int_blue_y)); +#endif +  /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */  #endif /* PNG_INTERNAL */ diff --git a/src/libpng/pngconf.h b/src/libpng/pngconf.h index 64f3ff0..145e8eb 100644 --- a/src/libpng/pngconf.h +++ b/src/libpng/pngconf.h @@ -1,9 +1,9 @@  /* pngconf.h - machine configurable file for libpng   * - * libpng version 1.2.22 - October 13, 2007 + * libpng version 1.2.37 - June 4, 2009   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   */ @@ -233,6 +233,8 @@  #  include <windows.h>     /* Console I/O functions are not supported on WindowsCE */  #  define PNG_NO_CONSOLE_IO +   /* abort() may not be supported on some/all Windows CE platforms */ +#  define PNG_ABORT() exit(-1)  #  ifdef PNG_DEBUG  #    undef PNG_DEBUG  #  endif @@ -312,28 +314,38 @@  #ifdef PNG_SETJMP_SUPPORTED  /* This is an attempt to force a single setjmp behaviour on Linux.  If   * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. + * + * You can bypass this test if you know that your application uses exactly + * the same setjmp.h that was included when libpng was built.  Only define + * PNG_SKIP_SETJMP_CHECK while building your application, prior to the + * application's '#include "png.h"'. Don't define PNG_SKIP_SETJMP_CHECK + * while building a separate libpng library for general use.   */ -#  ifdef __linux__ -#    ifdef _BSD_SOURCE -#      define PNG_SAVE_BSD_SOURCE -#      undef _BSD_SOURCE -#    endif -#    ifdef _SETJMP_H -     /* If you encounter a compiler error here, see the explanation -      * near the end of INSTALL. -      */ -         __png.h__ already includes setjmp.h; -         __dont__ include it again.; -#    endif -#  endif /* __linux__ */ +#  ifndef PNG_SKIP_SETJMP_CHECK +#    ifdef __linux__ +#      ifdef _BSD_SOURCE +#        define PNG_SAVE_BSD_SOURCE +#        undef _BSD_SOURCE +#      endif +#      ifdef _SETJMP_H +       /* If you encounter a compiler error here, see the explanation +        * near the end of INSTALL. +        */ +           __pngconf.h__ in libpng already includes setjmp.h; +           __dont__ include it again.; +#      endif +#    endif /* __linux__ */ +#  endif /* PNG_SKIP_SETJMP_CHECK */     /* include setjmp.h for error handling */  #  include <setjmp.h>  #  ifdef __linux__  #    ifdef PNG_SAVE_BSD_SOURCE -#      define _BSD_SOURCE +#      ifndef _BSD_SOURCE +#        define _BSD_SOURCE +#      endif  #      undef PNG_SAVE_BSD_SOURCE  #    endif  #  endif /* __linux__ */ @@ -796,6 +808,11 @@  #  define PNG_USER_HEIGHT_MAX 1000000L  #endif +/* Added at libpng-1.2.34 and 1.4.0 */ +#ifndef PNG_STRING_NEWLINE +#define PNG_STRING_NEWLINE "\n" +#endif +  /* These are currently experimental features, define them if you want */  /* very little testing */ @@ -1111,8 +1128,8 @@   * want to have unsigned int for png_uint_32 instead of unsigned long.   */ -typedef unsigned int png_uint_32;   /* IMLIB - changed long to int */ -typedef int png_int_32;             /* IMLIB - changed long to int */ +typedef unsigned long png_uint_32; +typedef long png_int_32;  typedef unsigned short png_uint_16;  typedef short png_int_16;  typedef unsigned char png_byte; @@ -1121,10 +1138,10 @@ typedef unsigned char png_byte;     change (I'm not sure if you will or not, so I thought I'd be safe) */  #ifdef PNG_SIZE_T     typedef PNG_SIZE_T png_size_t; -#  define png_sizeof(x) png_convert_size(sizeof (x)) +#  define png_sizeof(x) png_convert_size(sizeof(x))  #else     typedef size_t png_size_t; -#  define png_sizeof(x) sizeof (x) +#  define png_sizeof(x) sizeof(x)  #endif  /* The following is needed for medium model support.  It cannot be in the @@ -1430,8 +1447,6 @@ typedef z_stream FAR *  png_zstreamp;  #  define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK))  #  define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK))  #  define png_snprintf _fsnprintf   /* Added to v 1.2.19 */ -#  define png_strcpy  _fstrcpy -#  define png_strncpy _fstrncpy   /* Added to v 1.2.6 */  #  define png_strlen  _fstrlen  #  define png_memcmp  _fmemcmp    /* SJT: added */  #  define png_memcpy  _fmemcpy @@ -1460,8 +1475,6 @@ typedef z_stream FAR *  png_zstreamp;  #    define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \          sprintf(s1,fmt,x1,x2,x3,x4,x5,x6)  #  endif -#  define png_strcpy  strcpy -#  define png_strncpy strncpy     /* Added to v 1.2.6 */  #  define png_strlen  strlen  #  define png_memcmp  memcmp      /* SJT: added */  #  define png_memcpy  memcpy diff --git a/src/libpng/pngerror.c b/src/libpng/pngerror.c index bdafdc2..71a2e53 100644 --- a/src/libpng/pngerror.c +++ b/src/libpng/pngerror.c @@ -1,9 +1,9 @@  /* pngerror.c - stub functions for i/o and memory allocation   * - * Last changed in libpng 1.2.22 [October 13, 2007] + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   * @@ -15,8 +15,8 @@  #define PNG_INTERNAL  #include "png.h" -  #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +  static void /* PRIVATE */  png_default_error PNGARG((png_structp png_ptr,    png_const_charp error_message)); @@ -44,28 +44,29 @@ png_error(png_structp png_ptr, png_const_charp error_message)       {         if (*error_message == '#')         { +           /* Strip "#nnnn " from beginning of error message. */             int offset; -           for (offset=1; offset<15; offset++) -              if (*(error_message+offset) == ' ') +           for (offset = 1; offset<15; offset++) +              if (error_message[offset] == ' ')                    break;             if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)             {                int i; -              for (i=0; i<offset-1; i++) -                 msg[i]=error_message[i+1]; -              msg[i]='\0'; -              error_message=msg; +              for (i = 0; i < offset - 1; i++) +                 msg[i] = error_message[i + 1]; +              msg[i - 1] = '\0'; +              error_message = msg;             }             else -              error_message+=offset; +              error_message += offset;         }         else         {             if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)             { -              msg[0]='0'; -              msg[1]='\0'; -              error_message=msg; +              msg[0] = '0'; +              msg[1] = '\0'; +              error_message = msg;             }         }       } @@ -110,16 +111,16 @@ png_warning(png_structp png_ptr, png_const_charp warning_message)       {         if (*warning_message == '#')         { -           for (offset=1; offset<15; offset++) -              if (*(warning_message+offset) == ' ') +           for (offset = 1; offset < 15; offset++) +              if (warning_message[offset] == ' ')                    break;         }       } -     if (png_ptr != NULL && png_ptr->warning_fn != NULL) -        (*(png_ptr->warning_fn))(png_ptr, warning_message+offset);     } +   if (png_ptr != NULL && png_ptr->warning_fn != NULL) +      (*(png_ptr->warning_fn))(png_ptr, warning_message + offset);     else -      png_default_warning(png_ptr, warning_message+offset); +      png_default_warning(png_ptr, warning_message + offset);  }  #endif /* PNG_NO_WARNINGS */ @@ -136,6 +137,8 @@ static PNG_CONST char png_digit[16] = {     'A', 'B', 'C', 'D', 'E', 'F'  }; +#define PNG_MAX_ERROR_TEXT 64 +  #if !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT)  static void /* PRIVATE */  png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp @@ -165,8 +168,8 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp     {        buffer[iout++] = ':';        buffer[iout++] = ' '; -      png_strncpy(buffer+iout, error_message, 63); -      buffer[iout+63] = '\0'; +      png_memcpy(buffer + iout, error_message, PNG_MAX_ERROR_TEXT); +      buffer[iout + PNG_MAX_ERROR_TEXT - 1] = '\0';     }  } @@ -174,7 +177,7 @@ png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp  void PNGAPI  png_chunk_error(png_structp png_ptr, png_const_charp error_message)  { -   char msg[18+64]; +   char msg[18+PNG_MAX_ERROR_TEXT];     if (png_ptr == NULL)       png_error(png_ptr, error_message);     else @@ -190,7 +193,7 @@ png_chunk_error(png_structp png_ptr, png_const_charp error_message)  void PNGAPI  png_chunk_warning(png_structp png_ptr, png_const_charp warning_message)  { -   char msg[18+64]; +   char msg[18+PNG_MAX_ERROR_TEXT];     if (png_ptr == NULL)       png_warning(png_ptr, warning_message);     else @@ -214,26 +217,35 @@ png_default_error(png_structp png_ptr, png_const_charp error_message)  #ifdef PNG_ERROR_NUMBERS_SUPPORTED     if (*error_message == '#')     { +     /* Strip "#nnnn " from beginning of error message. */       int offset;       char error_number[16]; -     for (offset=0; offset<15; offset++) +     for (offset = 0; offset<15; offset++)       { -         error_number[offset] = *(error_message+offset+1); -         if (*(error_message+offset) == ' ') +         error_number[offset] = error_message[offset + 1]; +         if (error_message[offset] == ' ')               break;       } -     if((offset > 1) && (offset < 15)) +     if ((offset > 1) && (offset < 15))       { -       error_number[offset-1]='\0'; -       fprintf(stderr, "libpng error no. %s: %s\n", error_number, -          error_message+offset); +       error_number[offset - 1] = '\0'; +       fprintf(stderr, "libpng error no. %s: %s", +          error_number, error_message + offset + 1); +       fprintf(stderr, PNG_STRING_NEWLINE);       }       else -       fprintf(stderr, "libpng error: %s, offset=%d\n", error_message,offset); +     { +       fprintf(stderr, "libpng error: %s, offset=%d", +          error_message, offset); +       fprintf(stderr, PNG_STRING_NEWLINE); +     }     }     else  #endif -   fprintf(stderr, "libpng error: %s\n", error_message); +   { +      fprintf(stderr, "libpng error: %s", error_message); +      fprintf(stderr, PNG_STRING_NEWLINE); +   }  #endif  #ifdef PNG_SETJMP_SUPPORTED @@ -253,7 +265,7 @@ png_default_error(png_structp png_ptr, png_const_charp error_message)     PNG_ABORT();  #endif  #ifdef PNG_NO_CONSOLE_IO -   error_message = error_message; /* make compiler happy */ +   error_message = error_message; /* Make compiler happy */  #endif  } @@ -272,28 +284,36 @@ png_default_warning(png_structp png_ptr, png_const_charp warning_message)     {       int offset;       char warning_number[16]; -     for (offset=0; offset<15; offset++) +     for (offset = 0; offset < 15; offset++)       { -        warning_number[offset]=*(warning_message+offset+1); -        if (*(warning_message+offset) == ' ') +        warning_number[offset] = warning_message[offset + 1]; +        if (warning_message[offset] == ' ')              break;       } -     if((offset > 1) && (offset < 15)) +     if ((offset > 1) && (offset < 15))       { -       warning_number[offset-1]='\0'; -       fprintf(stderr, "libpng warning no. %s: %s\n", warning_number, -          warning_message+offset); +       warning_number[offset + 1] = '\0'; +       fprintf(stderr, "libpng warning no. %s: %s", +          warning_number, warning_message + offset); +       fprintf(stderr, PNG_STRING_NEWLINE);       }       else -       fprintf(stderr, "libpng warning: %s\n", warning_message); +     { +       fprintf(stderr, "libpng warning: %s", +          warning_message); +       fprintf(stderr, PNG_STRING_NEWLINE); +     }     }     else  #  endif -     fprintf(stderr, "libpng warning: %s\n", warning_message); +   { +     fprintf(stderr, "libpng warning: %s", warning_message); +     fprintf(stderr, PNG_STRING_NEWLINE); +   }  #else -   warning_message = warning_message; /* make compiler happy */ +   warning_message = warning_message; /* Make compiler happy */  #endif -   png_ptr = png_ptr; /* make compiler happy */ +   png_ptr = png_ptr; /* Make compiler happy */  }  #endif /* PNG_NO_WARNINGS */ @@ -331,7 +351,7 @@ png_get_error_ptr(png_structp png_ptr)  void PNGAPI  png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode)  { -   if(png_ptr != NULL) +   if (png_ptr != NULL)     {       png_ptr->flags &=         ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); diff --git a/src/libpng/pnggccrd.c b/src/libpng/pnggccrd.c index a7248d6..e61523e 100644 --- a/src/libpng/pnggccrd.c +++ b/src/libpng/pnggccrd.c @@ -2,8 +2,10 @@  /* This code snippet is for use by configure's compilation test. */ -#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && \ +#if (!defined _MSC_VER) && \ +    defined(PNG_ASSEMBLER_CODE_SUPPORTED) && \      defined(PNG_MMX_CODE_SUPPORTED) +  int PNGAPI png_dummy_mmx_support(void);  static int _mmx_supported = 2; // 0: no MMX; 1: MMX supported; 2: not tested diff --git a/src/libpng/pngget.c b/src/libpng/pngget.c index a0e90bb..0022d95 100644 --- a/src/libpng/pngget.c +++ b/src/libpng/pngget.c @@ -1,16 +1,15 @@  /* pngget.c - retrieval of values from info struct   * - * Last changed in libpng 1.2.15 January 5, 2007 + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   */  #define PNG_INTERNAL  #include "png.h" -  #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)  png_uint_32 PNGAPI @@ -18,6 +17,7 @@ png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)  {     if (png_ptr != NULL && info_ptr != NULL)        return(info_ptr->valid & flag); +     else        return(0);  } @@ -27,6 +27,7 @@ png_get_rowbytes(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL)        return(info_ptr->rowbytes); +     else        return(0);  } @@ -37,20 +38,20 @@ png_get_rows(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL)        return(info_ptr->row_pointers); +     else        return(0);  }  #endif  #ifdef PNG_EASY_ACCESS_SUPPORTED -/* easy access to info, added in libpng-0.99 */ +/* Easy access to info, added in libpng-0.99 */  png_uint_32 PNGAPI  png_get_image_width(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL) -   {        return info_ptr->width; -   } +     return (0);  } @@ -58,9 +59,8 @@ png_uint_32 PNGAPI  png_get_image_height(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL) -   {        return info_ptr->height; -   } +     return (0);  } @@ -68,9 +68,8 @@ png_byte PNGAPI  png_get_bit_depth(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL) -   {        return info_ptr->bit_depth; -   } +     return (0);  } @@ -78,9 +77,8 @@ png_byte PNGAPI  png_get_color_type(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL) -   {        return info_ptr->color_type; -   } +     return (0);  } @@ -88,9 +86,8 @@ png_byte PNGAPI  png_get_filter_type(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL) -   {        return info_ptr->filter_type; -   } +     return (0);  } @@ -98,9 +95,8 @@ png_byte PNGAPI  png_get_interlace_type(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL) -   {        return info_ptr->interlace_type; -   } +     return (0);  } @@ -108,9 +104,8 @@ png_byte PNGAPI  png_get_compression_type(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL) -   {        return info_ptr->compression_type; -   } +     return (0);  } @@ -121,10 +116,13 @@ png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)  #if defined(PNG_pHYs_SUPPORTED)     if (info_ptr->valid & PNG_INFO_pHYs)     { -      png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter"); -      if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) +      png_debug1(1, "in %s retrieval function", "png_get_x_pixels_per_meter"); + +      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)            return (0); -      else return (info_ptr->x_pixels_per_unit); + +      else +          return (info_ptr->x_pixels_per_unit);     }  #else     return (0); @@ -139,10 +137,13 @@ png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)  #if defined(PNG_pHYs_SUPPORTED)     if (info_ptr->valid & PNG_INFO_pHYs)     { -      png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter"); -      if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER) +      png_debug1(1, "in %s retrieval function", "png_get_y_pixels_per_meter"); + +      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)            return (0); -      else return (info_ptr->y_pixels_per_unit); + +      else +          return (info_ptr->y_pixels_per_unit);     }  #else     return (0); @@ -157,11 +158,14 @@ png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)  #if defined(PNG_pHYs_SUPPORTED)     if (info_ptr->valid & PNG_INFO_pHYs)     { -      png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter"); -      if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER || +      png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter"); + +      if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER ||           info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit)            return (0); -      else return (info_ptr->x_pixels_per_unit); + +      else +          return (info_ptr->x_pixels_per_unit);     }  #else     return (0); @@ -175,9 +179,10 @@ png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)     {     if (png_ptr != NULL && info_ptr != NULL)  #if defined(PNG_pHYs_SUPPORTED) +     if (info_ptr->valid & PNG_INFO_pHYs)     { -      png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio"); +      png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");        if (info_ptr->x_pixels_per_unit == 0)           return ((float)0.0);        else @@ -185,7 +190,7 @@ png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)              /(float)info_ptr->x_pixels_per_unit));     }  #else -   return (0.0); +      return (0.0);  #endif     return ((float)0.0);  } @@ -196,15 +201,19 @@ png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL)  #if defined(PNG_oFFs_SUPPORTED) +     if (info_ptr->valid & PNG_INFO_oFFs)     { -      png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); -      if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) +      png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); + +      if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)            return (0); -      else return (info_ptr->x_offset); + +      else +          return (info_ptr->x_offset);     }  #else -   return (0); +      return (0);  #endif     return (0);  } @@ -213,13 +222,17 @@ png_int_32 PNGAPI  png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL) +  #if defined(PNG_oFFs_SUPPORTED)     if (info_ptr->valid & PNG_INFO_oFFs)     { -      png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); -      if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) +      png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); + +      if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)            return (0); -      else return (info_ptr->y_offset); + +      else +          return (info_ptr->y_offset);     }  #else     return (0); @@ -231,13 +244,17 @@ png_int_32 PNGAPI  png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL) +  #if defined(PNG_oFFs_SUPPORTED)     if (info_ptr->valid & PNG_INFO_oFFs)     { -      png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns"); -      if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) +      png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); + +      if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)            return (0); -      else return (info_ptr->x_offset); + +      else +          return (info_ptr->x_offset);     }  #else     return (0); @@ -249,13 +266,17 @@ png_int_32 PNGAPI  png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)  {     if (png_ptr != NULL && info_ptr != NULL) +  #if defined(PNG_oFFs_SUPPORTED)     if (info_ptr->valid & PNG_INFO_oFFs)     { -      png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns"); -      if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) +      png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); + +      if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)            return (0); -      else return (info_ptr->y_offset); + +      else +          return (info_ptr->y_offset);     }  #else     return (0); @@ -308,7 +329,7 @@ png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr,     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))     { -      png_debug1(1, "in %s retrieval function\n", "pHYs"); +      png_debug1(1, "in %s retrieval function", "pHYs");        if (res_x != NULL)        {           *res_x = info_ptr->x_pixels_per_unit; @@ -323,7 +344,7 @@ png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr,        {           *unit_type = (int)info_ptr->phys_unit_type;           retval |= PNG_INFO_pHYs; -         if(*unit_type == 1) +         if (*unit_type == 1)           {              if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50);              if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50); @@ -365,7 +386,7 @@ png_get_bKGD(png_structp png_ptr, png_infop info_ptr,     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)        && background != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "bKGD"); +      png_debug1(1, "in %s retrieval function", "bKGD");        *background = &(info_ptr->background);        return (PNG_INFO_bKGD);     } @@ -382,7 +403,7 @@ png_get_cHRM(png_structp png_ptr, png_infop info_ptr,  {     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))     { -      png_debug1(1, "in %s retrieval function\n", "cHRM"); +      png_debug1(1, "in %s retrieval function", "cHRM");        if (white_x != NULL)           *white_x = (double)info_ptr->x_white;        if (white_y != NULL) @@ -413,7 +434,7 @@ png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,  {     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))     { -      png_debug1(1, "in %s retrieval function\n", "cHRM"); +      png_debug1(1, "in %s retrieval function", "cHRM");        if (white_x != NULL)           *white_x = info_ptr->int_x_white;        if (white_y != NULL) @@ -445,7 +466,7 @@ png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma)     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)        && file_gamma != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "gAMA"); +      png_debug1(1, "in %s retrieval function", "gAMA");        *file_gamma = (double)info_ptr->gamma;        return (PNG_INFO_gAMA);     } @@ -460,7 +481,7 @@ png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr,     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)        && int_file_gamma != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "gAMA"); +      png_debug1(1, "in %s retrieval function", "gAMA");        *int_file_gamma = info_ptr->int_gamma;        return (PNG_INFO_gAMA);     } @@ -476,7 +497,7 @@ png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent)     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)        && file_srgb_intent != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "sRGB"); +      png_debug1(1, "in %s retrieval function", "sRGB");        *file_srgb_intent = (int)info_ptr->srgb_intent;        return (PNG_INFO_sRGB);     } @@ -493,11 +514,12 @@ png_get_iCCP(png_structp png_ptr, png_infop info_ptr,     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)        && name != NULL && profile != NULL && proflen != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "iCCP"); +      png_debug1(1, "in %s retrieval function", "iCCP");        *name = info_ptr->iccp_name;        *profile = info_ptr->iccp_profile; -      /* compression_type is a dummy so the API won't have to change -         if we introduce multiple compression types later. */ +      /* Compression_type is a dummy so the API won't have to change +       * if we introduce multiple compression types later. +       */        *proflen = (int)info_ptr->iccp_proflen;        *compression_type = (int)info_ptr->iccp_compression;        return (PNG_INFO_iCCP); @@ -527,7 +549,7 @@ png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)        && hist != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "hIST"); +      png_debug1(1, "in %s retrieval function", "hIST");        *hist = info_ptr->hist;        return (PNG_INFO_hIST);     } @@ -545,27 +567,34 @@ png_get_IHDR(png_structp png_ptr, png_infop info_ptr,     if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL &&        bit_depth != NULL && color_type != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "IHDR"); +      png_debug1(1, "in %s retrieval function", "IHDR");        *width = info_ptr->width;        *height = info_ptr->height;        *bit_depth = info_ptr->bit_depth;        if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16) -        png_error(png_ptr, "Invalid bit depth"); +         png_error(png_ptr, "Invalid bit depth"); +        *color_type = info_ptr->color_type; +        if (info_ptr->color_type > 6) -        png_error(png_ptr, "Invalid color type"); +         png_error(png_ptr, "Invalid color type"); +        if (compression_type != NULL)           *compression_type = info_ptr->compression_type; +        if (filter_type != NULL)           *filter_type = info_ptr->filter_type; +        if (interlace_type != NULL)           *interlace_type = info_ptr->interlace_type; -      /* check for potential overflow of rowbytes */ +      /* Check for potential overflow of rowbytes */        if (*width == 0 || *width > PNG_UINT_31_MAX)          png_error(png_ptr, "Invalid image width"); +        if (*height == 0 || *height > PNG_UINT_31_MAX)          png_error(png_ptr, "Invalid image height"); +        if (info_ptr->width > (PNG_UINT_32_MAX                   >> 3)      /* 8-byte RGBA pixels */                   - 64       /* bigrowbuf hack */ @@ -576,6 +605,7 @@ png_get_IHDR(png_structp png_ptr, png_infop info_ptr,           png_warning(png_ptr,              "Width too large for libpng to process image data.");        } +        return (1);     }     return (0); @@ -589,7 +619,7 @@ png_get_oFFs(png_structp png_ptr, png_infop info_ptr,     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)        && offset_x != NULL && offset_y != NULL && unit_type != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "oFFs"); +      png_debug1(1, "in %s retrieval function", "oFFs");        *offset_x = info_ptr->x_offset;        *offset_y = info_ptr->y_offset;        *unit_type = (int)info_ptr->offset_unit_type; @@ -606,10 +636,10 @@ png_get_pCAL(png_structp png_ptr, png_infop info_ptr,     png_charp *units, png_charpp *params)  {     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) -      && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && -      nparams != NULL && units != NULL && params != NULL) +       && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && +       nparams != NULL && units != NULL && params != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "pCAL"); +      png_debug1(1, "in %s retrieval function", "pCAL");        *purpose = info_ptr->pcal_purpose;        *X0 = info_ptr->pcal_X0;        *X1 = info_ptr->pcal_X1; @@ -630,7 +660,7 @@ png_get_sCAL(png_structp png_ptr, png_infop info_ptr,               int *unit, double *width, double *height)  {      if (png_ptr != NULL && info_ptr != NULL && -       (info_ptr->valid & PNG_INFO_sCAL)) +        (info_ptr->valid & PNG_INFO_sCAL))      {          *unit = info_ptr->scal_unit;          *width = info_ptr->scal_pixel_width; @@ -646,7 +676,7 @@ png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr,               int *unit, png_charpp width, png_charpp height)  {      if (png_ptr != NULL && info_ptr != NULL && -       (info_ptr->valid & PNG_INFO_sCAL)) +        (info_ptr->valid & PNG_INFO_sCAL))      {          *unit = info_ptr->scal_unit;          *width = info_ptr->scal_s_width; @@ -669,17 +699,20 @@ png_get_pHYs(png_structp png_ptr, png_infop info_ptr,     if (png_ptr != NULL && info_ptr != NULL &&        (info_ptr->valid & PNG_INFO_pHYs))     { -      png_debug1(1, "in %s retrieval function\n", "pHYs"); +      png_debug1(1, "in %s retrieval function", "pHYs"); +        if (res_x != NULL)        {           *res_x = info_ptr->x_pixels_per_unit;           retval |= PNG_INFO_pHYs;        } +        if (res_y != NULL)        {           *res_y = info_ptr->y_pixels_per_unit;           retval |= PNG_INFO_pHYs;        } +        if (unit_type != NULL)        {           *unit_type = (int)info_ptr->phys_unit_type; @@ -697,10 +730,10 @@ png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette,     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)         && palette != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "PLTE"); +      png_debug1(1, "in %s retrieval function", "PLTE");        *palette = info_ptr->palette;        *num_palette = info_ptr->num_palette; -      png_debug1(3, "num_palette = %d\n", *num_palette); +      png_debug1(3, "num_palette = %d", *num_palette);        return (PNG_INFO_PLTE);     }     return (0); @@ -713,7 +746,7 @@ png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)        && sig_bit != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "sBIT"); +      png_debug1(1, "in %s retrieval function", "sBIT");        *sig_bit = &(info_ptr->sig_bit);        return (PNG_INFO_sBIT);     } @@ -728,13 +761,16 @@ png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,  {     if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)     { -      png_debug1(1, "in %s retrieval function\n", +      png_debug1(1, "in %s retrieval function",           (png_ptr->chunk_name[0] == '\0' ? "text"               : (png_const_charp)png_ptr->chunk_name)); +        if (text_ptr != NULL)           *text_ptr = info_ptr->text; +        if (num_text != NULL)           *num_text = info_ptr->num_text; +        return ((png_uint_32)info_ptr->num_text);     }     if (num_text != NULL) @@ -750,7 +786,7 @@ png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)         && mod_time != NULL)     { -      png_debug1(1, "in %s retrieval function\n", "tIME"); +      png_debug1(1, "in %s retrieval function", "tIME");        *mod_time = &(info_ptr->mod_time);        return (PNG_INFO_tIME);     } @@ -766,7 +802,7 @@ png_get_tRNS(png_structp png_ptr, png_infop info_ptr,     png_uint_32 retval = 0;     if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))     { -      png_debug1(1, "in %s retrieval function\n", "tRNS"); +      png_debug1(1, "in %s retrieval function", "tRNS");        if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)        {            if (trans != NULL) @@ -774,6 +810,7 @@ png_get_tRNS(png_structp png_ptr, png_infop info_ptr,               *trans = info_ptr->trans;               retval |= PNG_INFO_tRNS;            } +            if (trans_values != NULL)               *trans_values = &(info_ptr->trans_values);        } @@ -784,10 +821,11 @@ png_get_tRNS(png_structp png_ptr, png_infop info_ptr,               *trans_values = &(info_ptr->trans_values);               retval |= PNG_INFO_tRNS;            } -          if(trans != NULL) + +          if (trans != NULL)               *trans = NULL;        } -      if(num_trans != NULL) +      if (num_trans != NULL)        {           *num_trans = info_ptr->num_trans;           retval |= PNG_INFO_tRNS; @@ -837,54 +875,54 @@ png_get_compression_buffer_size(png_structp png_ptr)  #ifdef PNG_ASSEMBLER_CODE_SUPPORTED  #ifndef PNG_1_0_X -/* this function was added to libpng 1.2.0 and should exist by default */ +/* This function was added to libpng 1.2.0 and should exist by default */  png_uint_32 PNGAPI  png_get_asm_flags (png_structp png_ptr)  { -    /* obsolete, to be removed from libpng-1.4.0 */ +    /* Obsolete, to be removed from libpng-1.4.0 */      return (png_ptr? 0L: 0L);  } -/* this function was added to libpng 1.2.0 and should exist by default */ +/* This function was added to libpng 1.2.0 and should exist by default */  png_uint_32 PNGAPI  png_get_asm_flagmask (int flag_select)  { -    /* obsolete, to be removed from libpng-1.4.0 */ +    /* Obsolete, to be removed from libpng-1.4.0 */      flag_select=flag_select;      return 0L;  }      /* GRR:  could add this:   && defined(PNG_MMX_CODE_SUPPORTED) */ -/* this function was added to libpng 1.2.0 */ +/* This function was added to libpng 1.2.0 */  png_uint_32 PNGAPI  png_get_mmx_flagmask (int flag_select, int *compilerID)  { -    /* obsolete, to be removed from libpng-1.4.0 */ +    /* Obsolete, to be removed from libpng-1.4.0 */      flag_select=flag_select;      *compilerID = -1;   /* unknown (i.e., no asm/MMX code compiled) */      return 0L;  } -/* this function was added to libpng 1.2.0 */ +/* This function was added to libpng 1.2.0 */  png_byte PNGAPI  png_get_mmx_bitdepth_threshold (png_structp png_ptr)  { -    /* obsolete, to be removed from libpng-1.4.0 */ +    /* Obsolete, to be removed from libpng-1.4.0 */      return (png_ptr? 0: 0);  } -/* this function was added to libpng 1.2.0 */ +/* This function was added to libpng 1.2.0 */  png_uint_32 PNGAPI  png_get_mmx_rowbytes_threshold (png_structp png_ptr)  { -    /* obsolete, to be removed from libpng-1.4.0 */ +    /* Obsolete, to be removed from libpng-1.4.0 */      return (png_ptr? 0L: 0L);  }  #endif /* ?PNG_1_0_X */  #endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */  #ifdef PNG_SET_USER_LIMITS_SUPPORTED -/* these functions were added to libpng 1.2.6 */ +/* These functions were added to libpng 1.2.6 */  png_uint_32 PNGAPI  png_get_user_width_max (png_structp png_ptr)  { diff --git a/src/libpng/pngmem.c b/src/libpng/pngmem.c index 248060f..d1999b6 100644 --- a/src/libpng/pngmem.c +++ b/src/libpng/pngmem.c @@ -1,9 +1,9 @@  /* pngmem.c - stub functions for memory allocation   * - * Last changed in libpng 1.2.13 November 13, 2006 + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2006 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   * @@ -16,12 +16,11 @@  #define PNG_INTERNAL  #include "png.h" -  #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)  /* Borland DOS special memory handler */  #if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) -/* if you change this, be sure to change the one in png.h also */ +/* If you change this, be sure to change the one in png.h also */  /* Allocate memory for a png_struct.  The malloc and memset can be replaced     by a single call to calloc() if this is thought to improve performance. */ @@ -41,14 +40,14 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)     png_voidp struct_ptr;     if (type == PNG_STRUCT_INFO) -     size = png_sizeof(png_info); +      size = png_sizeof(png_info);     else if (type == PNG_STRUCT_PNG) -     size = png_sizeof(png_struct); +      size = png_sizeof(png_struct);     else -     return (png_get_copyright(NULL)); +      return (png_get_copyright(NULL));  #ifdef PNG_USER_MEM_SUPPORTED -   if(malloc_fn != NULL) +   if (malloc_fn != NULL)     {        png_struct dummy_struct;        png_structp png_ptr = &dummy_struct; @@ -57,7 +56,7 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)     }     else  #endif /* PNG_USER_MEM_SUPPORTED */ -      struct_ptr = (png_voidp)farmalloc(size); +   struct_ptr = (png_voidp)farmalloc(size);     if (struct_ptr != NULL)        png_memset(struct_ptr, 0, size);     return (struct_ptr); @@ -80,7 +79,7 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,     if (struct_ptr != NULL)     {  #ifdef PNG_USER_MEM_SUPPORTED -      if(free_fn != NULL) +      if (free_fn != NULL)        {           png_struct dummy_struct;           png_structp png_ptr = &dummy_struct; @@ -122,10 +121,10 @@ png_malloc(png_structp png_ptr, png_uint_32 size)        return (NULL);  #ifdef PNG_USER_MEM_SUPPORTED -   if(png_ptr->malloc_fn != NULL) -       ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); +   if (png_ptr->malloc_fn != NULL) +      ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));     else -       ret = (png_malloc_default(png_ptr, size)); +      ret = (png_malloc_default(png_ptr, size));     if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)         png_error(png_ptr, "Out of memory!");     return (ret); @@ -150,12 +149,12 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)  #endif     if (size != (size_t)size) -     ret = NULL; +      ret = NULL;     else if (size == (png_uint_32)65536L)     {        if (png_ptr->offset_table == NULL)        { -         /* try to see if we need to do any of this fancy stuff */ +         /* Try to see if we need to do any of this fancy stuff */           ret = farmalloc(size);           if (ret == NULL || ((png_size_t)ret & 0xffff))           { @@ -171,7 +170,7 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)                 ret = NULL;              } -            if(png_ptr->zlib_window_bits > 14) +            if (png_ptr->zlib_window_bits > 14)                 num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14));              else                 num_blocks = 1; @@ -210,7 +209,7 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)              png_ptr->offset_table = table;              png_ptr->offset_table_ptr = farmalloc(num_blocks * -               png_sizeof (png_bytep)); +               png_sizeof(png_bytep));              if (png_ptr->offset_table_ptr == NULL)              { @@ -270,9 +269,10 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)     return (ret);  } -/* free a pointer allocated by png_malloc().  In the default -   configuration, png_ptr is not used, but is passed in case it -   is needed.  If ptr is NULL, return without taking any action. */ +/* Free a pointer allocated by png_malloc().  In the default + * configuration, png_ptr is not used, but is passed in case it + * is needed.  If ptr is NULL, return without taking any action. + */  void PNGAPI  png_free(png_structp png_ptr, png_voidp ptr)  { @@ -285,7 +285,8 @@ png_free(png_structp png_ptr, png_voidp ptr)        (*(png_ptr->free_fn))(png_ptr, ptr);        return;     } -   else png_free_default(png_ptr, ptr); +   else +      png_free_default(png_ptr, ptr);  }  void PNGAPI @@ -293,7 +294,8 @@ png_free_default(png_structp png_ptr, png_voidp ptr)  {  #endif /* PNG_USER_MEM_SUPPORTED */ -   if(png_ptr == NULL) return; +   if (png_ptr == NULL || ptr == NULL) +      return;     if (png_ptr->offset_table != NULL)     { @@ -353,7 +355,7 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)        return (NULL);  #ifdef PNG_USER_MEM_SUPPORTED -   if(malloc_fn != NULL) +   if (malloc_fn != NULL)     {        png_struct dummy_struct;        png_structp png_ptr = &dummy_struct; @@ -369,7 +371,7 @@ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)     struct_ptr = (png_voidp)farmalloc(size);  #else  # if defined(_MSC_VER) && defined(MAXSEG_64K) -   struct_ptr = (png_voidp)halloc(size,1); +   struct_ptr = (png_voidp)halloc(size, 1);  # else     struct_ptr = (png_voidp)malloc(size);  # endif @@ -398,7 +400,7 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,     if (struct_ptr != NULL)     {  #ifdef PNG_USER_MEM_SUPPORTED -      if(free_fn != NULL) +      if (free_fn != NULL)        {           png_struct dummy_struct;           png_structp png_ptr = &dummy_struct; @@ -420,10 +422,12 @@ png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,  }  /* Allocate memory.  For reasonable files, size should never exceed -   64K.  However, zlib may allocate more then 64K if you don't tell -   it not to.  See zconf.h and png.h for more information.  zlib does -   need to allocate exactly 64K, so whatever you call here must -   have the ability to do that. */ + * 64K.  However, zlib may allocate more then 64K if you don't tell + * it not to.  See zconf.h and png.h for more information.  zlib does + * need to allocate exactly 64K, so whatever you call here must + * have the ability to do that. + */ +  png_voidp PNGAPI  png_malloc(png_structp png_ptr, png_uint_32 size) @@ -434,10 +438,10 @@ png_malloc(png_structp png_ptr, png_uint_32 size)     if (png_ptr == NULL || size == 0)        return (NULL); -   if(png_ptr->malloc_fn != NULL) -       ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); +   if (png_ptr->malloc_fn != NULL) +      ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));     else -       ret = (png_malloc_default(png_ptr, size)); +      ret = (png_malloc_default(png_ptr, size));     if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)         png_error(png_ptr, "Out of Memory!");     return (ret); @@ -456,7 +460,7 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)     if (size > (png_uint_32)65536L)     {  #ifndef PNG_USER_MEM_SUPPORTED -      if(png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) +      if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0)           png_error(png_ptr, "Cannot Allocate > 64K");        else  #endif @@ -464,23 +468,23 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)     }  #endif - /* Check for overflow */ +   /* Check for overflow */  #if defined(__TURBOC__) && !defined(__FLAT__) - if (size != (unsigned long)size) -   ret = NULL; - else -   ret = farmalloc(size); +   if (size != (unsigned long)size) +      ret = NULL; +   else +      ret = farmalloc(size);  #else  # if defined(_MSC_VER) && defined(MAXSEG_64K) - if (size != (unsigned long)size) -   ret = NULL; - else -   ret = halloc(size, 1); +   if (size != (unsigned long)size) +      ret = NULL; +   else +      ret = halloc(size, 1);  # else - if (size != (size_t)size) -   ret = NULL; - else -   ret = malloc((size_t)size); +   if (size != (size_t)size) +      ret = NULL; +   else +      ret = malloc((size_t)size);  # endif  #endif @@ -493,7 +497,8 @@ png_malloc_default(png_structp png_ptr, png_uint_32 size)  }  /* Free a pointer allocated by png_malloc().  If ptr is NULL, return -   without taking any action. */ + * without taking any action. + */  void PNGAPI  png_free(png_structp png_ptr, png_voidp ptr)  { @@ -506,7 +511,8 @@ png_free(png_structp png_ptr, png_voidp ptr)        (*(png_ptr->free_fn))(png_ptr, ptr);        return;     } -   else png_free_default(png_ptr, ptr); +   else +      png_free_default(png_ptr, ptr);  }  void PNGAPI  png_free_default(png_structp png_ptr, png_voidp ptr) @@ -542,9 +548,10 @@ png_malloc_warn(png_structp png_ptr, png_uint_32 size)  {     png_voidp ptr;     png_uint_32 save_flags; -   if(png_ptr == NULL) return (NULL); +   if (png_ptr == NULL) +      return (NULL); -   save_flags=png_ptr->flags; +   save_flags = png_ptr->flags;     png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK;     ptr = (png_voidp)png_malloc((png_structp)png_ptr, size);     png_ptr->flags=save_flags; @@ -560,7 +567,7 @@ png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2,     size = (png_size_t)length;     if ((png_uint_32)size != length) -      png_error(png_ptr,"Overflow in png_memcpy_check."); +      png_error(png_ptr, "Overflow in png_memcpy_check.");     return(png_memcpy (s1, s2, size));  } @@ -573,7 +580,7 @@ png_memset_check (png_structp png_ptr, png_voidp s1, int value,     size = (png_size_t)length;     if ((png_uint_32)size != length) -      png_error(png_ptr,"Overflow in png_memset_check."); +      png_error(png_ptr, "Overflow in png_memset_check.");     return (png_memset (s1, value, size)); @@ -587,10 +594,11 @@ void PNGAPI  png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr    malloc_fn, png_free_ptr free_fn)  { -   if(png_ptr != NULL) { -   png_ptr->mem_ptr = mem_ptr; -   png_ptr->malloc_fn = malloc_fn; -   png_ptr->free_fn = free_fn; +   if (png_ptr != NULL) +   { +      png_ptr->mem_ptr = mem_ptr; +      png_ptr->malloc_fn = malloc_fn; +      png_ptr->free_fn = free_fn;     }  } @@ -601,7 +609,8 @@ png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr  png_voidp PNGAPI  png_get_mem_ptr(png_structp png_ptr)  { -   if(png_ptr == NULL) return (NULL); +   if (png_ptr == NULL) +      return (NULL);     return ((png_voidp)png_ptr->mem_ptr);  }  #endif /* PNG_USER_MEM_SUPPORTED */ diff --git a/src/libpng/pngpread.c b/src/libpng/pngpread.c index cb6f6d3..9746c7a 100644 --- a/src/libpng/pngpread.c +++ b/src/libpng/pngpread.c @@ -1,19 +1,18 @@  /* pngpread.c - read a png file in push mode   * - * Last changed in libpng 1.2.22 [October 13, 2007] + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   */  #define PNG_INTERNAL  #include "png.h" -  #ifdef PNG_PROGRESSIVE_READ_SUPPORTED -/* push model modes */ +/* Push model modes */  #define PNG_READ_SIG_MODE   0  #define PNG_READ_CHUNK_MODE 1  #define PNG_READ_IDAT_MODE  2 @@ -28,7 +27,9 @@ void PNGAPI  png_process_data(png_structp png_ptr, png_infop info_ptr,     png_bytep buffer, png_size_t buffer_size)  { -   if(png_ptr == NULL) return; +   if (png_ptr == NULL || info_ptr == NULL) +      return; +     png_push_restore_buffer(png_ptr, buffer, buffer_size);     while (png_ptr->buffer_size) @@ -43,7 +44,9 @@ png_process_data(png_structp png_ptr, png_infop info_ptr,  void /* PRIVATE */  png_process_some_data(png_structp png_ptr, png_infop info_ptr)  { -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return; +     switch (png_ptr->process_mode)     {        case PNG_READ_SIG_MODE: @@ -51,22 +54,26 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr)           png_push_read_sig(png_ptr, info_ptr);           break;        } +        case PNG_READ_CHUNK_MODE:        {           png_push_read_chunk(png_ptr, info_ptr);           break;        } +        case PNG_READ_IDAT_MODE:        {           png_push_read_IDAT(png_ptr);           break;        } +  #if defined(PNG_READ_tEXt_SUPPORTED)        case PNG_READ_tEXt_MODE:        {           png_push_read_tEXt(png_ptr, info_ptr);           break;        } +  #endif  #if defined(PNG_READ_zTXt_SUPPORTED)        case PNG_READ_zTXt_MODE: @@ -74,6 +81,7 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr)           png_push_read_zTXt(png_ptr, info_ptr);           break;        } +  #endif  #if defined(PNG_READ_iTXt_SUPPORTED)        case PNG_READ_iTXt_MODE: @@ -81,12 +89,14 @@ png_process_some_data(png_structp png_ptr, png_infop info_ptr)           png_push_read_iTXt(png_ptr, info_ptr);           break;        } +  #endif        case PNG_SKIP_MODE:        {           png_push_crc_finish(png_ptr);           break;        } +        default:        {           png_ptr->buffer_size = 0; @@ -114,7 +124,7 @@ png_push_read_sig(png_structp png_ptr, png_infop info_ptr)     png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),        num_to_check); -   png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes+num_to_check); +   png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check);     if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))     { @@ -210,25 +220,31 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)        }        png_push_fill_buffer(png_ptr, chunk_length, 4); -      png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length); +      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);        png_reset_crc(png_ptr);        png_crc_read(png_ptr, png_ptr->chunk_name, 4); +      png_check_chunk_name(png_ptr, png_ptr->chunk_name);        png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;     }     if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) -     if(png_ptr->mode & PNG_AFTER_IDAT) +     if (png_ptr->mode & PNG_AFTER_IDAT)          png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;     if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))     { +      if (png_ptr->push_length != 13) +         png_error(png_ptr, "Invalid IHDR length"); +        if (png_ptr->push_length + 4 > png_ptr->buffer_size)        {           png_push_save_buffer(png_ptr);           return;        } +        png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);     } +     else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))     {        if (png_ptr->push_length + 4 > png_ptr->buffer_size) @@ -236,11 +252,13 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);        png_ptr->process_mode = PNG_READ_DONE_MODE;        png_push_have_end(png_ptr, info_ptr);     } +  #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED     else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))     { @@ -249,20 +267,26 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))           png_ptr->mode |= PNG_HAVE_IDAT; +        png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); +        if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))           png_ptr->mode |= PNG_HAVE_PLTE; +        else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))        {           if (!(png_ptr->mode & PNG_HAVE_IHDR))              png_error(png_ptr, "Missing IHDR before IDAT"); +           else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&                    !(png_ptr->mode & PNG_HAVE_PLTE))              png_error(png_ptr, "Missing PLTE before IDAT");        }     } +  #endif     else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))     { @@ -273,23 +297,26 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)        }        png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);     } +     else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))     {        /* If we reach an IDAT chunk, this means we have read all of the         * header chunks, and we can start reading the image (or if this         * is called after the image has been read - we have an error).         */ -     if (!(png_ptr->mode & PNG_HAVE_IHDR)) -       png_error(png_ptr, "Missing IHDR before IDAT"); -     else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && -         !(png_ptr->mode & PNG_HAVE_PLTE)) -       png_error(png_ptr, "Missing PLTE before IDAT"); + +      if (!(png_ptr->mode & PNG_HAVE_IHDR)) +         png_error(png_ptr, "Missing IHDR before IDAT"); + +      else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && +          !(png_ptr->mode & PNG_HAVE_PLTE)) +         png_error(png_ptr, "Missing PLTE before IDAT");        if (png_ptr->mode & PNG_HAVE_IDAT)        {           if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) -           if (png_ptr->push_length == 0) -              return; +            if (png_ptr->push_length == 0) +               return;           if (png_ptr->mode & PNG_AFTER_IDAT)              png_error(png_ptr, "Too many IDAT's found"); @@ -303,6 +330,7 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)        png_ptr->zstream.next_out = png_ptr->row_buf;        return;     } +  #if defined(PNG_READ_gAMA_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))     { @@ -311,8 +339,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_sBIT_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) @@ -322,8 +352,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_cHRM_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) @@ -333,8 +365,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_sRGB_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) @@ -344,8 +378,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_iCCP_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) @@ -355,8 +391,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_sPLT_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) @@ -366,8 +404,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_tRNS_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) @@ -377,8 +417,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_bKGD_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) @@ -388,8 +430,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_hIST_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) @@ -399,8 +443,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_pHYs_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) @@ -410,8 +456,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_oFFs_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) @@ -421,9 +469,11 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);     }  #endif +  #if defined(PNG_READ_pCAL_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))     { @@ -432,8 +482,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_sCAL_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) @@ -443,8 +495,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_tIME_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) @@ -454,8 +508,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_tEXt_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) @@ -465,8 +521,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_zTXt_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) @@ -476,8 +534,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif  #if defined(PNG_READ_iTXt_SUPPORTED)     else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) @@ -487,8 +547,10 @@ png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)           png_push_save_buffer(png_ptr);           return;        } +        png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);     } +  #endif     else     { @@ -563,7 +625,9 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)  {     png_bytep ptr; -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return; +     ptr = buffer;     if (png_ptr->save_buffer_size)     { @@ -587,6 +651,7 @@ png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)        if (length < png_ptr->current_buffer_size)           save_size = length; +        else           save_size = png_ptr->current_buffer_size; @@ -604,7 +669,7 @@ png_push_save_buffer(png_structp png_ptr)     {        if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)        { -         png_size_t i,istop; +         png_size_t i, istop;           png_bytep sp;           png_bytep dp; @@ -627,6 +692,7 @@ png_push_save_buffer(png_structp png_ptr)        {          png_error(png_ptr, "Potential overflow of save_buffer");        } +        new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;        old_buffer = png_ptr->save_buffer;        png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr, @@ -673,7 +739,7 @@ png_push_read_IDAT(png_structp png_ptr)        }        png_push_fill_buffer(png_ptr, chunk_length, 4); -      png_ptr->push_length = png_get_uint_31(png_ptr,chunk_length); +      png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length);        png_reset_crc(png_ptr);        png_crc_read(png_ptr, png_ptr->chunk_name, 4);        png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; @@ -695,16 +761,19 @@ png_push_read_IDAT(png_structp png_ptr)        if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size)        {           save_size = (png_size_t)png_ptr->idat_size; -         /* check for overflow */ -         if((png_uint_32)save_size != png_ptr->idat_size) + +         /* Check for overflow */ +         if ((png_uint_32)save_size != png_ptr->idat_size)              png_error(png_ptr, "save_size overflowed in pngpread");        }        else           save_size = png_ptr->save_buffer_size;        png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); +        if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))           png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); +        png_ptr->idat_size -= save_size;        png_ptr->buffer_size -= save_size;        png_ptr->save_buffer_size -= save_size; @@ -717,8 +786,9 @@ png_push_read_IDAT(png_structp png_ptr)        if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size)        {           save_size = (png_size_t)png_ptr->idat_size; -         /* check for overflow */ -         if((png_uint_32)save_size != png_ptr->idat_size) + +         /* Check for overflow */ +         if ((png_uint_32)save_size != png_ptr->idat_size)              png_error(png_ptr, "save_size overflowed in pngpread");        }        else @@ -758,7 +828,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,     png_ptr->zstream.next_in = buffer;     png_ptr->zstream.avail_in = (uInt)buffer_length; -   for(;;) +   for (;;)     {        ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);        if (ret != Z_OK) @@ -767,6 +837,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,           {              if (png_ptr->zstream.avail_in)                 png_error(png_ptr, "Extra compressed data"); +              if (!(png_ptr->zstream.avail_out))              {                 png_push_process_row(png_ptr); @@ -778,6 +849,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,           }           else if (ret == Z_BUF_ERROR)              break; +           else              png_error(png_ptr, "Decompression Error");        } @@ -799,6 +871,7 @@ png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,           png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;           png_ptr->zstream.next_out = png_ptr->row_buf;        } +        else           break;     } @@ -827,7 +900,7 @@ png_push_process_row(png_structp png_ptr)        png_do_read_transformations(png_ptr);  #if defined(PNG_READ_INTERLACING_SUPPORTED) -   /* blow up interlaced rows to full size */ +   /* Blow up interlaced rows to full size */     if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))     {        if (png_ptr->pass < 6) @@ -845,9 +918,10 @@ png_push_process_row(png_structp png_ptr)              for (i = 0; i < 8 && png_ptr->pass == 0; i++)              {                 png_push_have_row(png_ptr, png_ptr->row_buf + 1); -               png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */ +               png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */              } -            if (png_ptr->pass == 2) /* pass 1 might be empty */ + +            if (png_ptr->pass == 2) /* Pass 1 might be empty */              {                 for (i = 0; i < 4 && png_ptr->pass == 2; i++)                 { @@ -855,6 +929,7 @@ png_push_process_row(png_structp png_ptr)                    png_read_push_finish_row(png_ptr);                 }              } +              if (png_ptr->pass == 4 && png_ptr->height <= 4)              {                 for (i = 0; i < 2 && png_ptr->pass == 4; i++) @@ -863,13 +938,16 @@ png_push_process_row(png_structp png_ptr)                    png_read_push_finish_row(png_ptr);                 }              } +              if (png_ptr->pass == 6 && png_ptr->height <= 4)              {                  png_push_have_row(png_ptr, png_bytep_NULL);                  png_read_push_finish_row(png_ptr);              } +              break;           } +           case 1:           {              int i; @@ -878,7 +956,8 @@ png_push_process_row(png_structp png_ptr)                 png_push_have_row(png_ptr, png_ptr->row_buf + 1);                 png_read_push_finish_row(png_ptr);              } -            if (png_ptr->pass == 2) /* skip top 4 generated rows */ + +            if (png_ptr->pass == 2) /* Skip top 4 generated rows */              {                 for (i = 0; i < 4 && png_ptr->pass == 2; i++)                 { @@ -886,22 +965,27 @@ png_push_process_row(png_structp png_ptr)                    png_read_push_finish_row(png_ptr);                 }              } +              break;           } +           case 2:           {              int i; +              for (i = 0; i < 4 && png_ptr->pass == 2; i++)              {                 png_push_have_row(png_ptr, png_ptr->row_buf + 1);                 png_read_push_finish_row(png_ptr);              } +              for (i = 0; i < 4 && png_ptr->pass == 2; i++)              {                 png_push_have_row(png_ptr, png_bytep_NULL);                 png_read_push_finish_row(png_ptr);              } -            if (png_ptr->pass == 4) /* pass 3 might be empty */ + +            if (png_ptr->pass == 4) /* Pass 3 might be empty */              {                 for (i = 0; i < 2 && png_ptr->pass == 4; i++)                 { @@ -909,17 +993,21 @@ png_push_process_row(png_structp png_ptr)                    png_read_push_finish_row(png_ptr);                 }              } +              break;           } +           case 3:           {              int i; +              for (i = 0; i < 4 && png_ptr->pass == 3; i++)              {                 png_push_have_row(png_ptr, png_ptr->row_buf + 1);                 png_read_push_finish_row(png_ptr);              } -            if (png_ptr->pass == 4) /* skip top two generated rows */ + +            if (png_ptr->pass == 4) /* Skip top two generated rows */              {                 for (i = 0; i < 2 && png_ptr->pass == 4; i++)                 { @@ -927,49 +1015,61 @@ png_push_process_row(png_structp png_ptr)                    png_read_push_finish_row(png_ptr);                 }              } +              break;           } +           case 4:           {              int i; +              for (i = 0; i < 2 && png_ptr->pass == 4; i++)              {                 png_push_have_row(png_ptr, png_ptr->row_buf + 1);                 png_read_push_finish_row(png_ptr);              } +              for (i = 0; i < 2 && png_ptr->pass == 4; i++)              {                 png_push_have_row(png_ptr, png_bytep_NULL);                 png_read_push_finish_row(png_ptr);              } -            if (png_ptr->pass == 6) /* pass 5 might be empty */ + +            if (png_ptr->pass == 6) /* Pass 5 might be empty */              {                 png_push_have_row(png_ptr, png_bytep_NULL);                 png_read_push_finish_row(png_ptr);              } +              break;           } +           case 5:           {              int i; +              for (i = 0; i < 2 && png_ptr->pass == 5; i++)              {                 png_push_have_row(png_ptr, png_ptr->row_buf + 1);                 png_read_push_finish_row(png_ptr);              } -            if (png_ptr->pass == 6) /* skip top generated row */ + +            if (png_ptr->pass == 6) /* Skip top generated row */              {                 png_push_have_row(png_ptr, png_bytep_NULL);                 png_read_push_finish_row(png_ptr);              } +              break;           }           case 6:           {              png_push_have_row(png_ptr, png_ptr->row_buf + 1);              png_read_push_finish_row(png_ptr); +              if (png_ptr->pass != 6)                 break; +              png_push_have_row(png_ptr, png_bytep_NULL);              png_read_push_finish_row(png_ptr);           } @@ -987,18 +1087,18 @@ void /* PRIVATE */  png_read_push_finish_row(png_structp png_ptr)  {  #ifdef PNG_USE_LOCAL_ARRAYS -   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ +   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ -   /* start of interlace block */ +   /* Start of interlace block */     PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; -   /* offset to next interlace block */ +   /* Offset to next interlace block */     PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; -   /* start of interlace block in the y direction */ +   /* Start of interlace block in the y direction */     PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; -   /* offset to next interlace block in the y direction */ +   /* Offset to next interlace block in the y direction */     PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};     /* Height of interlace block.  This is not currently used - if you need @@ -1011,6 +1111,7 @@ png_read_push_finish_row(png_structp png_ptr)     if (png_ptr->row_number < png_ptr->num_rows)        return; +#if defined(PNG_READ_INTERLACING_SUPPORTED)     if (png_ptr->interlaced)     {        png_ptr->row_number = 0; @@ -1026,6 +1127,7 @@ png_read_push_finish_row(png_structp png_ptr)           if (png_ptr->pass > 7)              png_ptr->pass--; +           if (png_ptr->pass >= 7)              break; @@ -1047,6 +1149,7 @@ png_read_push_finish_row(png_structp png_ptr)        } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);     } +#endif /* PNG_READ_INTERLACING_SUPPORTED */  }  #if defined(PNG_READ_tEXt_SUPPORTED) @@ -1057,7 +1160,7 @@ png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32     if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))        {           png_error(png_ptr, "Out of place tEXt"); -         info_ptr = info_ptr; /* to quiet some compiler warnings */ +         info_ptr = info_ptr; /* To quiet some compiler warnings */        }  #ifdef PNG_MAX_MALLOC_64K @@ -1072,7 +1175,7 @@ png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32  #endif     png_ptr->current_text = (png_charp)png_malloc(png_ptr, -         (png_uint_32)(length+1)); +      (png_uint_32)(length + 1));     png_ptr->current_text[length] = '\0';     png_ptr->current_text_ptr = png_ptr->current_text;     png_ptr->current_text_size = (png_size_t)length; @@ -1089,8 +1192,10 @@ png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)        if (png_ptr->buffer_size < png_ptr->current_text_left)           text_size = png_ptr->buffer_size; +        else           text_size = png_ptr->current_text_left; +        png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);        png_ptr->current_text_left -= text_size;        png_ptr->current_text_ptr += text_size; @@ -1118,7 +1223,7 @@ png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)        key = png_ptr->current_text;        for (text = key; *text; text++) -         /* empty loop */ ; +         /* Empty loop */ ;        if (text < key + png_ptr->current_text_size)           text++; @@ -1153,7 +1258,7 @@ png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32     if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))        {           png_error(png_ptr, "Out of place zTXt"); -         info_ptr = info_ptr; /* to quiet some compiler warnings */ +         info_ptr = info_ptr; /* To quiet some compiler warnings */        }  #ifdef PNG_MAX_MALLOC_64K @@ -1170,7 +1275,7 @@ png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32  #endif     png_ptr->current_text = (png_charp)png_malloc(png_ptr, -       (png_uint_32)(length+1)); +      (png_uint_32)(length + 1));     png_ptr->current_text[length] = '\0';     png_ptr->current_text_ptr = png_ptr->current_text;     png_ptr->current_text_size = (png_size_t)length; @@ -1187,8 +1292,10 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)        if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)           text_size = png_ptr->buffer_size; +        else           text_size = png_ptr->current_text_left; +        png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);        png_ptr->current_text_left -= text_size;        png_ptr->current_text_ptr += text_size; @@ -1212,7 +1319,7 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)        key = png_ptr->current_text;        for (text = key; *text; text++) -         /* empty loop */ ; +         /* Empty loop */ ;        /* zTXt can't have zero text */        if (text >= key + png_ptr->current_text_size) @@ -1224,7 +1331,7 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)        text++; -      if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */ +      if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */        {           png_ptr->current_text = NULL;           png_free(png_ptr, key); @@ -1261,13 +1368,17 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)              if (text == NULL)              {                 text = (png_charp)png_malloc(png_ptr, -                  (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out -                     + key_size + 1)); +                     (png_uint_32)(png_ptr->zbuf_size +                     - png_ptr->zstream.avail_out + key_size + 1)); +                 png_memcpy(text + key_size, png_ptr->zbuf,                    png_ptr->zbuf_size - png_ptr->zstream.avail_out); +                 png_memcpy(text, key, key_size); +                 text_size = key_size + png_ptr->zbuf_size -                    png_ptr->zstream.avail_out; +                 *(text + text_size) = '\0';              }              else @@ -1276,12 +1387,15 @@ png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)                 tmp = text;                 text = (png_charp)png_malloc(png_ptr, text_size + -                  (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out -                   + 1)); +                  (png_uint_32)(png_ptr->zbuf_size  +                  - png_ptr->zstream.avail_out + 1)); +                 png_memcpy(text, tmp, text_size);                 png_free(png_ptr, tmp); +                 png_memcpy(text + text_size, png_ptr->zbuf,                    png_ptr->zbuf_size - png_ptr->zstream.avail_out); +                 text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;                 *(text + text_size) = '\0';              } @@ -1345,7 +1459,7 @@ png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32     if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))        {           png_error(png_ptr, "Out of place iTXt"); -         info_ptr = info_ptr; /* to quiet some compiler warnings */ +         info_ptr = info_ptr; /* To quiet some compiler warnings */        }  #ifdef PNG_MAX_MALLOC_64K @@ -1360,7 +1474,7 @@ png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32  #endif     png_ptr->current_text = (png_charp)png_malloc(png_ptr, -         (png_uint_32)(length+1)); +      (png_uint_32)(length + 1));     png_ptr->current_text[length] = '\0';     png_ptr->current_text_ptr = png_ptr->current_text;     png_ptr->current_text_size = (png_size_t)length; @@ -1378,8 +1492,10 @@ png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)        if (png_ptr->buffer_size < png_ptr->current_text_left)           text_size = png_ptr->buffer_size; +        else           text_size = png_ptr->current_text_left; +        png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);        png_ptr->current_text_left -= text_size;        png_ptr->current_text_ptr += text_size; @@ -1410,23 +1526,25 @@ png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)        key = png_ptr->current_text;        for (lang = key; *lang; lang++) -         /* empty loop */ ; +         /* Empty loop */ ;        if (lang < key + png_ptr->current_text_size - 3)           lang++;        comp_flag = *lang++; -      lang++;     /* skip comp_type, always zero */ +      lang++;     /* Skip comp_type, always zero */        for (lang_key = lang; *lang_key; lang_key++) -         /* empty loop */ ; -      lang_key++;        /* skip NUL separator */ +         /* Empty loop */ ; + +      lang_key++;        /* Skip NUL separator */        text=lang_key; +        if (lang_key < key + png_ptr->current_text_size - 1)        {          for (; *text; text++) -           /* empty loop */ ; +           /* Empty loop */ ;        }        if (text < key + png_ptr->current_text_size) @@ -1434,6 +1552,7 @@ png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)        text_ptr = (png_textp)png_malloc(png_ptr,           (png_uint_32)png_sizeof(png_text)); +        text_ptr->compression = comp_flag + 2;        text_ptr->key = key;        text_ptr->lang = lang; @@ -1461,22 +1580,21 @@ void /* PRIVATE */  png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32     length)  { -   png_uint_32 skip=0; -   png_check_chunk_name(png_ptr, png_ptr->chunk_name); +   png_uint_32 skip = 0;     if (!(png_ptr->chunk_name[0] & 0x20))     {  #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) -     if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != -          PNG_HANDLE_CHUNK_ALWAYS +      if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != +         PNG_HANDLE_CHUNK_ALWAYS  #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) -          && png_ptr->read_user_chunk_fn == NULL +         && png_ptr->read_user_chunk_fn == NULL  #endif -        ) +         )  #endif -        png_chunk_error(png_ptr, "unknown critical chunk"); +         png_chunk_error(png_ptr, "unknown critical chunk"); -     info_ptr = info_ptr; /* to quiet some compiler warnings */ +      info_ptr = info_ptr; /* To quiet some compiler warnings */     }  #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) @@ -1490,37 +1608,53 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32            length = (png_uint_32)65535L;        }  #endif -      png_strncpy((png_charp)png_ptr->unknown_chunk.name, -	 (png_charp)png_ptr->chunk_name, 4); -      png_ptr->unknown_chunk.name[4] = '\0'; -      png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); +      png_memcpy((png_charp)png_ptr->unknown_chunk.name, +                 (png_charp)png_ptr->chunk_name,  +                 png_sizeof(png_ptr->unknown_chunk.name)); +      png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] +        = '\0'; +        png_ptr->unknown_chunk.size = (png_size_t)length; -      png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); + +      if (length == 0) +         png_ptr->unknown_chunk.data = NULL; + +      else +      { +         png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, +       (png_uint_32)length); +         png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); +      } +  #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) -      if(png_ptr->read_user_chunk_fn != NULL) +      if (png_ptr->read_user_chunk_fn != NULL)        { -         /* callback to user unknown chunk handler */ +         /* Callback to user unknown chunk handler */           int ret;           ret = (*(png_ptr->read_user_chunk_fn))             (png_ptr, &png_ptr->unknown_chunk); +           if (ret < 0)              png_chunk_error(png_ptr, "error in user chunk"); +           if (ret == 0)           {              if (!(png_ptr->chunk_name[0] & 0x20)) -               if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != +               if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=                      PNG_HANDLE_CHUNK_ALWAYS)                    png_chunk_error(png_ptr, "unknown critical chunk");              png_set_unknown_chunks(png_ptr, info_ptr,                 &png_ptr->unknown_chunk, 1);           }        } -#else -      png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); + +      else  #endif +        png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);        png_free(png_ptr, png_ptr->unknown_chunk.data);        png_ptr->unknown_chunk.data = NULL;     } +     else  #endif        skip=length; @@ -1557,7 +1691,9 @@ png_progressive_combine_row (png_structp png_ptr,     PNG_CONST int FARDATA png_pass_dsp_mask[7] =        {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};  #endif -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return; +     if (new_row != NULL)    /* new_row must == png_ptr->row_buf here. */        png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);  } @@ -1567,7 +1703,9 @@ png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,     png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,     png_progressive_end_ptr end_fn)  { -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return; +     png_ptr->info_fn = info_fn;     png_ptr->row_fn = row_fn;     png_ptr->end_fn = end_fn; @@ -1578,7 +1716,9 @@ png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,  png_voidp PNGAPI  png_get_progressive_ptr(png_structp png_ptr)  { -   if(png_ptr == NULL) return (NULL); +   if (png_ptr == NULL) +      return (NULL); +     return png_ptr->io_ptr;  }  #endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ diff --git a/src/libpng/pngread.c b/src/libpng/pngread.c index 02efb0d..370ecba 100644 --- a/src/libpng/pngread.c +++ b/src/libpng/pngread.c @@ -1,9 +1,9 @@  /* pngread.c - read a PNG file   * - * Last changed in libpng 1.2.20 September 7, 2007 + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   * @@ -13,7 +13,6 @@  #define PNG_INTERNAL  #include "png.h" -  #if defined(PNG_READ_SUPPORTED)  /* Create a PNG structure for reading, and allocate any memory needed. */ @@ -35,6 +34,9 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,  {  #endif /* PNG_USER_MEM_SUPPORTED */ +#ifdef PNG_SETJMP_SUPPORTED +   volatile +#endif     png_structp png_ptr;  #ifdef PNG_SETJMP_SUPPORTED @@ -45,7 +47,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,     int i; -   png_debug(1, "in png_create_read_struct\n"); +   png_debug(1, "in png_create_read_struct");  #ifdef PNG_USER_MEM_SUPPORTED     png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,        (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); @@ -55,7 +57,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,     if (png_ptr == NULL)        return (NULL); -   /* added at libpng-1.2.6 */ +   /* Added at libpng-1.2.6 */  #ifdef PNG_SET_USER_LIMITS_SUPPORTED     png_ptr->user_width_max=PNG_USER_WIDTH_MAX;     png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; @@ -69,7 +71,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,  #endif     {        png_free(png_ptr, png_ptr->zbuf); -      png_ptr->zbuf=NULL; +      png_ptr->zbuf = NULL;  #ifdef PNG_USER_MEM_SUPPORTED        png_destroy_struct_2((png_voidp)png_ptr,           (png_free_ptr)free_fn, (png_voidp)mem_ptr); @@ -79,7 +81,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,        return (NULL);     }  #ifdef USE_FAR_KEYWORD -   png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); +   png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));  #endif  #endif @@ -89,12 +91,18 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,     png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); -   i=0; -   do +   if (user_png_ver)     { -     if(user_png_ver[i] != png_libpng_ver[i]) +     i = 0; +     do +     { +       if (user_png_ver[i] != png_libpng_ver[i]) +          png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; +     } while (png_libpng_ver[i++]); +   } +   else          png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; -   } while (png_libpng_ver[i++]); +        if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)     { @@ -122,14 +130,14 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,          png_warning(png_ptr, msg);  #endif  #ifdef PNG_ERROR_NUMBERS_SUPPORTED -        png_ptr->flags=0; +        png_ptr->flags = 0;  #endif          png_error(png_ptr,             "Incompatible libpng version in application and library");       }     } -   /* initialize zbuf - compression buffer */ +   /* Initialize zbuf - compression buffer */     png_ptr->zbuf_size = PNG_ZBUF_SIZE;     png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,       (png_uint_32)png_ptr->zbuf_size); @@ -158,7 +166,7 @@ png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,  #ifdef USE_FAR_KEYWORD     if (setjmp(jmpbuf))        PNG_ABORT(); -   png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); +   png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));  #else     if (setjmp(png_ptr->jmpbuf))        PNG_ABORT(); @@ -184,13 +192,14 @@ png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver,     png_size_t png_struct_size, png_size_t png_info_size)  {     /* We only come here via pre-1.0.12-compiled applications */ -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;  #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) -   if(png_sizeof(png_struct) > png_struct_size || +   if (png_sizeof(png_struct) > png_struct_size ||        png_sizeof(png_info) > png_info_size)     {        char msg[80]; -      png_ptr->warning_fn=NULL; +      png_ptr->warning_fn = NULL;        if (user_png_ver)        {          png_snprintf(msg, 80, @@ -204,20 +213,20 @@ png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver,        png_warning(png_ptr, msg);     }  #endif -   if(png_sizeof(png_struct) > png_struct_size) +   if (png_sizeof(png_struct) > png_struct_size)       { -       png_ptr->error_fn=NULL; +       png_ptr->error_fn = NULL;  #ifdef PNG_ERROR_NUMBERS_SUPPORTED -       png_ptr->flags=0; +       png_ptr->flags = 0;  #endif         png_error(png_ptr,         "The png struct allocated by the application for reading is too small.");       } -   if(png_sizeof(png_info) > png_info_size) +   if (png_sizeof(png_info) > png_info_size)       { -       png_ptr->error_fn=NULL; +       png_ptr->error_fn = NULL;  #ifdef PNG_ERROR_NUMBERS_SUPPORTED -       png_ptr->flags=0; +       png_ptr->flags = 0;  #endif         png_error(png_ptr,           "The info struct allocated by application for reading is too small."); @@ -234,20 +243,21 @@ png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,     jmp_buf tmp_jmp;  /* to save current jump buffer */  #endif -   int i=0; +   int i = 0;     png_structp png_ptr=*ptr_ptr; -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;     do     { -     if(user_png_ver[i] != png_libpng_ver[i]) +     if (user_png_ver[i] != png_libpng_ver[i])       {  #ifdef PNG_LEGACY_SUPPORTED         png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;  #else -       png_ptr->warning_fn=NULL; +       png_ptr->warning_fn = NULL;         png_warning(png_ptr,          "Application uses deprecated png_read_init() and should be recompiled.");         break; @@ -255,35 +265,35 @@ png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,       }     } while (png_libpng_ver[i++]); -   png_debug(1, "in png_read_init_3\n"); +   png_debug(1, "in png_read_init_3");  #ifdef PNG_SETJMP_SUPPORTED -   /* save jump buffer and error functions */ -   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); +   /* Save jump buffer and error functions */ +   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));  #endif -   if(png_sizeof(png_struct) > png_struct_size) -     { -       png_destroy_struct(png_ptr); -       *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); -       png_ptr = *ptr_ptr; -     } +   if (png_sizeof(png_struct) > png_struct_size) +   { +      png_destroy_struct(png_ptr); +      *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); +      png_ptr = *ptr_ptr; +   } -   /* reset all variables to 0 */ -   png_memset(png_ptr, 0, png_sizeof (png_struct)); +   /* Reset all variables to 0 */ +   png_memset(png_ptr, 0, png_sizeof(png_struct));  #ifdef PNG_SETJMP_SUPPORTED -   /* restore jump buffer */ -   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); +   /* Restore jump buffer */ +   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));  #endif -   /* added at libpng-1.2.6 */ +   /* Added at libpng-1.2.6 */  #ifdef PNG_SET_USER_LIMITS_SUPPORTED     png_ptr->user_width_max=PNG_USER_WIDTH_MAX;     png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;  #endif -   /* initialize zbuf - compression buffer */ +   /* Initialize zbuf - compression buffer */     png_ptr->zbuf_size = PNG_ZBUF_SIZE;     png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,       (png_uint_32)png_ptr->zbuf_size); @@ -318,8 +328,9 @@ png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,  void PNGAPI  png_read_info(png_structp png_ptr, png_infop info_ptr)  { -   if(png_ptr == NULL) return; -   png_debug(1, "in png_read_info\n"); +   if (png_ptr == NULL || info_ptr == NULL) +      return; +   png_debug(1, "in png_read_info");     /* If we haven't checked all of the PNG signature bytes, do so now. */     if (png_ptr->sig_bytes < 8)     { @@ -341,7 +352,7 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)           png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;     } -   for(;;) +   for (;;)     {  #ifdef PNG_USE_LOCAL_ARRAYS        PNG_CONST PNG_IHDR; @@ -400,38 +411,29 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)        PNG_CONST PNG_zTXt;  #endif  #endif /* PNG_USE_LOCAL_ARRAYS */ -      png_byte chunk_length[4]; -      png_uint_32 length; - -      png_read_data(png_ptr, chunk_length, 4); -      length = png_get_uint_31(png_ptr,chunk_length); - -      png_reset_crc(png_ptr); -      png_crc_read(png_ptr, png_ptr->chunk_name, 4); - -      png_debug2(0, "Reading %s chunk, length=%lu.\n", png_ptr->chunk_name, -         length); +      png_uint_32 length = png_read_chunk_header(png_ptr); +      PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;        /* This should be a binary subdivision search or a hash for         * matching the chunk name rather than a linear search.         */ -      if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) -        if(png_ptr->mode & PNG_AFTER_IDAT) +      if (!png_memcmp(chunk_name, png_IDAT, 4)) +        if (png_ptr->mode & PNG_AFTER_IDAT)            png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; -      if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) +      if (!png_memcmp(chunk_name, png_IHDR, 4))           png_handle_IHDR(png_ptr, info_ptr, length); -      else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) +      else if (!png_memcmp(chunk_name, png_IEND, 4))           png_handle_IEND(png_ptr, info_ptr, length);  #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -      else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) +      else if (png_handle_as_unknown(png_ptr, chunk_name))        { -         if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) +         if (!png_memcmp(chunk_name, png_IDAT, 4))              png_ptr->mode |= PNG_HAVE_IDAT;           png_handle_unknown(png_ptr, info_ptr, length); -         if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) +         if (!png_memcmp(chunk_name, png_PLTE, 4))              png_ptr->mode |= PNG_HAVE_PLTE; -         else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) +         else if (!png_memcmp(chunk_name, png_IDAT, 4))           {              if (!(png_ptr->mode & PNG_HAVE_IHDR))                 png_error(png_ptr, "Missing IHDR before IDAT"); @@ -442,9 +444,9 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)           }        }  #endif -      else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) +      else if (!png_memcmp(chunk_name, png_PLTE, 4))           png_handle_PLTE(png_ptr, info_ptr, length); -      else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) +      else if (!png_memcmp(chunk_name, png_IDAT, 4))        {           if (!(png_ptr->mode & PNG_HAVE_IHDR))              png_error(png_ptr, "Missing IHDR before IDAT"); @@ -457,71 +459,71 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)           break;        }  #if defined(PNG_READ_bKGD_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) +      else if (!png_memcmp(chunk_name, png_bKGD, 4))           png_handle_bKGD(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_cHRM_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) +      else if (!png_memcmp(chunk_name, png_cHRM, 4))           png_handle_cHRM(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_gAMA_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) +      else if (!png_memcmp(chunk_name, png_gAMA, 4))           png_handle_gAMA(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_hIST_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) +      else if (!png_memcmp(chunk_name, png_hIST, 4))           png_handle_hIST(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_oFFs_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) +      else if (!png_memcmp(chunk_name, png_oFFs, 4))           png_handle_oFFs(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_pCAL_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) +      else if (!png_memcmp(chunk_name, png_pCAL, 4))           png_handle_pCAL(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_sCAL_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) +      else if (!png_memcmp(chunk_name, png_sCAL, 4))           png_handle_sCAL(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_pHYs_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) +      else if (!png_memcmp(chunk_name, png_pHYs, 4))           png_handle_pHYs(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_sBIT_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) +      else if (!png_memcmp(chunk_name, png_sBIT, 4))           png_handle_sBIT(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_sRGB_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) +      else if (!png_memcmp(chunk_name, png_sRGB, 4))           png_handle_sRGB(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_iCCP_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) +      else if (!png_memcmp(chunk_name, png_iCCP, 4))           png_handle_iCCP(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_sPLT_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) +      else if (!png_memcmp(chunk_name, png_sPLT, 4))           png_handle_sPLT(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_tEXt_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) +      else if (!png_memcmp(chunk_name, png_tEXt, 4))           png_handle_tEXt(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_tIME_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) +      else if (!png_memcmp(chunk_name, png_tIME, 4))           png_handle_tIME(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_tRNS_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) +      else if (!png_memcmp(chunk_name, png_tRNS, 4))           png_handle_tRNS(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_zTXt_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) +      else if (!png_memcmp(chunk_name, png_zTXt, 4))           png_handle_zTXt(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_iTXt_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) +      else if (!png_memcmp(chunk_name, png_iTXt, 4))           png_handle_iTXt(png_ptr, info_ptr, length);  #endif        else @@ -530,12 +532,13 @@ png_read_info(png_structp png_ptr, png_infop info_ptr)  }  #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ -/* optional call to update the users info_ptr structure */ +/* Optional call to update the users info_ptr structure */  void PNGAPI  png_read_update_info(png_structp png_ptr, png_infop info_ptr)  { -   png_debug(1, "in png_read_update_info\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_read_update_info"); +   if (png_ptr == NULL) +      return;     if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))        png_read_start_row(png_ptr);     else @@ -553,8 +556,9 @@ png_read_update_info(png_structp png_ptr, png_infop info_ptr)  void PNGAPI  png_start_read_image(png_structp png_ptr)  { -   png_debug(1, "in png_start_read_image\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_start_read_image"); +   if (png_ptr == NULL) +      return;     if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))        png_read_start_row(png_ptr);  } @@ -567,18 +571,19 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)  #ifdef PNG_USE_LOCAL_ARRAYS     PNG_CONST PNG_IDAT;     PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, -     0xff}; +      0xff};     PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};  #endif     int ret; -   if(png_ptr == NULL) return; -   png_debug2(1, "in png_read_row (row %lu, pass %d)\n", +   if (png_ptr == NULL) +      return; +   png_debug2(1, "in png_read_row (row %lu, pass %d)",        png_ptr->row_number, png_ptr->pass);     if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))        png_read_start_row(png_ptr);     if (png_ptr->row_number == 0 && png_ptr->pass == 0)     { -   /* check for transforms that have been set but were defined out */ +   /* Check for transforms that have been set but were defined out */  #if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)     if (png_ptr->transformations & PNG_INVERT_MONO)        png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined."); @@ -610,7 +615,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)     }  #if defined(PNG_READ_INTERLACING_SUPPORTED) -   /* if interlaced and we do not need a new row, combine row and return */ +   /* If interlaced and we do not need a new row, combine row and return */     if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))     {        switch (png_ptr->pass) @@ -697,15 +702,9 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)        {           while (!png_ptr->idat_size)           { -            png_byte chunk_length[4]; -              png_crc_finish(png_ptr, 0); -            png_read_data(png_ptr, chunk_length, 4); -            png_ptr->idat_size = png_get_uint_31(png_ptr,chunk_length); - -            png_reset_crc(png_ptr); -            png_crc_read(png_ptr, png_ptr->chunk_name, 4); +            png_ptr->idat_size = png_read_chunk_header(png_ptr);              if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))                 png_error(png_ptr, "Not enough image data");           } @@ -741,7 +740,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)     png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,         png_ptr->row_info.width); -   if(png_ptr->row_buf[0]) +   if (png_ptr->row_buf[0])     png_read_filter_row(png_ptr, &(png_ptr->row_info),        png_ptr->row_buf + 1, png_ptr->prev_row + 1,        (int)(png_ptr->row_buf[0])); @@ -750,7 +749,7 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)        png_ptr->rowbytes + 1);  #if defined(PNG_MNG_FEATURES_SUPPORTED) -   if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && +   if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&        (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))     {        /* Intrapixel differencing */ @@ -763,15 +762,15 @@ png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)        png_do_read_transformations(png_ptr);  #if defined(PNG_READ_INTERLACING_SUPPORTED) -   /* blow up interlaced rows to full size */ +   /* Blow up interlaced rows to full size */     if (png_ptr->interlaced &&        (png_ptr->transformations & PNG_INTERLACE))     {        if (png_ptr->pass < 6) -/*       old interface (pre-1.0.9): -         png_do_read_interlace(&(png_ptr->row_info), -            png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); - */ +         /* Old interface (pre-1.0.9): +          * png_do_read_interlace(&(png_ptr->row_info), +          *    png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); +          */           png_do_read_interlace(png_ptr);        if (dsp_row != NULL) @@ -829,8 +828,9 @@ png_read_rows(png_structp png_ptr, png_bytepp row,     png_bytepp rp;     png_bytepp dp; -   png_debug(1, "in png_read_rows\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_read_rows"); +   if (png_ptr == NULL) +      return;     rp = row;     dp = display_row;     if (rp != NULL && dp != NULL) @@ -841,14 +841,14 @@ png_read_rows(png_structp png_ptr, png_bytepp row,           png_read_row(png_ptr, rptr, dptr);        } -   else if(rp != NULL) +   else if (rp != NULL)        for (i = 0; i < num_rows; i++)        {           png_bytep rptr = *rp;           png_read_row(png_ptr, rptr, png_bytep_NULL);           rp++;        } -   else if(dp != NULL) +   else if (dp != NULL)        for (i = 0; i < num_rows; i++)        {           png_bytep dptr = *dp; @@ -874,12 +874,13 @@ png_read_rows(png_structp png_ptr, png_bytepp row,  void PNGAPI  png_read_image(png_structp png_ptr, png_bytepp image)  { -   png_uint_32 i,image_height; +   png_uint_32 i, image_height;     int pass, j;     png_bytepp rp; -   png_debug(1, "in png_read_image\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_read_image"); +   if (png_ptr == NULL) +      return;  #ifdef PNG_READ_INTERLACING_SUPPORTED     pass = png_set_interlace_handling(png_ptr); @@ -914,11 +915,9 @@ png_read_image(png_structp png_ptr, png_bytepp image)  void PNGAPI  png_read_end(png_structp png_ptr, png_infop info_ptr)  { -   png_byte chunk_length[4]; -   png_uint_32 length; - -   png_debug(1, "in png_read_end\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_read_end"); +   if (png_ptr == NULL) +      return;     png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */     do @@ -980,33 +979,27 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)        PNG_CONST PNG_zTXt;  #endif  #endif /* PNG_USE_LOCAL_ARRAYS */ +      png_uint_32 length = png_read_chunk_header(png_ptr); +      PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; -      png_read_data(png_ptr, chunk_length, 4); -      length = png_get_uint_31(png_ptr,chunk_length); - -      png_reset_crc(png_ptr); -      png_crc_read(png_ptr, png_ptr->chunk_name, 4); - -      png_debug1(0, "Reading %s chunk.\n", png_ptr->chunk_name); - -      if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) +      if (!png_memcmp(chunk_name, png_IHDR, 4))           png_handle_IHDR(png_ptr, info_ptr, length); -      else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) +      else if (!png_memcmp(chunk_name, png_IEND, 4))           png_handle_IEND(png_ptr, info_ptr, length);  #ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -      else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) +      else if (png_handle_as_unknown(png_ptr, chunk_name))        { -         if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) +         if (!png_memcmp(chunk_name, png_IDAT, 4))           {              if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT))                 png_error(png_ptr, "Too many IDAT's found");           }           png_handle_unknown(png_ptr, info_ptr, length); -         if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) +         if (!png_memcmp(chunk_name, png_PLTE, 4))              png_ptr->mode |= PNG_HAVE_PLTE;        }  #endif -      else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) +      else if (!png_memcmp(chunk_name, png_IDAT, 4))        {           /* Zero length IDATs are legal after the last IDAT has been            * read, but not after other chunks have been read. @@ -1015,74 +1008,74 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)              png_error(png_ptr, "Too many IDAT's found");           png_crc_finish(png_ptr, length);        } -      else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) +      else if (!png_memcmp(chunk_name, png_PLTE, 4))           png_handle_PLTE(png_ptr, info_ptr, length);  #if defined(PNG_READ_bKGD_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) +      else if (!png_memcmp(chunk_name, png_bKGD, 4))           png_handle_bKGD(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_cHRM_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) +      else if (!png_memcmp(chunk_name, png_cHRM, 4))           png_handle_cHRM(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_gAMA_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) +      else if (!png_memcmp(chunk_name, png_gAMA, 4))           png_handle_gAMA(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_hIST_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) +      else if (!png_memcmp(chunk_name, png_hIST, 4))           png_handle_hIST(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_oFFs_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) +      else if (!png_memcmp(chunk_name, png_oFFs, 4))           png_handle_oFFs(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_pCAL_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) +      else if (!png_memcmp(chunk_name, png_pCAL, 4))           png_handle_pCAL(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_sCAL_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) +      else if (!png_memcmp(chunk_name, png_sCAL, 4))           png_handle_sCAL(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_pHYs_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) +      else if (!png_memcmp(chunk_name, png_pHYs, 4))           png_handle_pHYs(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_sBIT_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) +      else if (!png_memcmp(chunk_name, png_sBIT, 4))           png_handle_sBIT(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_sRGB_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) +      else if (!png_memcmp(chunk_name, png_sRGB, 4))           png_handle_sRGB(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_iCCP_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) +      else if (!png_memcmp(chunk_name, png_iCCP, 4))           png_handle_iCCP(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_sPLT_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) +      else if (!png_memcmp(chunk_name, png_sPLT, 4))           png_handle_sPLT(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_tEXt_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) +      else if (!png_memcmp(chunk_name, png_tEXt, 4))           png_handle_tEXt(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_tIME_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) +      else if (!png_memcmp(chunk_name, png_tIME, 4))           png_handle_tIME(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_tRNS_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) +      else if (!png_memcmp(chunk_name, png_tRNS, 4))           png_handle_tRNS(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_zTXt_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) +      else if (!png_memcmp(chunk_name, png_zTXt, 4))           png_handle_zTXt(png_ptr, info_ptr, length);  #endif  #if defined(PNG_READ_iTXt_SUPPORTED) -      else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) +      else if (!png_memcmp(chunk_name, png_iTXt, 4))           png_handle_iTXt(png_ptr, info_ptr, length);  #endif        else @@ -1091,7 +1084,7 @@ png_read_end(png_structp png_ptr, png_infop info_ptr)  }  #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ -/* free all memory used by the read */ +/* Free all memory used by the read */  void PNGAPI  png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,     png_infopp end_info_ptr_ptr) @@ -1099,13 +1092,20 @@ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,     png_structp png_ptr = NULL;     png_infop info_ptr = NULL, end_info_ptr = NULL;  #ifdef PNG_USER_MEM_SUPPORTED -   png_free_ptr free_fn; -   png_voidp mem_ptr; +   png_free_ptr free_fn = NULL; +   png_voidp mem_ptr = NULL;  #endif -   png_debug(1, "in png_destroy_read_struct\n"); +   png_debug(1, "in png_destroy_read_struct");     if (png_ptr_ptr != NULL)        png_ptr = *png_ptr_ptr; +   if (png_ptr == NULL) +      return; + +#ifdef PNG_USER_MEM_SUPPORTED +   free_fn = png_ptr->free_fn; +   mem_ptr = png_ptr->mem_ptr; +#endif     if (info_ptr_ptr != NULL)        info_ptr = *info_ptr_ptr; @@ -1113,11 +1113,6 @@ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,     if (end_info_ptr_ptr != NULL)        end_info_ptr = *end_info_ptr_ptr; -#ifdef PNG_USER_MEM_SUPPORTED -   free_fn = png_ptr->free_fn; -   mem_ptr = png_ptr->mem_ptr; -#endif -     png_read_destroy(png_ptr, info_ptr, end_info_ptr);     if (info_ptr != NULL) @@ -1161,7 +1156,7 @@ png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,     }  } -/* free all memory used by the read (old method) */ +/* Free all memory used by the read (old method) */  void /* PRIVATE */  png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)  { @@ -1175,7 +1170,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr     png_free_ptr free_fn;  #endif -   png_debug(1, "in png_read_destroy\n"); +   png_debug(1, "in png_read_destroy");     if (info_ptr != NULL)        png_info_destroy(png_ptr, info_ptr); @@ -1185,6 +1180,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr     png_free(png_ptr, png_ptr->zbuf);     png_free(png_ptr, png_ptr->big_row_buf);     png_free(png_ptr, png_ptr->prev_row); +   png_free(png_ptr, png_ptr->chunkdata);  #if defined(PNG_READ_DITHER_SUPPORTED)     png_free(png_ptr, png_ptr->palette_lookup);     png_free(png_ptr, png_ptr->dither_index); @@ -1281,7 +1277,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr      * being used again.      */  #ifdef PNG_SETJMP_SUPPORTED -   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); +   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));  #endif     error_fn = png_ptr->error_fn; @@ -1291,7 +1287,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr     free_fn = png_ptr->free_fn;  #endif -   png_memset(png_ptr, 0, png_sizeof (png_struct)); +   png_memset(png_ptr, 0, png_sizeof(png_struct));     png_ptr->error_fn = error_fn;     png_ptr->warning_fn = warning_fn; @@ -1301,7 +1297,7 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr  #endif  #ifdef PNG_SETJMP_SUPPORTED -   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); +   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));  #endif  } @@ -1309,7 +1305,8 @@ png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr  void PNGAPI  png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn)  { -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;     png_ptr->read_row_fn = read_row_fn;  } @@ -1323,9 +1320,10 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,  {     int row; -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;  #if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) -   /* invert the alpha channel from opacity to transparency +   /* Invert the alpha channel from opacity to transparency      */     if (transforms & PNG_TRANSFORM_INVERT_ALPHA)         png_set_invert_alpha(png_ptr); @@ -1336,15 +1334,15 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,      */     png_read_info(png_ptr, info_ptr);     if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep)) -      png_error(png_ptr,"Image is too high to process with png_read_png()"); +      png_error(png_ptr, "Image is too high to process with png_read_png()");     /* -------------- image transformations start here ------------------- */  #if defined(PNG_READ_16_TO_8_SUPPORTED) -   /* tell libpng to strip 16 bit/color files down to 8 bits per color +   /* Tell libpng to strip 16 bit/color files down to 8 bits per color.      */     if (transforms & PNG_TRANSFORM_STRIP_16) -       png_set_strip_16(png_ptr); +      png_set_strip_16(png_ptr);  #endif  #if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) @@ -1352,7 +1350,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,      * the background (not recommended).      */     if (transforms & PNG_TRANSFORM_STRIP_ALPHA) -       png_set_strip_alpha(png_ptr); +      png_set_strip_alpha(png_ptr);  #endif  #if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED) @@ -1360,7 +1358,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,      * byte into separate bytes (useful for paletted and grayscale images).      */     if (transforms & PNG_TRANSFORM_PACKING) -       png_set_packing(png_ptr); +      png_set_packing(png_ptr);  #endif  #if defined(PNG_READ_PACKSWAP_SUPPORTED) @@ -1368,7 +1366,7 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,      * (not useful if you are using png_set_packing).      */     if (transforms & PNG_TRANSFORM_PACKSWAP) -       png_set_packswap(png_ptr); +      png_set_packswap(png_ptr);  #endif  #if defined(PNG_READ_EXPAND_SUPPORTED) @@ -1378,9 +1376,9 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,      * channels so the data will be available as RGBA quartets.      */     if (transforms & PNG_TRANSFORM_EXPAND) -       if ((png_ptr->bit_depth < 8) || -           (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || -           (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) +      if ((png_ptr->bit_depth < 8) || +          (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || +          (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))           png_set_expand(png_ptr);  #endif @@ -1388,10 +1386,10 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,      */  #if defined(PNG_READ_INVERT_SUPPORTED) -   /* invert monochrome files to have 0 as white and 1 as black +   /* Invert monochrome files to have 0 as white and 1 as black      */     if (transforms & PNG_TRANSFORM_INVERT_MONO) -       png_set_invert_mono(png_ptr); +      png_set_invert_mono(png_ptr);  #endif  #if defined(PNG_READ_SHIFT_SUPPORTED) @@ -1410,24 +1408,24 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,  #endif  #if defined(PNG_READ_BGR_SUPPORTED) -   /* flip the RGB pixels to BGR (or RGBA to BGRA) +   /* Flip the RGB pixels to BGR (or RGBA to BGRA)      */     if (transforms & PNG_TRANSFORM_BGR) -       png_set_bgr(png_ptr); +      png_set_bgr(png_ptr);  #endif  #if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) -   /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) +   /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR)      */     if (transforms & PNG_TRANSFORM_SWAP_ALPHA)         png_set_swap_alpha(png_ptr);  #endif  #if defined(PNG_READ_SWAP_SUPPORTED) -   /* swap bytes of 16 bit files to least significant byte first +   /* Swap bytes of 16 bit files to least significant byte first      */     if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) -       png_set_swap(png_ptr); +      png_set_swap(png_ptr);  #endif     /* We don't handle adding filler bytes */ @@ -1443,27 +1441,27 @@ png_read_png(png_structp png_ptr, png_infop info_ptr,  #ifdef PNG_FREE_ME_SUPPORTED     png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);  #endif -   if(info_ptr->row_pointers == NULL) +   if (info_ptr->row_pointers == NULL)     {        info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr,           info_ptr->height * png_sizeof(png_bytep)); +      png_memset(info_ptr->row_pointers, 0, info_ptr->height +         * png_sizeof(png_bytep));  #ifdef PNG_FREE_ME_SUPPORTED        info_ptr->free_me |= PNG_FREE_ROWS;  #endif        for (row = 0; row < (int)info_ptr->height; row++) -      {           info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr,              png_get_rowbytes(png_ptr, info_ptr)); -      }     }     png_read_image(png_ptr, info_ptr->row_pointers);     info_ptr->valid |= PNG_INFO_IDAT; -   /* read rest of file, and get additional chunks in info_ptr - REQUIRED */ +   /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */     png_read_end(png_ptr, info_ptr); -   transforms = transforms; /* quiet compiler warnings */ +   transforms = transforms; /* Quiet compiler warnings */     params = params;  } diff --git a/src/libpng/pngrio.c b/src/libpng/pngrio.c index 7d2522f..2c8e6a7 100644 --- a/src/libpng/pngrio.c +++ b/src/libpng/pngrio.c @@ -1,9 +1,9 @@  /* pngrio.c - functions for data input   * - * Last changed in libpng 1.2.13 November 13, 2006 + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2006 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   * @@ -17,18 +17,18 @@  #define PNG_INTERNAL  #include "png.h" -  #if defined(PNG_READ_SUPPORTED)  /* Read the data from whatever input you are using.  The default routine -   reads from a file pointer.  Note that this routine sometimes gets called -   with very small lengths, so you should implement some kind of simple -   buffering if you are using unbuffered reads.  This should never be asked -   to read more then 64K on a 16 bit machine. */ + * reads from a file pointer.  Note that this routine sometimes gets called + * with very small lengths, so you should implement some kind of simple + * buffering if you are using unbuffered reads.  This should never be asked + * to read more then 64K on a 16 bit machine. + */  void /* PRIVATE */  png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)  { -   png_debug1(4,"reading %d bytes\n", (int)length); +   png_debug1(4, "reading %d bytes", (int)length);     if (png_ptr->read_data_fn != NULL)        (*(png_ptr->read_data_fn))(png_ptr, data, length);     else @@ -37,16 +37,18 @@ png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)  #if !defined(PNG_NO_STDIO)  /* This is the function that does the actual reading of data.  If you are -   not reading from a standard C stream, you should create a replacement -   read_data function and use it at run time with png_set_read_fn(), rather -   than changing the library. */ + * not reading from a standard C stream, you should create a replacement + * read_data function and use it at run time with png_set_read_fn(), rather + * than changing the library. + */  #ifndef USE_FAR_KEYWORD  void PNGAPI  png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)  {     png_size_t check; -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;     /* fread() returns 0 on error, so it is OK to store this in a png_size_t      * instead of an int, which is what fread() actually returns.      */ @@ -62,7 +64,7 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)        png_error(png_ptr, "Read Error");  }  #else -/* this is the model-independent version. Since the standard I/O library +/* This is the model-independent version. Since the standard I/O library     can't handle far buffers in the medium and small models, we have to copy     the data.  */ @@ -77,7 +79,8 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)     png_byte *n_data;     png_FILE_p io_ptr; -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;     /* Check if data really is near. If so, use usual code. */     n_data = (png_byte *)CVT_PTR_NOCHECK(data);     io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); @@ -106,7 +109,7 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)           err = fread(buf, (png_size_t)1, read, io_ptr);  #endif           png_memcpy(data, buf, read); /* copy far buffer to near buffer */ -         if(err != read) +         if (err != read)              break;           else              check += err; @@ -122,23 +125,27 @@ png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)  #endif  /* This function allows the application to supply a new input function -   for libpng if standard C streams aren't being used. - -   This function takes as its arguments: -   png_ptr      - pointer to a png input data structure -   io_ptr       - pointer to user supplied structure containing info about -                  the input functions.  May be NULL. -   read_data_fn - pointer to a new input function that takes as its -                  arguments a pointer to a png_struct, a pointer to -                  a location where input data can be stored, and a 32-bit -                  unsigned int that is the number of bytes to be read. -                  To exit and output any fatal error messages the new write -                  function should call png_error(png_ptr, "Error msg"). */ + * for libpng if standard C streams aren't being used. + * + * This function takes as its arguments: + * png_ptr      - pointer to a png input data structure + * io_ptr       - pointer to user supplied structure containing info about + *                the input functions.  May be NULL. + * read_data_fn - pointer to a new input function that takes as its + *                arguments a pointer to a png_struct, a pointer to + *                a location where input data can be stored, and a 32-bit + *                unsigned int that is the number of bytes to be read. + *                To exit and output any fatal error messages the new write + *                function should call png_error(png_ptr, "Error msg"). + *                May be NULL, in which case libpng's default function will + *                be used. + */  void PNGAPI  png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,     png_rw_ptr read_data_fn)  { -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;     png_ptr->io_ptr = io_ptr;  #if !defined(PNG_NO_STDIO) diff --git a/src/libpng/pngrtran.c b/src/libpng/pngrtran.c index cda3921..af396df 100644 --- a/src/libpng/pngrtran.c +++ b/src/libpng/pngrtran.c @@ -1,9 +1,9 @@  /* pngrtran.c - transforms the data in a row for PNG readers   * - * Last changed in libpng 1.2.22 [October 13, 2007] + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   * @@ -15,32 +15,37 @@  #define PNG_INTERNAL  #include "png.h" -  #if defined(PNG_READ_SUPPORTED)  /* Set the action on getting a CRC error for an ancillary or critical chunk. */  void PNGAPI  png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)  { -   png_debug(1, "in png_set_crc_action\n"); +   png_debug(1, "in png_set_crc_action");     /* Tell libpng how we react to CRC errors in critical chunks */ -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;     switch (crit_action)     { -      case PNG_CRC_NO_CHANGE:                        /* leave setting as is */ +      case PNG_CRC_NO_CHANGE:                        /* Leave setting as is */           break; -      case PNG_CRC_WARN_USE:                               /* warn/use data */ + +      case PNG_CRC_WARN_USE:                               /* Warn/use data */           png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;           png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE;           break; -      case PNG_CRC_QUIET_USE:                             /* quiet/use data */ + +      case PNG_CRC_QUIET_USE:                             /* Quiet/use data */           png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;           png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE |                             PNG_FLAG_CRC_CRITICAL_IGNORE;           break; -      case PNG_CRC_WARN_DISCARD:    /* not a valid action for critical data */ -         png_warning(png_ptr, "Can't discard critical data on CRC error."); -      case PNG_CRC_ERROR_QUIT:                                /* error/quit */ + +      case PNG_CRC_WARN_DISCARD:    /* Not a valid action for critical data */ +         png_warning(png_ptr, +            "Can't discard critical data on CRC error."); +      case PNG_CRC_ERROR_QUIT:                                /* Error/quit */ +        case PNG_CRC_DEFAULT:        default:           png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; @@ -49,22 +54,27 @@ png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)     switch (ancil_action)     { -      case PNG_CRC_NO_CHANGE:                       /* leave setting as is */ +      case PNG_CRC_NO_CHANGE:                       /* Leave setting as is */           break; -      case PNG_CRC_WARN_USE:                              /* warn/use data */ + +      case PNG_CRC_WARN_USE:                              /* Warn/use data */           png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;           png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE;           break; -      case PNG_CRC_QUIET_USE:                            /* quiet/use data */ + +      case PNG_CRC_QUIET_USE:                            /* Quiet/use data */           png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;           png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE |                             PNG_FLAG_CRC_ANCILLARY_NOWARN;           break; -      case PNG_CRC_ERROR_QUIT:                               /* error/quit */ + +      case PNG_CRC_ERROR_QUIT:                               /* Error/quit */           png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;           png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN;           break; -      case PNG_CRC_WARN_DISCARD:                      /* warn/discard data */ + +      case PNG_CRC_WARN_DISCARD:                      /* Warn/discard data */ +        case PNG_CRC_DEFAULT:        default:           png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; @@ -74,14 +84,15 @@ png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)  #if defined(PNG_READ_BACKGROUND_SUPPORTED) && \      defined(PNG_FLOATING_POINT_SUPPORTED) -/* handle alpha and tRNS via a background color */ +/* Handle alpha and tRNS via a background color */  void PNGAPI  png_set_background(png_structp png_ptr,     png_color_16p background_color, int background_gamma_code,     int need_expand, double background_gamma)  { -   png_debug(1, "in png_set_background\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_background"); +   if (png_ptr == NULL) +      return;     if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN)     {        png_warning(png_ptr, "Application must supply a known background gamma"); @@ -98,12 +109,13 @@ png_set_background(png_structp png_ptr,  #endif  #if defined(PNG_READ_16_TO_8_SUPPORTED) -/* strip 16 bit depth files to 8 bit depth */ +/* Strip 16 bit depth files to 8 bit depth */  void PNGAPI  png_set_strip_16(png_structp png_ptr)  { -   png_debug(1, "in png_set_strip_16\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_strip_16"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= PNG_16_TO_8;  }  #endif @@ -112,8 +124,9 @@ png_set_strip_16(png_structp png_ptr)  void PNGAPI  png_set_strip_alpha(png_structp png_ptr)  { -   png_debug(1, "in png_set_strip_alpha\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_strip_alpha"); +   if (png_ptr == NULL) +      return;     png_ptr->flags |= PNG_FLAG_STRIP_ALPHA;  }  #endif @@ -142,8 +155,9 @@ png_set_dither(png_structp png_ptr, png_colorp palette,     int num_palette, int maximum_colors, png_uint_16p histogram,     int full_dither)  { -   png_debug(1, "in png_set_dither\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_dither"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= PNG_DITHER;     if (!full_dither) @@ -151,7 +165,7 @@ png_set_dither(png_structp png_ptr, png_colorp palette,        int i;        png_ptr->dither_index = (png_bytep)png_malloc(png_ptr, -         (png_uint_32)(num_palette * png_sizeof (png_byte))); +         (png_uint_32)(num_palette * png_sizeof(png_byte)));        for (i = 0; i < num_palette; i++)           png_ptr->dither_index[i] = (png_byte)i;     } @@ -161,27 +175,29 @@ png_set_dither(png_structp png_ptr, png_colorp palette,        if (histogram != NULL)        {           /* This is easy enough, just throw out the least used colors. -            Perhaps not the best solution, but good enough. */ +          * Perhaps not the best solution, but good enough. +          */           int i; -         /* initialize an array to sort colors */ +         /* Initialize an array to sort colors */           png_ptr->dither_sort = (png_bytep)png_malloc(png_ptr, -            (png_uint_32)(num_palette * png_sizeof (png_byte))); +            (png_uint_32)(num_palette * png_sizeof(png_byte))); -         /* initialize the dither_sort array */ +         /* Initialize the dither_sort array */           for (i = 0; i < num_palette; i++)              png_ptr->dither_sort[i] = (png_byte)i;           /* Find the least used palette entries by starting a -            bubble sort, and running it until we have sorted -            out enough colors.  Note that we don't care about -            sorting all the colors, just finding which are -            least used. */ +          * bubble sort, and running it until we have sorted +          * out enough colors.  Note that we don't care about +          * sorting all the colors, just finding which are +          * least used. +          */           for (i = num_palette - 1; i >= maximum_colors; i--)           { -            int done; /* to stop early if the list is pre-sorted */ +            int done; /* To stop early if the list is pre-sorted */              int j;              done = 1; @@ -202,13 +218,14 @@ png_set_dither(png_structp png_ptr, png_colorp palette,                 break;           } -         /* swap the palette around, and set up a table, if necessary */ +         /* Swap the palette around, and set up a table, if necessary */           if (full_dither)           {              int j = num_palette; -            /* put all the useful colors within the max, but don't -               move the others */ +            /* Put all the useful colors within the max, but don't +             * move the others. +             */              for (i = 0; i < maximum_colors; i++)              {                 if ((int)png_ptr->dither_sort[i] >= maximum_colors) @@ -224,11 +241,12 @@ png_set_dither(png_structp png_ptr, png_colorp palette,           {              int j = num_palette; -            /* move all the used colors inside the max limit, and -               develop a translation table */ +            /* Move all the used colors inside the max limit, and +             * develop a translation table. +             */              for (i = 0; i < maximum_colors; i++)              { -               /* only move the colors we need to */ +               /* Only move the colors we need to */                 if ((int)png_ptr->dither_sort[i] >= maximum_colors)                 {                    png_color tmp_color; @@ -240,20 +258,20 @@ png_set_dither(png_structp png_ptr, png_colorp palette,                    tmp_color = palette[j];                    palette[j] = palette[i];                    palette[i] = tmp_color; -                  /* indicate where the color went */ +                  /* Indicate where the color went */                    png_ptr->dither_index[j] = (png_byte)i;                    png_ptr->dither_index[i] = (png_byte)j;                 }              } -            /* find closest color for those colors we are not using */ +            /* Find closest color for those colors we are not using */              for (i = 0; i < num_palette; i++)              {                 if ((int)png_ptr->dither_index[i] >= maximum_colors)                 {                    int min_d, k, min_k, d_index; -                  /* find the closest color to one we threw out */ +                  /* Find the closest color to one we threw out */                    d_index = png_ptr->dither_index[i];                    min_d = PNG_COLOR_DIST(palette[d_index], palette[0]);                    for (k = 1, min_k = 0; k < maximum_colors; k++) @@ -268,39 +286,39 @@ png_set_dither(png_structp png_ptr, png_colorp palette,                          min_k = k;                       }                    } -                  /* point to closest color */ +                  /* Point to closest color */                    png_ptr->dither_index[i] = (png_byte)min_k;                 }              }           }           png_free(png_ptr, png_ptr->dither_sort); -         png_ptr->dither_sort=NULL; +         png_ptr->dither_sort = NULL;        }        else        {           /* This is much harder to do simply (and quickly).  Perhaps -            we need to go through a median cut routine, but those -            don't always behave themselves with only a few colors -            as input.  So we will just find the closest two colors, -            and throw out one of them (chosen somewhat randomly). -            [We don't understand this at all, so if someone wants to -             work on improving it, be our guest - AED, GRP] -            */ +          * we need to go through a median cut routine, but those +          * don't always behave themselves with only a few colors +          * as input.  So we will just find the closest two colors, +          * and throw out one of them (chosen somewhat randomly). +          * [We don't understand this at all, so if someone wants to +          *  work on improving it, be our guest - AED, GRP] +          */           int i;           int max_d;           int num_new_palette;           png_dsortp t;           png_dsortpp hash; -         t=NULL; +         t = NULL; -         /* initialize palette index arrays */ +         /* Initialize palette index arrays */           png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr, -            (png_uint_32)(num_palette * png_sizeof (png_byte))); +            (png_uint_32)(num_palette * png_sizeof(png_byte)));           png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr, -            (png_uint_32)(num_palette * png_sizeof (png_byte))); +            (png_uint_32)(num_palette * png_sizeof(png_byte))); -         /* initialize the sort array */ +         /* Initialize the sort array */           for (i = 0; i < num_palette; i++)           {              png_ptr->index_to_palette[i] = (png_byte)i; @@ -308,21 +326,19 @@ png_set_dither(png_structp png_ptr, png_colorp palette,           }           hash = (png_dsortpp)png_malloc(png_ptr, (png_uint_32)(769 * -            png_sizeof (png_dsortp))); -         for (i = 0; i < 769; i++) -            hash[i] = NULL; -/*         png_memset(hash, 0, 769 * png_sizeof (png_dsortp)); */ +            png_sizeof(png_dsortp))); +         png_memset(hash, 0, 769 * png_sizeof(png_dsortp));           num_new_palette = num_palette; -         /* initial wild guess at how far apart the farthest pixel -            pair we will be eliminating will be.  Larger -            numbers mean more areas will be allocated, Smaller -            numbers run the risk of not saving enough data, and -            having to do this all over again. - -            I have not done extensive checking on this number. -            */ +         /* Initial wild guess at how far apart the farthest pixel +          * pair we will be eliminating will be.  Larger +          * numbers mean more areas will be allocated, Smaller +          * numbers run the risk of not saving enough data, and +          * having to do this all over again. +          * +          * I have not done extensive checking on this number. +          */           max_d = 96;           while (num_new_palette > maximum_colors) @@ -436,8 +452,8 @@ png_set_dither(png_structp png_ptr, png_colorp palette,           png_free(png_ptr, hash);           png_free(png_ptr, png_ptr->palette_to_index);           png_free(png_ptr, png_ptr->index_to_palette); -         png_ptr->palette_to_index=NULL; -         png_ptr->index_to_palette=NULL; +         png_ptr->palette_to_index = NULL; +         png_ptr->index_to_palette = NULL;        }        num_palette = maximum_colors;     } @@ -457,12 +473,10 @@ png_set_dither(png_structp png_ptr, png_colorp palette,        int num_green = (1 << PNG_DITHER_GREEN_BITS);        int num_blue = (1 << PNG_DITHER_BLUE_BITS);        png_size_t num_entries = ((png_size_t)1 << total_bits); -        png_ptr->palette_lookup = (png_bytep )png_malloc(png_ptr, -         (png_uint_32)(num_entries * png_sizeof (png_byte))); - +         (png_uint_32)(num_entries * png_sizeof(png_byte)));        png_memset(png_ptr->palette_lookup, 0, num_entries * -         png_sizeof (png_byte)); +         png_sizeof(png_byte));        distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries *           png_sizeof(png_byte))); @@ -526,8 +540,9 @@ png_set_dither(png_structp png_ptr, png_colorp palette,  void PNGAPI  png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma)  { -   png_debug(1, "in png_set_gamma\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_gamma"); +   if (png_ptr == NULL) +      return;     if ((fabs(scrn_gamma * file_gamma - 1.0) > PNG_GAMMA_THRESHOLD) ||         (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) ||         (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) @@ -545,12 +560,11 @@ png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma)  void PNGAPI  png_set_expand(png_structp png_ptr)  { -   png_debug(1, "in png_set_expand\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_expand"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); -#ifdef PNG_WARN_UNINITIALIZED_ROW     png_ptr->flags &= ~PNG_FLAG_ROW_INIT; -#endif  }  /* GRR 19990627:  the following three functions currently are identical @@ -574,12 +588,11 @@ png_set_expand(png_structp png_ptr)  void PNGAPI  png_set_palette_to_rgb(png_structp png_ptr)  { -   png_debug(1, "in png_set_palette_to_rgb\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_palette_to_rgb"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); -#ifdef PNG_WARN_UNINITIALIZED_ROW     png_ptr->flags &= ~PNG_FLAG_ROW_INIT; -#endif  }  #if !defined(PNG_1_0_X) @@ -587,12 +600,11 @@ png_set_palette_to_rgb(png_structp png_ptr)  void PNGAPI  png_set_expand_gray_1_2_4_to_8(png_structp png_ptr)  { -   png_debug(1, "in png_set_expand_gray_1_2_4_to_8\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_expand_gray_1_2_4_to_8"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= PNG_EXPAND; -#ifdef PNG_WARN_UNINITIALIZED_ROW     png_ptr->flags &= ~PNG_FLAG_ROW_INIT; -#endif  }  #endif @@ -602,8 +614,9 @@ png_set_expand_gray_1_2_4_to_8(png_structp png_ptr)  void PNGAPI  png_set_gray_1_2_4_to_8(png_structp png_ptr)  { -   png_debug(1, "in png_set_gray_1_2_4_to_8\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_gray_1_2_4_to_8"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);  }  #endif @@ -613,11 +626,9 @@ png_set_gray_1_2_4_to_8(png_structp png_ptr)  void PNGAPI  png_set_tRNS_to_alpha(png_structp png_ptr)  { -   png_debug(1, "in png_set_tRNS_to_alpha\n"); +   png_debug(1, "in png_set_tRNS_to_alpha");     png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); -#ifdef PNG_WARN_UNINITIALIZED_ROW     png_ptr->flags &= ~PNG_FLAG_ROW_INIT; -#endif  }  #endif /* defined(PNG_READ_EXPAND_SUPPORTED) */ @@ -625,11 +636,9 @@ png_set_tRNS_to_alpha(png_structp png_ptr)  void PNGAPI  png_set_gray_to_rgb(png_structp png_ptr)  { -   png_debug(1, "in png_set_gray_to_rgb\n"); +   png_debug(1, "in png_set_gray_to_rgb");     png_ptr->transformations |= PNG_GRAY_TO_RGB; -#ifdef PNG_WARN_UNINITIALIZED_ROW     png_ptr->flags &= ~PNG_FLAG_ROW_INIT; -#endif  }  #endif @@ -643,10 +652,11 @@ void PNGAPI  png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red,     double green)  { -      int red_fixed = (int)((float)red*100000.0 + 0.5); -      int green_fixed = (int)((float)green*100000.0 + 0.5); -      if(png_ptr == NULL) return; -      png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed); +   int red_fixed = (int)((float)red*100000.0 + 0.5); +   int green_fixed = (int)((float)green*100000.0 + 0.5); +   if (png_ptr == NULL) +      return; +   png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed);  }  #endif @@ -654,14 +664,17 @@ void PNGAPI  png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,     png_fixed_point red, png_fixed_point green)  { -   png_debug(1, "in png_set_rgb_to_gray\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_rgb_to_gray"); +   if (png_ptr == NULL) +      return;     switch(error_action)     {        case 1: png_ptr->transformations |= PNG_RGB_TO_GRAY;                break; +        case 2: png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN;                break; +        case 3: png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR;     }     if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) @@ -669,21 +682,22 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,        png_ptr->transformations |= PNG_EXPAND;  #else     { -      png_warning(png_ptr, "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED."); +      png_warning(png_ptr, +        "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED.");        png_ptr->transformations &= ~PNG_RGB_TO_GRAY;     }  #endif     {        png_uint_16 red_int, green_int; -      if(red < 0 || green < 0) +      if (red < 0 || green < 0)        {           red_int   =  6968; /* .212671 * 32768 + .5 */           green_int = 23434; /* .715160 * 32768 + .5 */        } -      else if(red + green < 100000L) +      else if (red + green < 100000L)        { -        red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L); -        green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L); +         red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L); +         green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L);        }        else        { @@ -693,7 +707,8 @@ png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,        }        png_ptr->rgb_to_gray_red_coeff   = red_int;        png_ptr->rgb_to_gray_green_coeff = green_int; -      png_ptr->rgb_to_gray_blue_coeff  = (png_uint_16)(32768-red_int-green_int); +      png_ptr->rgb_to_gray_blue_coeff  = +         (png_uint_16)(32768 - red_int - green_int);     }  }  #endif @@ -705,14 +720,15 @@ void PNGAPI  png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr     read_user_transform_fn)  { -   png_debug(1, "in png_set_read_user_transform_fn\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_read_user_transform_fn"); +   if (png_ptr == NULL) +      return;  #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)     png_ptr->transformations |= PNG_USER_TRANSFORM;     png_ptr->read_user_transform_fn = read_user_transform_fn;  #endif  #ifdef PNG_LEGACY_SUPPORTED -   if(read_user_transform_fn) +   if (read_user_transform_fn)        png_warning(png_ptr,          "This version of libpng does not support user transforms");  #endif @@ -725,9 +741,9 @@ png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr  void /* PRIVATE */  png_init_read_transformations(png_structp png_ptr)  { -   png_debug(1, "in png_init_read_transformations\n"); +   png_debug(1, "in png_init_read_transformations");  #if defined(PNG_USELESS_TESTS_SUPPORTED) -   if(png_ptr != NULL) +   if (png_ptr != NULL)  #endif    {  #if defined(PNG_READ_BACKGROUND_SUPPORTED) || defined(PNG_READ_SHIFT_SUPPORTED) \ @@ -739,8 +755,9 @@ png_init_read_transformations(png_structp png_ptr)  #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)     /* Detect gray background and attempt to enable optimization -    * for gray --> RGB case */ -   /* Note:  if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or +    * for gray --> RGB case +    * +    * Note:  if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or      * RGB_ALPHA (in which case need_expand is superfluous anyway), the      * background color might actually be gray yet not be flagged as such.      * This is not a problem for the current code, which uses @@ -767,7 +784,7 @@ png_init_read_transformations(png_structp png_ptr)     {        if (!(color_type & PNG_COLOR_MASK_COLOR))  /* i.e., GRAY or GRAY_ALPHA */        { -         /* expand background and tRNS chunks */ +         /* Expand background and tRNS chunks */           switch (png_ptr->bit_depth)           {              case 1: @@ -781,6 +798,7 @@ png_init_read_transformations(png_structp png_ptr)                     = png_ptr->trans_values.blue = png_ptr->trans_values.gray;                 }                 break; +              case 2:                 png_ptr->background.gray *= (png_uint_16)0x55;                 png_ptr->background.red = png_ptr->background.green @@ -792,6 +810,7 @@ png_init_read_transformations(png_structp png_ptr)                     = png_ptr->trans_values.blue = png_ptr->trans_values.gray;                 }                 break; +              case 4:                 png_ptr->background.gray *= (png_uint_16)0x11;                 png_ptr->background.red = png_ptr->background.green @@ -803,7 +822,9 @@ png_init_read_transformations(png_structp png_ptr)                     = png_ptr->trans_values.blue = png_ptr->trans_values.gray;                 }                 break; +              case 8: +              case 16:                 png_ptr->background.red = png_ptr->background.green                   = png_ptr->background.blue = png_ptr->background.gray; @@ -826,9 +847,10 @@ png_init_read_transformations(png_structp png_ptr)             if (!(png_ptr->transformations & PNG_EXPAND_tRNS))  #endif             { -           /* invert the alpha channel (in tRNS) unless the pixels are -              going to be expanded, in which case leave it for later */ -              int i,istop; +           /* Invert the alpha channel (in tRNS) unless the pixels are +            * going to be expanded, in which case leave it for later +            */ +              int i, istop;                istop=(int)png_ptr->num_trans;                for (i=0; i<istop; i++)                   png_ptr->trans[i] = (png_byte)(255 - png_ptr->trans[i]); @@ -849,12 +871,12 @@ png_init_read_transformations(png_structp png_ptr)         && (fabs(png_ptr->screen_gamma * png_ptr->gamma - 1.0)           < PNG_GAMMA_THRESHOLD))     { -    int i,k; +    int i, k;      k=0;      for (i=0; i<png_ptr->num_trans; i++)      {        if (png_ptr->trans[i] != 0 && png_ptr->trans[i] != 0xff) -        k=1; /* partial transparency is present */ +        k=1; /* Partial transparency is present */      }      if (k == 0)        png_ptr->transformations &= ~PNG_GAMMA; @@ -869,8 +891,7 @@ png_init_read_transformations(png_structp png_ptr)        {           if (color_type == PNG_COLOR_TYPE_PALETTE)           { -           /* could skip if no transparency and -           */ +           /* Could skip if no transparency */              png_color back, back_1;              png_colorp palette = png_ptr->palette;              int num_palette = png_ptr->num_palette; @@ -895,10 +916,12 @@ png_init_read_transformations(png_structp png_ptr)                       g = (png_ptr->screen_gamma);                       gs = 1.0;                       break; +                    case PNG_BACKGROUND_GAMMA_FILE:                       g = 1.0 / (png_ptr->gamma);                       gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma);                       break; +                    case PNG_BACKGROUND_GAMMA_UNIQUE:                       g = 1.0 / (png_ptr->background_gamma);                       gs = 1.0 / (png_ptr->background_gamma * @@ -964,6 +987,14 @@ png_init_read_transformations(png_structp png_ptr)                    palette[i].blue = png_ptr->gamma_table[palette[i].blue];                 }              } +	    /* Prevent the transformations being done again, and make sure +	     * that the now spurious alpha channel is stripped - the code +	     * has just reduced background composition and gamma correction +	     * to a simple alpha channel strip. +	     */ +	    png_ptr->transformations &= ~PNG_BACKGROUND; +	    png_ptr->transformations &= ~PNG_GAMMA; +	    png_ptr->transformations |= PNG_STRIP_ALPHA;           }           /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */           else @@ -979,10 +1010,12 @@ png_init_read_transformations(png_structp png_ptr)                    g = (png_ptr->screen_gamma);                    gs = 1.0;                    break; +                 case PNG_BACKGROUND_GAMMA_FILE:                    g = 1.0 / (png_ptr->gamma);                    gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma);                    break; +                 case PNG_BACKGROUND_GAMMA_UNIQUE:                    g = 1.0 / (png_ptr->background_gamma);                    gs = 1.0 / (png_ptr->background_gamma * @@ -1024,7 +1057,7 @@ png_init_read_transformations(png_structp png_ptr)           }        }        else -      /* transformation does not include PNG_BACKGROUND */ +      /* Transformation does not include PNG_BACKGROUND */  #endif /* PNG_READ_BACKGROUND_SUPPORTED */        if (color_type == PNG_COLOR_TYPE_PALETTE)        { @@ -1038,6 +1071,9 @@ png_init_read_transformations(png_structp png_ptr)              palette[i].green = png_ptr->gamma_table[palette[i].green];              palette[i].blue = png_ptr->gamma_table[palette[i].blue];           } + +	 /* Done the gamma correction. */ +	 png_ptr->transformations &= ~PNG_GAMMA;        }     }  #if defined(PNG_READ_BACKGROUND_SUPPORTED) @@ -1075,6 +1111,10 @@ png_init_read_transformations(png_structp png_ptr)                 png_ptr->trans[i], back.blue);           }        } + +      /* Handled alpha, still need to strip the channel. */ +      png_ptr->transformations &= ~PNG_BACKGROUND; +      png_ptr->transformations |= PNG_STRIP_ALPHA;     }  #endif /* PNG_READ_BACKGROUND_SUPPORTED */ @@ -1105,7 +1145,7 @@ png_init_read_transformations(png_structp png_ptr)   }  #if !defined(PNG_READ_GAMMA_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) \   && !defined(PNG_READ_BACKGROUND_SUPPORTED) -   if(png_ptr) +   if (png_ptr)        return;  #endif  } @@ -1117,13 +1157,14 @@ png_init_read_transformations(png_structp png_ptr)  void /* PRIVATE */  png_read_transform_info(png_structp png_ptr, png_infop info_ptr)  { -   png_debug(1, "in png_read_transform_info\n"); +   png_debug(1, "in png_read_transform_info");  #if defined(PNG_READ_EXPAND_SUPPORTED)     if (png_ptr->transformations & PNG_EXPAND)     {        if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)        { -         if (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND_tRNS)) +         if (png_ptr->num_trans && +              (png_ptr->transformations & PNG_EXPAND_tRNS))              info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA;           else              info_ptr->color_type = PNG_COLOR_TYPE_RGB; @@ -1136,8 +1177,10 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)           {              if (png_ptr->transformations & PNG_EXPAND_tRNS)                info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; +#if 0 /* Removed from libpng-1.2.27 */              else                info_ptr->color_type |= PNG_COLOR_MASK_COLOR; +#endif           }           if (info_ptr->bit_depth < 8)              info_ptr->bit_depth = 8; @@ -1186,8 +1229,8 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)     if (png_ptr->transformations & PNG_DITHER)     {        if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || -         (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) && -         png_ptr->palette_lookup && info_ptr->bit_depth == 8) +          (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) && +          png_ptr->palette_lookup && info_ptr->bit_depth == 8)        {           info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;        } @@ -1221,7 +1264,7 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)         (info_ptr->color_type == PNG_COLOR_TYPE_GRAY)))     {        info_ptr->channels++; -      /* if adding a true alpha channel not just filler */ +      /* If adding a true alpha channel not just filler */  #if !defined(PNG_1_0_X)        if (png_ptr->transformations & PNG_ADD_ALPHA)          info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; @@ -1231,11 +1274,11 @@ png_read_transform_info(png_structp png_ptr, png_infop info_ptr)  #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \  defined(PNG_READ_USER_TRANSFORM_SUPPORTED) -   if(png_ptr->transformations & PNG_USER_TRANSFORM) +   if (png_ptr->transformations & PNG_USER_TRANSFORM)       { -       if(info_ptr->bit_depth < png_ptr->user_transform_depth) +       if (info_ptr->bit_depth < png_ptr->user_transform_depth)           info_ptr->bit_depth = png_ptr->user_transform_depth; -       if(info_ptr->channels < png_ptr->user_transform_channels) +       if (info_ptr->channels < png_ptr->user_transform_channels)           info_ptr->channels = png_ptr->user_transform_channels;       }  #endif @@ -1243,10 +1286,10 @@ defined(PNG_READ_USER_TRANSFORM_SUPPORTED)     info_ptr->pixel_depth = (png_byte)(info_ptr->channels *        info_ptr->bit_depth); -   info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth,info_ptr->width); +   info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, info_ptr->width);  #if !defined(PNG_READ_EXPAND_SUPPORTED) -   if(png_ptr) +   if (png_ptr)        return;  #endif  } @@ -1258,14 +1301,14 @@ defined(PNG_READ_USER_TRANSFORM_SUPPORTED)  void /* PRIVATE */  png_do_read_transformations(png_structp png_ptr)  { -   png_debug(1, "in png_do_read_transformations\n"); +   png_debug(1, "in png_do_read_transformations");     if (png_ptr->row_buf == NULL)     {  #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)        char msg[50];        png_snprintf2(msg, 50, -         "NULL row buffer for row %ld, pass %d", png_ptr->row_number, +         "NULL row buffer for row %ld, pass %d", (long)png_ptr->row_number,           png_ptr->pass);        png_error(png_ptr, msg);  #else @@ -1276,7 +1319,8 @@ png_do_read_transformations(png_structp png_ptr)     if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))        /* Application has failed to call either png_read_start_image()         * or png_read_update_info() after setting transforms that expand -       * pixels.  This check added to libpng-1.2.19 */ +       * pixels.  This check added to libpng-1.2.19 +       */  #if (PNG_WARN_UNINITIALIZED_ROW==1)        png_error(png_ptr, "Uninitialized row");  #else @@ -1316,52 +1360,54 @@ png_do_read_transformations(png_structp png_ptr)     {        int rgb_error =           png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), png_ptr->row_buf + 1); -      if(rgb_error) +      if (rgb_error)        {           png_ptr->rgb_to_gray_status=1; -         if((png_ptr->transformations & PNG_RGB_TO_GRAY) ==  +         if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==               PNG_RGB_TO_GRAY_WARN)              png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel"); -         if((png_ptr->transformations & PNG_RGB_TO_GRAY) == +         if ((png_ptr->transformations & PNG_RGB_TO_GRAY) ==               PNG_RGB_TO_GRAY_ERR)              png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel");        }     }  #endif -/* -From Andreas Dilger e-mail to png-implement, 26 March 1998: - -  In most cases, the "simple transparency" should be done prior to doing -  gray-to-RGB, or you will have to test 3x as many bytes to check if a -  pixel is transparent.  You would also need to make sure that the -  transparency information is upgraded to RGB. - -  To summarize, the current flow is: -  - Gray + simple transparency -> compare 1 or 2 gray bytes and composite -                                  with background "in place" if transparent, -                                  convert to RGB if necessary -  - Gray + alpha -> composite with gray background and remove alpha bytes, -                                  convert to RGB if necessary - -  To support RGB backgrounds for gray images we need: -  - Gray + simple transparency -> convert to RGB + simple transparency, compare -                                  3 or 6 bytes and composite with background -                                  "in place" if transparent (3x compare/pixel -                                  compared to doing composite with gray bkgrnd) -  - Gray + alpha -> convert to RGB + alpha, composite with background and -                                  remove alpha bytes (3x float operations/pixel -                                  compared with composite on gray background) - -  Greg's change will do this.  The reason it wasn't done before is for -  performance, as this increases the per-pixel operations.  If we would check -  in advance if the background was gray or RGB, and position the gray-to-RGB -  transform appropriately, then it would save a lot of work/time. +/* From Andreas Dilger e-mail to png-implement, 26 March 1998: + *  + *   In most cases, the "simple transparency" should be done prior to doing + *   gray-to-RGB, or you will have to test 3x as many bytes to check if a + *   pixel is transparent.  You would also need to make sure that the + *   transparency information is upgraded to RGB. + *  + *   To summarize, the current flow is: + *   - Gray + simple transparency -> compare 1 or 2 gray bytes and composite + *                                   with background "in place" if transparent, + *                                   convert to RGB if necessary + *   - Gray + alpha -> composite with gray background and remove alpha bytes, + *                                   convert to RGB if necessary + * + *   To support RGB backgrounds for gray images we need: + *   - Gray + simple transparency -> convert to RGB + simple transparency, + *                                   compare 3 or 6 bytes and composite with + *                                   background "in place" if transparent + *                                   (3x compare/pixel compared to doing + *                                   composite with gray bkgrnd) + *   - Gray + alpha -> convert to RGB + alpha, composite with background and + *                                   remove alpha bytes (3x float + *                                   operations/pixel compared with composite + *                                   on gray background) + * + *  Greg's change will do this.  The reason it wasn't done before is for + *  performance, as this increases the per-pixel operations.  If we would check + *  in advance if the background was gray or RGB, and position the gray-to-RGB + *  transform appropriately, then it would save a lot of work/time.   */  #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) -   /* if gray -> RGB, do so now only if background is non-gray; else do later -    * for performance reasons */ +   /* If gray -> RGB, do so now only if background is non-gray; else do later +    * for performance reasons +    */     if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&         !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY))        png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); @@ -1386,14 +1432,14 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:  #if defined(PNG_READ_GAMMA_SUPPORTED)     if ((png_ptr->transformations & PNG_GAMMA) &&  #if defined(PNG_READ_BACKGROUND_SUPPORTED) -      !((png_ptr->transformations & PNG_BACKGROUND) && -      ((png_ptr->num_trans != 0) || -      (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) && +       !((png_ptr->transformations & PNG_BACKGROUND) && +       ((png_ptr->num_trans != 0) || +       (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) &&  #endif -      (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)) +       (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE))        png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1, -         png_ptr->gamma_table, png_ptr->gamma_16_table, -         png_ptr->gamma_shift); +          png_ptr->gamma_table, png_ptr->gamma_16_table, +          png_ptr->gamma_shift);  #endif  #if defined(PNG_READ_16_TO_8_SUPPORTED) @@ -1406,7 +1452,7 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:     {        png_do_dither((png_row_infop)&(png_ptr->row_info), png_ptr->row_buf + 1,           png_ptr->palette_lookup, png_ptr->dither_index); -      if(png_ptr->row_info.rowbytes == (png_uint_32)0) +      if (png_ptr->row_info.rowbytes == (png_uint_32)0)           png_error(png_ptr, "png_do_dither returned rowbytes=0");     }  #endif @@ -1438,7 +1484,7 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:  #endif  #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) -   /* if gray -> RGB, do so now only if we did not do so above */ +   /* If gray -> RGB, do so now only if we did not do so above */     if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&         (png_ptr->mode & PNG_BACKGROUND_IS_GRAY))        png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); @@ -1468,21 +1514,21 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:  #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)     if (png_ptr->transformations & PNG_USER_TRANSFORM)      { -      if(png_ptr->read_user_transform_fn != NULL) -        (*(png_ptr->read_user_transform_fn)) /* user read transform function */ -          (png_ptr,                    /* png_ptr */ -           &(png_ptr->row_info),       /* row_info:     */ -             /*  png_uint_32 width;          width of row */ -             /*  png_uint_32 rowbytes;       number of bytes in row */ -             /*  png_byte color_type;        color type of pixels */ -             /*  png_byte bit_depth;         bit depth of samples */ -             /*  png_byte channels;          number of channels (1-4) */ -             /*  png_byte pixel_depth;       bits per pixel (depth*channels) */ -           png_ptr->row_buf + 1);      /* start of pixel data for row */ +      if (png_ptr->read_user_transform_fn != NULL) +         (*(png_ptr->read_user_transform_fn)) /* User read transform function */ +            (png_ptr,                    /* png_ptr */ +               &(png_ptr->row_info),     /* row_info: */ +               /*  png_uint_32 width;       width of row */ +               /*  png_uint_32 rowbytes;    number of bytes in row */ +               /*  png_byte color_type;     color type of pixels */ +               /*  png_byte bit_depth;      bit depth of samples */ +               /*  png_byte channels;       number of channels (1-4) */ +               /*  png_byte pixel_depth;    bits per pixel (depth*channels) */ +               png_ptr->row_buf + 1);    /* start of pixel data for row */  #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) -      if(png_ptr->user_transform_depth) +      if (png_ptr->user_transform_depth)           png_ptr->row_info.bit_depth = png_ptr->user_transform_depth; -      if(png_ptr->user_transform_channels) +      if (png_ptr->user_transform_channels)           png_ptr->row_info.channels = png_ptr->user_transform_channels;  #endif        png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * @@ -1504,7 +1550,7 @@ From Andreas Dilger e-mail to png-implement, 26 March 1998:  void /* PRIVATE */  png_do_unpack(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_unpack\n"); +   png_debug(1, "in png_do_unpack");  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL && row_info->bit_depth < 8)  #else @@ -1536,6 +1582,7 @@ png_do_unpack(png_row_infop row_info, png_bytep row)              }              break;           } +           case 2:           { @@ -1557,6 +1604,7 @@ png_do_unpack(png_row_infop row_info, png_bytep row)              }              break;           } +           case 4:           {              png_bytep sp = row + (png_size_t)((row_width - 1) >> 1); @@ -1594,7 +1642,7 @@ png_do_unpack(png_row_infop row_info, png_bytep row)  void /* PRIVATE */  png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)  { -   png_debug(1, "in png_do_unshift\n"); +   png_debug(1, "in png_do_unshift");     if (  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && sig_bits != NULL && @@ -1648,6 +1696,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)              }              break;           } +           case 4:           {              png_bytep bp = row; @@ -1663,6 +1712,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)              }              break;           } +           case 8:           {              png_bytep bp = row; @@ -1675,6 +1725,7 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)              }              break;           } +           case 16:           {              png_bytep bp = row; @@ -1696,11 +1747,11 @@ png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)  #endif  #if defined(PNG_READ_16_TO_8_SUPPORTED) -/* chop rows of bit depth 16 down to 8 */ +/* Chop rows of bit depth 16 down to 8 */  void /* PRIVATE */  png_do_chop(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_chop\n"); +   png_debug(1, "in png_do_chop");  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL && row_info->bit_depth == 16)  #else @@ -1720,14 +1771,17 @@ png_do_chop(png_row_infop row_info, png_bytep row)         *         * What the ideal calculation should be:         *   *dp = (((((png_uint_32)(*sp) << 8) | -       *          (png_uint_32)(*(sp + 1))) * 255 + 127) / (png_uint_32)65535L; +       *          (png_uint_32)(*(sp + 1))) * 255 + 127) +       *          / (png_uint_32)65535L;         *         * GRR: no, I think this is what it really should be:         *   *dp = (((((png_uint_32)(*sp) << 8) | -       *           (png_uint_32)(*(sp + 1))) + 128L) / (png_uint_32)257L; +       *           (png_uint_32)(*(sp + 1))) + 128L) +       *           / (png_uint_32)257L;         *         * GRR: here's the exact calculation with shifts: -       *   temp = (((png_uint_32)(*sp) << 8) | (png_uint_32)(*(sp + 1))) + 128L; +       *   temp = (((png_uint_32)(*sp) << 8) | +       *           (png_uint_32)(*(sp + 1))) + 128L;         *   *dp = (temp - (temp >> 8)) >> 8;         *         * Approximate calculation with shift/add instead of multiply/divide: @@ -1754,7 +1808,7 @@ png_do_chop(png_row_infop row_info, png_bytep row)  void /* PRIVATE */  png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_read_swap_alpha\n"); +   png_debug(1, "in png_do_read_swap_alpha");  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL)  #endif @@ -1846,7 +1900,7 @@ png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)  void /* PRIVATE */  png_do_read_invert_alpha(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_read_invert_alpha\n"); +   png_debug(1, "in png_do_read_invert_alpha");  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL)  #endif @@ -1952,14 +2006,14 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,     png_byte hi_filler = (png_byte)((filler>>8) & 0xff);     png_byte lo_filler = (png_byte)(filler & 0xff); -   png_debug(1, "in png_do_read_filler\n"); +   png_debug(1, "in png_do_read_filler");     if (  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL  && row_info != NULL &&  #endif         row_info->color_type == PNG_COLOR_TYPE_GRAY)     { -      if(row_info->bit_depth == 8) +      if (row_info->bit_depth == 8)        {           /* This changes the data from G to GX */           if (flags & PNG_FLAG_FILLER_AFTER) @@ -1991,7 +2045,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,              row_info->rowbytes = row_width * 2;           }        } -      else if(row_info->bit_depth == 16) +      else if (row_info->bit_depth == 16)        {           /* This changes the data from GG to GGXX */           if (flags & PNG_FLAG_FILLER_AFTER) @@ -2031,7 +2085,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,     } /* COLOR_TYPE == GRAY */     else if (row_info->color_type == PNG_COLOR_TYPE_RGB)     { -      if(row_info->bit_depth == 8) +      if (row_info->bit_depth == 8)        {           /* This changes the data from RGB to RGBX */           if (flags & PNG_FLAG_FILLER_AFTER) @@ -2067,7 +2121,7 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,              row_info->rowbytes = row_width * 4;           }        } -      else if(row_info->bit_depth == 16) +      else if (row_info->bit_depth == 16)        {           /* This changes the data from RRGGBB to RRGGBBXX */           if (flags & PNG_FLAG_FILLER_AFTER) @@ -2117,14 +2171,14 @@ png_do_read_filler(png_row_infop row_info, png_bytep row,  #endif  #if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) -/* expand grayscale files to RGB, with or without alpha */ +/* Expand grayscale files to RGB, with or without alpha */  void /* PRIVATE */  png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)  {     png_uint_32 i;     png_uint_32 row_width = row_info->width; -   png_debug(1, "in png_do_gray_to_rgb\n"); +   png_debug(1, "in png_do_gray_to_rgb");     if (row_info->bit_depth >= 8 &&  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -2194,16 +2248,18 @@ png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)        row_info->color_type |= PNG_COLOR_MASK_COLOR;        row_info->pixel_depth = (png_byte)(row_info->channels *           row_info->bit_depth); -      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); +      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);     }  }  #endif  #if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) -/* reduce RGB files to grayscale, with or without alpha +/* Reduce RGB files to grayscale, with or without alpha   * using the equation given in Poynton's ColorFAQ at - * <http://www.inforamp.net/~poynton/> - * Copyright (c) 1998-01-04 Charles Poynton poynton at inforamp.net + * <http://www.inforamp.net/~poynton/>  (THIS LINK IS DEAD June 2008) + * New link: + * <http://www.poynton.com/notes/colour_and_gamma/> + * Charles Poynton poynton at poynton.com   *   *     Y = 0.212671 * R + 0.715160 * G + 0.072169 * B   * @@ -2228,7 +2284,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)     png_uint_32 row_width = row_info->width;     int rgb_error = 0; -   png_debug(1, "in png_do_rgb_to_gray\n"); +   png_debug(1, "in png_do_rgb_to_gray");     if (  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -2254,14 +2310,14 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)                    png_byte red   = png_ptr->gamma_to_1[*(sp++)];                    png_byte green = png_ptr->gamma_to_1[*(sp++)];                    png_byte blue  = png_ptr->gamma_to_1[*(sp++)]; -                  if(red != green || red != blue) +                  if (red != green || red != blue)                    {                       rgb_error |= 1;                       *(dp++) = png_ptr->gamma_from_1[ -                       (rc*red+gc*green+bc*blue)>>15]; +                       (rc*red + gc*green + bc*blue)>>15];                    }                    else -                     *(dp++) = *(sp-1); +                     *(dp++) = *(sp - 1);                 }              }              else @@ -2274,13 +2330,13 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)                    png_byte red   = *(sp++);                    png_byte green = *(sp++);                    png_byte blue  = *(sp++); -                  if(red != green || red != blue) +                  if (red != green || red != blue)                    {                       rgb_error |= 1; -                     *(dp++) = (png_byte)((rc*red+gc*green+bc*blue)>>15); +                     *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15);                    }                    else -                     *(dp++) = *(sp-1); +                     *(dp++) = *(sp - 1);                 }              }           } @@ -2301,7 +2357,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)                    green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;                    blue  = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; -                  if(red == green && red == blue) +                  if (red == green && red == blue)                       w = red;                    else                    { @@ -2335,7 +2391,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)                    green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;                    blue  = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; -                  if(red != green || red != blue) +                  if (red != green || red != blue)                       rgb_error |= 1;                    gray16  = (png_uint_16)((rc*red + gc*green + bc*blue)>>15);                    *(dp++) = (png_byte)((gray16>>8) & 0xff); @@ -2358,7 +2414,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)                    png_byte red   = png_ptr->gamma_to_1[*(sp++)];                    png_byte green = png_ptr->gamma_to_1[*(sp++)];                    png_byte blue  = png_ptr->gamma_to_1[*(sp++)]; -                  if(red != green || red != blue) +                  if (red != green || red != blue)                       rgb_error |= 1;                    *(dp++) =  png_ptr->gamma_from_1                               [(rc*red + gc*green + bc*blue)>>15]; @@ -2375,7 +2431,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)                    png_byte red   = *(sp++);                    png_byte green = *(sp++);                    png_byte blue  = *(sp++); -                  if(red != green || red != blue) +                  if (red != green || red != blue)                       rgb_error |= 1;                    *(dp++) =  (png_byte)((rc*red + gc*green + bc*blue)>>15);                    *(dp++) = *(sp++);  /* alpha */ @@ -2398,7 +2454,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)                    green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;                    blue  = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; -                  if(red == green && red == blue) +                  if (red == green && red == blue)                       w = red;                    else                    { @@ -2432,7 +2488,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)                    red   = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2;                    green = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2;                    blue  = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; -                  if(red != green || red != blue) +                  if (red != green || red != blue)                       rgb_error |= 1;                    gray16  = (png_uint_16)((rc*red + gc*green + bc*blue)>>15);                    *(dp++) = (png_byte)((gray16>>8) & 0xff); @@ -2447,7 +2503,7 @@ png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)        row_info->color_type &= ~PNG_COLOR_MASK_COLOR;        row_info->pixel_depth = (png_byte)(row_info->channels *           row_info->bit_depth); -      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); +      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);     }     return rgb_error;  } @@ -2466,7 +2522,7 @@ png_build_grayscale_palette(int bit_depth, png_colorp palette)     int i;     int v; -   png_debug(1, "in png_do_build_grayscale_palette\n"); +   png_debug(1, "in png_do_build_grayscale_palette");     if (palette == NULL)        return; @@ -2476,18 +2532,22 @@ png_build_grayscale_palette(int bit_depth, png_colorp palette)           num_palette = 2;           color_inc = 0xff;           break; +        case 2:           num_palette = 4;           color_inc = 0x55;           break; +        case 4:           num_palette = 16;           color_inc = 0x11;           break; +        case 8:           num_palette = 256;           color_inc = 1;           break; +        default:           num_palette = 0;           color_inc = 0; @@ -2508,7 +2568,7 @@ void /* PRIVATE */  png_correct_palette(png_structp png_ptr, png_colorp palette,     int num_palette)  { -   png_debug(1, "in png_correct_palette\n"); +   png_debug(1, "in png_correct_palette");  #if defined(PNG_READ_BACKGROUND_SUPPORTED) && \      defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)     if (png_ptr->transformations & (PNG_GAMMA | PNG_BACKGROUND)) @@ -2665,7 +2725,7 @@ png_correct_palette(png_structp png_ptr, png_colorp palette,              }           }        } -      else /* assume grayscale palette (what else could it be?) */ +      else /* Assume grayscale palette (what else could it be?) */        {           int i; @@ -2705,7 +2765,7 @@ png_do_background(png_row_infop row_info, png_bytep row,     png_uint_32 row_width=row_info->width;     int shift; -   png_debug(1, "in png_do_background\n"); +   png_debug(1, "in png_do_background");     if (background != NULL &&  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -2741,6 +2801,7 @@ png_do_background(png_row_infop row_info, png_bytep row,                    }                    break;                 } +                 case 2:                 {  #if defined(PNG_READ_GAMMA_SUPPORTED) @@ -2797,6 +2858,7 @@ png_do_background(png_row_infop row_info, png_bytep row,                    }                    break;                 } +                 case 4:                 {  #if defined(PNG_READ_GAMMA_SUPPORTED) @@ -2853,6 +2915,7 @@ png_do_background(png_row_infop row_info, png_bytep row,                    }                    break;                 } +                 case 8:                 {  #if defined(PNG_READ_GAMMA_SUPPORTED) @@ -2885,6 +2948,7 @@ png_do_background(png_row_infop row_info, png_bytep row,                    }                    break;                 } +                 case 16:                 {  #if defined(PNG_READ_GAMMA_SUPPORTED) @@ -2898,7 +2962,7 @@ png_do_background(png_row_infop row_info, png_bytep row,                          v = (png_uint_16)(((*sp) << 8) + *(sp + 1));                          if (v == trans_values->gray)                          { -                           /* background is already in screen gamma */ +                           /* Background is already in screen gamma */                             *sp = (png_byte)((background->gray >> 8) & 0xff);                             *(sp + 1) = (png_byte)(background->gray & 0xff);                          } @@ -2931,6 +2995,7 @@ png_do_background(png_row_infop row_info, png_bytep row,              }              break;           } +           case PNG_COLOR_TYPE_RGB:           {              if (row_info->bit_depth == 8) @@ -2988,7 +3053,7 @@ png_do_background(png_row_infop row_info, png_bytep row,                       if (r == trans_values->red && g == trans_values->green &&                          b == trans_values->blue)                       { -                        /* background is already in screen gamma */ +                        /* Background is already in screen gamma */                          *sp = (png_byte)((background->red >> 8) & 0xff);                          *(sp + 1) = (png_byte)(background->red & 0xff);                          *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); @@ -3035,6 +3100,7 @@ png_do_background(png_row_infop row_info, png_bytep row,              }              break;           } +           case PNG_COLOR_TYPE_GRAY_ALPHA:           {              if (row_info->bit_depth == 8) @@ -3055,7 +3121,7 @@ png_do_background(png_row_infop row_info, png_bytep row,                       }                       else if (a == 0)                       { -                        /* background is already in screen gamma */ +                        /* Background is already in screen gamma */                          *dp = (png_byte)background->gray;                       }                       else @@ -3122,7 +3188,7 @@ png_do_background(png_row_infop row_info, png_bytep row,                       else  #endif                       { -                        /* background is already in screen gamma */ +                        /* Background is already in screen gamma */                          *dp = (png_byte)((background->gray >> 8) & 0xff);                          *(dp + 1) = (png_byte)(background->gray & 0xff);                       } @@ -3177,6 +3243,7 @@ png_do_background(png_row_infop row_info, png_bytep row,              }              break;           } +           case PNG_COLOR_TYPE_RGB_ALPHA:           {              if (row_info->bit_depth == 8) @@ -3199,7 +3266,7 @@ png_do_background(png_row_infop row_info, png_bytep row,                       }                       else if (a == 0)                       { -                        /* background is already in screen gamma */ +                        /* Background is already in screen gamma */                          *dp = (png_byte)background->red;                          *(dp + 1) = (png_byte)background->green;                          *(dp + 2) = (png_byte)background->blue; @@ -3280,7 +3347,7 @@ png_do_background(png_row_infop row_info, png_bytep row,                       }                       else if (a == 0)                       { -                        /* background is already in screen gamma */ +                        /* Background is already in screen gamma */                          *dp = (png_byte)((background->red >> 8) & 0xff);                          *(dp + 1) = (png_byte)(background->red & 0xff);                          *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); @@ -3365,7 +3432,7 @@ png_do_background(png_row_infop row_info, png_bytep row,           row_info->channels--;           row_info->pixel_depth = (png_byte)(row_info->channels *              row_info->bit_depth); -         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); +         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);        }     }  } @@ -3387,7 +3454,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,     png_uint_32 i;     png_uint_32 row_width=row_info->width; -   png_debug(1, "in png_do_gamma\n"); +   png_debug(1, "in png_do_gamma");     if (  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -3435,6 +3502,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,              }              break;           } +           case PNG_COLOR_TYPE_RGB_ALPHA:           {              if (row_info->bit_depth == 8) @@ -3472,6 +3540,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,              }              break;           } +           case PNG_COLOR_TYPE_GRAY_ALPHA:           {              if (row_info->bit_depth == 8) @@ -3496,6 +3565,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,              }              break;           } +           case PNG_COLOR_TYPE_GRAY:           {              if (row_info->bit_depth == 2) @@ -3516,6 +3586,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,                    sp++;                 }              } +              if (row_info->bit_depth == 4)              {                 sp = row; @@ -3529,6 +3600,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,                    sp++;                 }              } +              else if (row_info->bit_depth == 8)              {                 sp = row; @@ -3538,6 +3610,7 @@ png_do_gamma(png_row_infop row_info, png_bytep row,                    sp++;                 }              } +              else if (row_info->bit_depth == 16)              {                 sp = row; @@ -3569,7 +3642,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,     png_uint_32 i;     png_uint_32 row_width=row_info->width; -   png_debug(1, "in png_do_expand_palette\n"); +   png_debug(1, "in png_do_expand_palette");     if (  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -3603,6 +3676,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,                 }                 break;              } +              case 2:              {                 sp = row + (png_size_t)((row_width - 1) >> 2); @@ -3624,6 +3698,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,                 }                 break;              } +              case 4:              {                 sp = row + (png_size_t)((row_width - 1) >> 1); @@ -3688,6 +3763,7 @@ png_do_expand_palette(png_row_infop row_info, png_bytep row,                    *dp-- = palette[*sp].red;                    sp--;                 } +                 row_info->bit_depth = 8;                 row_info->pixel_depth = 24;                 row_info->rowbytes = row_width * 3; @@ -3712,7 +3788,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,     png_uint_32 i;     png_uint_32 row_width=row_info->width; -   png_debug(1, "in png_do_expand\n"); +   png_debug(1, "in png_do_expand");  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL)  #endif @@ -3749,6 +3825,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,                    }                    break;                 } +                 case 2:                 {                    gray = (png_uint_16)((gray&0x03)*0x55); @@ -3772,6 +3849,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,                    }                    break;                 } +                 case 4:                 {                    gray = (png_uint_16)((gray&0x0f)*0x11); @@ -3795,6 +3873,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,                    break;                 }              } +              row_info->bit_depth = 8;              row_info->pixel_depth = 8;              row_info->rowbytes = row_width; @@ -3816,6 +3895,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,                    *dp-- = *sp--;                 }              } +              else if (row_info->bit_depth == 16)              {                 png_byte gray_high = (gray >> 8) & 0xff; @@ -3824,7 +3904,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,                 dp = row + (row_info->rowbytes << 1) - 1;                 for (i = 0; i < row_width; i++)                 { -                  if (*(sp-1) == gray_high && *(sp) == gray_low)  +                  if (*(sp - 1) == gray_high && *(sp) == gray_low)                    {                       *dp-- = 0;                       *dp-- = 0; @@ -3838,6 +3918,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,                    *dp-- = *sp--;                 }              } +              row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA;              row_info->channels = 2;              row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1); @@ -3903,7 +3984,7 @@ png_do_expand(png_row_infop row_info, png_bytep row,           row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA;           row_info->channels = 4;           row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2); -         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); +         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);        }     }  } @@ -3918,7 +3999,7 @@ png_do_dither(png_row_infop row_info, png_bytep row,     png_uint_32 i;     png_uint_32 row_width=row_info->width; -   png_debug(1, "in png_do_dither\n"); +   png_debug(1, "in png_do_dither");  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL)  #endif @@ -3935,13 +4016,13 @@ png_do_dither(png_row_infop row_info, png_bytep row,              g = *sp++;              b = *sp++; -            /* this looks real messy, but the compiler will reduce -               it down to a reasonable formula.  For example, with -               5 bits per color, we get: -               p = (((r >> 3) & 0x1f) << 10) | -                  (((g >> 3) & 0x1f) << 5) | -                  ((b >> 3) & 0x1f); -               */ +            /* This looks real messy, but the compiler will reduce +             * it down to a reasonable formula.  For example, with +             * 5 bits per color, we get: +             * p = (((r >> 3) & 0x1f) << 10) | +             *    (((g >> 3) & 0x1f) << 5) | +             *    ((b >> 3) & 0x1f); +             */              p = (((r >> (8 - PNG_DITHER_RED_BITS)) &                 ((1 << PNG_DITHER_RED_BITS) - 1)) <<                 (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | @@ -3956,7 +4037,7 @@ png_do_dither(png_row_infop row_info, png_bytep row,           row_info->color_type = PNG_COLOR_TYPE_PALETTE;           row_info->channels = 1;           row_info->pixel_depth = row_info->bit_depth; -         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); +         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);        }        else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&           palette_lookup != NULL && row_info->bit_depth == 8) @@ -3985,7 +4066,7 @@ png_do_dither(png_row_infop row_info, png_bytep row,           row_info->color_type = PNG_COLOR_TYPE_PALETTE;           row_info->channels = 1;           row_info->pixel_depth = row_info->bit_depth; -         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,row_width); +         row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width);        }        else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE &&           dither_lookup && row_info->bit_depth == 8) @@ -4013,7 +4094,7 @@ static PNG_CONST int png_gamma_shift[] =  void /* PRIVATE */  png_build_gamma_table(png_structp png_ptr)  { -  png_debug(1, "in png_build_gamma_table\n"); +  png_debug(1, "in png_build_gamma_table");    if (png_ptr->bit_depth <= 8)    { @@ -4022,6 +4103,7 @@ png_build_gamma_table(png_structp png_ptr)       if (png_ptr->screen_gamma > .000001)          g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); +       else          g = 1.0; @@ -4054,10 +4136,11 @@ png_build_gamma_table(png_structp png_ptr)          png_ptr->gamma_from_1 = (png_bytep)png_malloc(png_ptr,             (png_uint_32)256); -        if(png_ptr->screen_gamma > 0.000001) +        if (png_ptr->screen_gamma > 0.000001)             g = 1.0 / png_ptr->screen_gamma; +          else -           g = png_ptr->gamma;   /* probably doing rgb_to_gray */ +           g = png_ptr->gamma;   /* Probably doing rgb_to_gray */          for (i = 0; i < 256; i++)          { @@ -4078,8 +4161,10 @@ png_build_gamma_table(png_structp png_ptr)       if (png_ptr->color_type & PNG_COLOR_MASK_COLOR)       {          sig_bit = (int)png_ptr->sig_bit.red; +          if ((int)png_ptr->sig_bit.green > sig_bit)             sig_bit = png_ptr->sig_bit.green; +          if ((int)png_ptr->sig_bit.blue > sig_bit)             sig_bit = png_ptr->sig_bit.blue;       } @@ -4090,6 +4175,7 @@ png_build_gamma_table(png_structp png_ptr)       if (sig_bit > 0)          shift = 16 - sig_bit; +       else          shift = 0; @@ -4101,6 +4187,7 @@ png_build_gamma_table(png_structp png_ptr)       if (shift > 8)          shift = 8; +       if (shift < 0)          shift = 0; @@ -4114,7 +4201,8 @@ png_build_gamma_table(png_structp png_ptr)          g = 1.0;       png_ptr->gamma_16_table = (png_uint_16pp)png_malloc(png_ptr, -        (png_uint_32)(num * png_sizeof (png_uint_16p))); +        (png_uint_32)(num * png_sizeof(png_uint_16p))); +     png_memset(png_ptr->gamma_16_table, 0, num * png_sizeof(png_uint_16p));        if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND))       { @@ -4124,7 +4212,7 @@ png_build_gamma_table(png_structp png_ptr)          for (i = 0; i < num; i++)          {             png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, -              (png_uint_32)(256 * png_sizeof (png_uint_16))); +              (png_uint_32)(256 * png_sizeof(png_uint_16)));          }          g = 1.0 / g; @@ -4154,9 +4242,10 @@ png_build_gamma_table(png_structp png_ptr)          for (i = 0; i < num; i++)          {             png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, -              (png_uint_32)(256 * png_sizeof (png_uint_16))); +              (png_uint_32)(256 * png_sizeof(png_uint_16)));             ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4); +             for (j = 0; j < 256; j++)             {                png_ptr->gamma_16_table[i][j] = @@ -4174,12 +4263,13 @@ png_build_gamma_table(png_structp png_ptr)          g = 1.0 / (png_ptr->gamma);          png_ptr->gamma_16_to_1 = (png_uint_16pp)png_malloc(png_ptr, -           (png_uint_32)(num * png_sizeof (png_uint_16p ))); +           (png_uint_32)(num * png_sizeof(png_uint_16p ))); +        png_memset(png_ptr->gamma_16_to_1, 0, num * png_sizeof(png_uint_16p));           for (i = 0; i < num; i++)          {             png_ptr->gamma_16_to_1[i] = (png_uint_16p)png_malloc(png_ptr, -              (png_uint_32)(256 * png_sizeof (png_uint_16))); +              (png_uint_32)(256 * png_sizeof(png_uint_16)));             ig = (((png_uint_32)i *                (png_uint_32)png_gamma_shift[shift]) >> 4); @@ -4191,21 +4281,25 @@ png_build_gamma_table(png_structp png_ptr)             }          } -        if(png_ptr->screen_gamma > 0.000001) +        if (png_ptr->screen_gamma > 0.000001)             g = 1.0 / png_ptr->screen_gamma; +          else -           g = png_ptr->gamma;   /* probably doing rgb_to_gray */ +           g = png_ptr->gamma;   /* Probably doing rgb_to_gray */          png_ptr->gamma_16_from_1 = (png_uint_16pp)png_malloc(png_ptr, -           (png_uint_32)(num * png_sizeof (png_uint_16p))); +           (png_uint_32)(num * png_sizeof(png_uint_16p))); +        png_memset(png_ptr->gamma_16_from_1, 0, +           num * png_sizeof(png_uint_16p));           for (i = 0; i < num; i++)          {             png_ptr->gamma_16_from_1[i] = (png_uint_16p)png_malloc(png_ptr, -              (png_uint_32)(256 * png_sizeof (png_uint_16))); +              (png_uint_32)(256 * png_sizeof(png_uint_16)));             ig = (((png_uint_32)i *                (png_uint_32)png_gamma_shift[shift]) >> 4); +             for (j = 0; j < 256; j++)             {                png_ptr->gamma_16_from_1[i][j] = @@ -4222,11 +4316,11 @@ png_build_gamma_table(png_structp png_ptr)  #endif  #if defined(PNG_MNG_FEATURES_SUPPORTED) -/* undoes intrapixel differencing  */ +/* Undoes intrapixel differencing  */  void /* PRIVATE */  png_do_read_intrapixel(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_read_intrapixel\n"); +   png_debug(1, "in png_do_read_intrapixel");     if (  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -4242,8 +4336,10 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row)           if (row_info->color_type == PNG_COLOR_TYPE_RGB)              bytes_per_pixel = 3; +           else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)              bytes_per_pixel = 4; +           else              return; @@ -4260,18 +4356,20 @@ png_do_read_intrapixel(png_row_infop row_info, png_bytep row)           if (row_info->color_type == PNG_COLOR_TYPE_RGB)              bytes_per_pixel = 6; +           else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)              bytes_per_pixel = 8; +           else              return;           for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)           { -            png_uint_32 s0   = (*(rp  ) << 8) | *(rp+1); -            png_uint_32 s1   = (*(rp+2) << 8) | *(rp+3); -            png_uint_32 s2   = (*(rp+4) << 8) | *(rp+5); -            png_uint_32 red  = (png_uint_32)((s0+s1+65536L) & 0xffffL); -            png_uint_32 blue = (png_uint_32)((s2+s1+65536L) & 0xffffL); +            png_uint_32 s0   = (*(rp    ) << 8) | *(rp + 1); +            png_uint_32 s1   = (*(rp + 2) << 8) | *(rp + 3); +            png_uint_32 s2   = (*(rp + 4) << 8) | *(rp + 5); +            png_uint_32 red  = (png_uint_32)((s0 + s1 + 65536L) & 0xffffL); +            png_uint_32 blue = (png_uint_32)((s2 + s1 + 65536L) & 0xffffL);              *(rp  ) = (png_byte)((red >> 8) & 0xff);              *(rp+1) = (png_byte)(red & 0xff);              *(rp+4) = (png_byte)((blue >> 8) & 0xff); diff --git a/src/libpng/pngrutil.c b/src/libpng/pngrutil.c index ad4f1a9..ae1e3f7 100644 --- a/src/libpng/pngrutil.c +++ b/src/libpng/pngrutil.c @@ -1,9 +1,9 @@  /* pngrutil.c - utilities to read a PNG file   * - * Last changed in libpng 1.2.22 [October 13, 2007] + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   * @@ -13,7 +13,6 @@  #define PNG_INTERNAL  #include "png.h" -  #if defined(PNG_READ_SUPPORTED)  #if defined(_WIN32_WCE) && (_WIN32_WCE<0x500) @@ -22,7 +21,7 @@  #ifdef PNG_FLOATING_POINT_SUPPORTED  #  if defined(WIN32_WCE_OLD) -/* strtod() function is not supported on WindowsCE */ +/* The strtod() function is not supported on WindowsCE */  __inline double png_strtod(png_structp png_ptr, PNG_CONST char *nptr, char **endptr)  {     double result = 0; @@ -30,7 +29,7 @@ __inline double png_strtod(png_structp png_ptr, PNG_CONST char *nptr, char **end     wchar_t *str, *end;     len = MultiByteToWideChar(CP_ACP, 0, nptr, -1, NULL, 0); -   str = (wchar_t *)png_malloc(png_ptr, len * sizeof(wchar_t)); +   str = (wchar_t *)png_malloc(png_ptr, len * png_sizeof(wchar_t));     if ( NULL != str )     {        MultiByteToWideChar(CP_ACP, 0, nptr, -1, str, len); @@ -49,7 +48,15 @@ __inline double png_strtod(png_structp png_ptr, PNG_CONST char *nptr, char **end  png_uint_32 PNGAPI  png_get_uint_31(png_structp png_ptr, png_bytep buf)  { +#ifdef PNG_READ_BIG_ENDIAN_SUPPORTED     png_uint_32 i = png_get_uint_32(buf); +#else +   /* Avoid an extra function call by inlining the result. */ +   png_uint_32 i = ((png_uint_32)(*buf) << 24) + +      ((png_uint_32)(*(buf + 1)) << 16) + +      ((png_uint_32)(*(buf + 2)) << 8) + +      (png_uint_32)(*(buf + 3)); +#endif     if (i > PNG_UINT_31_MAX)       png_error(png_ptr, "PNG unsigned integer out of range.");     return (i); @@ -69,7 +76,8 @@ png_get_uint_32(png_bytep buf)  /* Grab a signed 32-bit integer from a buffer in big-endian format.  The   * data is stored in the PNG file in two's complement format, and it is - * assumed that the machine format for signed integers is the same. */ + * assumed that the machine format for signed integers is the same. + */  png_int_32 PNGAPI  png_get_int_32(png_bytep buf)  { @@ -92,19 +100,50 @@ png_get_uint_16(png_bytep buf)  }  #endif /* PNG_READ_BIG_ENDIAN_SUPPORTED */ +/* Read the chunk header (length + type name). + * Put the type name into png_ptr->chunk_name, and return the length. + */ +png_uint_32 /* PRIVATE */ +png_read_chunk_header(png_structp png_ptr) +{ +   png_byte buf[8]; +   png_uint_32 length; + +   /* Read the length and the chunk name */ +   png_read_data(png_ptr, buf, 8); +   length = png_get_uint_31(png_ptr, buf); + +   /* Put the chunk name into png_ptr->chunk_name */ +   png_memcpy(png_ptr->chunk_name, buf + 4, 4); + +   png_debug2(0, "Reading %s chunk, length = %lu", +      png_ptr->chunk_name, length); + +   /* Reset the crc and run it over the chunk name */ +   png_reset_crc(png_ptr); +   png_calculate_crc(png_ptr, png_ptr->chunk_name, 4); + +   /* Check to see if chunk name is valid */ +   png_check_chunk_name(png_ptr, png_ptr->chunk_name); + +   return length; +} +  /* Read data, and (optionally) run it through the CRC. */  void /* PRIVATE */  png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length)  { -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;     png_read_data(png_ptr, buf, length);     png_calculate_crc(png_ptr, buf, length);  }  /* Optionally skip data and then check the CRC.  Depending on whether we -   are reading a ancillary or critical chunk, and how the program has set -   things up, we may calculate the CRC on the data and print a message. -   Returns '1' if there was a CRC error, '0' otherwise. */ + * are reading a ancillary or critical chunk, and how the program has set + * things up, we may calculate the CRC on the data and print a message. + * Returns '1' if there was a CRC error, '0' otherwise. + */  int /* PRIVATE */  png_crc_finish(png_structp png_ptr, png_uint_32 skip)  { @@ -123,7 +162,7 @@ png_crc_finish(png_structp png_ptr, png_uint_32 skip)     if (png_crc_error(png_ptr))     {        if (((png_ptr->chunk_name[0] & 0x20) &&                /* Ancillary */ -           !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) || +          !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) ||            (!(png_ptr->chunk_name[0] & 0x20) &&             /* Critical  */            (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE)))        { @@ -140,7 +179,8 @@ png_crc_finish(png_structp png_ptr, png_uint_32 skip)  }  /* Compare the CRC stored in the PNG file with that calculated by libpng from -   the data it has read thus far. */ + * the data it has read thus far. + */  int /* PRIVATE */  png_crc_error(png_structp png_ptr)  { @@ -180,9 +220,9 @@ png_crc_error(png_structp png_ptr)   * holding the original prefix part and an uncompressed version of the   * trailing part (the malloc area passed in is freed).   */ -png_charp /* PRIVATE */ +void /* PRIVATE */  png_decompress_chunk(png_structp png_ptr, int comp_type, -                              png_charp chunkdata, png_size_t chunklength, +                              png_size_t chunklength,                                png_size_t prefix_size, png_size_t *newlength)  {     static PNG_CONST char msg[] = "Error decoding compressed text"; @@ -192,7 +232,7 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,     if (comp_type == PNG_COMPRESSION_TYPE_BASE)     {        int ret = Z_OK; -      png_ptr->zstream.next_in = (png_bytep)(chunkdata + prefix_size); +      png_ptr->zstream.next_in = (png_bytep)(png_ptr->chunkdata + prefix_size);        png_ptr->zstream.avail_in = (uInt)(chunklength - prefix_size);        png_ptr->zstream.next_out = png_ptr->zbuf;        png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; @@ -218,19 +258,21 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,                 text = (png_charp)png_malloc_warn(png_ptr, text_size);                 if (text ==  NULL)                   { -                    png_free(png_ptr,chunkdata); -                    png_error(png_ptr,"Not enough memory to decompress chunk"); +                    png_free(png_ptr, png_ptr->chunkdata); +                    png_ptr->chunkdata = NULL; +                    png_error(png_ptr, "Not enough memory to decompress chunk");                   } -               png_memcpy(text, chunkdata, prefix_size); +               png_memcpy(text, png_ptr->chunkdata, prefix_size);              }              text[text_size - 1] = 0x00;              /* Copy what we can of the error message into the text chunk */ -            text_size = (png_size_t)(chunklength - (text - chunkdata) - 1); -            text_size = png_sizeof(msg) > text_size ? text_size : -               png_sizeof(msg); -            png_memcpy(text + prefix_size, msg, text_size + 1); +            text_size = (png_size_t)(chunklength - +              (text - png_ptr->chunkdata) - 1); +            if (text_size > png_sizeof(msg)) +               text_size = png_sizeof(msg); +            png_memcpy(text + prefix_size, msg, text_size);              break;           }           if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END) @@ -241,13 +283,15 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,                     png_ptr->zbuf_size - png_ptr->zstream.avail_out;                 text = (png_charp)png_malloc_warn(png_ptr, text_size + 1);                 if (text ==  NULL) -                 { -                    png_free(png_ptr,chunkdata); -                    png_error(png_ptr,"Not enough memory to decompress chunk."); -                 } +               { +                  png_free(png_ptr, png_ptr->chunkdata); +                  png_ptr->chunkdata = NULL; +                  png_error(png_ptr, +                    "Not enough memory to decompress chunk."); +               }                 png_memcpy(text + prefix_size, png_ptr->zbuf,                      text_size - prefix_size); -               png_memcpy(text, chunkdata, prefix_size); +               png_memcpy(text, png_ptr->chunkdata, prefix_size);                 *(text + text_size) = 0x00;              }              else @@ -261,8 +305,10 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,                 if (text == NULL)                 {                    png_free(png_ptr, tmp); -                  png_free(png_ptr, chunkdata); -                  png_error(png_ptr,"Not enough memory to decompress chunk.."); +                  png_free(png_ptr, png_ptr->chunkdata); +                  png_ptr->chunkdata = NULL; +                  png_error(png_ptr, +                    "Not enough memory to decompress chunk..");                 }                 png_memcpy(text, tmp, text_size);                 png_free(png_ptr, tmp); @@ -289,29 +335,33 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,              png_snprintf(umsg, 52,                  "Buffer error in compressed datastream in %s chunk",                  png_ptr->chunk_name); +           else if (ret == Z_DATA_ERROR)              png_snprintf(umsg, 52,                  "Data error in compressed datastream in %s chunk",                  png_ptr->chunk_name); +           else              png_snprintf(umsg, 52,                  "Incomplete compressed datastream in %s chunk",                  png_ptr->chunk_name); +           png_warning(png_ptr, umsg);  #else           png_warning(png_ptr,              "Incomplete compressed datastream in chunk other than IDAT");  #endif -         text_size=prefix_size; +         text_size = prefix_size;           if (text ==  NULL)           {              text = (png_charp)png_malloc_warn(png_ptr, text_size+1);              if (text == NULL)                { -                png_free(png_ptr, chunkdata); -                png_error(png_ptr,"Not enough memory for text."); +                png_free(png_ptr, png_ptr->chunkdata); +                png_ptr->chunkdata = NULL; +                png_error(png_ptr, "Not enough memory for text.");                } -            png_memcpy(text, chunkdata, prefix_size); +            png_memcpy(text, png_ptr->chunkdata, prefix_size);           }           *(text + text_size) = 0x00;        } @@ -319,8 +369,8 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,        inflateReset(&png_ptr->zstream);        png_ptr->zstream.avail_in = 0; -      png_free(png_ptr, chunkdata); -      chunkdata = text; +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = text;        *newlength=text_size;     }     else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */ @@ -328,22 +378,19 @@ png_decompress_chunk(png_structp png_ptr, int comp_type,  #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)        char umsg[50]; -      png_snprintf(umsg, 50, -         "Unknown zTXt compression type %d", comp_type); +      png_snprintf(umsg, 50, "Unknown zTXt compression type %d", comp_type);        png_warning(png_ptr, umsg);  #else        png_warning(png_ptr, "Unknown zTXt compression type");  #endif -      *(chunkdata + prefix_size) = 0x00; -      *newlength=prefix_size; +      *(png_ptr->chunkdata + prefix_size) = 0x00; +      *newlength = prefix_size;     } - -   return chunkdata;  }  #endif -/* read and check the IDHR chunk */ +/* Read and check the IDHR chunk */  void /* PRIVATE */  png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  { @@ -352,12 +399,12 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     int bit_depth, color_type, compression_type, filter_type;     int interlace_type; -   png_debug(1, "in png_handle_IHDR\n"); +   png_debug(1, "in png_handle_IHDR");     if (png_ptr->mode & PNG_HAVE_IHDR)        png_error(png_ptr, "Out of place IHDR"); -   /* check the length */ +   /* Check the length */     if (length != 13)        png_error(png_ptr, "Invalid IHDR chunk"); @@ -374,7 +421,7 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     filter_type = buf[11];     interlace_type = buf[12]; -   /* set internal variables */ +   /* Set internal variables */     png_ptr->width = width;     png_ptr->height = height;     png_ptr->bit_depth = (png_byte)bit_depth; @@ -385,36 +432,39 @@ png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  #endif     png_ptr->compression_type = (png_byte)compression_type; -   /* find number of channels */ +   /* Find number of channels */     switch (png_ptr->color_type)     {        case PNG_COLOR_TYPE_GRAY:        case PNG_COLOR_TYPE_PALETTE:           png_ptr->channels = 1;           break; +        case PNG_COLOR_TYPE_RGB:           png_ptr->channels = 3;           break; +        case PNG_COLOR_TYPE_GRAY_ALPHA:           png_ptr->channels = 2;           break; +        case PNG_COLOR_TYPE_RGB_ALPHA:           png_ptr->channels = 4;           break;     } -   /* set up other useful info */ +   /* Set up other useful info */     png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth *     png_ptr->channels); -   png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width); -   png_debug1(3,"bit_depth = %d\n", png_ptr->bit_depth); -   png_debug1(3,"channels = %d\n", png_ptr->channels); -   png_debug1(3,"rowbytes = %lu\n", png_ptr->rowbytes); +   png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width); +   png_debug1(3, "bit_depth = %d", png_ptr->bit_depth); +   png_debug1(3, "channels = %d", png_ptr->channels); +   png_debug1(3, "rowbytes = %lu", png_ptr->rowbytes);     png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth,        color_type, interlace_type, compression_type, filter_type);  } -/* read and check the palette */ +/* Read and check the palette */  void /* PRIVATE */  png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  { @@ -424,16 +474,18 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_colorp pal_ptr;  #endif -   png_debug(1, "in png_handle_PLTE\n"); +   png_debug(1, "in png_handle_PLTE");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before PLTE"); +     else if (png_ptr->mode & PNG_HAVE_IDAT)     {        png_warning(png_ptr, "Invalid PLTE after IDAT");        png_crc_finish(png_ptr, length);        return;     } +     else if (png_ptr->mode & PNG_HAVE_PLTE)        png_error(png_ptr, "Duplicate PLTE chunk"); @@ -462,6 +514,7 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)           png_crc_finish(png_ptr, length);           return;        } +        else        {           png_error(png_ptr, "Invalid palette chunk"); @@ -486,7 +539,7 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        png_byte buf[3];        png_crc_read(png_ptr, buf, 3); -      /* don't depend upon png_color being any order */ +      /* Don't depend upon png_color being any order */        palette[i].red = buf[0];        palette[i].green = buf[1];        palette[i].blue = buf[2]; @@ -494,9 +547,10 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  #endif     /* If we actually NEED the PLTE chunk (ie for a paletted image), we do -      whatever the normal CRC configuration tells us.  However, if we -      have an RGB image, the PLTE can be considered ancillary, so -      we will act as though it is. */ +    * whatever the normal CRC configuration tells us.  However, if we +    * have an RGB image, the PLTE can be considered ancillary, so +    * we will act as though it is. +    */  #if !defined(PNG_READ_OPT_PLTE_SUPPORTED)     if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)  #endif @@ -556,7 +610,7 @@ png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  void /* PRIVATE */  png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  { -   png_debug(1, "in png_handle_IEND\n"); +   png_debug(1, "in png_handle_IEND");     if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT))     { @@ -571,7 +625,7 @@ png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     }     png_crc_finish(png_ptr, length); -   info_ptr =info_ptr; /* quiet compiler warnings about unused info_ptr */ +   info_ptr = info_ptr; /* Quiet compiler warnings about unused info_ptr */  }  #if defined(PNG_READ_gAMA_SUPPORTED) @@ -584,7 +638,7 @@ png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  #endif     png_byte buf[4]; -   png_debug(1, "in png_handle_gAMA\n"); +   png_debug(1, "in png_handle_gAMA");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before gAMA"); @@ -621,7 +675,7 @@ png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        return;     igamma = (png_fixed_point)png_get_uint_32(buf); -   /* check for zero gamma */ +   /* Check for zero gamma */     if (igamma == 0)        {           png_warning(png_ptr, @@ -636,7 +690,7 @@ png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)           png_warning(png_ptr,             "Ignoring incorrect gAMA value when sRGB is also present");  #ifndef PNG_NO_CONSOLE_IO -         fprintf(stderr, "gamma = (%d/100000)\n", (int)igamma); +         fprintf(stderr, "gamma = (%d/100000)", (int)igamma);  #endif           return;        } @@ -662,7 +716,7 @@ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_size_t truelen;     png_byte buf[4]; -   png_debug(1, "in png_handle_sBIT\n"); +   png_debug(1, "in png_handle_sBIT");     buf[0] = buf[1] = buf[2] = buf[3] = 0; @@ -725,7 +779,7 @@ png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  void /* PRIVATE */  png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  { -   png_byte buf[4]; +   png_byte buf[32];  #ifdef PNG_FLOATING_POINT_SUPPORTED     float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;  #endif @@ -734,7 +788,7 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_uint_32 uint_x, uint_y; -   png_debug(1, "in png_handle_cHRM\n"); +   png_debug(1, "in png_handle_cHRM");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before cHRM"); @@ -766,64 +820,27 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        return;     } -   png_crc_read(png_ptr, buf, 4); -   uint_x = png_get_uint_32(buf); - -   png_crc_read(png_ptr, buf, 4); -   uint_y = png_get_uint_32(buf); - -   if (uint_x > 80000L || uint_y > 80000L || -      uint_x + uint_y > 100000L) -   { -      png_warning(png_ptr, "Invalid cHRM white point"); -      png_crc_finish(png_ptr, 24); +   png_crc_read(png_ptr, buf, 32); +   if (png_crc_finish(png_ptr, 0))        return; -   } -   int_x_white = (png_fixed_point)uint_x; -   int_y_white = (png_fixed_point)uint_y; -   png_crc_read(png_ptr, buf, 4);     uint_x = png_get_uint_32(buf); +   uint_y = png_get_uint_32(buf + 4); +   int_x_white = (png_fixed_point)uint_x; +   int_y_white = (png_fixed_point)uint_y; -   png_crc_read(png_ptr, buf, 4); -   uint_y = png_get_uint_32(buf); - -   if (uint_x + uint_y > 100000L) -   { -      png_warning(png_ptr, "Invalid cHRM red point"); -      png_crc_finish(png_ptr, 16); -      return; -   } +   uint_x = png_get_uint_32(buf + 8); +   uint_y = png_get_uint_32(buf + 12);     int_x_red = (png_fixed_point)uint_x;     int_y_red = (png_fixed_point)uint_y; -   png_crc_read(png_ptr, buf, 4); -   uint_x = png_get_uint_32(buf); - -   png_crc_read(png_ptr, buf, 4); -   uint_y = png_get_uint_32(buf); - -   if (uint_x + uint_y > 100000L) -   { -      png_warning(png_ptr, "Invalid cHRM green point"); -      png_crc_finish(png_ptr, 8); -      return; -   } +   uint_x = png_get_uint_32(buf + 16); +   uint_y = png_get_uint_32(buf + 20);     int_x_green = (png_fixed_point)uint_x;     int_y_green = (png_fixed_point)uint_y; -   png_crc_read(png_ptr, buf, 4); -   uint_x = png_get_uint_32(buf); - -   png_crc_read(png_ptr, buf, 4); -   uint_y = png_get_uint_32(buf); - -   if (uint_x + uint_y > 100000L) -   { -      png_warning(png_ptr, "Invalid cHRM blue point"); -      png_crc_finish(png_ptr, 0); -      return; -   } +   uint_x = png_get_uint_32(buf + 24); +   uint_y = png_get_uint_32(buf + 28);     int_x_blue = (png_fixed_point)uint_x;     int_y_blue = (png_fixed_point)uint_y; @@ -854,19 +871,18 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)                "Ignoring incorrect cHRM value when sRGB is also present");  #ifndef PNG_NO_CONSOLE_IO  #ifdef PNG_FLOATING_POINT_SUPPORTED -            fprintf(stderr,"wx=%f, wy=%f, rx=%f, ry=%f\n", +            fprintf(stderr, "wx=%f, wy=%f, rx=%f, ry=%f\n",                 white_x, white_y, red_x, red_y); -            fprintf(stderr,"gx=%f, gy=%f, bx=%f, by=%f\n", +            fprintf(stderr, "gx=%f, gy=%f, bx=%f, by=%f\n",                 green_x, green_y, blue_x, blue_y);  #else -            fprintf(stderr,"wx=%ld, wy=%ld, rx=%ld, ry=%ld\n", +            fprintf(stderr, "wx=%ld, wy=%ld, rx=%ld, ry=%ld\n",                 int_x_white, int_y_white, int_x_red, int_y_red); -            fprintf(stderr,"gx=%ld, gy=%ld, bx=%ld, by=%ld\n", +            fprintf(stderr, "gx=%ld, gy=%ld, bx=%ld, by=%ld\n",                 int_x_green, int_y_green, int_x_blue, int_y_blue);  #endif  #endif /* PNG_NO_CONSOLE_IO */           } -         png_crc_finish(png_ptr, 0);           return;        }  #endif /* PNG_READ_sRGB_SUPPORTED */ @@ -880,8 +896,6 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        int_x_white, int_y_white, int_x_red, int_y_red, int_x_green,        int_y_green, int_x_blue, int_y_blue);  #endif -   if (png_crc_finish(png_ptr, 0)) -      return;  }  #endif @@ -892,7 +906,7 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     int intent;     png_byte buf[1]; -   png_debug(1, "in png_handle_sRGB\n"); +   png_debug(1, "in png_handle_sRGB");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before sRGB"); @@ -925,7 +939,7 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        return;     intent = buf[0]; -   /* check for bad intent */ +   /* Check for bad intent */     if (intent >= PNG_sRGB_INTENT_LAST)     {        png_warning(png_ptr, "Unknown sRGB intent"); @@ -949,10 +963,11 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)             "Ignoring incorrect gAMA value when sRGB is also present");  #ifndef PNG_NO_CONSOLE_IO  #  ifdef PNG_FIXED_POINT_SUPPORTED -         fprintf(stderr,"incorrect gamma=(%d/100000)\n",(int)png_ptr->int_gamma); +         fprintf(stderr, "incorrect gamma=(%d/100000)\n", +            (int)png_ptr->int_gamma);  #  else  #    ifdef PNG_FLOATING_POINT_SUPPORTED -         fprintf(stderr,"incorrect gamma=%f\n",png_ptr->gamma); +         fprintf(stderr, "incorrect gamma=%f\n", png_ptr->gamma);  #    endif  #  endif  #endif @@ -987,7 +1002,6 @@ void /* PRIVATE */  png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  /* Note: this does not properly handle chunks that are > 64K under DOS */  { -   png_charp chunkdata;     png_byte compression_type;     png_bytep pC;     png_charp profile; @@ -995,7 +1009,7 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_uint_32 profile_size, profile_length;     png_size_t slength, prefix_length, data_length; -   png_debug(1, "in png_handle_iCCP\n"); +   png_debug(1, "in png_handle_iCCP");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before iCCP"); @@ -1025,74 +1039,81 @@ png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     }  #endif -   chunkdata = (png_charp)png_malloc(png_ptr, length + 1); +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1);     slength = (png_size_t)length; -   png_crc_read(png_ptr, (png_bytep)chunkdata, slength); +   png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);     if (png_crc_finish(png_ptr, skip))     { -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     } -   chunkdata[slength] = 0x00; +   png_ptr->chunkdata[slength] = 0x00; -   for (profile = chunkdata; *profile; profile++) -      /* empty loop to find end of name */ ; +   for (profile = png_ptr->chunkdata; *profile; profile++) +      /* Empty loop to find end of name */ ;     ++profile; -   /* there should be at least one zero (the compression type byte) -      following the separator, and we should be on it  */ -   if ( profile >= chunkdata + slength - 1) +   /* There should be at least one zero (the compression type byte) +    * following the separator, and we should be on it +    */ +   if ( profile >= png_ptr->chunkdata + slength - 1)     { -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        png_warning(png_ptr, "Malformed iCCP chunk");        return;     } -   /* compression_type should always be zero */ +   /* Compression_type should always be zero */     compression_type = *profile++;     if (compression_type)     {        png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk"); -      compression_type=0x00;  /* Reset it to zero (libpng-1.0.6 through 1.0.8 +      compression_type = 0x00;  /* Reset it to zero (libpng-1.0.6 through 1.0.8                                   wrote nonzero) */     } -   prefix_length = profile - chunkdata; -   chunkdata = png_decompress_chunk(png_ptr, compression_type, chunkdata, -                                    slength, prefix_length, &data_length); +   prefix_length = profile - png_ptr->chunkdata; +   png_decompress_chunk(png_ptr, compression_type, +     slength, prefix_length, &data_length);     profile_length = data_length - prefix_length;     if ( prefix_length > data_length || profile_length < 4)     { -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        png_warning(png_ptr, "Profile size field missing from iCCP chunk");        return;     }     /* Check the profile_size recorded in the first 32 bits of the ICC profile */ -   pC = (png_bytep)(chunkdata+prefix_length); -   profile_size = ((*(pC  ))<<24) | -                  ((*(pC+1))<<16) | -                  ((*(pC+2))<< 8) | -                  ((*(pC+3))    ); +   pC = (png_bytep)(png_ptr->chunkdata + prefix_length); +   profile_size = ((*(pC    ))<<24) | +                  ((*(pC + 1))<<16) | +                  ((*(pC + 2))<< 8) | +                  ((*(pC + 3))    ); -   if(profile_size < profile_length) +   if (profile_size < profile_length)        profile_length = profile_size; -   if(profile_size > profile_length) +   if (profile_size > profile_length)     { -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        png_warning(png_ptr, "Ignoring truncated iCCP profile.");        return;     } -   png_set_iCCP(png_ptr, info_ptr, chunkdata, compression_type, -                chunkdata + prefix_length, profile_length); -   png_free(png_ptr, chunkdata); +   png_set_iCCP(png_ptr, info_ptr, png_ptr->chunkdata, +     compression_type, png_ptr->chunkdata + prefix_length, profile_length); +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = NULL;  }  #endif /* PNG_READ_iCCP_SUPPORTED */ @@ -1101,7 +1122,6 @@ void /* PRIVATE */  png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  /* Note: this does not properly handle chunks that are > 64K under DOS */  { -   png_bytep chunkdata;     png_bytep entry_start;     png_sPLT_t new_palette;  #ifdef PNG_NO_POINTER_INDEXING @@ -1111,7 +1131,8 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_uint_32 skip = 0;     png_size_t slength; -   png_debug(1, "in png_handle_sPLT\n"); +   png_debug(1, "in png_handle_sPLT"); +     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before sPLT"); @@ -1131,45 +1152,49 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     }  #endif -   chunkdata = (png_bytep)png_malloc(png_ptr, length + 1); +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1);     slength = (png_size_t)length; -   png_crc_read(png_ptr, (png_bytep)chunkdata, slength); +   png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);     if (png_crc_finish(png_ptr, skip))     { -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     } -   chunkdata[slength] = 0x00; +   png_ptr->chunkdata[slength] = 0x00; -   for (entry_start = chunkdata; *entry_start; entry_start++) -      /* empty loop to find end of name */ ; +   for (entry_start = (png_bytep)png_ptr->chunkdata; *entry_start; entry_start++) +      /* Empty loop to find end of name */ ;     ++entry_start; -   /* a sample depth should follow the separator, and we should be on it  */ -   if (entry_start > chunkdata + slength - 2) +   /* A sample depth should follow the separator, and we should be on it  */ +   if (entry_start > (png_bytep)png_ptr->chunkdata + slength - 2)     { -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        png_warning(png_ptr, "malformed sPLT chunk");        return;     }     new_palette.depth = *entry_start++;     entry_size = (new_palette.depth == 8 ? 6 : 10); -   data_length = (slength - (entry_start - chunkdata)); +   data_length = (slength - (entry_start - (png_bytep)png_ptr->chunkdata)); -   /* integrity-check the data length */ +   /* Integrity-check the data length */     if (data_length % entry_size)     { -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        png_warning(png_ptr, "sPLT chunk has bad length");        return;     }     new_palette.nentries = (png_int_32) ( data_length / entry_size); -   if ((png_uint_32) new_palette.nentries > (png_uint_32) (PNG_SIZE_MAX / -       png_sizeof(png_sPLT_entry))) +   if ((png_uint_32) new_palette.nentries > +       (png_uint_32) (PNG_SIZE_MAX / png_sizeof(png_sPLT_entry)))     {         png_warning(png_ptr, "sPLT chunk too long");         return; @@ -1226,12 +1251,13 @@ png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     }  #endif -   /* discard all chunk data except the name and stash that */ -   new_palette.name = (png_charp)chunkdata; +   /* Discard all chunk data except the name and stash that */ +   new_palette.name = png_ptr->chunkdata;     png_set_sPLT(png_ptr, info_ptr, &new_palette, 1); -   png_free(png_ptr, chunkdata); +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = NULL;     png_free(png_ptr, new_palette.entries);  }  #endif /* PNG_READ_sPLT_SUPPORTED */ @@ -1241,14 +1267,8 @@ void /* PRIVATE */  png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  {     png_byte readbuf[PNG_MAX_PALETTE_LENGTH]; -   int bit_mask; -   png_debug(1, "in png_handle_tRNS\n"); - -   /* For non-indexed color, mask off any bits in the tRNS value that -    * exceed the bit depth.  Some creators were writing extra bits there. -    * This is not needed for indexed color. */ -   bit_mask = (1 << png_ptr->bit_depth) - 1; +   png_debug(1, "in png_handle_tRNS");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before tRNS"); @@ -1278,7 +1298,7 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        png_crc_read(png_ptr, buf, 2);        png_ptr->num_trans = 1; -      png_ptr->trans_values.gray = png_get_uint_16(buf) & bit_mask; +      png_ptr->trans_values.gray = png_get_uint_16(buf);     }     else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)     { @@ -1292,9 +1312,9 @@ png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        }        png_crc_read(png_ptr, buf, (png_size_t)length);        png_ptr->num_trans = 1; -      png_ptr->trans_values.red = png_get_uint_16(buf) & bit_mask; -      png_ptr->trans_values.green = png_get_uint_16(buf + 2) & bit_mask; -      png_ptr->trans_values.blue = png_get_uint_16(buf + 4) & bit_mask; +      png_ptr->trans_values.red = png_get_uint_16(buf); +      png_ptr->trans_values.green = png_get_uint_16(buf + 2); +      png_ptr->trans_values.blue = png_get_uint_16(buf + 4);     }     else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)     { @@ -1344,7 +1364,7 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_size_t truelen;     png_byte buf[6]; -   png_debug(1, "in png_handle_bKGD\n"); +   png_debug(1, "in png_handle_bKGD");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before bKGD"); @@ -1393,9 +1413,9 @@ png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)     {        png_ptr->background.index = buf[0]; -      if(info_ptr->num_palette) +      if (info_ptr && info_ptr->num_palette)        { -          if(buf[0] > info_ptr->num_palette) +          if (buf[0] >= info_ptr->num_palette)            {               png_warning(png_ptr, "Incorrect bKGD chunk index value");               return; @@ -1433,7 +1453,7 @@ png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     unsigned int num, i;     png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH]; -   png_debug(1, "in png_handle_hIST\n"); +   png_debug(1, "in png_handle_hIST");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before hIST"); @@ -1488,7 +1508,7 @@ png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_uint_32 res_x, res_y;     int unit_type; -   png_debug(1, "in png_handle_pHYs\n"); +   png_debug(1, "in png_handle_pHYs");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before pHYs"); @@ -1531,7 +1551,7 @@ png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_int_32 offset_x, offset_y;     int unit_type; -   png_debug(1, "in png_handle_oFFs\n"); +   png_debug(1, "in png_handle_oFFs");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before oFFs"); @@ -1567,11 +1587,10 @@ png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  #endif  #if defined(PNG_READ_pCAL_SUPPORTED) -/* read the pCAL chunk (described in the PNG Extensions document) */ +/* Read the pCAL chunk (described in the PNG Extensions document) */  void /* PRIVATE */  png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  { -   png_charp purpose;     png_int_32 X0, X1;     png_byte type, nparams;     png_charp buf, units, endptr; @@ -1579,7 +1598,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_size_t slength;     int i; -   png_debug(1, "in png_handle_pCAL\n"); +   png_debug(1, "in png_handle_pCAL");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before pCAL"); @@ -1596,48 +1615,51 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        return;     } -   png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)\n", +   png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)",        length + 1); -   purpose = (png_charp)png_malloc_warn(png_ptr, length + 1); -   if (purpose == NULL) +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); +   if (png_ptr->chunkdata == NULL)       {         png_warning(png_ptr, "No memory for pCAL purpose.");         return;       }     slength = (png_size_t)length; -   png_crc_read(png_ptr, (png_bytep)purpose, slength); +   png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);     if (png_crc_finish(png_ptr, 0))     { -      png_free(png_ptr, purpose); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     } -   purpose[slength] = 0x00; /* null terminate the last string */ +   png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */ -   png_debug(3, "Finding end of pCAL purpose string\n"); -   for (buf = purpose; *buf; buf++) -      /* empty loop */ ; +   png_debug(3, "Finding end of pCAL purpose string"); +   for (buf = png_ptr->chunkdata; *buf; buf++) +      /* Empty loop */ ; -   endptr = purpose + slength; +   endptr = png_ptr->chunkdata + slength;     /* We need to have at least 12 bytes after the purpose string        in order to get the parameter information. */     if (endptr <= buf + 12)     {        png_warning(png_ptr, "Invalid pCAL data"); -      png_free(png_ptr, purpose); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     } -   png_debug(3, "Reading pCAL X0, X1, type, nparams, and units\n"); +   png_debug(3, "Reading pCAL X0, X1, type, nparams, and units");     X0 = png_get_int_32((png_bytep)buf+1);     X1 = png_get_int_32((png_bytep)buf+5);     type = buf[9];     nparams = buf[10];     units = buf + 11; -   png_debug(3, "Checking pCAL equation type and number of parameters\n"); +   png_debug(3, "Checking pCAL equation type and number of parameters");     /* Check that we have the right number of parameters for known        equation types. */     if ((type == PNG_EQUATION_LINEAR && nparams != 2) || @@ -1646,7 +1668,8 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)         (type == PNG_EQUATION_HYPERBOLIC && nparams != 4))     {        png_warning(png_ptr, "Invalid pCAL parameters for equation type"); -      png_free(png_ptr, purpose); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     }     else if (type >= PNG_EQUATION_LAST) @@ -1657,12 +1680,13 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     for (buf = units; *buf; buf++)        /* Empty loop to move past the units string. */ ; -   png_debug(3, "Allocating pCAL parameters array\n"); -   params = (png_charpp)png_malloc_warn(png_ptr, (png_uint_32)(nparams -      *png_sizeof(png_charp))) ; +   png_debug(3, "Allocating pCAL parameters array"); +   params = (png_charpp)png_malloc_warn(png_ptr, +      (png_uint_32)(nparams * png_sizeof(png_charp))) ;     if (params == NULL)       { -       png_free(png_ptr, purpose); +       png_free(png_ptr, png_ptr->chunkdata); +       png_ptr->chunkdata = NULL;         png_warning(png_ptr, "No memory for pCAL params.");         return;       } @@ -1672,7 +1696,7 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     {        buf++; /* Skip the null string terminator from previous parameter. */ -      png_debug1(3, "Reading pCAL parameter %d\n", i); +      png_debug1(3, "Reading pCAL parameter %d", i);        for (params[i] = buf; buf <= endptr && *buf != 0x00; buf++)           /* Empty loop to move past each parameter string */ ; @@ -1680,26 +1704,28 @@ png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        if (buf > endptr)        {           png_warning(png_ptr, "Invalid pCAL data"); -         png_free(png_ptr, purpose); +         png_free(png_ptr, png_ptr->chunkdata); +         png_ptr->chunkdata = NULL;           png_free(png_ptr, params);           return;        }     } -   png_set_pCAL(png_ptr, info_ptr, purpose, X0, X1, type, nparams, +   png_set_pCAL(png_ptr, info_ptr, png_ptr->chunkdata, X0, X1, type, nparams,        units, params); -   png_free(png_ptr, purpose); +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = NULL;     png_free(png_ptr, params);  }  #endif  #if defined(PNG_READ_sCAL_SUPPORTED) -/* read the sCAL chunk */ +/* Read the sCAL chunk */  void /* PRIVATE */  png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  { -   png_charp buffer, ep; +   png_charp ep;  #ifdef PNG_FLOATING_POINT_SUPPORTED     double width, height;     png_charp vp; @@ -1710,7 +1736,7 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  #endif     png_size_t slength; -   png_debug(1, "in png_handle_sCAL\n"); +   png_debug(1, "in png_handle_sCAL");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before sCAL"); @@ -1727,88 +1753,91 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        return;     } -   png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)\n", +   png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)",        length + 1); -   buffer = (png_charp)png_malloc_warn(png_ptr, length + 1); -   if (buffer == NULL) -     { -       png_warning(png_ptr, "Out of memory while processing sCAL chunk"); -       return; -     } +   png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); +   if (png_ptr->chunkdata == NULL) +   { +      png_warning(png_ptr, "Out of memory while processing sCAL chunk"); +      return; +   }     slength = (png_size_t)length; -   png_crc_read(png_ptr, (png_bytep)buffer, slength); +   png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);     if (png_crc_finish(png_ptr, 0))     { -      png_free(png_ptr, buffer); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     } -   buffer[slength] = 0x00; /* null terminate the last string */ +   png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */ -   ep = buffer + 1;        /* skip unit byte */ +   ep = png_ptr->chunkdata + 1;        /* Skip unit byte */  #ifdef PNG_FLOATING_POINT_SUPPORTED     width = png_strtod(png_ptr, ep, &vp);     if (*vp)     { -       png_warning(png_ptr, "malformed width string in sCAL chunk"); -       return; +      png_warning(png_ptr, "malformed width string in sCAL chunk"); +      return;     }  #else  #ifdef PNG_FIXED_POINT_SUPPORTED     swidth = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1);     if (swidth == NULL) -     { -       png_warning(png_ptr, "Out of memory while processing sCAL chunk width"); -       return; -     } +   { +      png_warning(png_ptr, "Out of memory while processing sCAL chunk width"); +      return; +   }     png_memcpy(swidth, ep, (png_size_t)png_strlen(ep));  #endif  #endif -   for (ep = buffer; *ep; ep++) -      /* empty loop */ ; +   for (ep = png_ptr->chunkdata; *ep; ep++) +      /* Empty loop */ ;     ep++; -   if (buffer + slength < ep) +   if (png_ptr->chunkdata + slength < ep)     { -       png_warning(png_ptr, "Truncated sCAL chunk"); +      png_warning(png_ptr, "Truncated sCAL chunk");  #if defined(PNG_FIXED_POINT_SUPPORTED) && \      !defined(PNG_FLOATING_POINT_SUPPORTED) -       png_free(png_ptr, swidth); +      png_free(png_ptr, swidth);  #endif -      png_free(png_ptr, buffer); -       return; +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL; +      return;     }  #ifdef PNG_FLOATING_POINT_SUPPORTED     height = png_strtod(png_ptr, ep, &vp);     if (*vp)     { -       png_warning(png_ptr, "malformed height string in sCAL chunk"); -       return; +      png_warning(png_ptr, "malformed height string in sCAL chunk"); +      return;     }  #else  #ifdef PNG_FIXED_POINT_SUPPORTED     sheight = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); -   if (swidth == NULL) -     { -       png_warning(png_ptr, "Out of memory while processing sCAL chunk height"); -       return; -     } +   if (sheight == NULL) +   { +      png_warning(png_ptr, "Out of memory while processing sCAL chunk height"); +      return; +   }     png_memcpy(sheight, ep, (png_size_t)png_strlen(ep));  #endif  #endif -   if (buffer + slength < ep +   if (png_ptr->chunkdata + slength < ep  #ifdef PNG_FLOATING_POINT_SUPPORTED        || width <= 0. || height <= 0.  #endif        )     {        png_warning(png_ptr, "Invalid sCAL data"); -      png_free(png_ptr, buffer); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;  #if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)        png_free(png_ptr, swidth);        png_free(png_ptr, sheight); @@ -1818,14 +1847,15 @@ png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  #ifdef PNG_FLOATING_POINT_SUPPORTED -   png_set_sCAL(png_ptr, info_ptr, buffer[0], width, height); +   png_set_sCAL(png_ptr, info_ptr, png_ptr->chunkdata[0], width, height);  #else  #ifdef PNG_FIXED_POINT_SUPPORTED -   png_set_sCAL_s(png_ptr, info_ptr, buffer[0], swidth, sheight); +   png_set_sCAL_s(png_ptr, info_ptr, png_ptr->chunkdata[0], swidth, sheight);  #endif  #endif -   png_free(png_ptr, buffer); +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = NULL;  #if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)     png_free(png_ptr, swidth);     png_free(png_ptr, sheight); @@ -1840,7 +1870,7 @@ png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_byte buf[7];     png_time mod_time; -   png_debug(1, "in png_handle_tIME\n"); +   png_debug(1, "in png_handle_tIME");     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Out of place tIME chunk"); @@ -1888,7 +1918,8 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_size_t slength;     int ret; -   png_debug(1, "in png_handle_tEXt\n"); +   png_debug(1, "in png_handle_tEXt"); +     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before tEXt"); @@ -1905,25 +1936,30 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     }  #endif -   key = (png_charp)png_malloc_warn(png_ptr, length + 1); -   if (key == NULL) +   png_free(png_ptr, png_ptr->chunkdata); + +   png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); +   if (png_ptr->chunkdata == NULL)     {       png_warning(png_ptr, "No memory to process text chunk.");       return;     }     slength = (png_size_t)length; -   png_crc_read(png_ptr, (png_bytep)key, slength); +   png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);     if (png_crc_finish(png_ptr, skip))     { -      png_free(png_ptr, key); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     } +   key = png_ptr->chunkdata; +     key[slength] = 0x00;     for (text = key; *text; text++) -      /* empty loop to find end of key */ ; +      /* Empty loop to find end of key */ ;     if (text != key + slength)        text++; @@ -1933,7 +1969,8 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     if (text_ptr == NULL)     {       png_warning(png_ptr, "Not enough memory to process text chunk."); -     png_free(png_ptr, key); +     png_free(png_ptr, png_ptr->chunkdata); +     png_ptr->chunkdata = NULL;       return;     }     text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; @@ -1946,9 +1983,10 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     text_ptr->text = text;     text_ptr->text_length = png_strlen(text); -   ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); +   ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); -   png_free(png_ptr, key); +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = NULL;     png_free(png_ptr, text_ptr);     if (ret)       png_warning(png_ptr, "Insufficient memory to process text chunk."); @@ -1956,18 +1994,19 @@ png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  #endif  #if defined(PNG_READ_zTXt_SUPPORTED) -/* note: this does not correctly handle chunks that are > 64K under DOS */ +/* Note: this does not correctly handle chunks that are > 64K under DOS */  void /* PRIVATE */  png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  {     png_textp text_ptr; -   png_charp chunkdata;     png_charp text;     int comp_type;     int ret;     png_size_t slength, prefix_len, data_len; -   png_debug(1, "in png_handle_zTXt\n"); +   png_debug(1, "in png_handle_zTXt"); + +     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before zTXt"); @@ -1979,36 +2018,39 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        there is no hard and fast rule to tell us where to stop. */     if (length > (png_uint_32)65535L)     { -     png_warning(png_ptr,"zTXt chunk too large to fit in memory"); +     png_warning(png_ptr, "zTXt chunk too large to fit in memory");       png_crc_finish(png_ptr, length);       return;     }  #endif -   chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); -   if (chunkdata == NULL) +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); +   if (png_ptr->chunkdata == NULL)     { -     png_warning(png_ptr,"Out of memory processing zTXt chunk."); +     png_warning(png_ptr, "Out of memory processing zTXt chunk.");       return;     }     slength = (png_size_t)length; -   png_crc_read(png_ptr, (png_bytep)chunkdata, slength); +   png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);     if (png_crc_finish(png_ptr, 0))     { -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     } -   chunkdata[slength] = 0x00; +   png_ptr->chunkdata[slength] = 0x00; -   for (text = chunkdata; *text; text++) -      /* empty loop */ ; +   for (text = png_ptr->chunkdata; *text; text++) +      /* Empty loop */ ;     /* zTXt must have some text after the chunkdataword */ -   if (text >= chunkdata + slength - 2) +   if (text >= png_ptr->chunkdata + slength - 2)     {        png_warning(png_ptr, "Truncated zTXt chunk"); -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     }     else @@ -2019,54 +2061,56 @@ png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)            png_warning(png_ptr, "Unknown compression type in zTXt chunk");            comp_type = PNG_TEXT_COMPRESSION_zTXt;         } -       text++;        /* skip the compression_method byte */ +       text++;        /* Skip the compression_method byte */     } -   prefix_len = text - chunkdata; +   prefix_len = text - png_ptr->chunkdata; -   chunkdata = (png_charp)png_decompress_chunk(png_ptr, comp_type, chunkdata, -                                    (png_size_t)length, prefix_len, &data_len); +   png_decompress_chunk(png_ptr, comp_type, +     (png_size_t)length, prefix_len, &data_len);     text_ptr = (png_textp)png_malloc_warn(png_ptr, -     (png_uint_32)png_sizeof(png_text)); +      (png_uint_32)png_sizeof(png_text));     if (text_ptr == NULL)     { -     png_warning(png_ptr,"Not enough memory to process zTXt chunk."); -     png_free(png_ptr, chunkdata); +     png_warning(png_ptr, "Not enough memory to process zTXt chunk."); +     png_free(png_ptr, png_ptr->chunkdata); +     png_ptr->chunkdata = NULL;       return;     }     text_ptr->compression = comp_type; -   text_ptr->key = chunkdata; +   text_ptr->key = png_ptr->chunkdata;  #ifdef PNG_iTXt_SUPPORTED     text_ptr->lang = NULL;     text_ptr->lang_key = NULL;     text_ptr->itxt_length = 0;  #endif -   text_ptr->text = chunkdata + prefix_len; +   text_ptr->text = png_ptr->chunkdata + prefix_len;     text_ptr->text_length = data_len; -   ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); +   ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);     png_free(png_ptr, text_ptr); -   png_free(png_ptr, chunkdata); +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = NULL;     if (ret)       png_error(png_ptr, "Insufficient memory to store zTXt chunk.");  }  #endif  #if defined(PNG_READ_iTXt_SUPPORTED) -/* note: this does not correctly handle chunks that are > 64K under DOS */ +/* Note: this does not correctly handle chunks that are > 64K under DOS */  void /* PRIVATE */  png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  {     png_textp text_ptr; -   png_charp chunkdata;     png_charp key, lang, text, lang_key;     int comp_flag;     int comp_type = 0;     int ret;     png_size_t slength, prefix_len, data_len; -   png_debug(1, "in png_handle_iTXt\n"); +   png_debug(1, "in png_handle_iTXt"); +     if (!(png_ptr->mode & PNG_HAVE_IHDR))        png_error(png_ptr, "Missing IHDR before iTXt"); @@ -2079,40 +2123,44 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)        there is no hard and fast rule to tell us where to stop. */     if (length > (png_uint_32)65535L)     { -     png_warning(png_ptr,"iTXt chunk too large to fit in memory"); +     png_warning(png_ptr, "iTXt chunk too large to fit in memory");       png_crc_finish(png_ptr, length);       return;     }  #endif -   chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); -   if (chunkdata == NULL) +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); +   if (png_ptr->chunkdata == NULL)     {       png_warning(png_ptr, "No memory to process iTXt chunk.");       return;     }     slength = (png_size_t)length; -   png_crc_read(png_ptr, (png_bytep)chunkdata, slength); +   png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);     if (png_crc_finish(png_ptr, 0))     { -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     } -   chunkdata[slength] = 0x00; +   png_ptr->chunkdata[slength] = 0x00; -   for (lang = chunkdata; *lang; lang++) -      /* empty loop */ ; -   lang++;        /* skip NUL separator */ +   for (lang = png_ptr->chunkdata; *lang; lang++) +      /* Empty loop */ ; +   lang++;        /* Skip NUL separator */     /* iTXt must have a language tag (possibly empty), two compression bytes, -      translated keyword (possibly empty), and possibly some text after the -      keyword */ +    * translated keyword (possibly empty), and possibly some text after the +    * keyword +    */ -   if (lang >= chunkdata + slength - 3) +   if (lang >= png_ptr->chunkdata + slength - 3)     {        png_warning(png_ptr, "Truncated iTXt chunk"); -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     }     else @@ -2122,54 +2170,58 @@ png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     }     for (lang_key = lang; *lang_key; lang_key++) -      /* empty loop */ ; -   lang_key++;        /* skip NUL separator */ +      /* Empty loop */ ; +   lang_key++;        /* Skip NUL separator */ -   if (lang_key >= chunkdata + slength) +   if (lang_key >= png_ptr->chunkdata + slength)     {        png_warning(png_ptr, "Truncated iTXt chunk"); -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     }     for (text = lang_key; *text; text++) -      /* empty loop */ ; -   text++;        /* skip NUL separator */ -   if (text >= chunkdata + slength) +      /* Empty loop */ ; +   text++;        /* Skip NUL separator */ +   if (text >= png_ptr->chunkdata + slength)     {        png_warning(png_ptr, "Malformed iTXt chunk"); -      png_free(png_ptr, chunkdata); +      png_free(png_ptr, png_ptr->chunkdata); +      png_ptr->chunkdata = NULL;        return;     } -   prefix_len = text - chunkdata; +   prefix_len = text - png_ptr->chunkdata; -   key=chunkdata; +   key=png_ptr->chunkdata;     if (comp_flag) -       chunkdata = png_decompress_chunk(png_ptr, comp_type, chunkdata, -          (size_t)length, prefix_len, &data_len); +       png_decompress_chunk(png_ptr, comp_type, +         (size_t)length, prefix_len, &data_len);     else -       data_len=png_strlen(chunkdata + prefix_len); +       data_len = png_strlen(png_ptr->chunkdata + prefix_len);     text_ptr = (png_textp)png_malloc_warn(png_ptr,        (png_uint_32)png_sizeof(png_text));     if (text_ptr == NULL)     { -     png_warning(png_ptr,"Not enough memory to process iTXt chunk."); -     png_free(png_ptr, chunkdata); +     png_warning(png_ptr, "Not enough memory to process iTXt chunk."); +     png_free(png_ptr, png_ptr->chunkdata); +     png_ptr->chunkdata = NULL;       return;     }     text_ptr->compression = (int)comp_flag + 1; -   text_ptr->lang_key = chunkdata+(lang_key-key); -   text_ptr->lang = chunkdata+(lang-key); +   text_ptr->lang_key = png_ptr->chunkdata + (lang_key - key); +   text_ptr->lang = png_ptr->chunkdata + (lang - key);     text_ptr->itxt_length = data_len;     text_ptr->text_length = 0; -   text_ptr->key = chunkdata; -   text_ptr->text = chunkdata + prefix_len; +   text_ptr->key = png_ptr->chunkdata; +   text_ptr->text = png_ptr->chunkdata + prefix_len; -   ret=png_set_text_2(png_ptr, info_ptr, text_ptr, 1); +   ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);     png_free(png_ptr, text_ptr); -   png_free(png_ptr, chunkdata); +   png_free(png_ptr, png_ptr->chunkdata); +   png_ptr->chunkdata = NULL;     if (ret)       png_error(png_ptr, "Insufficient memory to store iTXt chunk.");  } @@ -2185,23 +2237,22 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  {     png_uint_32 skip = 0; -   png_debug(1, "in png_handle_unknown\n"); +   png_debug(1, "in png_handle_unknown"); +     if (png_ptr->mode & PNG_HAVE_IDAT)     {  #ifdef PNG_USE_LOCAL_ARRAYS        PNG_CONST PNG_IDAT;  #endif -      if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))  /* not an IDAT */ +      if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))  /* Not an IDAT */           png_ptr->mode |= PNG_AFTER_IDAT;     } -   png_check_chunk_name(png_ptr, png_ptr->chunk_name); -     if (!(png_ptr->chunk_name[0] & 0x20))     {  #if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) -      if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != +      if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=             PNG_HANDLE_CHUNK_ALWAYS  #if defined(PNG_READ_USER_CHUNKS_SUPPORTED)             && png_ptr->read_user_chunk_fn == NULL @@ -2223,16 +2274,22 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)             length = (png_uint_32)65535L;         }  #endif -       png_strncpy((png_charp)png_ptr->unknown_chunk.name, -	 (png_charp)png_ptr->chunk_name, 4); -       png_ptr->unknown_chunk.name[4] = '\0'; -       png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); +       png_memcpy((png_charp)png_ptr->unknown_chunk.name, +                  (png_charp)png_ptr->chunk_name,  +                  png_sizeof(png_ptr->unknown_chunk.name)); +       png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1] = '\0';         png_ptr->unknown_chunk.size = (png_size_t)length; -       png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); +       if (length == 0) +         png_ptr->unknown_chunk.data = NULL; +       else +       { +         png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); +         png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); +       }  #if defined(PNG_READ_USER_CHUNKS_SUPPORTED) -       if(png_ptr->read_user_chunk_fn != NULL) +       if (png_ptr->read_user_chunk_fn != NULL)         { -          /* callback to user unknown chunk handler */ +          /* Callback to user unknown chunk handler */            int ret;            ret = (*(png_ptr->read_user_chunk_fn))              (png_ptr, &png_ptr->unknown_chunk); @@ -2241,16 +2298,16 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)            if (ret == 0)            {               if (!(png_ptr->chunk_name[0] & 0x20)) -                if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != +                if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=                       PNG_HANDLE_CHUNK_ALWAYS)                     png_chunk_error(png_ptr, "unknown critical chunk");               png_set_unknown_chunks(png_ptr, info_ptr,                 &png_ptr->unknown_chunk, 1);            }         } -#else -       png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); +       else  #endif +       png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1);         png_free(png_ptr, png_ptr->unknown_chunk.data);         png_ptr->unknown_chunk.data = NULL;     } @@ -2261,7 +2318,7 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)     png_crc_finish(png_ptr, skip);  #if !defined(PNG_READ_USER_CHUNKS_SUPPORTED) -   info_ptr = info_ptr; /* quiet compiler warnings about unused info_ptr */ +   info_ptr = info_ptr; /* Quiet compiler warnings about unused info_ptr */  #endif  } @@ -2276,7 +2333,7 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)  void /* PRIVATE */  png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name)  { -   png_debug(1, "in png_check_chunk_name\n"); +   png_debug(1, "in png_check_chunk_name");     if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) ||         isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3]))     { @@ -2298,7 +2355,7 @@ png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name)  void /* PRIVATE */  png_combine_row(png_structp png_ptr, png_bytep row, int mask)  { -   png_debug(1,"in png_combine_row\n"); +   png_debug(1, "in png_combine_row");     if (mask == 0xff)     {        png_memcpy(row, png_ptr->row_buf + 1, @@ -2509,12 +2566,12 @@ png_do_read_interlace(png_structp png_ptr)     int pass = png_ptr->pass;     png_uint_32 transformations = png_ptr->transformations;  #ifdef PNG_USE_LOCAL_ARRAYS -   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ -   /* offset to next interlace block */ +   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ +   /* Offset to next interlace block */     PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};  #endif -   png_debug(1,"in png_do_read_interlace\n"); +   png_debug(1, "in png_do_read_interlace");     if (row != NULL && row_info != NULL)     {        png_uint_32 final_width; @@ -2715,10 +2772,10 @@ png_do_read_interlace(png_structp png_ptr)           }        }        row_info->width = final_width; -      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth,final_width); +      row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, final_width);     }  #if !defined(PNG_READ_PACKSWAP_SUPPORTED) -   transformations = transformations; /* silence compiler warning */ +   transformations = transformations; /* Silence compiler warning */  #endif  }  #endif /* PNG_READ_INTERLACING_SUPPORTED */ @@ -2727,8 +2784,8 @@ void /* PRIVATE */  png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,     png_bytep prev_row, int filter)  { -   png_debug(1, "in png_read_filter_row\n"); -   png_debug2(2,"row = %lu, filter = %d\n", png_ptr->row_number, filter); +   png_debug(1, "in png_read_filter_row"); +   png_debug2(2, "row = %lu, filter = %d", png_ptr->row_number, filter);     switch (filter)     {        case PNG_FILTER_VALUE_NONE: @@ -2802,7 +2859,7 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,              rp++;           } -         for (i = 0; i < istop; i++)   /* use leftover rp,pp */ +         for (i = 0; i < istop; i++)   /* Use leftover rp,pp */           {              int a, b, c, pa, pb, pc, p; @@ -2832,7 +2889,7 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,                    p = c;               */ -            p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; +            p = (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c;              *rp = (png_byte)(((int)(*rp) + p) & 0xff);              rp++; @@ -2841,35 +2898,39 @@ png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,        }        default:           png_warning(png_ptr, "Ignoring bad adaptive filter type"); -         *row=0; +         *row = 0;           break;     }  } +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED  void /* PRIVATE */  png_read_finish_row(png_structp png_ptr)  {  #ifdef PNG_USE_LOCAL_ARRAYS -   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ +#ifdef PNG_READ_INTERLACING_SUPPORTED +   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ -   /* start of interlace block */ +   /* Start of interlace block */     PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; -   /* offset to next interlace block */ +   /* Offset to next interlace block */     PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -   /* start of interlace block in the y direction */ +   /* Start of interlace block in the y direction */     PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; -   /* offset to next interlace block in the y direction */ +   /* Offset to next interlace block in the y direction */     PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif /* PNG_READ_INTERLACING_SUPPORTED */  #endif -   png_debug(1, "in png_read_finish_row\n"); +   png_debug(1, "in png_read_finish_row");     png_ptr->row_number++;     if (png_ptr->row_number < png_ptr->num_rows)        return; +#ifdef PNG_READ_INTERLACING_SUPPORTED     if (png_ptr->interlaced)     {        png_ptr->row_number = 0; @@ -2904,6 +2965,7 @@ png_read_finish_row(png_structp png_ptr)        if (png_ptr->pass < 7)           return;     } +#endif /* PNG_READ_INTERLACING_SUPPORTED */     if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))     { @@ -2915,7 +2977,7 @@ png_read_finish_row(png_structp png_ptr)        png_ptr->zstream.next_out = (Byte *)&extra;        png_ptr->zstream.avail_out = (uInt)1; -      for(;;) +      for (;;)        {           if (!(png_ptr->zstream.avail_in))           { @@ -2973,32 +3035,36 @@ png_read_finish_row(png_structp png_ptr)     png_ptr->mode |= PNG_AFTER_IDAT;  } +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */  void /* PRIVATE */  png_read_start_row(png_structp png_ptr)  {  #ifdef PNG_USE_LOCAL_ARRAYS -   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ +#ifdef PNG_READ_INTERLACING_SUPPORTED +   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ -   /* start of interlace block */ +   /* Start of interlace block */     PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; -   /* offset to next interlace block */ +   /* Offset to next interlace block */     PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -   /* start of interlace block in the y direction */ +   /* Start of interlace block in the y direction */     PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; -   /* offset to next interlace block in the y direction */ +   /* Offset to next interlace block in the y direction */     PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};  #endif +#endif     int max_pixel_depth; -   png_uint_32 row_bytes; +   png_size_t row_bytes; -   png_debug(1, "in png_read_start_row\n"); +   png_debug(1, "in png_read_start_row");     png_ptr->zstream.avail_in = 0;     png_init_read_transformations(png_ptr); +#ifdef PNG_READ_INTERLACING_SUPPORTED     if (png_ptr->interlaced)     {        if (!(png_ptr->transformations & PNG_INTERLACE)) @@ -3012,13 +3078,11 @@ png_read_start_row(png_structp png_ptr)           png_pass_start[png_ptr->pass]) /           png_pass_inc[png_ptr->pass]; -         row_bytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->iwidth) + 1; - -         png_ptr->irowbytes = (png_size_t)row_bytes; -         if((png_uint_32)png_ptr->irowbytes != row_bytes) -            png_error(png_ptr, "Rowbytes overflow in png_read_start_row"); +         png_ptr->irowbytes = +            PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1;     }     else +#endif /* PNG_READ_INTERLACING_SUPPORTED */     {        png_ptr->num_rows = png_ptr->height;        png_ptr->iwidth = png_ptr->width; @@ -3117,46 +3181,63 @@ png_read_start_row(png_structp png_ptr)  #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \  defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) -   if(png_ptr->transformations & PNG_USER_TRANSFORM) +   if (png_ptr->transformations & PNG_USER_TRANSFORM)       { -       int user_pixel_depth=png_ptr->user_transform_depth* +       int user_pixel_depth = png_ptr->user_transform_depth*           png_ptr->user_transform_channels; -       if(user_pixel_depth > max_pixel_depth) +       if (user_pixel_depth > max_pixel_depth)           max_pixel_depth=user_pixel_depth;       }  #endif -   /* align the width on the next larger 8 pixels.  Mainly used -      for interlacing */ +   /* Align the width on the next larger 8 pixels.  Mainly used +    * for interlacing +    */     row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7)); -   /* calculate the maximum bytes needed, adding a byte and a pixel -      for safety's sake */ -   row_bytes = PNG_ROWBYTES(max_pixel_depth,row_bytes) + +   /* Calculate the maximum bytes needed, adding a byte and a pixel +    * for safety's sake +    */ +   row_bytes = PNG_ROWBYTES(max_pixel_depth, row_bytes) +        1 + ((max_pixel_depth + 7) >> 3);  #ifdef PNG_MAX_MALLOC_64K     if (row_bytes > (png_uint_32)65536L)        png_error(png_ptr, "This image requires a row greater than 64KB");  #endif -   png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes+64); -   png_ptr->row_buf = png_ptr->big_row_buf+32; + +   if (row_bytes + 64 > png_ptr->old_big_row_buf_size) +   { +     png_free(png_ptr, png_ptr->big_row_buf); +     png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 64); +     if (png_ptr->interlaced) +       png_memset(png_ptr->big_row_buf, 0, row_bytes + 64); +     png_ptr->row_buf = png_ptr->big_row_buf + 32; +     png_ptr->old_big_row_buf_size = row_bytes + 64; +   }  #ifdef PNG_MAX_MALLOC_64K -   if ((png_uint_32)png_ptr->rowbytes + 1 > (png_uint_32)65536L) +   if ((png_uint_32)row_bytes + 1 > (png_uint_32)65536L)        png_error(png_ptr, "This image requires a row greater than 64KB");  #endif -   if ((png_uint_32)png_ptr->rowbytes > (png_uint_32)(PNG_SIZE_MAX - 1)) +   if ((png_uint_32)row_bytes > (png_uint_32)(PNG_SIZE_MAX - 1))        png_error(png_ptr, "Row has too many bytes to allocate in memory."); -   png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)( -      png_ptr->rowbytes + 1)); -   png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1); +   if (row_bytes + 1 > png_ptr->old_prev_row_size) +   { +      png_free(png_ptr, png_ptr->prev_row); +      png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)( +        row_bytes + 1)); +      png_memset_check(png_ptr, png_ptr->prev_row, 0, row_bytes + 1); +      png_ptr->old_prev_row_size = row_bytes + 1; +   } + +   png_ptr->rowbytes = row_bytes; -   png_debug1(3, "width = %lu,\n", png_ptr->width); -   png_debug1(3, "height = %lu,\n", png_ptr->height); -   png_debug1(3, "iwidth = %lu,\n", png_ptr->iwidth); -   png_debug1(3, "num_rows = %lu\n", png_ptr->num_rows); -   png_debug1(3, "rowbytes = %lu,\n", png_ptr->rowbytes); -   png_debug1(3, "irowbytes = %lu,\n", png_ptr->irowbytes); +   png_debug1(3, "width = %lu,", png_ptr->width); +   png_debug1(3, "height = %lu,", png_ptr->height); +   png_debug1(3, "iwidth = %lu,", png_ptr->iwidth); +   png_debug1(3, "num_rows = %lu,", png_ptr->num_rows); +   png_debug1(3, "rowbytes = %lu,", png_ptr->rowbytes); +   png_debug1(3, "irowbytes = %lu", png_ptr->irowbytes);     png_ptr->flags |= PNG_FLAG_ROW_INIT;  } diff --git a/src/libpng/pngset.c b/src/libpng/pngset.c index b54a111..fa68a2d 100644 --- a/src/libpng/pngset.c +++ b/src/libpng/pngset.c @@ -1,9 +1,9 @@  /* pngset.c - storage of image information into info struct   * - * Last changed in libpng 1.2.22 [October 13, 2007] + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   * @@ -15,14 +15,13 @@  #define PNG_INTERNAL  #include "png.h" -  #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)  #if defined(PNG_bKGD_SUPPORTED)  void PNGAPI  png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background)  { -   png_debug1(1, "in %s storage function\n", "bKGD"); +   png_debug1(1, "in %s storage function", "bKGD");     if (png_ptr == NULL || info_ptr == NULL)        return; @@ -38,29 +37,10 @@ png_set_cHRM(png_structp png_ptr, png_infop info_ptr,     double white_x, double white_y, double red_x, double red_y,     double green_x, double green_y, double blue_x, double blue_y)  { -   png_debug1(1, "in %s storage function\n", "cHRM"); +   png_debug1(1, "in %s storage function", "cHRM");     if (png_ptr == NULL || info_ptr == NULL)        return; -   if (white_x < 0.0 || white_y < 0.0 || -         red_x < 0.0 ||   red_y < 0.0 || -       green_x < 0.0 || green_y < 0.0 || -        blue_x < 0.0 ||  blue_y < 0.0) -   { -      png_warning(png_ptr, -        "Ignoring attempt to set negative chromaticity value"); -      return; -   } -   if (white_x > 21474.83 || white_y > 21474.83 || -         red_x > 21474.83 ||   red_y > 21474.83 || -       green_x > 21474.83 || green_y > 21474.83 || -        blue_x > 21474.83 ||  blue_y > 21474.83) -   { -      png_warning(png_ptr, -        "Ignoring attempt to set chromaticity value exceeding 21474.83"); -      return; -   } -     info_ptr->x_white = (float)white_x;     info_ptr->y_white = (float)white_y;     info_ptr->x_red   = (float)red_x; @@ -81,7 +61,8 @@ png_set_cHRM(png_structp png_ptr, png_infop info_ptr,  #endif     info_ptr->valid |= PNG_INFO_cHRM;  } -#endif +#endif /* PNG_FLOATING_POINT_SUPPORTED */ +  #ifdef PNG_FIXED_POINT_SUPPORTED  void PNGAPI  png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, @@ -89,73 +70,46 @@ png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,     png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,     png_fixed_point blue_x, png_fixed_point blue_y)  { -   png_debug1(1, "in %s storage function\n", "cHRM"); +   png_debug1(1, "in %s storage function", "cHRM fixed");     if (png_ptr == NULL || info_ptr == NULL)        return; -   if (white_x < 0 || white_y < 0 || -         red_x < 0 ||   red_y < 0 || -       green_x < 0 || green_y < 0 || -        blue_x < 0 ||  blue_y < 0) -   { -      png_warning(png_ptr, -        "Ignoring attempt to set negative chromaticity value"); -      return; -   } -#ifdef PNG_FLOATING_POINT_SUPPORTED -   if (white_x > (double) PNG_UINT_31_MAX || -       white_y > (double) PNG_UINT_31_MAX || -         red_x > (double) PNG_UINT_31_MAX || -         red_y > (double) PNG_UINT_31_MAX || -       green_x > (double) PNG_UINT_31_MAX || -       green_y > (double) PNG_UINT_31_MAX || -        blue_x > (double) PNG_UINT_31_MAX || -        blue_y > (double) PNG_UINT_31_MAX) -#else -   if (white_x > (png_fixed_point) PNG_UINT_31_MAX/100000L || -       white_y > (png_fixed_point) PNG_UINT_31_MAX/100000L || -         red_x > (png_fixed_point) PNG_UINT_31_MAX/100000L || -         red_y > (png_fixed_point) PNG_UINT_31_MAX/100000L || -       green_x > (png_fixed_point) PNG_UINT_31_MAX/100000L || -       green_y > (png_fixed_point) PNG_UINT_31_MAX/100000L || -        blue_x > (png_fixed_point) PNG_UINT_31_MAX/100000L || -        blue_y > (png_fixed_point) PNG_UINT_31_MAX/100000L) +#if !defined(PNG_NO_CHECK_cHRM) +   if (png_check_cHRM_fixed(png_ptr, +      white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y))  #endif     { -      png_warning(png_ptr, -        "Ignoring attempt to set chromaticity value exceeding 21474.83"); -      return; +      info_ptr->int_x_white = white_x; +      info_ptr->int_y_white = white_y; +      info_ptr->int_x_red   = red_x; +      info_ptr->int_y_red   = red_y; +      info_ptr->int_x_green = green_x; +      info_ptr->int_y_green = green_y; +      info_ptr->int_x_blue  = blue_x; +      info_ptr->int_y_blue  = blue_y; +#ifdef  PNG_FLOATING_POINT_SUPPORTED +      info_ptr->x_white = (float)(white_x/100000.); +      info_ptr->y_white = (float)(white_y/100000.); +      info_ptr->x_red   = (float)(  red_x/100000.); +      info_ptr->y_red   = (float)(  red_y/100000.); +      info_ptr->x_green = (float)(green_x/100000.); +      info_ptr->y_green = (float)(green_y/100000.); +      info_ptr->x_blue  = (float)( blue_x/100000.); +      info_ptr->y_blue  = (float)( blue_y/100000.); +#endif +      info_ptr->valid |= PNG_INFO_cHRM;     } -   info_ptr->int_x_white = white_x; -   info_ptr->int_y_white = white_y; -   info_ptr->int_x_red   = red_x; -   info_ptr->int_y_red   = red_y; -   info_ptr->int_x_green = green_x; -   info_ptr->int_y_green = green_y; -   info_ptr->int_x_blue  = blue_x; -   info_ptr->int_y_blue  = blue_y; -#ifdef PNG_FLOATING_POINT_SUPPORTED -   info_ptr->x_white = (float)(white_x/100000.); -   info_ptr->y_white = (float)(white_y/100000.); -   info_ptr->x_red   = (float)(  red_x/100000.); -   info_ptr->y_red   = (float)(  red_y/100000.); -   info_ptr->x_green = (float)(green_x/100000.); -   info_ptr->y_green = (float)(green_y/100000.); -   info_ptr->x_blue  = (float)( blue_x/100000.); -   info_ptr->y_blue  = (float)( blue_y/100000.); -#endif -   info_ptr->valid |= PNG_INFO_cHRM;  } -#endif -#endif +#endif /* PNG_FIXED_POINT_SUPPORTED */ +#endif /* PNG_cHRM_SUPPORTED */  #if defined(PNG_gAMA_SUPPORTED)  #ifdef PNG_FLOATING_POINT_SUPPORTED  void PNGAPI  png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)  { -   double gamma; -   png_debug1(1, "in %s storage function\n", "gAMA"); +   double png_gamma; +   png_debug1(1, "in %s storage function", "gAMA");     if (png_ptr == NULL || info_ptr == NULL)        return; @@ -163,16 +117,16 @@ png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)     if (file_gamma > 21474.83)     {        png_warning(png_ptr, "Limiting gamma to 21474.83"); -      gamma=21474.83; +      png_gamma=21474.83;     }     else -      gamma=file_gamma; -   info_ptr->gamma = (float)gamma; +      png_gamma = file_gamma; +   info_ptr->gamma = (float)png_gamma;  #ifdef PNG_FIXED_POINT_SUPPORTED -   info_ptr->int_gamma = (int)(gamma*100000.+.5); +   info_ptr->int_gamma = (int)(png_gamma*100000.+.5);  #endif     info_ptr->valid |= PNG_INFO_gAMA; -   if(gamma == 0.0) +   if (png_gamma == 0.0)        png_warning(png_ptr, "Setting gamma=0");  }  #endif @@ -180,35 +134,35 @@ void PNGAPI  png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point     int_gamma)  { -   png_fixed_point gamma; +   png_fixed_point png_gamma; -   png_debug1(1, "in %s storage function\n", "gAMA"); +   png_debug1(1, "in %s storage function", "gAMA");     if (png_ptr == NULL || info_ptr == NULL)        return; -   if (int_gamma > (png_fixed_point) PNG_UINT_31_MAX) +   if (int_gamma > (png_fixed_point)PNG_UINT_31_MAX)     { -     png_warning(png_ptr, "Limiting gamma to 21474.83"); -     gamma=PNG_UINT_31_MAX; +      png_warning(png_ptr, "Limiting gamma to 21474.83"); +      png_gamma=PNG_UINT_31_MAX;     }     else     { -     if (int_gamma < 0) -     { -       png_warning(png_ptr, "Setting negative gamma to zero"); -       gamma=0; -     } -     else -       gamma=int_gamma; +      if (int_gamma < 0) +      { +         png_warning(png_ptr, "Setting negative gamma to zero"); +         png_gamma = 0; +      } +      else +         png_gamma = int_gamma;     }  #ifdef PNG_FLOATING_POINT_SUPPORTED -   info_ptr->gamma = (float)(gamma/100000.); +   info_ptr->gamma = (float)(png_gamma/100000.);  #endif  #ifdef PNG_FIXED_POINT_SUPPORTED -   info_ptr->int_gamma = gamma; +   info_ptr->int_gamma = png_gamma;  #endif     info_ptr->valid |= PNG_INFO_gAMA; -   if(gamma == 0) +   if (png_gamma == 0)        png_warning(png_ptr, "Setting gamma=0");  }  #endif @@ -219,32 +173,33 @@ png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)  {     int i; -   png_debug1(1, "in %s storage function\n", "hIST"); +   png_debug1(1, "in %s storage function", "hIST");     if (png_ptr == NULL || info_ptr == NULL)        return;     if (info_ptr->num_palette == 0 || info_ptr->num_palette         > PNG_MAX_PALETTE_LENGTH)     { -       png_warning(png_ptr, -          "Invalid palette size, hIST allocation skipped."); -       return; +      png_warning(png_ptr, +         "Invalid palette size, hIST allocation skipped."); +      return;     }  #ifdef PNG_FREE_ME_SUPPORTED     png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0);  #endif -   /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in version -      1.2.1 */ +   /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in +    * version 1.2.1 +    */     png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr, -      (png_uint_32)(PNG_MAX_PALETTE_LENGTH * png_sizeof (png_uint_16))); +      (png_uint_32)(PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16)));     if (png_ptr->hist == NULL) -     { -       png_warning(png_ptr, "Insufficient memory for hIST chunk data."); -       return; -     } +   { +      png_warning(png_ptr, "Insufficient memory for hIST chunk data."); +      return; +   }     for (i = 0; i < info_ptr->num_palette; i++) -       png_ptr->hist[i] = hist[i]; +      png_ptr->hist[i] = hist[i];     info_ptr->hist = png_ptr->hist;     info_ptr->valid |= PNG_INFO_hIST; @@ -262,11 +217,11 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,     int color_type, int interlace_type, int compression_type,     int filter_type)  { -   png_debug1(1, "in %s storage function\n", "IHDR"); +   png_debug1(1, "in %s storage function", "IHDR");     if (png_ptr == NULL || info_ptr == NULL)        return; -   /* check for width and height valid values */ +   /* Check for width and height valid values */     if (width == 0 || height == 0)        png_error(png_ptr, "Image width or height is zero in IHDR");  #ifdef PNG_SET_USER_LIMITS_SUPPORTED @@ -286,13 +241,13 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,                   - 8)       /* extra max_pixel_depth pad */        png_warning(png_ptr, "Width is too large for libpng to process pixels"); -   /* check other values */ +   /* Check other values */     if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 &&        bit_depth != 8 && bit_depth != 16)        png_error(png_ptr, "Invalid bit depth in IHDR");     if (color_type < 0 || color_type == 1 || -      color_type == 5 || color_type > 6) +       color_type == 5 || color_type > 6)        png_error(png_ptr, "Invalid color type in IHDR");     if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) || @@ -317,21 +272,21 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,      * 4. The filter_method is 64 and      * 5. The color_type is RGB or RGBA      */ -   if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted) -      png_warning(png_ptr,"MNG features are not allowed in a PNG datastream"); -   if(filter_type != PNG_FILTER_TYPE_BASE) +   if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted) +      png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); +   if (filter_type != PNG_FILTER_TYPE_BASE)     { -     if(!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && -        (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && -        ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && -        (color_type == PNG_COLOR_TYPE_RGB || +     if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && +         (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && +         ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && +         (color_type == PNG_COLOR_TYPE_RGB ||           color_type == PNG_COLOR_TYPE_RGB_ALPHA)))          png_error(png_ptr, "Unknown filter method in IHDR"); -     if(png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) +     if (png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)          png_warning(png_ptr, "Invalid filter method in IHDR");     }  #else -   if(filter_type != PNG_FILTER_TYPE_BASE) +   if (filter_type != PNG_FILTER_TYPE_BASE)        png_error(png_ptr, "Unknown filter method in IHDR");  #endif @@ -352,7 +307,7 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,        info_ptr->channels++;     info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); -   /* check for potential overflow */ +   /* Check for potential overflow */     if (width > (PNG_UINT_32_MAX                   >> 3)      /* 8-byte RGBA pixels */                   - 64       /* bigrowbuf hack */ @@ -361,7 +316,7 @@ png_set_IHDR(png_structp png_ptr, png_infop info_ptr,                   - 8)       /* extra max_pixel_depth pad */        info_ptr->rowbytes = (png_size_t)0;     else -      info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth,width); +      info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);  }  #if defined(PNG_oFFs_SUPPORTED) @@ -369,7 +324,7 @@ void PNGAPI  png_set_oFFs(png_structp png_ptr, png_infop info_ptr,     png_int_32 offset_x, png_int_32 offset_y, int unit_type)  { -   png_debug1(1, "in %s storage function\n", "oFFs"); +   png_debug1(1, "in %s storage function", "oFFs");     if (png_ptr == NULL || info_ptr == NULL)        return; @@ -389,56 +344,59 @@ png_set_pCAL(png_structp png_ptr, png_infop info_ptr,     png_uint_32 length;     int i; -   png_debug1(1, "in %s storage function\n", "pCAL"); +   png_debug1(1, "in %s storage function", "pCAL");     if (png_ptr == NULL || info_ptr == NULL)        return;     length = png_strlen(purpose) + 1; -   png_debug1(3, "allocating purpose for info (%lu bytes)\n", length); +   png_debug1(3, "allocating purpose for info (%lu bytes)", +     (unsigned long)length);     info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length);     if (info_ptr->pcal_purpose == NULL) -     { +   {         png_warning(png_ptr, "Insufficient memory for pCAL purpose."); -       return; -     } +      return; +   }     png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length); -   png_debug(3, "storing X0, X1, type, and nparams in info\n"); +   png_debug(3, "storing X0, X1, type, and nparams in info");     info_ptr->pcal_X0 = X0;     info_ptr->pcal_X1 = X1;     info_ptr->pcal_type = (png_byte)type;     info_ptr->pcal_nparams = (png_byte)nparams;     length = png_strlen(units) + 1; -   png_debug1(3, "allocating units for info (%lu bytes)\n", length); +   png_debug1(3, "allocating units for info (%lu bytes)", +     (unsigned long)length);     info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length);     if (info_ptr->pcal_units == NULL) -     { +   {         png_warning(png_ptr, "Insufficient memory for pCAL units."); -       return; -     } +      return; +   }     png_memcpy(info_ptr->pcal_units, units, (png_size_t)length);     info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr,        (png_uint_32)((nparams + 1) * png_sizeof(png_charp)));     if (info_ptr->pcal_params == NULL) -     { +   {         png_warning(png_ptr, "Insufficient memory for pCAL params."); -       return; -     } +      return; +   } -   info_ptr->pcal_params[nparams] = NULL; +   png_memset(info_ptr->pcal_params, 0, (nparams + 1) * png_sizeof(png_charp));     for (i = 0; i < nparams; i++)     {        length = png_strlen(params[i]) + 1; -      png_debug2(3, "allocating parameter %d for info (%lu bytes)\n", i, length); +      png_debug2(3, "allocating parameter %d for info (%lu bytes)", i, +        (unsigned long)length);        info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length);        if (info_ptr->pcal_params[i] == NULL) -        { +      {            png_warning(png_ptr, "Insufficient memory for pCAL parameter.");            return; -        } +      }        png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length);     } @@ -455,7 +413,7 @@ void PNGAPI  png_set_sCAL(png_structp png_ptr, png_infop info_ptr,               int unit, double width, double height)  { -   png_debug1(1, "in %s storage function\n", "sCAL"); +   png_debug1(1, "in %s storage function", "sCAL");     if (png_ptr == NULL || info_ptr == NULL)        return; @@ -473,33 +431,37 @@ png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,  {     png_uint_32 length; -   png_debug1(1, "in %s storage function\n", "sCAL"); +   png_debug1(1, "in %s storage function", "sCAL");     if (png_ptr == NULL || info_ptr == NULL)        return;     info_ptr->scal_unit = (png_byte)unit;     length = png_strlen(swidth) + 1; -   png_debug1(3, "allocating unit for info (%d bytes)\n", length); +   png_debug1(3, "allocating unit for info (%u bytes)", +      (unsigned int)length);     info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, length);     if (info_ptr->scal_s_width == NULL)     {        png_warning(png_ptr,         "Memory allocation failed while processing sCAL."); +      return;     }     png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length);     length = png_strlen(sheight) + 1; -   png_debug1(3, "allocating unit for info (%d bytes)\n", length); +   png_debug1(3, "allocating unit for info (%u bytes)", +      (unsigned int)length);     info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, length);     if (info_ptr->scal_s_height == NULL)     {        png_free (png_ptr, info_ptr->scal_s_width); +      info_ptr->scal_s_width = NULL;        png_warning(png_ptr,         "Memory allocation failed while processing sCAL."); +      return;     }     png_memcpy(info_ptr->scal_s_height, sheight, (png_size_t)length); -     info_ptr->valid |= PNG_INFO_sCAL;  #ifdef PNG_FREE_ME_SUPPORTED     info_ptr->free_me |= PNG_FREE_SCAL; @@ -514,7 +476,7 @@ void PNGAPI  png_set_pHYs(png_structp png_ptr, png_infop info_ptr,     png_uint_32 res_x, png_uint_32 res_y, int unit_type)  { -   png_debug1(1, "in %s storage function\n", "pHYs"); +   png_debug1(1, "in %s storage function", "pHYs");     if (png_ptr == NULL || info_ptr == NULL)        return; @@ -530,20 +492,20 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr,     png_colorp palette, int num_palette)  { -   png_debug1(1, "in %s storage function\n", "PLTE"); +   png_debug1(1, "in %s storage function", "PLTE");     if (png_ptr == NULL || info_ptr == NULL)        return;     if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH) -     { -       if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) +   { +      if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)           png_error(png_ptr, "Invalid palette length"); -       else -       { +      else +      {           png_warning(png_ptr, "Invalid palette length");           return; -       } -     } +      } +   }     /*      * It may not actually be necessary to set png_ptr->palette here; @@ -555,13 +517,14 @@ png_set_PLTE(png_structp png_ptr, png_infop info_ptr,  #endif     /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead -      of num_palette entries, -      in case of an invalid PNG file that has too-large sample values. */ +    * of num_palette entries, in case of an invalid PNG file that has +    * too-large sample values. +    */     png_ptr->palette = (png_colorp)png_malloc(png_ptr,        PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color));     png_memset(png_ptr->palette, 0, PNG_MAX_PALETTE_LENGTH *        png_sizeof(png_color)); -   png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof (png_color)); +   png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color));     info_ptr->palette = png_ptr->palette;     info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; @@ -579,11 +542,11 @@ void PNGAPI  png_set_sBIT(png_structp png_ptr, png_infop info_ptr,     png_color_8p sig_bit)  { -   png_debug1(1, "in %s storage function\n", "sBIT"); +   png_debug1(1, "in %s storage function", "sBIT");     if (png_ptr == NULL || info_ptr == NULL)        return; -   png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof (png_color_8)); +   png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8));     info_ptr->valid |= PNG_INFO_sBIT;  }  #endif @@ -592,7 +555,7 @@ png_set_sBIT(png_structp png_ptr, png_infop info_ptr,  void PNGAPI  png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent)  { -   png_debug1(1, "in %s storage function\n", "sRGB"); +   png_debug1(1, "in %s storage function", "sRGB");     if (png_ptr == NULL || info_ptr == NULL)        return; @@ -616,12 +579,10 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,  #ifdef PNG_FLOATING_POINT_SUPPORTED     float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;  #endif -#ifdef PNG_FIXED_POINT_SUPPORTED     png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,        int_green_y, int_blue_x, int_blue_y;  #endif -#endif -   png_debug1(1, "in %s storage function\n", "sRGB_gAMA_and_cHRM"); +   png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM");     if (png_ptr == NULL || info_ptr == NULL)        return; @@ -639,7 +600,6 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,  #endif  #if defined(PNG_cHRM_SUPPORTED) -#ifdef PNG_FIXED_POINT_SUPPORTED     int_white_x = 31270L;     int_white_y = 32900L;     int_red_x   = 64000L; @@ -649,10 +609,6 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,     int_blue_x  = 15000L;     int_blue_y  =  6000L; -   png_set_cHRM_fixed(png_ptr, info_ptr, -      int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, int_green_y, -      int_blue_x, int_blue_y); -#endif  #ifdef PNG_FLOATING_POINT_SUPPORTED     white_x = (float).3127;     white_y = (float).3290; @@ -662,13 +618,27 @@ png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,     green_y = (float).60;     blue_x  = (float).15;     blue_y  = (float).06; +#endif -   png_set_cHRM(png_ptr, info_ptr, -      white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); +#if !defined(PNG_NO_CHECK_cHRM) +   if (png_check_cHRM_fixed(png_ptr, +       int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, +       int_green_y, int_blue_x, int_blue_y))  #endif +   { +#ifdef PNG_FIXED_POINT_SUPPORTED +      png_set_cHRM_fixed(png_ptr, info_ptr, +          int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, +          int_green_y, int_blue_x, int_blue_y);  #endif -} +#ifdef PNG_FLOATING_POINT_SUPPORTED +      png_set_cHRM(png_ptr, info_ptr, +          white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y);  #endif +   } +#endif /* cHRM */ +} +#endif /* sRGB */  #if defined(PNG_iCCP_SUPPORTED) @@ -679,24 +649,26 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr,  {     png_charp new_iccp_name;     png_charp new_iccp_profile; +   png_uint_32 length; -   png_debug1(1, "in %s storage function\n", "iCCP"); +   png_debug1(1, "in %s storage function", "iCCP");     if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)        return; -   new_iccp_name = (png_charp)png_malloc_warn(png_ptr, png_strlen(name)+1); +   length = png_strlen(name)+1; +   new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length);     if (new_iccp_name == NULL)     {        png_warning(png_ptr, "Insufficient memory to process iCCP chunk.");        return;     } -   png_strncpy(new_iccp_name, name, png_strlen(name)); -   new_iccp_name[png_strlen(name)] = '\0'; +   png_memcpy(new_iccp_name, name, length);     new_iccp_profile = (png_charp)png_malloc_warn(png_ptr, proflen);     if (new_iccp_profile == NULL)     {        png_free (png_ptr, new_iccp_name); -      png_warning(png_ptr, "Insufficient memory to process iCCP profile."); +      png_warning(png_ptr, +      "Insufficient memory to process iCCP profile.");        return;     }     png_memcpy(new_iccp_profile, profile, (png_size_t)proflen); @@ -719,21 +691,21 @@ png_set_iCCP(png_structp png_ptr, png_infop info_ptr,  #if defined(PNG_TEXT_SUPPORTED)  void PNGAPI  png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, -   int num_text) +             int num_text)  {     int ret; -   ret=png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); +   ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text);     if (ret) -     png_error(png_ptr, "Insufficient memory to store text"); +      png_error(png_ptr, "Insufficient memory to store text");  }  int /* PRIVATE */  png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, -   int num_text) +               int num_text)  {     int i; -   png_debug1(1, "in %s storage function\n", (png_ptr->chunk_name[0] == '\0' ? +   png_debug1(1, "in %s storage function", (png_ptr->chunk_name[0] == '\0' ?        "text" : (png_const_charp)png_ptr->chunk_name));     if (png_ptr == NULL || info_ptr == NULL || num_text == 0) @@ -753,12 +725,12 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,           info_ptr->max_text = info_ptr->num_text + num_text + 8;           old_text = info_ptr->text;           info_ptr->text = (png_textp)png_malloc_warn(png_ptr, -            (png_uint_32)(info_ptr->max_text * png_sizeof (png_text))); +            (png_uint_32)(info_ptr->max_text * png_sizeof(png_text)));           if (info_ptr->text == NULL) -           { -             png_free(png_ptr, old_text); -             return(1); -           } +         { +            png_free(png_ptr, old_text); +            return(1); +         }           png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max *              png_sizeof(png_text)));           png_free(png_ptr, old_text); @@ -768,20 +740,20 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,           info_ptr->max_text = num_text + 8;           info_ptr->num_text = 0;           info_ptr->text = (png_textp)png_malloc_warn(png_ptr, -            (png_uint_32)(info_ptr->max_text * png_sizeof (png_text))); +            (png_uint_32)(info_ptr->max_text * png_sizeof(png_text)));           if (info_ptr->text == NULL) -           return(1); +            return(1);  #ifdef PNG_FREE_ME_SUPPORTED           info_ptr->free_me |= PNG_FREE_TEXT;  #endif        } -      png_debug1(3, "allocated %d entries for info_ptr->text\n", +      png_debug1(3, "allocated %d entries for info_ptr->text",           info_ptr->max_text);     }     for (i = 0; i < num_text; i++)     { -      png_size_t text_length,key_len; -      png_size_t lang_len,lang_key_len; +      png_size_t text_length, key_len; +      png_size_t lang_len, lang_key_len;        png_textp textp = &(info_ptr->text[info_ptr->num_text]);        if (text_ptr[i].key == NULL) @@ -789,28 +761,28 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,        key_len = png_strlen(text_ptr[i].key); -      if(text_ptr[i].compression <= 0) +      if (text_ptr[i].compression <= 0)        { -        lang_len = 0; -        lang_key_len = 0; +         lang_len = 0; +         lang_key_len = 0;        }        else  #ifdef PNG_iTXt_SUPPORTED        { -        /* set iTXt data */ -        if (text_ptr[i].lang != NULL) -          lang_len = png_strlen(text_ptr[i].lang); -        else -          lang_len = 0; -        if (text_ptr[i].lang_key != NULL) -          lang_key_len = png_strlen(text_ptr[i].lang_key); -        else -          lang_key_len = 0; +         /* Set iTXt data */ +         if (text_ptr[i].lang != NULL) +            lang_len = png_strlen(text_ptr[i].lang); +         else +            lang_len = 0; +         if (text_ptr[i].lang_key != NULL) +            lang_key_len = png_strlen(text_ptr[i].lang_key); +         else +            lang_key_len = 0;        }  #else        { -        png_warning(png_ptr, "iTXt chunk not supported."); -        continue; +         png_warning(png_ptr, "iTXt chunk not supported."); +         continue;        }  #endif @@ -818,7 +790,7 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,        {           text_length = 0;  #ifdef PNG_iTXt_SUPPORTED -         if(text_ptr[i].compression > 0) +         if (text_ptr[i].compression > 0)              textp->compression = PNG_ITXT_COMPRESSION_NONE;           else  #endif @@ -831,26 +803,27 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,        }        textp->key = (png_charp)png_malloc_warn(png_ptr, -         (png_uint_32)(key_len + text_length + lang_len + lang_key_len + 4)); +         (png_uint_32) +         (key_len + text_length + lang_len + lang_key_len + 4));        if (textp->key == NULL) -        return(1); -      png_debug2(2, "Allocated %lu bytes at %x in png_set_text\n", -         (png_uint_32)(key_len + lang_len + lang_key_len + text_length + 4), -         (int)textp->key); - -      png_memcpy(textp->key, text_ptr[i].key, -         (png_size_t)(key_len)); -      *(textp->key+key_len) = '\0'; +         return(1); +      png_debug2(2, "Allocated %lu bytes at %x in png_set_text", +                 (png_uint_32) +                 (key_len + lang_len + lang_key_len + text_length + 4), +                 (int)textp->key); + +      png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len)); +      *(textp->key + key_len) = '\0';  #ifdef PNG_iTXt_SUPPORTED        if (text_ptr[i].compression > 0)        { -         textp->lang=textp->key + key_len + 1; +         textp->lang = textp->key + key_len + 1;           png_memcpy(textp->lang, text_ptr[i].lang, lang_len); -         *(textp->lang+lang_len) = '\0'; -         textp->lang_key=textp->lang + lang_len + 1; +         *(textp->lang + lang_len) = '\0'; +         textp->lang_key = textp->lang + lang_len + 1;           png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len); -         *(textp->lang_key+lang_key_len) = '\0'; -         textp->text=textp->lang_key + lang_key_len + 1; +         *(textp->lang_key + lang_key_len) = '\0'; +         textp->text = textp->lang_key + lang_key_len + 1;        }        else  #endif @@ -859,15 +832,15 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,           textp->lang=NULL;           textp->lang_key=NULL;  #endif -         textp->text=textp->key + key_len + 1; +         textp->text = textp->key + key_len + 1;        } -      if(text_length) +      if (text_length)           png_memcpy(textp->text, text_ptr[i].text,              (png_size_t)(text_length)); -      *(textp->text+text_length) = '\0'; +      *(textp->text + text_length) = '\0';  #ifdef PNG_iTXt_SUPPORTED -      if(textp->compression > 0) +      if (textp->compression > 0)        {           textp->text_length = 0;           textp->itxt_length = text_length; @@ -881,7 +854,7 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,  #endif        }        info_ptr->num_text++; -      png_debug1(3, "transferred text chunk %d\n", info_ptr->num_text); +      png_debug1(3, "transferred text chunk %d", info_ptr->num_text);     }     return(0);  } @@ -891,12 +864,12 @@ png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,  void PNGAPI  png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time)  { -   png_debug1(1, "in %s storage function\n", "tIME"); +   png_debug1(1, "in %s storage function", "tIME");     if (png_ptr == NULL || info_ptr == NULL ||         (png_ptr->mode & PNG_WROTE_tIME))        return; -   png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof (png_time)); +   png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time));     info_ptr->valid |= PNG_INFO_tIME;  }  #endif @@ -906,7 +879,7 @@ void PNGAPI  png_set_tRNS(png_structp png_ptr, png_infop info_ptr,     png_bytep trans, int num_trans, png_color_16p trans_values)  { -   png_debug1(1, "in %s storage function\n", "tRNS"); +   png_debug1(1, "in %s storage function", "tRNS");     if (png_ptr == NULL || info_ptr == NULL)        return; @@ -917,30 +890,45 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr,          * we do it for backward compatibility with the way the png_handle_tRNS          * function used to do the allocation.          */ +  #ifdef PNG_FREE_ME_SUPPORTED         png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);  #endif +         /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */         png_ptr->trans = info_ptr->trans = (png_bytep)png_malloc(png_ptr,             (png_uint_32)PNG_MAX_PALETTE_LENGTH); -       if (num_trans <= PNG_MAX_PALETTE_LENGTH) -         png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans); -#ifdef PNG_FREE_ME_SUPPORTED -       info_ptr->free_me |= PNG_FREE_TRNS; -#else -       png_ptr->flags |= PNG_FLAG_FREE_TRNS; -#endif +       if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) +          png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans);     }     if (trans_values != NULL)     { +      int sample_max = (1 << info_ptr->bit_depth); +      if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY && +          (int)trans_values->gray > sample_max) || +          (info_ptr->color_type == PNG_COLOR_TYPE_RGB && +          ((int)trans_values->red > sample_max || +          (int)trans_values->green > sample_max || +          (int)trans_values->blue > sample_max))) +         png_warning(png_ptr, +            "tRNS chunk has out-of-range samples for bit_depth");        png_memcpy(&(info_ptr->trans_values), trans_values,           png_sizeof(png_color_16));        if (num_trans == 0) -        num_trans = 1; +         num_trans = 1;     } +     info_ptr->num_trans = (png_uint_16)num_trans; -   info_ptr->valid |= PNG_INFO_tRNS; +   if (num_trans != 0) +   { +      info_ptr->valid |= PNG_INFO_tRNS; +#ifdef PNG_FREE_ME_SUPPORTED +      info_ptr->free_me |= PNG_FREE_TRNS; +#else +      png_ptr->flags |= PNG_FLAG_FREE_TRNS; +#endif +   }  }  #endif @@ -948,62 +936,70 @@ png_set_tRNS(png_structp png_ptr, png_infop info_ptr,  void PNGAPI  png_set_sPLT(png_structp png_ptr,               png_infop info_ptr, png_sPLT_tp entries, int nentries) +/* + *  entries        - array of png_sPLT_t structures + *                   to be added to the list of palettes + *                   in the info structure. + *  nentries       - number of palette structures to be + *                   added. + */  { -    png_sPLT_tp np; -    int i; +   png_sPLT_tp np; +   int i; -    if (png_ptr == NULL || info_ptr == NULL) -       return; +   if (png_ptr == NULL || info_ptr == NULL) +      return; -    np = (png_sPLT_tp)png_malloc_warn(png_ptr, -        (info_ptr->splt_palettes_num + nentries) * png_sizeof(png_sPLT_t)); -    if (np == NULL) -    { +   np = (png_sPLT_tp)png_malloc_warn(png_ptr, +       (info_ptr->splt_palettes_num + nentries) * +        (png_uint_32)png_sizeof(png_sPLT_t)); +   if (np == NULL) +   {        png_warning(png_ptr, "No memory for sPLT palettes."); -      return; -    } - -    png_memcpy(np, info_ptr->splt_palettes, -           info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t)); -    png_free(png_ptr, info_ptr->splt_palettes); -    info_ptr->splt_palettes=NULL; - -    for (i = 0; i < nentries; i++) -    { -        png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; -        png_sPLT_tp from = entries + i; - -        to->name = (png_charp)png_malloc_warn(png_ptr, -          png_strlen(from->name) + 1); -        if (to->name == NULL) -        { -           png_warning(png_ptr, -             "Out of memory while processing sPLT chunk"); -        } -        /* TODO: use png_malloc_warn */ -        png_strncpy(to->name, from->name, png_strlen(from->name)); -        to->name[png_strlen(from->name)] = '\0'; -        to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr, -            from->nentries * png_sizeof(png_sPLT_entry)); -        /* TODO: use png_malloc_warn */ -        png_memcpy(to->entries, from->entries, -            from->nentries * png_sizeof(png_sPLT_entry)); -        if (to->entries == NULL) -        { -           png_warning(png_ptr, -             "Out of memory while processing sPLT chunk"); -           png_free(png_ptr,to->name); -           to->name = NULL; -        } -        to->nentries = from->nentries; -        to->depth = from->depth; -    } - -    info_ptr->splt_palettes = np; -    info_ptr->splt_palettes_num += nentries; -    info_ptr->valid |= PNG_INFO_sPLT; +     return; +   } + +   png_memcpy(np, info_ptr->splt_palettes, +          info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t)); +   png_free(png_ptr, info_ptr->splt_palettes); +   info_ptr->splt_palettes=NULL; + +   for (i = 0; i < nentries; i++) +   { +      png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; +      png_sPLT_tp from = entries + i; +      png_uint_32 length; + +      length = png_strlen(from->name) + 1; +        to->name = (png_charp)png_malloc_warn(png_ptr, length); +      if (to->name == NULL) +      { +         png_warning(png_ptr, +           "Out of memory while processing sPLT chunk"); +         continue; +      } +      png_memcpy(to->name, from->name, length); +      to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr, +            (png_uint_32)(from->nentries * png_sizeof(png_sPLT_entry))); +      if (to->entries == NULL) +      { +         png_warning(png_ptr, +           "Out of memory while processing sPLT chunk"); +         png_free(png_ptr, to->name); +         to->name = NULL; +         continue; +      } +      png_memcpy(to->entries, from->entries, +          from->nentries * png_sizeof(png_sPLT_entry)); +      to->nentries = from->nentries; +      to->depth = from->depth; +   } + +   info_ptr->splt_palettes = np; +   info_ptr->splt_palettes_num += nentries; +   info_ptr->valid |= PNG_INFO_sPLT;  #ifdef PNG_FREE_ME_SUPPORTED -    info_ptr->free_me |= PNG_FREE_SPLT; +   info_ptr->free_me |= PNG_FREE_SPLT;  #endif  }  #endif /* PNG_sPLT_SUPPORTED */ @@ -1013,61 +1009,68 @@ void PNGAPI  png_set_unknown_chunks(png_structp png_ptr,     png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)  { -    png_unknown_chunkp np; -    int i; - -    if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0) -        return; - -    np = (png_unknown_chunkp)png_malloc_warn(png_ptr, -        (info_ptr->unknown_chunks_num + num_unknowns) * -        png_sizeof(png_unknown_chunk)); -    if (np == NULL) -    { -       png_warning(png_ptr, -          "Out of memory while processing unknown chunk."); +   png_unknown_chunkp np; +   int i; + +   if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0)         return; -    } - -    png_memcpy(np, info_ptr->unknown_chunks, -           info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk)); -    png_free(png_ptr, info_ptr->unknown_chunks); -    info_ptr->unknown_chunks=NULL; - -    for (i = 0; i < num_unknowns; i++) -    { -        png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; -        png_unknown_chunkp from = unknowns + i; - -        png_strncpy((png_charp)to->name, (png_charp)from->name, 4); -        to->name[4] = '\0'; -        to->data = (png_bytep)png_malloc_warn(png_ptr, from->size); -        if (to->data == NULL) -        { -           png_warning(png_ptr, -              "Out of memory while processing unknown chunk."); -        } -        else -        { -           png_memcpy(to->data, from->data, from->size); -           to->size = from->size; - -           /* note our location in the read or write sequence */ -           to->location = (png_byte)(png_ptr->mode & 0xff); -        } -    } - -    info_ptr->unknown_chunks = np; -    info_ptr->unknown_chunks_num += num_unknowns; + +   np = (png_unknown_chunkp)png_malloc_warn(png_ptr, +       (png_uint_32)((info_ptr->unknown_chunks_num + num_unknowns) * +       png_sizeof(png_unknown_chunk))); +   if (np == NULL) +   { +      png_warning(png_ptr, +         "Out of memory while processing unknown chunk."); +      return; +   } + +   png_memcpy(np, info_ptr->unknown_chunks, +          info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk)); +   png_free(png_ptr, info_ptr->unknown_chunks); +   info_ptr->unknown_chunks=NULL; + +   for (i = 0; i < num_unknowns; i++) +   { +      png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; +      png_unknown_chunkp from = unknowns + i; + +      png_memcpy((png_charp)to->name,  +                 (png_charp)from->name,  +                 png_sizeof(from->name)); +      to->name[png_sizeof(to->name)-1] = '\0'; +      to->size = from->size; +      /* Note our location in the read or write sequence */ +      to->location = (png_byte)(png_ptr->mode & 0xff); + +      if (from->size == 0) +         to->data=NULL; +      else +      { +         to->data = (png_bytep)png_malloc_warn(png_ptr, +           (png_uint_32)from->size); +         if (to->data == NULL) +         { +            png_warning(png_ptr, +             "Out of memory while processing unknown chunk."); +            to->size = 0; +         } +         else +            png_memcpy(to->data, from->data, from->size); +      } +   } + +   info_ptr->unknown_chunks = np; +   info_ptr->unknown_chunks_num += num_unknowns;  #ifdef PNG_FREE_ME_SUPPORTED -    info_ptr->free_me |= PNG_FREE_UNKN; +   info_ptr->free_me |= PNG_FREE_UNKN;  #endif  }  void PNGAPI  png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr,     int chunk, int location)  { -   if(png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk < +   if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk <           (int)info_ptr->unknown_chunks_num)        info_ptr->unknown_chunks[chunk].location = (png_byte)location;  } @@ -1081,7 +1084,7 @@ png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)  {     /* This function is deprecated in favor of png_permit_mng_features()        and will be removed from libpng-1.3.0 */ -   png_debug(1, "in png_permit_empty_plte, DEPRECATED.\n"); +   png_debug(1, "in png_permit_empty_plte, DEPRECATED.");     if (png_ptr == NULL)        return;     png_ptr->mng_features_permitted = (png_byte) @@ -1095,7 +1098,7 @@ png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)  png_uint_32 PNGAPI  png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features)  { -   png_debug(1, "in png_permit_mng_features\n"); +   png_debug(1, "in png_permit_mng_features");     if (png_ptr == NULL)        return (png_uint_32)0;     png_ptr->mng_features_permitted = @@ -1109,43 +1112,44 @@ void PNGAPI  png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep     chunk_list, int num_chunks)  { -    png_bytep new_list, p; -    int i, old_num_chunks; -    if (png_ptr == NULL) -       return; -    if (num_chunks == 0) -    { -      if(keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE) -        png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS; +   png_bytep new_list, p; +   int i, old_num_chunks; +   if (png_ptr == NULL) +      return; +   if (num_chunks == 0) +   { +      if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE) +         png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS;        else -        png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS; +         png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS; -      if(keep == PNG_HANDLE_CHUNK_ALWAYS) -        png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS; +      if (keep == PNG_HANDLE_CHUNK_ALWAYS) +         png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS;        else -        png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS; +         png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS;        return; -    } -    if (chunk_list == NULL) +   } +   if (chunk_list == NULL)        return; -    old_num_chunks=png_ptr->num_chunk_list; -    new_list=(png_bytep)png_malloc(png_ptr, -       (png_uint_32)(5*(num_chunks+old_num_chunks))); -    if(png_ptr->chunk_list != NULL) -    { -       png_memcpy(new_list, png_ptr->chunk_list, -          (png_size_t)(5*old_num_chunks)); -       png_free(png_ptr, png_ptr->chunk_list); -       png_ptr->chunk_list=NULL; -    } -    png_memcpy(new_list+5*old_num_chunks, chunk_list, -       (png_size_t)(5*num_chunks)); -    for (p=new_list+5*old_num_chunks+4, i=0; i<num_chunks; i++, p+=5) -       *p=(png_byte)keep; -    png_ptr->num_chunk_list=old_num_chunks+num_chunks; -    png_ptr->chunk_list=new_list; +   old_num_chunks = png_ptr->num_chunk_list; +   new_list=(png_bytep)png_malloc(png_ptr, +      (png_uint_32) +      (5*(num_chunks + old_num_chunks))); +   if (png_ptr->chunk_list != NULL) +   { +      png_memcpy(new_list, png_ptr->chunk_list, +         (png_size_t)(5*old_num_chunks)); +      png_free(png_ptr, png_ptr->chunk_list); +      png_ptr->chunk_list=NULL; +   } +   png_memcpy(new_list + 5*old_num_chunks, chunk_list, +      (png_size_t)(5*num_chunks)); +   for (p = new_list + 5*old_num_chunks + 4, i = 0; i<num_chunks; i++, p += 5) +      *p=(png_byte)keep; +   png_ptr->num_chunk_list = old_num_chunks + num_chunks; +   png_ptr->chunk_list = new_list;  #ifdef PNG_FREE_ME_SUPPORTED -    png_ptr->free_me |= PNG_FREE_LIST; +   png_ptr->free_me |= PNG_FREE_LIST;  #endif  }  #endif @@ -1155,7 +1159,7 @@ void PNGAPI  png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,     png_user_chunk_ptr read_user_chunk_fn)  { -   png_debug(1, "in png_set_read_user_chunk_fn\n"); +   png_debug(1, "in png_set_read_user_chunk_fn");     if (png_ptr == NULL)        return;     png_ptr->read_user_chunk_fn = read_user_chunk_fn; @@ -1167,27 +1171,27 @@ png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,  void PNGAPI  png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)  { -   png_debug1(1, "in %s storage function\n", "rows"); +   png_debug1(1, "in %s storage function", "rows");     if (png_ptr == NULL || info_ptr == NULL)        return; -   if(info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers)) +   if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))        png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);     info_ptr->row_pointers = row_pointers; -   if(row_pointers) +   if (row_pointers)        info_ptr->valid |= PNG_INFO_IDAT;  }  #endif  #ifdef PNG_WRITE_SUPPORTED  void PNGAPI -png_set_compression_buffer_size(png_structp png_ptr, png_uint_32 size) +png_set_compression_buffer_size(png_structp png_ptr, +    png_uint_32 size)  {      if (png_ptr == NULL)         return; -    if(png_ptr->zbuf) -       png_free(png_ptr, png_ptr->zbuf); +    png_free(png_ptr, png_ptr->zbuf);      png_ptr->zbuf_size = (png_size_t)size;      png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size);      png_ptr->zstream.next_out = png_ptr->zbuf; @@ -1205,16 +1209,17 @@ png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask)  #ifndef PNG_1_0_X  #ifdef PNG_ASSEMBLER_CODE_SUPPORTED -/* function was added to libpng 1.2.0 and should always exist by default */ +/* Function was added to libpng 1.2.0 and should always exist by default */  void PNGAPI  png_set_asm_flags (png_structp png_ptr, png_uint_32 asm_flags)  {  /* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */      if (png_ptr != NULL)      png_ptr->asm_flags = 0; +    asm_flags = asm_flags; /* Quiet the compiler */  } -/* this function was added to libpng 1.2.0 */ +/* This function was added to libpng 1.2.0 */  void PNGAPI  png_set_mmx_thresholds (png_structp png_ptr,                          png_byte mmx_bitdepth_threshold, @@ -1223,22 +1228,26 @@ png_set_mmx_thresholds (png_structp png_ptr,  /* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */      if (png_ptr == NULL)         return; +    /* Quiet the compiler */ +    mmx_bitdepth_threshold = mmx_bitdepth_threshold; +    mmx_rowbytes_threshold = mmx_rowbytes_threshold;  }  #endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */  #ifdef PNG_SET_USER_LIMITS_SUPPORTED -/* this function was added to libpng 1.2.6 */ +/* This function was added to libpng 1.2.6 */  void PNGAPI  png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max,      png_uint_32 user_height_max)  { -    /* Images with dimensions larger than these limits will be -     * rejected by png_set_IHDR().  To accept any PNG datastream -     * regardless of dimensions, set both limits to 0x7ffffffL. -     */ -    if(png_ptr == NULL) return; -    png_ptr->user_width_max = user_width_max; -    png_ptr->user_height_max = user_height_max; +   /* Images with dimensions larger than these limits will be +    * rejected by png_set_IHDR().  To accept any PNG datastream +    * regardless of dimensions, set both limits to 0x7ffffffL. +    */ +   if (png_ptr == NULL) +      return; +   png_ptr->user_width_max = user_width_max; +   png_ptr->user_height_max = user_height_max;  }  #endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ diff --git a/src/libpng/pngtrans.c b/src/libpng/pngtrans.c index 1640095..f221f54 100644 --- a/src/libpng/pngtrans.c +++ b/src/libpng/pngtrans.c @@ -1,47 +1,50 @@  /* pngtrans.c - transforms the data in a row (used by both readers and writers)   * - * Last changed in libpng 1.2.17 May 15, 2007 + * Last changed in libpng 1.2.36 [May 14, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   */  #define PNG_INTERNAL  #include "png.h" -  #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +  #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -/* turn on BGR-to-RGB mapping */ +/* Turn on BGR-to-RGB mapping */  void PNGAPI  png_set_bgr(png_structp png_ptr)  { -   png_debug(1, "in png_set_bgr\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_bgr"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= PNG_BGR;  }  #endif  #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -/* turn on 16 bit byte swapping */ +/* Turn on 16 bit byte swapping */  void PNGAPI  png_set_swap(png_structp png_ptr)  { -   png_debug(1, "in png_set_swap\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_swap"); +   if (png_ptr == NULL) +      return;     if (png_ptr->bit_depth == 16)        png_ptr->transformations |= PNG_SWAP_BYTES;  }  #endif  #if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) -/* turn on pixel packing */ +/* Turn on pixel packing */  void PNGAPI  png_set_packing(png_structp png_ptr)  { -   png_debug(1, "in png_set_packing\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_packing"); +   if (png_ptr == NULL) +      return;     if (png_ptr->bit_depth < 8)     {        png_ptr->transformations |= PNG_PACK; @@ -51,12 +54,13 @@ png_set_packing(png_structp png_ptr)  #endif  #if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) -/* turn on packed pixel swapping */ +/* Turn on packed pixel swapping */  void PNGAPI  png_set_packswap(png_structp png_ptr)  { -   png_debug(1, "in png_set_packswap\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_packswap"); +   if (png_ptr == NULL) +      return;     if (png_ptr->bit_depth < 8)        png_ptr->transformations |= PNG_PACKSWAP;  } @@ -66,8 +70,9 @@ png_set_packswap(png_structp png_ptr)  void PNGAPI  png_set_shift(png_structp png_ptr, png_color_8p true_bits)  { -   png_debug(1, "in png_set_shift\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_shift"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= PNG_SHIFT;     png_ptr->shift = *true_bits;  } @@ -78,7 +83,7 @@ png_set_shift(png_structp png_ptr, png_color_8p true_bits)  int PNGAPI  png_set_interlace_handling(png_structp png_ptr)  { -   png_debug(1, "in png_set_interlace handling\n"); +   png_debug(1, "in png_set_interlace handling");     if (png_ptr && png_ptr->interlaced)     {        png_ptr->transformations |= PNG_INTERLACE; @@ -98,8 +103,9 @@ png_set_interlace_handling(png_structp png_ptr)  void PNGAPI  png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)  { -   png_debug(1, "in png_set_filler\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_filler"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= PNG_FILLER;     png_ptr->filler = (png_byte)filler;     if (filler_loc == PNG_FILLER_AFTER) @@ -131,8 +137,9 @@ png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)  void PNGAPI  png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)  { -   png_debug(1, "in png_set_add_alpha\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_add_alpha"); +   if (png_ptr == NULL) +      return;     png_set_filler(png_ptr, filler, filler_loc);     png_ptr->transformations |= PNG_ADD_ALPHA;  } @@ -145,8 +152,9 @@ png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)  void PNGAPI  png_set_swap_alpha(png_structp png_ptr)  { -   png_debug(1, "in png_set_swap_alpha\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_swap_alpha"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= PNG_SWAP_ALPHA;  }  #endif @@ -156,8 +164,9 @@ png_set_swap_alpha(png_structp png_ptr)  void PNGAPI  png_set_invert_alpha(png_structp png_ptr)  { -   png_debug(1, "in png_set_invert_alpha\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_invert_alpha"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= PNG_INVERT_ALPHA;  }  #endif @@ -166,16 +175,17 @@ png_set_invert_alpha(png_structp png_ptr)  void PNGAPI  png_set_invert_mono(png_structp png_ptr)  { -   png_debug(1, "in png_set_invert_mono\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_invert_mono"); +   if (png_ptr == NULL) +      return;     png_ptr->transformations |= PNG_INVERT_MONO;  } -/* invert monochrome grayscale data */ +/* Invert monochrome grayscale data */  void /* PRIVATE */  png_do_invert(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_invert\n"); +   png_debug(1, "in png_do_invert");    /* This test removed from libpng version 1.0.13 and 1.2.0:     *   if (row_info->bit_depth == 1 &&     */ @@ -226,11 +236,11 @@ png_do_invert(png_row_infop row_info, png_bytep row)  #endif  #if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -/* swaps byte order on 16 bit depth images */ +/* Swaps byte order on 16 bit depth images */  void /* PRIVATE */  png_do_swap(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_swap\n"); +   png_debug(1, "in png_do_swap");     if (  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -357,11 +367,11 @@ static PNG_CONST png_byte fourbppswaptable[256] = {     0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF  }; -/* swaps pixel packing order within bytes */ +/* Swaps pixel packing order within bytes */  void /* PRIVATE */  png_do_packswap(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_packswap\n"); +   png_debug(1, "in png_do_packswap");     if (  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -389,11 +399,11 @@ png_do_packswap(png_row_infop row_info, png_bytep row)  #if defined(PNG_WRITE_FILLER_SUPPORTED) || \      defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -/* remove filler or alpha byte(s) */ +/* Remove filler or alpha byte(s) */  void /* PRIVATE */  png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)  { -   png_debug(1, "in png_do_strip_filler\n"); +   png_debug(1, "in png_do_strip_filler");  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL)  #endif @@ -404,9 +414,9 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)        png_uint_32 i;        if ((row_info->color_type == PNG_COLOR_TYPE_RGB || -         (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && -         (flags & PNG_FLAG_STRIP_ALPHA))) && -         row_info->channels == 4) +          (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && +          (flags & PNG_FLAG_STRIP_ALPHA))) && +          row_info->channels == 4)        {           if (row_info->bit_depth == 8)           { @@ -547,11 +557,11 @@ png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)  #endif  #if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -/* swaps red and blue bytes within a pixel */ +/* Swaps red and blue bytes within a pixel */  void /* PRIVATE */  png_do_bgr(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_bgr\n"); +   png_debug(1, "in png_do_bgr");     if (  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -630,14 +640,15 @@ void PNGAPI  png_set_user_transform_info(png_structp png_ptr, png_voidp     user_transform_ptr, int user_transform_depth, int user_transform_channels)  { -   png_debug(1, "in png_set_user_transform_info\n"); -   if(png_ptr == NULL) return; +   png_debug(1, "in png_set_user_transform_info"); +   if (png_ptr == NULL) +      return;  #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)     png_ptr->user_transform_ptr = user_transform_ptr;     png_ptr->user_transform_depth = (png_byte)user_transform_depth;     png_ptr->user_transform_channels = (png_byte)user_transform_channels;  #else -   if(user_transform_ptr || user_transform_depth || user_transform_channels) +   if (user_transform_ptr || user_transform_depth || user_transform_channels)        png_warning(png_ptr,          "This version of libpng does not support user transform info");  #endif @@ -652,8 +663,9 @@ png_set_user_transform_info(png_structp png_ptr, png_voidp  png_voidp PNGAPI  png_get_user_transform_ptr(png_structp png_ptr)  { +   if (png_ptr == NULL) +      return (NULL);  #if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) -   if (png_ptr == NULL) return (NULL);     return ((png_voidp)png_ptr->user_transform_ptr);  #else     return (NULL); diff --git a/src/libpng/pngwio.c b/src/libpng/pngwio.c index 371a4fa..740b71d 100644 --- a/src/libpng/pngwio.c +++ b/src/libpng/pngwio.c @@ -1,9 +1,9 @@  /* pngwio.c - functions for data output   * - * Last changed in libpng 1.2.13 November 13, 2006 + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2006 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   * @@ -20,10 +20,11 @@  #ifdef PNG_WRITE_SUPPORTED  /* Write the data to whatever output you are using.  The default routine -   writes to a file pointer.  Note that this routine sometimes gets called -   with very small lengths, so you should implement some kind of simple -   buffering if you are using unbuffered writes.  This should never be asked -   to write more than 64K on a 16 bit machine.  */ + * writes to a file pointer.  Note that this routine sometimes gets called + * with very small lengths, so you should implement some kind of simple + * buffering if you are using unbuffered writes.  This should never be asked + * to write more than 64K on a 16 bit machine. + */  void /* PRIVATE */  png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) @@ -36,16 +37,18 @@ png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)  #if !defined(PNG_NO_STDIO)  /* This is the function that does the actual writing of data.  If you are -   not writing to a standard C stream, you should create a replacement -   write_data function and use it at run time with png_set_write_fn(), rather -   than changing the library. */ + * not writing to a standard C stream, you should create a replacement + * write_data function and use it at run time with png_set_write_fn(), rather + * than changing the library. + */  #ifndef USE_FAR_KEYWORD  void PNGAPI  png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)  {     png_uint_32 check; -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;  #if defined(_WIN32_WCE)     if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )        check = 0; @@ -56,10 +59,10 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)        png_error(png_ptr, "Write Error");  }  #else -/* this is the model-independent version. Since the standard I/O library -   can't handle far buffers in the medium and small models, we have to copy -   the data. -*/ +/* This is the model-independent version. Since the standard I/O library + * can't handle far buffers in the medium and small models, we have to copy + * the data. + */  #define NEAR_BUF_SIZE 1024  #define MIN(a,b) (a <= b ? a : b) @@ -71,7 +74,8 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)     png_byte *near_data;  /* Needs to be "png_byte *" instead of "png_bytep" */     png_FILE_p io_ptr; -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;     /* Check if data really is near. If so, use usual code. */     near_data = (png_byte *)CVT_PTR_NOCHECK(data);     io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); @@ -93,7 +97,7 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)        do        {           written = MIN(NEAR_BUF_SIZE, remaining); -         png_memcpy(buf, data, written); /* copy far buffer to near buffer */ +         png_memcpy(buf, data, written); /* Copy far buffer to near buffer */  #if defined(_WIN32_WCE)           if ( !WriteFile(io_ptr, buf, written, &err, NULL) )              err = 0; @@ -102,8 +106,10 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)  #endif           if (err != written)              break; +           else              check += err; +           data += written;           remaining -= written;        } @@ -117,8 +123,9 @@ png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)  #endif  /* This function is called to output any data pending writing (normally -   to disk).  After png_flush is called, there should be no data pending -   writing in any buffers. */ + * to disk).  After png_flush is called, there should be no data pending + * writing in any buffers. + */  #if defined(PNG_WRITE_FLUSH_SUPPORTED)  void /* PRIVATE */  png_flush(png_structp png_ptr) @@ -134,48 +141,58 @@ png_default_flush(png_structp png_ptr)  #if !defined(_WIN32_WCE)     png_FILE_p io_ptr;  #endif -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;  #if !defined(_WIN32_WCE)     io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr)); -   if (io_ptr != NULL) -      fflush(io_ptr); +   fflush(io_ptr);  #endif  }  #endif  #endif  /* This function allows the application to supply new output functions for -   libpng if standard C streams aren't being used. - -   This function takes as its arguments: -   png_ptr       - pointer to a png output data structure -   io_ptr        - pointer to user supplied structure containing info about -                   the output functions.  May be NULL. -   write_data_fn - pointer to a new output function that takes as its -                   arguments a pointer to a png_struct, a pointer to -                   data to be written, and a 32-bit unsigned int that is -                   the number of bytes to be written.  The new write -                   function should call png_error(png_ptr, "Error msg") -                   to exit and output any fatal error messages. -   flush_data_fn - pointer to a new flush function that takes as its -                   arguments a pointer to a png_struct.  After a call to -                   the flush function, there should be no data in any buffers -                   or pending transmission.  If the output method doesn't do -                   any buffering of ouput, a function prototype must still be -                   supplied although it doesn't have to do anything.  If -                   PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile -                   time, output_flush_fn will be ignored, although it must be -                   supplied for compatibility. */ + * libpng if standard C streams aren't being used. + * + * This function takes as its arguments: + * png_ptr       - pointer to a png output data structure + * io_ptr        - pointer to user supplied structure containing info about + *                 the output functions.  May be NULL. + * write_data_fn - pointer to a new output function that takes as its + *                 arguments a pointer to a png_struct, a pointer to + *                 data to be written, and a 32-bit unsigned int that is + *                 the number of bytes to be written.  The new write + *                 function should call png_error(png_ptr, "Error msg") + *                 to exit and output any fatal error messages.  May be + *                 NULL, in which case libpng's default function will + *                 be used. + * flush_data_fn - pointer to a new flush function that takes as its + *                 arguments a pointer to a png_struct.  After a call to + *                 the flush function, there should be no data in any buffers + *                 or pending transmission.  If the output method doesn't do + *                 any buffering of ouput, a function prototype must still be + *                 supplied although it doesn't have to do anything.  If + *                 PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile + *                 time, output_flush_fn will be ignored, although it must be + *                 supplied for compatibility.  May be NULL, in which case + *                 libpng's default function will be used, if + *                 PNG_WRITE_FLUSH_SUPPORTED is defined.  This is not + *                 a good idea if io_ptr does not point to a standard + *                 *FILE structure. + */  void PNGAPI  png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,     png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)  { -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return; +     png_ptr->io_ptr = io_ptr;  #if !defined(PNG_NO_STDIO)     if (write_data_fn != NULL)        png_ptr->write_data_fn = write_data_fn; +     else        png_ptr->write_data_fn = png_default_write_data;  #else @@ -186,6 +203,7 @@ png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,  #if !defined(PNG_NO_STDIO)     if (output_flush_fn != NULL)        png_ptr->output_flush_fn = output_flush_fn; +     else        png_ptr->output_flush_fn = png_default_flush;  #else @@ -206,27 +224,31 @@ png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,  #if defined(USE_FAR_KEYWORD)  #if defined(_MSC_VER) -void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) +void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check)  {     void *near_ptr;     void FAR *far_ptr;     FP_OFF(near_ptr) = FP_OFF(ptr);     far_ptr = (void FAR *)near_ptr; -   if(check != 0) -      if(FP_SEG(ptr) != FP_SEG(far_ptr)) -         png_error(png_ptr,"segment lost in conversion"); + +   if (check != 0) +      if (FP_SEG(ptr) != FP_SEG(far_ptr)) +         png_error(png_ptr, "segment lost in conversion"); +     return(near_ptr);  }  #  else -void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check) +void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check)  {     void *near_ptr;     void FAR *far_ptr;     near_ptr = (void FAR *)ptr;     far_ptr = (void FAR *)near_ptr; -   if(check != 0) -      if(far_ptr != ptr) -         png_error(png_ptr,"segment lost in conversion"); + +   if (check != 0) +      if (far_ptr != ptr) +         png_error(png_ptr, "segment lost in conversion"); +     return(near_ptr);  }  #   endif diff --git a/src/libpng/pngwrite.c b/src/libpng/pngwrite.c index c6df1ef..bd6263c 100644 --- a/src/libpng/pngwrite.c +++ b/src/libpng/pngwrite.c @@ -1,14 +1,14 @@  /* pngwrite.c - general routines to write a PNG file   * - * Last changed in libpng 1.2.15 January 5, 2007 + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   */ -/* get internal access to png.h */ +/* Get internal access to png.h */  #define PNG_INTERNAL  #include "png.h"  #ifdef PNG_WRITE_SUPPORTED @@ -25,20 +25,20 @@  void PNGAPI  png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)  { -   png_debug(1, "in png_write_info_before_PLTE\n"); +   png_debug(1, "in png_write_info_before_PLTE");     if (png_ptr == NULL || info_ptr == NULL)        return;     if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))     { -   png_write_sig(png_ptr); /* write PNG signature */ +   png_write_sig(png_ptr); /* Write PNG signature */  #if defined(PNG_MNG_FEATURES_SUPPORTED) -   if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted)) +   if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted))     { -      png_warning(png_ptr,"MNG features are not allowed in a PNG datastream"); +      png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");        png_ptr->mng_features_permitted=0;     }  #endif -   /* write IHDR information. */ +   /* Write IHDR information. */     png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,        info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,        info_ptr->filter_type, @@ -47,8 +47,9 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)  #else        0);  #endif -   /* the rest of these check to see if the valid field has the appropriate -      flag set, and if it does, writes the chunk. */ +   /* The rest of these check to see if the valid field has the appropriate +    * flag set, and if it does, writes the chunk. +    */  #if defined(PNG_WRITE_gAMA_SUPPORTED)     if (info_ptr->valid & PNG_INFO_gAMA)     { @@ -97,14 +98,14 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)  #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)     if (info_ptr->unknown_chunks_num)     { -       png_unknown_chunk *up; +      png_unknown_chunk *up; -       png_debug(5, "writing extra chunks\n"); +      png_debug(5, "writing extra chunks"); -       for (up = info_ptr->unknown_chunks; -            up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; -            up++) -       { +      for (up = info_ptr->unknown_chunks; +           up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; +           up++) +      {           int keep=png_handle_as_unknown(png_ptr, up->name);           if (keep != PNG_HANDLE_CHUNK_NEVER &&              up->location && !(up->location & PNG_HAVE_PLTE) && @@ -112,9 +113,11 @@ png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)              ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS ||              (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))           { +            if (up->size == 0) +               png_warning(png_ptr, "Writing zero-length unknown chunk");              png_write_chunk(png_ptr, up->name, up->data, up->size);           } -       } +      }     }  #endif        png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; @@ -128,7 +131,7 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)     int i;  #endif -   png_debug(1, "in png_write_info\n"); +   png_debug(1, "in png_write_info");     if (png_ptr == NULL || info_ptr == NULL)        return; @@ -143,20 +146,20 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)  #if defined(PNG_WRITE_tRNS_SUPPORTED)     if (info_ptr->valid & PNG_INFO_tRNS) -      { +   {  #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -         /* invert the alpha channel (in tRNS) */ -         if ((png_ptr->transformations & PNG_INVERT_ALPHA) && -            info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) -         { -            int j; -            for (j=0; j<(int)info_ptr->num_trans; j++) -               info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]); -         } +      /* Invert the alpha channel (in tRNS) */ +      if ((png_ptr->transformations & PNG_INVERT_ALPHA) && +         info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) +      { +         int j; +         for (j=0; j<(int)info_ptr->num_trans; j++) +            info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]); +      }  #endif        png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values),           info_ptr->num_trans, info_ptr->color_type); -      } +   }  #endif  #if defined(PNG_WRITE_bKGD_SUPPORTED)     if (info_ptr->valid & PNG_INFO_bKGD) @@ -177,49 +180,56 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)           info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,           info_ptr->pcal_units, info_ptr->pcal_params);  #endif -#if defined(PNG_WRITE_sCAL_SUPPORTED) + +#if defined(PNG_sCAL_SUPPORTED)     if (info_ptr->valid & PNG_INFO_sCAL) +#if defined(PNG_WRITE_sCAL_SUPPORTED)  #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)        png_write_sCAL(png_ptr, (int)info_ptr->scal_unit,            info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); -#else +#else /* !FLOATING_POINT */  #ifdef PNG_FIXED_POINT_SUPPORTED        png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit,            info_ptr->scal_s_width, info_ptr->scal_s_height); -#else +#endif /* FIXED_POINT */ +#endif /* FLOATING_POINT */ +#else  /* !WRITE_sCAL */        png_warning(png_ptr,            "png_write_sCAL not supported; sCAL chunk not written."); -#endif -#endif -#endif +#endif /* WRITE_sCAL */ +#endif /* sCAL */ +  #if defined(PNG_WRITE_pHYs_SUPPORTED)     if (info_ptr->valid & PNG_INFO_pHYs)        png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,           info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); -#endif +#endif /* pHYs */ +  #if defined(PNG_WRITE_tIME_SUPPORTED)     if (info_ptr->valid & PNG_INFO_tIME)     {        png_write_tIME(png_ptr, &(info_ptr->mod_time));        png_ptr->mode |= PNG_WROTE_tIME;     } -#endif +#endif /* tIME */ +  #if defined(PNG_WRITE_sPLT_SUPPORTED)     if (info_ptr->valid & PNG_INFO_sPLT)       for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)         png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); -#endif +#endif /* sPLT */ +  #if defined(PNG_WRITE_TEXT_SUPPORTED)     /* Check to see if we need to write text chunks */     for (i = 0; i < info_ptr->num_text; i++)     { -      png_debug2(2, "Writing header text chunk %d, type %d\n", i, +      png_debug2(2, "Writing header text chunk %d, type %d", i,           info_ptr->text[i].compression); -      /* an internationalized chunk? */ +      /* An internationalized chunk? */        if (info_ptr->text[i].compression > 0)        {  #if defined(PNG_WRITE_iTXt_SUPPORTED) -          /* write international chunk */ +          /* Write international chunk */            png_write_iTXt(png_ptr,                           info_ptr->text[i].compression,                           info_ptr->text[i].key, @@ -236,7 +246,7 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)        else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt)        {  #if defined(PNG_WRITE_zTXt_SUPPORTED) -         /* write compressed chunk */ +         /* Write compressed chunk */           png_write_zTXt(png_ptr, info_ptr->text[i].key,              info_ptr->text[i].text, 0,              info_ptr->text[i].compression); @@ -249,24 +259,26 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)        else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)        {  #if defined(PNG_WRITE_tEXt_SUPPORTED) -         /* write uncompressed chunk */ +         /* Write uncompressed chunk */           png_write_tEXt(png_ptr, info_ptr->text[i].key,                           info_ptr->text[i].text,                           0); +         /* Mark this chunk as written */ +         info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;  #else +         /* Can't get here */           png_warning(png_ptr, "Unable to write uncompressed text");  #endif -         /* Mark this chunk as written */ -         info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;        }     } -#endif +#endif /* tEXt */ +  #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)     if (info_ptr->unknown_chunks_num)     {         png_unknown_chunk *up; -       png_debug(5, "writing extra chunks\n"); +       png_debug(5, "writing extra chunks");         for (up = info_ptr->unknown_chunks;              up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; @@ -294,35 +306,35 @@ png_write_info(png_structp png_ptr, png_infop info_ptr)  void PNGAPI  png_write_end(png_structp png_ptr, png_infop info_ptr)  { -   png_debug(1, "in png_write_end\n"); +   png_debug(1, "in png_write_end");     if (png_ptr == NULL)        return;     if (!(png_ptr->mode & PNG_HAVE_IDAT))        png_error(png_ptr, "No IDATs written into file"); -   /* see if user wants us to write information chunks */ +   /* See if user wants us to write information chunks */     if (info_ptr != NULL)     {  #if defined(PNG_WRITE_TEXT_SUPPORTED) -      int i; /* local index variable */ +      int i; /* Local index variable */  #endif  #if defined(PNG_WRITE_tIME_SUPPORTED) -      /* check to see if user has supplied a time chunk */ +      /* Check to see if user has supplied a time chunk */        if ((info_ptr->valid & PNG_INFO_tIME) &&           !(png_ptr->mode & PNG_WROTE_tIME))           png_write_tIME(png_ptr, &(info_ptr->mod_time));  #endif  #if defined(PNG_WRITE_TEXT_SUPPORTED) -      /* loop through comment chunks */ +      /* Loop through comment chunks */        for (i = 0; i < info_ptr->num_text; i++)        { -         png_debug2(2, "Writing trailer text chunk %d, type %d\n", i, +         png_debug2(2, "Writing trailer text chunk %d, type %d", i,              info_ptr->text[i].compression); -         /* an internationalized chunk? */ +         /* An internationalized chunk? */           if (info_ptr->text[i].compression > 0)           {  #if defined(PNG_WRITE_iTXt_SUPPORTED) -             /* write international chunk */ +             /* Write international chunk */               png_write_iTXt(png_ptr,                           info_ptr->text[i].compression,                           info_ptr->text[i].key, @@ -338,7 +350,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)           else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)           {  #if defined(PNG_WRITE_zTXt_SUPPORTED) -            /* write compressed chunk */ +            /* Write compressed chunk */              png_write_zTXt(png_ptr, info_ptr->text[i].key,                 info_ptr->text[i].text, 0,                 info_ptr->text[i].compression); @@ -351,7 +363,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)           else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)           {  #if defined(PNG_WRITE_tEXt_SUPPORTED) -            /* write uncompressed chunk */ +            /* Write uncompressed chunk */              png_write_tEXt(png_ptr, info_ptr->text[i].key,                 info_ptr->text[i].text, 0);  #else @@ -368,7 +380,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)     {         png_unknown_chunk *up; -       png_debug(5, "writing extra chunks\n"); +       png_debug(5, "writing extra chunks");         for (up = info_ptr->unknown_chunks;              up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; @@ -389,8 +401,20 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)     png_ptr->mode |= PNG_AFTER_IDAT; -   /* write end of PNG file */ +   /* Write end of PNG file */     png_write_IEND(png_ptr); +   /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03, +    * and restored again in libpng-1.2.30, may cause some applications that +    * do not set png_ptr->output_flush_fn to crash.  If your application +    * experiences a problem, please try building libpng with +    * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to +    * png-mng-implement at lists.sf.net .  This kludge will be removed +    * from libpng-1.4.0. +    */ +#if defined(PNG_WRITE_FLUSH_SUPPORTED) && \ +    defined(PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED) +   png_flush(png_ptr); +#endif  }  #if defined(PNG_WRITE_tIME_SUPPORTED) @@ -399,7 +423,7 @@ png_write_end(png_structp png_ptr, png_infop info_ptr)  void PNGAPI  png_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime)  { -   png_debug(1, "in png_convert_from_struct_tm\n"); +   png_debug(1, "in png_convert_from_struct_tm");     ptime->year = (png_uint_16)(1900 + ttime->tm_year);     ptime->month = (png_byte)(ttime->tm_mon + 1);     ptime->day = (png_byte)ttime->tm_mday; @@ -413,7 +437,7 @@ png_convert_from_time_t(png_timep ptime, time_t ttime)  {     struct tm *tbuf; -   png_debug(1, "in png_convert_from_time_t\n"); +   png_debug(1, "in png_convert_from_time_t");     tbuf = gmtime(&ttime);     png_convert_from_struct_tm(ptime, tbuf);  } @@ -437,14 +461,17 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,     png_malloc_ptr malloc_fn, png_free_ptr free_fn)  {  #endif /* PNG_USER_MEM_SUPPORTED */ -   png_structp png_ptr; +#ifdef PNG_SETJMP_SUPPORTED +    volatile +#endif +    png_structp png_ptr;  #ifdef PNG_SETJMP_SUPPORTED  #ifdef USE_FAR_KEYWORD     jmp_buf jmpbuf;  #endif  #endif     int i; -   png_debug(1, "in png_create_write_struct\n"); +   png_debug(1, "in png_create_write_struct");  #ifdef PNG_USER_MEM_SUPPORTED     png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,        (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); @@ -454,7 +481,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,     if (png_ptr == NULL)        return (NULL); -   /* added at libpng-1.2.6 */ +   /* Added at libpng-1.2.6 */  #ifdef PNG_SET_USER_LIMITS_SUPPORTED     png_ptr->user_width_max=PNG_USER_WIDTH_MAX;     png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; @@ -468,12 +495,12 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,  #endif     {        png_free(png_ptr, png_ptr->zbuf); -      png_ptr->zbuf=NULL; +       png_ptr->zbuf=NULL;        png_destroy_struct(png_ptr);        return (NULL);     }  #ifdef USE_FAR_KEYWORD -   png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); +   png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));  #endif  #endif @@ -482,12 +509,15 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,  #endif /* PNG_USER_MEM_SUPPORTED */     png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); -   i=0; -   do +   if (user_png_ver)     { -     if(user_png_ver[i] != png_libpng_ver[i]) -        png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; -   } while (png_libpng_ver[i++]); +     i=0; +     do +     { +       if (user_png_ver[i] != png_libpng_ver[i]) +          png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; +     } while (png_libpng_ver[i++]); +   }     if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)     { @@ -522,7 +552,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,       }     } -   /* initialize zbuf - compression buffer */ +   /* Initialize zbuf - compression buffer */     png_ptr->zbuf_size = PNG_ZBUF_SIZE;     png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,        (png_uint_32)png_ptr->zbuf_size); @@ -542,7 +572,7 @@ png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,  #ifdef USE_FAR_KEYWORD     if (setjmp(jmpbuf))        PNG_ABORT(); -   png_memcpy(png_ptr->jmpbuf,jmpbuf,png_sizeof(jmp_buf)); +   png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf));  #else     if (setjmp(png_ptr->jmpbuf))        PNG_ABORT(); @@ -567,9 +597,9 @@ png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver,     png_size_t png_struct_size, png_size_t png_info_size)  {     /* We only come here via pre-1.0.12-compiled applications */ -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) return;  #if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) -   if(png_sizeof(png_struct) > png_struct_size || +   if (png_sizeof(png_struct) > png_struct_size ||        png_sizeof(png_info) > png_info_size)     {        char msg[80]; @@ -587,7 +617,7 @@ png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver,        png_warning(png_ptr, msg);     }  #endif -   if(png_sizeof(png_struct) > png_struct_size) +   if (png_sizeof(png_struct) > png_struct_size)       {         png_ptr->error_fn=NULL;  #ifdef PNG_ERROR_NUMBERS_SUPPORTED @@ -596,7 +626,7 @@ png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver,         png_error(png_ptr,         "The png struct allocated by the application for writing is too small.");       } -   if(png_sizeof(png_info) > png_info_size) +   if (png_sizeof(png_info) > png_info_size)       {         png_ptr->error_fn=NULL;  #ifdef PNG_ERROR_NUMBERS_SUPPORTED @@ -616,7 +646,7 @@ png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,  {     png_structp png_ptr=*ptr_ptr;  #ifdef PNG_SETJMP_SUPPORTED -   jmp_buf tmp_jmp; /* to save current jump buffer */ +   jmp_buf tmp_jmp; /* To save current jump buffer */  #endif     int i = 0; @@ -633,17 +663,17 @@ png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,  #else         png_ptr->warning_fn=NULL;         png_warning(png_ptr, -     "Application uses deprecated png_write_init() and should be recompiled."); + "Application uses deprecated png_write_init() and should be recompiled.");         break;  #endif       }     } while (png_libpng_ver[i++]); -   png_debug(1, "in png_write_init_3\n"); +   png_debug(1, "in png_write_init_3");  #ifdef PNG_SETJMP_SUPPORTED -   /* save jump buffer and error functions */ -   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); +   /* Save jump buffer and error functions */ +   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));  #endif     if (png_sizeof(png_struct) > png_struct_size) @@ -653,24 +683,24 @@ png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,         *ptr_ptr = png_ptr;       } -   /* reset all variables to 0 */ -   png_memset(png_ptr, 0, png_sizeof (png_struct)); +   /* Reset all variables to 0 */ +   png_memset(png_ptr, 0, png_sizeof(png_struct)); -   /* added at libpng-1.2.6 */ +   /* Added at libpng-1.2.6 */  #ifdef PNG_SET_USER_LIMITS_SUPPORTED     png_ptr->user_width_max=PNG_USER_WIDTH_MAX;     png_ptr->user_height_max=PNG_USER_HEIGHT_MAX;  #endif  #ifdef PNG_SETJMP_SUPPORTED -   /* restore jump buffer */ -   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); +   /* Restore jump buffer */ +   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));  #endif     png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL,        png_flush_ptr_NULL); -   /* initialize zbuf - compression buffer */ +   /* Initialize zbuf - compression buffer */     png_ptr->zbuf_size = PNG_ZBUF_SIZE;     png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,        (png_uint_32)png_ptr->zbuf_size); @@ -690,15 +720,15 @@ void PNGAPI  png_write_rows(png_structp png_ptr, png_bytepp row,     png_uint_32 num_rows)  { -   png_uint_32 i; /* row counter */ -   png_bytepp rp; /* row pointer */ +   png_uint_32 i; /* Row counter */ +   png_bytepp rp; /* Row pointer */ -   png_debug(1, "in png_write_rows\n"); +   png_debug(1, "in png_write_rows");     if (png_ptr == NULL)        return; -   /* loop through the rows */ +   /* Loop through the rows */     for (i = 0, rp = row; i < num_rows; i++, rp++)     {        png_write_row(png_ptr, *rp); @@ -711,25 +741,26 @@ png_write_rows(png_structp png_ptr, png_bytepp row,  void PNGAPI  png_write_image(png_structp png_ptr, png_bytepp image)  { -   png_uint_32 i; /* row index */ -   int pass, num_pass; /* pass variables */ -   png_bytepp rp; /* points to current row */ +   png_uint_32 i; /* Row index */ +   int pass, num_pass; /* Pass variables */ +   png_bytepp rp; /* Points to current row */     if (png_ptr == NULL)        return; -   png_debug(1, "in png_write_image\n"); +   png_debug(1, "in png_write_image");  #if defined(PNG_WRITE_INTERLACING_SUPPORTED) -   /* intialize interlace handling.  If image is not interlaced, -      this will set pass to 1 */ +   /* Initialize interlace handling.  If image is not interlaced, +    * this will set pass to 1 +    */     num_pass = png_set_interlace_handling(png_ptr);  #else     num_pass = 1;  #endif -   /* loop through passes */ +   /* Loop through passes */     for (pass = 0; pass < num_pass; pass++)     { -      /* loop through image */ +      /* Loop through image */        for (i = 0, rp = image; i < png_ptr->height; i++, rp++)        {           png_write_row(png_ptr, *rp); @@ -737,58 +768,58 @@ png_write_image(png_structp png_ptr, png_bytepp image)     }  } -/* called by user to write a row of image data */ +/* Called by user to write a row of image data */  void PNGAPI  png_write_row(png_structp png_ptr, png_bytep row)  {     if (png_ptr == NULL)        return; -   png_debug2(1, "in png_write_row (row %ld, pass %d)\n", +   png_debug2(1, "in png_write_row (row %ld, pass %d)",        png_ptr->row_number, png_ptr->pass); -   /* initialize transformations and other stuff if first time */ +   /* Initialize transformations and other stuff if first time */     if (png_ptr->row_number == 0 && png_ptr->pass == 0)     { -   /* make sure we wrote the header info */ -   if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) -      png_error(png_ptr, -         "png_write_info was never called before png_write_row."); +      /* Make sure we wrote the header info */ +      if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) +         png_error(png_ptr, +            "png_write_info was never called before png_write_row."); -   /* check for transforms that have been set but were defined out */ +      /* Check for transforms that have been set but were defined out */  #if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) -   if (png_ptr->transformations & PNG_INVERT_MONO) -      png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined."); +      if (png_ptr->transformations & PNG_INVERT_MONO) +         png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined.");  #endif  #if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) -   if (png_ptr->transformations & PNG_FILLER) -      png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined."); +      if (png_ptr->transformations & PNG_FILLER) +         png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined.");  #endif  #if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTED) -   if (png_ptr->transformations & PNG_PACKSWAP) -      png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined."); +      if (png_ptr->transformations & PNG_PACKSWAP) +         png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined.");  #endif  #if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) -   if (png_ptr->transformations & PNG_PACK) -      png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined."); +      if (png_ptr->transformations & PNG_PACK) +         png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined.");  #endif  #if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) -   if (png_ptr->transformations & PNG_SHIFT) -      png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined."); +      if (png_ptr->transformations & PNG_SHIFT) +         png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined.");  #endif  #if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) -   if (png_ptr->transformations & PNG_BGR) -      png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined."); +      if (png_ptr->transformations & PNG_BGR) +         png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined.");  #endif  #if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) -   if (png_ptr->transformations & PNG_SWAP_BYTES) -      png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined."); +      if (png_ptr->transformations & PNG_SWAP_BYTES) +         png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined.");  #endif        png_write_start_row(png_ptr);     }  #if defined(PNG_WRITE_INTERLACING_SUPPORTED) -   /* if interlaced and not interested in row, return */ +   /* If interlaced and not interested in row, return */     if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))     {        switch (png_ptr->pass) @@ -846,7 +877,7 @@ png_write_row(png_structp png_ptr, png_bytep row)     }  #endif -   /* set up row info for transformations */ +   /* Set up row info for transformations */     png_ptr->row_info.color_type = png_ptr->color_type;     png_ptr->row_info.width = png_ptr->usr_width;     png_ptr->row_info.channels = png_ptr->usr_channels; @@ -857,25 +888,25 @@ png_write_row(png_structp png_ptr, png_bytep row)     png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,        png_ptr->row_info.width); -   png_debug1(3, "row_info->color_type = %d\n", png_ptr->row_info.color_type); -   png_debug1(3, "row_info->width = %lu\n", png_ptr->row_info.width); -   png_debug1(3, "row_info->channels = %d\n", png_ptr->row_info.channels); -   png_debug1(3, "row_info->bit_depth = %d\n", png_ptr->row_info.bit_depth); -   png_debug1(3, "row_info->pixel_depth = %d\n", png_ptr->row_info.pixel_depth); -   png_debug1(3, "row_info->rowbytes = %lu\n", png_ptr->row_info.rowbytes); +   png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type); +   png_debug1(3, "row_info->width = %lu", png_ptr->row_info.width); +   png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels); +   png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth); +   png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth); +   png_debug1(3, "row_info->rowbytes = %lu", png_ptr->row_info.rowbytes);     /* Copy user's row into buffer, leaving room for filter byte. */     png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row,        png_ptr->row_info.rowbytes);  #if defined(PNG_WRITE_INTERLACING_SUPPORTED) -   /* handle interlacing */ +   /* Handle interlacing */     if (png_ptr->interlaced && png_ptr->pass < 6 &&        (png_ptr->transformations & PNG_INTERLACE))     {        png_do_write_interlace(&(png_ptr->row_info),           png_ptr->row_buf + 1, png_ptr->pass); -      /* this should always get caught above, but still ... */ +      /* This should always get caught above, but still ... */        if (!(png_ptr->row_info.width))        {           png_write_finish_row(png_ptr); @@ -884,7 +915,7 @@ png_write_row(png_structp png_ptr, png_bytep row)     }  #endif -   /* handle other transformations */ +   /* Handle other transformations */     if (png_ptr->transformations)        png_do_write_transformations(png_ptr); @@ -898,7 +929,7 @@ png_write_row(png_structp png_ptr, png_bytep row)      * 4. The filter_method is 64 and      * 5. The color_type is RGB or RGBA      */ -   if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && +   if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&        (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))     {        /* Intrapixel differencing */ @@ -918,34 +949,34 @@ png_write_row(png_structp png_ptr, png_bytep row)  void PNGAPI  png_set_flush(png_structp png_ptr, int nrows)  { -   png_debug(1, "in png_set_flush\n"); +   png_debug(1, "in png_set_flush");     if (png_ptr == NULL)        return;     png_ptr->flush_dist = (nrows < 0 ? 0 : nrows);  } -/* flush the current output buffers now */ +/* Flush the current output buffers now */  void PNGAPI  png_write_flush(png_structp png_ptr)  {     int wrote_IDAT; -   png_debug(1, "in png_write_flush\n"); +   png_debug(1, "in png_write_flush");     if (png_ptr == NULL)        return;     /* We have already written out all of the data */     if (png_ptr->row_number >= png_ptr->num_rows) -     return; +      return;     do     {        int ret; -      /* compress the data */ +      /* Compress the data */        ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH);        wrote_IDAT = 0; -      /* check for compression errors */ +      /* Check for compression errors */        if (ret != Z_OK)        {           if (png_ptr->zstream.msg != NULL) @@ -956,7 +987,7 @@ png_write_flush(png_structp png_ptr)        if (!(png_ptr->zstream.avail_out))        { -         /* write the IDAT and reset the zlib output buffer */ +         /* Write the IDAT and reset the zlib output buffer */           png_write_IDAT(png_ptr, png_ptr->zbuf,                          png_ptr->zbuf_size);           png_ptr->zstream.next_out = png_ptr->zbuf; @@ -968,7 +999,7 @@ png_write_flush(png_structp png_ptr)     /* If there is any data left to be output, write it into a new IDAT */     if (png_ptr->zbuf_size != png_ptr->zstream.avail_out)     { -      /* write the IDAT and reset the zlib output buffer */ +      /* Write the IDAT and reset the zlib output buffer */        png_write_IDAT(png_ptr, png_ptr->zbuf,                       png_ptr->zbuf_size - png_ptr->zstream.avail_out);        png_ptr->zstream.next_out = png_ptr->zbuf; @@ -979,7 +1010,7 @@ png_write_flush(png_structp png_ptr)  }  #endif /* PNG_WRITE_FLUSH_SUPPORTED */ -/* free all memory used by the write */ +/* Free all memory used by the write */  void PNGAPI  png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)  { @@ -990,7 +1021,7 @@ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)     png_voidp mem_ptr = NULL;  #endif -   png_debug(1, "in png_destroy_write_struct\n"); +   png_debug(1, "in png_destroy_write_struct");     if (png_ptr_ptr != NULL)     {        png_ptr = *png_ptr_ptr; @@ -1000,21 +1031,32 @@ png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)  #endif     } +#ifdef PNG_USER_MEM_SUPPORTED +   if (png_ptr != NULL) +   { +      free_fn = png_ptr->free_fn; +      mem_ptr = png_ptr->mem_ptr; +   } +#endif +     if (info_ptr_ptr != NULL)        info_ptr = *info_ptr_ptr;     if (info_ptr != NULL)     { -      png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); +      if (png_ptr != NULL) +      { +        png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);  #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) -      if (png_ptr->num_chunk_list) -      { -         png_free(png_ptr, png_ptr->chunk_list); -         png_ptr->chunk_list=NULL; -         png_ptr->num_chunk_list=0; -      } +        if (png_ptr->num_chunk_list) +        { +           png_free(png_ptr, png_ptr->chunk_list); +           png_ptr->chunk_list=NULL; +           png_ptr->num_chunk_list = 0; +        }  #endif +      }  #ifdef PNG_USER_MEM_SUPPORTED        png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, @@ -1044,7 +1086,7 @@ void /* PRIVATE */  png_write_destroy(png_structp png_ptr)  {  #ifdef PNG_SETJMP_SUPPORTED -   jmp_buf tmp_jmp; /* save jump buffer */ +   jmp_buf tmp_jmp; /* Save jump buffer */  #endif     png_error_ptr error_fn;     png_error_ptr warning_fn; @@ -1053,18 +1095,20 @@ png_write_destroy(png_structp png_ptr)     png_free_ptr free_fn;  #endif -   png_debug(1, "in png_write_destroy\n"); -   /* free any memory zlib uses */ +   png_debug(1, "in png_write_destroy"); +   /* Free any memory zlib uses */     deflateEnd(&png_ptr->zstream); -   /* free our memory.  png_free checks NULL for us. */ +   /* Free our memory.  png_free checks NULL for us. */     png_free(png_ptr, png_ptr->zbuf);     png_free(png_ptr, png_ptr->row_buf); +#ifndef PNG_NO_WRITE_FILTER     png_free(png_ptr, png_ptr->prev_row);     png_free(png_ptr, png_ptr->sub_row);     png_free(png_ptr, png_ptr->up_row);     png_free(png_ptr, png_ptr->avg_row);     png_free(png_ptr, png_ptr->paeth_row); +#endif  #if defined(PNG_TIME_RFC1123_SUPPORTED)     png_free(png_ptr, png_ptr->time_buffer); @@ -1079,8 +1123,8 @@ png_write_destroy(png_structp png_ptr)  #endif  #ifdef PNG_SETJMP_SUPPORTED -   /* reset structure */ -   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof (jmp_buf)); +   /* Reset structure */ +   png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));  #endif     error_fn = png_ptr->error_fn; @@ -1090,7 +1134,7 @@ png_write_destroy(png_structp png_ptr)     free_fn = png_ptr->free_fn;  #endif -   png_memset(png_ptr, 0, png_sizeof (png_struct)); +   png_memset(png_ptr, 0, png_sizeof(png_struct));     png_ptr->error_fn = error_fn;     png_ptr->warning_fn = warning_fn; @@ -1100,7 +1144,7 @@ png_write_destroy(png_structp png_ptr)  #endif  #ifdef PNG_SETJMP_SUPPORTED -   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof (jmp_buf)); +   png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));  #endif  } @@ -1108,11 +1152,11 @@ png_write_destroy(png_structp png_ptr)  void PNGAPI  png_set_filter(png_structp png_ptr, int method, int filters)  { -   png_debug(1, "in png_set_filter\n"); +   png_debug(1, "in png_set_filter");     if (png_ptr == NULL)        return;  #if defined(PNG_MNG_FEATURES_SUPPORTED) -   if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && +   if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&        (method == PNG_INTRAPIXEL_DIFFERENCING))           method = PNG_FILTER_TYPE_BASE;  #endif @@ -1231,7 +1275,7 @@ png_set_filter_heuristics(png_structp png_ptr, int heuristic_method,  {     int i; -   png_debug(1, "in png_set_filter_heuristics\n"); +   png_debug(1, "in png_set_filter_heuristics");     if (png_ptr == NULL)        return;     if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST) @@ -1345,7 +1389,7 @@ png_set_filter_heuristics(png_structp png_ptr, int heuristic_method,  void PNGAPI  png_set_compression_level(png_structp png_ptr, int level)  { -   png_debug(1, "in png_set_compression_level\n"); +   png_debug(1, "in png_set_compression_level");     if (png_ptr == NULL)        return;     png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL; @@ -1355,7 +1399,7 @@ png_set_compression_level(png_structp png_ptr, int level)  void PNGAPI  png_set_compression_mem_level(png_structp png_ptr, int mem_level)  { -   png_debug(1, "in png_set_compression_mem_level\n"); +   png_debug(1, "in png_set_compression_mem_level");     if (png_ptr == NULL)        return;     png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL; @@ -1365,7 +1409,7 @@ png_set_compression_mem_level(png_structp png_ptr, int mem_level)  void PNGAPI  png_set_compression_strategy(png_structp png_ptr, int strategy)  { -   png_debug(1, "in png_set_compression_strategy\n"); +   png_debug(1, "in png_set_compression_strategy");     if (png_ptr == NULL)        return;     png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; @@ -1382,7 +1426,7 @@ png_set_compression_window_bits(png_structp png_ptr, int window_bits)     else if (window_bits < 8)        png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");  #ifndef WBITS_8_OK -   /* avoid libpng bug with 256-byte windows */ +   /* Avoid libpng bug with 256-byte windows */     if (window_bits == 8)       {         png_warning(png_ptr, "Compression window is being reset to 512"); @@ -1396,7 +1440,7 @@ png_set_compression_window_bits(png_structp png_ptr, int window_bits)  void PNGAPI  png_set_compression_method(png_structp png_ptr, int method)  { -   png_debug(1, "in png_set_compression_method\n"); +   png_debug(1, "in png_set_compression_method");     if (png_ptr == NULL)        return;     if (method != 8) @@ -1418,7 +1462,7 @@ void PNGAPI  png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr     write_user_transform_fn)  { -   png_debug(1, "in png_set_write_user_transform_fn\n"); +   png_debug(1, "in png_set_write_user_transform_fn");     if (png_ptr == NULL)        return;     png_ptr->transformations |= PNG_USER_TRANSFORM; @@ -1435,9 +1479,9 @@ png_write_png(png_structp png_ptr, png_infop info_ptr,     if (png_ptr == NULL || info_ptr == NULL)        return;  #if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -   /* invert the alpha channel from opacity to transparency */ +   /* Invert the alpha channel from opacity to transparency */     if (transforms & PNG_TRANSFORM_INVERT_ALPHA) -       png_set_invert_alpha(png_ptr); +      png_set_invert_alpha(png_ptr);  #endif     /* Write the file header information. */ @@ -1446,9 +1490,9 @@ png_write_png(png_structp png_ptr, png_infop info_ptr,     /* ------ these transformations don't touch the info structure ------- */  #if defined(PNG_WRITE_INVERT_SUPPORTED) -   /* invert monochrome pixels */ +   /* Invert monochrome pixels */     if (transforms & PNG_TRANSFORM_INVERT_MONO) -       png_set_invert_mono(png_ptr); +      png_set_invert_mono(png_ptr);  #endif  #if defined(PNG_WRITE_SHIFT_SUPPORTED) @@ -1457,57 +1501,57 @@ png_write_png(png_structp png_ptr, png_infop info_ptr,      */     if ((transforms & PNG_TRANSFORM_SHIFT)                 && (info_ptr->valid & PNG_INFO_sBIT)) -       png_set_shift(png_ptr, &info_ptr->sig_bit); +      png_set_shift(png_ptr, &info_ptr->sig_bit);  #endif  #if defined(PNG_WRITE_PACK_SUPPORTED) -   /* pack pixels into bytes */ +   /* Pack pixels into bytes */     if (transforms & PNG_TRANSFORM_PACKING)         png_set_packing(png_ptr);  #endif  #if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -   /* swap location of alpha bytes from ARGB to RGBA */ +   /* Swap location of alpha bytes from ARGB to RGBA */     if (transforms & PNG_TRANSFORM_SWAP_ALPHA) -       png_set_swap_alpha(png_ptr); +      png_set_swap_alpha(png_ptr);  #endif  #if defined(PNG_WRITE_FILLER_SUPPORTED) -   /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into -    * RGB (4 channels -> 3 channels). The second parameter is not used. -    */ -   if (transforms & PNG_TRANSFORM_STRIP_FILLER) -       png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); +   /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */ +   if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) +      png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); +   else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) +      png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);  #endif  #if defined(PNG_WRITE_BGR_SUPPORTED) -   /* flip BGR pixels to RGB */ +   /* Flip BGR pixels to RGB */     if (transforms & PNG_TRANSFORM_BGR) -       png_set_bgr(png_ptr); +      png_set_bgr(png_ptr);  #endif  #if defined(PNG_WRITE_SWAP_SUPPORTED) -   /* swap bytes of 16-bit files to most significant byte first */ +   /* Swap bytes of 16-bit files to most significant byte first */     if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) -       png_set_swap(png_ptr); +      png_set_swap(png_ptr);  #endif  #if defined(PNG_WRITE_PACKSWAP_SUPPORTED) -   /* swap bits of 1, 2, 4 bit packed pixel formats */ +   /* Swap bits of 1, 2, 4 bit packed pixel formats */     if (transforms & PNG_TRANSFORM_PACKSWAP) -       png_set_packswap(png_ptr); +      png_set_packswap(png_ptr);  #endif     /* ----------------------- end of transformations ------------------- */ -   /* write the bits */ +   /* Write the bits */     if (info_ptr->valid & PNG_INFO_IDAT)         png_write_image(png_ptr, info_ptr->row_pointers);     /* It is REQUIRED to call this to finish writing the rest of the file */     png_write_end(png_ptr, info_ptr); -   transforms = transforms; /* quiet compiler warnings */ +   transforms = transforms; /* Quiet compiler warnings */     params = params;  }  #endif diff --git a/src/libpng/pngwtran.c b/src/libpng/pngwtran.c index 0372fe6..ac56339 100644 --- a/src/libpng/pngwtran.c +++ b/src/libpng/pngwtran.c @@ -1,9 +1,9 @@  /* pngwtran.c - transforms the data in a row for PNG writers   * - * Last changed in libpng 1.2.9 April 14, 2006 + * Last changed in libpng 1.2.37 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2006 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   */ @@ -18,15 +18,15 @@  void /* PRIVATE */  png_do_write_transformations(png_structp png_ptr)  { -   png_debug(1, "in png_do_write_transformations\n"); +   png_debug(1, "in png_do_write_transformations");     if (png_ptr == NULL)        return;  #if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)     if (png_ptr->transformations & PNG_USER_TRANSFORM) -      if(png_ptr->write_user_transform_fn != NULL) -        (*(png_ptr->write_user_transform_fn)) /* user write transform function */ +      if (png_ptr->write_user_transform_fn != NULL) +        (*(png_ptr->write_user_transform_fn)) /* User write transform function */            (png_ptr,                    /* png_ptr */             &(png_ptr->row_info),       /* row_info:     */               /*  png_uint_32 width;          width of row */ @@ -86,7 +86,7 @@ png_do_write_transformations(png_structp png_ptr)  void /* PRIVATE */  png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)  { -   png_debug(1, "in png_do_pack\n"); +   png_debug(1, "in png_do_pack");     if (row_info->bit_depth == 8 &&  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -212,7 +212,7 @@ png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)  void /* PRIVATE */  png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)  { -   png_debug(1, "in png_do_shift\n"); +   png_debug(1, "in png_do_shift");  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL &&  #else @@ -248,7 +248,7 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)           channels++;        } -      /* with low row depths, could only be grayscale, so one channel */ +      /* With low row depths, could only be grayscale, so one channel */        if (row_info->bit_depth < 8)        {           png_bytep bp = row; @@ -336,7 +336,7 @@ png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)  void /* PRIVATE */  png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_write_swap_alpha\n"); +   png_debug(1, "in png_do_write_swap_alpha");  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL)  #endif @@ -424,7 +424,7 @@ png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)  void /* PRIVATE */  png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_write_invert_alpha\n"); +   png_debug(1, "in png_do_write_invert_alpha");  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL)  #endif @@ -439,7 +439,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)              png_uint_32 row_width = row_info->width;              for (i = 0, sp = dp = row; i < row_width; i++)              { -               /* does nothing +               /* Does nothing                 *(dp++) = *(sp++);                 *(dp++) = *(sp++);                 *(dp++) = *(sp++); @@ -457,7 +457,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)              for (i = 0, sp = dp = row; i < row_width; i++)              { -               /* does nothing +               /* Does nothing                 *(dp++) = *(sp++);                 *(dp++) = *(sp++);                 *(dp++) = *(sp++); @@ -495,7 +495,7 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)              for (i = 0, sp = dp = row; i < row_width; i++)              { -               /* does nothing +               /* Does nothing                 *(dp++) = *(sp++);                 *(dp++) = *(sp++);                 */ @@ -510,11 +510,11 @@ png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)  #endif  #if defined(PNG_MNG_FEATURES_SUPPORTED) -/* undoes intrapixel differencing  */ +/* Undoes intrapixel differencing  */  void /* PRIVATE */  png_do_write_intrapixel(png_row_infop row_info, png_bytep row)  { -   png_debug(1, "in png_do_write_intrapixel\n"); +   png_debug(1, "in png_do_write_intrapixel");     if (  #if defined(PNG_USELESS_TESTS_SUPPORTED)         row != NULL && row_info != NULL && @@ -558,8 +558,8 @@ png_do_write_intrapixel(png_row_infop row_info, png_bytep row)              png_uint_32 s0   = (*(rp  ) << 8) | *(rp+1);              png_uint_32 s1   = (*(rp+2) << 8) | *(rp+3);              png_uint_32 s2   = (*(rp+4) << 8) | *(rp+5); -            png_uint_32 red  = (png_uint_32)((s0-s1) & 0xffffL); -            png_uint_32 blue = (png_uint_32)((s2-s1) & 0xffffL); +            png_uint_32 red  = (png_uint_32)((s0 - s1) & 0xffffL); +            png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL);              *(rp  ) = (png_byte)((red >> 8) & 0xff);              *(rp+1) = (png_byte)(red & 0xff);              *(rp+4) = (png_byte)((blue >> 8) & 0xff); diff --git a/src/libpng/pngwutil.c b/src/libpng/pngwutil.c index fef38ae..22a83cc 100644 --- a/src/libpng/pngwutil.c +++ b/src/libpng/pngwutil.c @@ -1,9 +1,9 @@  /* pngwutil.c - utilities to write a PNG file   * - * Last changed in libpng 1.2.20 Septhember 3, 2007 + * Last changed in libpng 1.2.36 [June 4, 2009]   * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2007 Glenn Randers-Pehrson + * Copyright (c) 1998-2009 Glenn Randers-Pehrson   * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)   * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)   */ @@ -49,6 +49,24 @@ png_save_uint_16(png_bytep buf, unsigned int i)     buf[1] = (png_byte)(i & 0xff);  } +/* Simple function to write the signature.  If we have already written + * the magic bytes of the signature, or more likely, the PNG stream is + * being embedded into another stream and doesn't need its own signature, + * we should call png_set_sig_bytes() to tell libpng how many of the + * bytes have already been written. + */ +void /* PRIVATE */ +png_write_sig(png_structp png_ptr) +{ +   png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; + +   /* Write the rest of the 8 byte signature */ +   png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes], +      (png_size_t)(8 - png_ptr->sig_bytes)); +   if (png_ptr->sig_bytes < 3) +      png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; +} +  /* Write a PNG chunk all at once.  The type is an array of ASCII characters   * representing the chunk name.  The array must be at least 4 bytes in   * length, and does not need to be null terminated.  To be safe, pass the @@ -62,9 +80,10 @@ void PNGAPI  png_write_chunk(png_structp png_ptr, png_bytep chunk_name,     png_bytep data, png_size_t length)  { -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) +      return;     png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length); -   png_write_chunk_data(png_ptr, data, length); +   png_write_chunk_data(png_ptr, data, (png_size_t)length);     png_write_chunk_end(png_ptr);  } @@ -76,17 +95,20 @@ void PNGAPI  png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name,     png_uint_32 length)  { -   png_byte buf[4]; -   png_debug2(0, "Writing %s chunk (%lu bytes)\n", chunk_name, length); -   if(png_ptr == NULL) return; +   png_byte buf[8]; -   /* write the length */ -   png_save_uint_32(buf, length); -   png_write_data(png_ptr, buf, (png_size_t)4); +   png_debug2(0, "Writing %s chunk, length = %lu", chunk_name, +      (unsigned long)length); +   if (png_ptr == NULL) +      return; -   /* write the chunk name */ -   png_write_data(png_ptr, chunk_name, (png_size_t)4); -   /* reset the crc and run it over the chunk name */ +   /* Write the length and the chunk name */ +   png_save_uint_32(buf, length); +   png_memcpy(buf + 4, chunk_name, 4); +   png_write_data(png_ptr, buf, (png_size_t)8); +   /* Put the chunk name into png_ptr->chunk_name */ +   png_memcpy(png_ptr->chunk_name, chunk_name, 4); +   /* Reset the crc and run it over the chunk name */     png_reset_crc(png_ptr);     png_calculate_crc(png_ptr, chunk_name, (png_size_t)4);  } @@ -99,12 +121,16 @@ png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name,  void PNGAPI  png_write_chunk_data(png_structp png_ptr, png_bytep data, png_size_t length)  { -   /* write the data, and run the CRC over it */ -   if(png_ptr == NULL) return; +   /* Write the data, and run the CRC over it */ +   if (png_ptr == NULL) +      return;     if (data != NULL && length > 0)     { -      png_calculate_crc(png_ptr, data, length);        png_write_data(png_ptr, data, length); +      /* Update the CRC after writing the data, +       * in case that the user I/O routine alters it. +       */ +      png_calculate_crc(png_ptr, data, length);     }  } @@ -114,34 +140,16 @@ png_write_chunk_end(png_structp png_ptr)  {     png_byte buf[4]; -   if(png_ptr == NULL) return; +   if (png_ptr == NULL) return; -   /* write the crc */ +   /* Write the crc in a single operation */     png_save_uint_32(buf, png_ptr->crc);     png_write_data(png_ptr, buf, (png_size_t)4);  } -/* Simple function to write the signature.  If we have already written - * the magic bytes of the signature, or more likely, the PNG stream is - * being embedded into another stream and doesn't need its own signature, - * we should call png_set_sig_bytes() to tell libpng how many of the - * bytes have already been written. - */ -void /* PRIVATE */ -png_write_sig(png_structp png_ptr) -{ -   png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; -   /* write the rest of the 8 byte signature */ -   png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes], -      (png_size_t)8 - png_ptr->sig_bytes); -   if(png_ptr->sig_bytes < 3) -      png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; -} -  #if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_iCCP_SUPPORTED) -/* - * This pair of functions encapsulates the operation of (a) compressing a +/* This pair of functions encapsulates the operation of (a) compressing a   * text string, and (b) issuing it later as a series of chunk data writes.   * The compression_state structure is shared context for these functions   * set up by the caller in order to make the whole mess thread-safe. @@ -149,14 +157,14 @@ png_write_sig(png_structp png_ptr)  typedef struct  { -    char *input;   /* the uncompressed input data */ -    int input_len;   /* its length */ -    int num_output_ptr; /* number of output pointers used */ -    int max_output_ptr; /* size of output_ptr */ -    png_charpp output_ptr; /* array of pointers to output */ +   char *input;   /* The uncompressed input data */ +   int input_len;   /* Its length */ +   int num_output_ptr; /* Number of output pointers used */ +   int max_output_ptr; /* Size of output_ptr */ +   png_charpp output_ptr; /* Array of pointers to output */  } compression_state; -/* compress given text into storage in the png_ptr structure */ +/* Compress given text into storage in the png_ptr structure */  static int /* PRIVATE */  png_text_compress(png_structp png_ptr,          png_charp text, png_size_t text_len, int compression, @@ -170,7 +178,7 @@ png_text_compress(png_structp png_ptr,     comp->input = NULL;     comp->input_len = 0; -   /* we may just want to pass the text right through */ +   /* We may just want to pass the text right through */     if (compression == PNG_TEXT_COMPRESSION_NONE)     {         comp->input = text; @@ -204,29 +212,29 @@ png_text_compress(png_structp png_ptr,      * wouldn't cause a failure, just a slowdown due to swapping).      */ -   /* set up the compression buffers */ +   /* Set up the compression buffers */     png_ptr->zstream.avail_in = (uInt)text_len;     png_ptr->zstream.next_in = (Bytef *)text;     png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;     png_ptr->zstream.next_out = (Bytef *)png_ptr->zbuf; -   /* this is the same compression loop as in png_write_row() */ +   /* This is the same compression loop as in png_write_row() */     do     { -      /* compress the data */ +      /* Compress the data */        ret = deflate(&png_ptr->zstream, Z_NO_FLUSH);        if (ret != Z_OK)        { -         /* error */ +         /* Error */           if (png_ptr->zstream.msg != NULL)              png_error(png_ptr, png_ptr->zstream.msg);           else              png_error(png_ptr, "zlib error");        } -      /* check to see if we need more room */ +      /* Check to see if we need more room */        if (!(png_ptr->zstream.avail_out))        { -         /* make sure the output array has room */ +         /* Make sure the output array has room */           if (comp->num_output_ptr >= comp->max_output_ptr)           {              int old_max; @@ -239,20 +247,21 @@ png_text_compress(png_structp png_ptr,                 old_ptr = comp->output_ptr;                 comp->output_ptr = (png_charpp)png_malloc(png_ptr, -                  (png_uint_32)(comp->max_output_ptr * -                  png_sizeof (png_charpp))); +                  (png_uint_32) +                  (comp->max_output_ptr * png_sizeof(png_charpp)));                 png_memcpy(comp->output_ptr, old_ptr, old_max -                  * png_sizeof (png_charp)); +                  * png_sizeof(png_charp));                 png_free(png_ptr, old_ptr);              }              else                 comp->output_ptr = (png_charpp)png_malloc(png_ptr, -                  (png_uint_32)(comp->max_output_ptr * -                  png_sizeof (png_charp))); +                  (png_uint_32) +                  (comp->max_output_ptr * png_sizeof(png_charp)));           } -         /* save the data */ -         comp->output_ptr[comp->num_output_ptr] = (png_charp)png_malloc(png_ptr, +         /* Save the data */ +         comp->output_ptr[comp->num_output_ptr] = +            (png_charp)png_malloc(png_ptr,              (png_uint_32)png_ptr->zbuf_size);           png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf,              png_ptr->zbuf_size); @@ -262,21 +271,21 @@ png_text_compress(png_structp png_ptr,           png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;           png_ptr->zstream.next_out = png_ptr->zbuf;        } -   /* continue until we don't have any more to compress */ +   /* Continue until we don't have any more to compress */     } while (png_ptr->zstream.avail_in); -   /* finish the compression */ +   /* Finish the compression */     do     { -      /* tell zlib we are finished */ +      /* Tell zlib we are finished */        ret = deflate(&png_ptr->zstream, Z_FINISH);        if (ret == Z_OK)        { -         /* check to see if we need more room */ +         /* Check to see if we need more room */           if (!(png_ptr->zstream.avail_out))           { -            /* check to make sure our output array has room */ +            /* Check to make sure our output array has room */              if (comp->num_output_ptr >= comp->max_output_ptr)              {                 int old_max; @@ -291,20 +300,21 @@ png_text_compress(png_structp png_ptr,                    /* This could be optimized to realloc() */                    comp->output_ptr = (png_charpp)png_malloc(png_ptr,                       (png_uint_32)(comp->max_output_ptr * -                     png_sizeof (png_charpp))); +                     png_sizeof(png_charp)));                    png_memcpy(comp->output_ptr, old_ptr, -                     old_max * png_sizeof (png_charp)); +                     old_max * png_sizeof(png_charp));                    png_free(png_ptr, old_ptr);                 }                 else                    comp->output_ptr = (png_charpp)png_malloc(png_ptr,                       (png_uint_32)(comp->max_output_ptr * -                     png_sizeof (png_charp))); +                     png_sizeof(png_charp)));              } -            /* save off the data */ +            /* Save the data */              comp->output_ptr[comp->num_output_ptr] = -               (png_charp)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size); +               (png_charp)png_malloc(png_ptr, +               (png_uint_32)png_ptr->zbuf_size);              png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf,                 png_ptr->zbuf_size);              comp->num_output_ptr++; @@ -316,7 +326,7 @@ png_text_compress(png_structp png_ptr,        }        else if (ret != Z_STREAM_END)        { -         /* we got an error */ +         /* We got an error */           if (png_ptr->zstream.msg != NULL)              png_error(png_ptr, png_ptr->zstream.msg);           else @@ -324,7 +334,7 @@ png_text_compress(png_structp png_ptr,        }     } while (ret != Z_STREAM_END); -   /* text length is number of buffers plus last buffer */ +   /* Text length is number of buffers plus last buffer */     text_len = png_ptr->zbuf_size * comp->num_output_ptr;     if (png_ptr->zstream.avail_out < png_ptr->zbuf_size)        text_len += png_ptr->zbuf_size - (png_size_t)png_ptr->zstream.avail_out; @@ -332,37 +342,37 @@ png_text_compress(png_structp png_ptr,     return((int)text_len);  } -/* ship the compressed text out via chunk writes */ +/* Ship the compressed text out via chunk writes */  static void /* PRIVATE */  png_write_compressed_data_out(png_structp png_ptr, compression_state *comp)  {     int i; -   /* handle the no-compression case */ +   /* Handle the no-compression case */     if (comp->input)     { -       png_write_chunk_data(png_ptr, (png_bytep)comp->input, +      png_write_chunk_data(png_ptr, (png_bytep)comp->input,                              (png_size_t)comp->input_len); -       return; +      return;     } -   /* write saved output buffers, if any */ +   /* Write saved output buffers, if any */     for (i = 0; i < comp->num_output_ptr; i++)     { -      png_write_chunk_data(png_ptr,(png_bytep)comp->output_ptr[i], -         png_ptr->zbuf_size); +      png_write_chunk_data(png_ptr, (png_bytep)comp->output_ptr[i], +         (png_size_t)png_ptr->zbuf_size);        png_free(png_ptr, comp->output_ptr[i]); -      comp->output_ptr[i]=NULL; +       comp->output_ptr[i]=NULL;     }     if (comp->max_output_ptr != 0)        png_free(png_ptr, comp->output_ptr); -      comp->output_ptr=NULL; -   /* write anything left in zbuf */ +       comp->output_ptr=NULL; +   /* Write anything left in zbuf */     if (png_ptr->zstream.avail_out < (png_uint_32)png_ptr->zbuf_size)        png_write_chunk_data(png_ptr, png_ptr->zbuf, -         png_ptr->zbuf_size - png_ptr->zstream.avail_out); +         (png_size_t)(png_ptr->zbuf_size - png_ptr->zstream.avail_out)); -   /* reset zlib for another zTXt/iTXt or image data */ +   /* Reset zlib for another zTXt/iTXt or image data */     deflateReset(&png_ptr->zstream);     png_ptr->zstream.data_type = Z_BINARY;  } @@ -380,9 +390,11 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,  #ifdef PNG_USE_LOCAL_ARRAYS     PNG_IHDR;  #endif -   png_byte buf[13]; /* buffer to store the IHDR info */ +   int ret; + +   png_byte buf[13]; /* Buffer to store the IHDR info */ -   png_debug(1, "in png_write_IHDR\n"); +   png_debug(1, "in png_write_IHDR");     /* Check that we have valid input data from the application info */     switch (color_type)     { @@ -394,7 +406,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,              case 4:              case 8:              case 16: png_ptr->channels = 1; break; -            default: png_error(png_ptr,"Invalid bit depth for grayscale image"); +            default: png_error(png_ptr, "Invalid bit depth for grayscale image");           }           break;        case PNG_COLOR_TYPE_RGB: @@ -466,7 +478,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,     interlace_type=PNG_INTERLACE_NONE;  #endif -   /* save off the relevent information */ +   /* Save the relevent information */     png_ptr->bit_depth = (png_byte)bit_depth;     png_ptr->color_type = (png_byte)color_type;     png_ptr->interlaced = (png_byte)interlace_type; @@ -479,12 +491,12 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,     png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels);     png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width); -   /* set the usr info, so any transformations can modify it */ +   /* Set the usr info, so any transformations can modify it */     png_ptr->usr_width = png_ptr->width;     png_ptr->usr_bit_depth = png_ptr->bit_depth;     png_ptr->usr_channels = png_ptr->channels; -   /* pack the header information into the buffer */ +   /* Pack the header information into the buffer */     png_save_uint_32(buf, width);     png_save_uint_32(buf + 4, height);     buf[8] = (png_byte)bit_depth; @@ -493,10 +505,10 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,     buf[11] = (png_byte)filter_type;     buf[12] = (png_byte)interlace_type; -   /* write the chunk */ -   png_write_chunk(png_ptr, png_IHDR, buf, (png_size_t)13); +   /* Write the chunk */ +   png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13); -   /* initialize zlib with PNG info */ +   /* Initialize zlib with PNG info */     png_ptr->zstream.zalloc = png_zalloc;     png_ptr->zstream.zfree = png_zfree;     png_ptr->zstream.opaque = (voidpf)png_ptr; @@ -523,20 +535,29 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,        png_ptr->zlib_window_bits = 15;     if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD))        png_ptr->zlib_method = 8; -   if (deflateInit2(&png_ptr->zstream, png_ptr->zlib_level, -      png_ptr->zlib_method, png_ptr->zlib_window_bits, -      png_ptr->zlib_mem_level, png_ptr->zlib_strategy) != Z_OK) -       png_error(png_ptr, "zlib failed to initialize compressor"); +   ret = deflateInit2(&png_ptr->zstream, png_ptr->zlib_level, +         png_ptr->zlib_method, png_ptr->zlib_window_bits, +         png_ptr->zlib_mem_level, png_ptr->zlib_strategy); +   if (ret != Z_OK) +   { +      if (ret == Z_VERSION_ERROR) png_error(png_ptr, +          "zlib failed to initialize compressor -- version error"); +      if (ret == Z_STREAM_ERROR) png_error(png_ptr, +           "zlib failed to initialize compressor -- stream error"); +      if (ret == Z_MEM_ERROR) png_error(png_ptr, +           "zlib failed to initialize compressor -- mem error"); +      png_error(png_ptr, "zlib failed to initialize compressor"); +   }     png_ptr->zstream.next_out = png_ptr->zbuf;     png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;     /* libpng is not interested in zstream.data_type */ -   /* set it to a predefined value, to avoid its evaluation inside zlib */ +   /* Set it to a predefined value, to avoid its evaluation inside zlib */     png_ptr->zstream.data_type = Z_BINARY;     png_ptr->mode = PNG_HAVE_IHDR;  } -/* write the palette.  We are careful not to trust png_color to be in the +/* Write the palette.  We are careful not to trust png_color to be in the   * correct order for PNG, so people can redefine it to any convenient   * structure.   */ @@ -550,7 +571,7 @@ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)     png_colorp pal_ptr;     png_byte buf[3]; -   png_debug(1, "in png_write_PLTE\n"); +   png_debug(1, "in png_write_PLTE");     if ((  #if defined(PNG_MNG_FEATURES_SUPPORTED)          !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && @@ -576,9 +597,10 @@ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)     }     png_ptr->num_palette = (png_uint_16)num_pal; -   png_debug1(3, "num_palette = %d\n", png_ptr->num_palette); +   png_debug1(3, "num_palette = %d", png_ptr->num_palette); -   png_write_chunk_start(png_ptr, png_PLTE, num_pal * 3); +   png_write_chunk_start(png_ptr, (png_bytep)png_PLTE, +     (png_uint_32)(num_pal * 3));  #ifndef PNG_NO_POINTER_INDEXING     for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++)     { @@ -602,14 +624,14 @@ png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)     png_ptr->mode |= PNG_HAVE_PLTE;  } -/* write an IDAT chunk */ +/* Write an IDAT chunk */  void /* PRIVATE */  png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)  {  #ifdef PNG_USE_LOCAL_ARRAYS     PNG_IDAT;  #endif -   png_debug(1, "in png_write_IDAT\n"); +   png_debug(1, "in png_write_IDAT");     /* Optimize the CMF field in the zlib stream. */     /* This hack of the zlib stream is compliant to the stream specification. */ @@ -619,9 +641,11 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)        unsigned int z_cmf = data[0];  /* zlib compression method and flags */        if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70)        { -         /* Avoid memory underflows and multiplication overflows. */ -         /* The conditions below are practically always satisfied; -            however, they still must be checked. */ +         /* Avoid memory underflows and multiplication overflows. +          * +          * The conditions below are practically always satisfied; +          * however, they still must be checked. +          */           if (length >= 2 &&               png_ptr->height < 16384 && png_ptr->width < 16384)           { @@ -650,25 +674,25 @@ png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)              "Invalid zlib compression method or flags in IDAT");     } -   png_write_chunk(png_ptr, png_IDAT, data, length); +   png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length);     png_ptr->mode |= PNG_HAVE_IDAT;  } -/* write an IEND chunk */ +/* Write an IEND chunk */  void /* PRIVATE */  png_write_IEND(png_structp png_ptr)  {  #ifdef PNG_USE_LOCAL_ARRAYS     PNG_IEND;  #endif -   png_debug(1, "in png_write_IEND\n"); -   png_write_chunk(png_ptr, png_IEND, png_bytep_NULL, +   png_debug(1, "in png_write_IEND"); +   png_write_chunk(png_ptr, (png_bytep)png_IEND, png_bytep_NULL,       (png_size_t)0);     png_ptr->mode |= PNG_HAVE_IEND;  }  #if defined(PNG_WRITE_gAMA_SUPPORTED) -/* write a gAMA chunk */ +/* Write a gAMA chunk */  #ifdef PNG_FLOATING_POINT_SUPPORTED  void /* PRIVATE */  png_write_gAMA(png_structp png_ptr, double file_gamma) @@ -679,11 +703,11 @@ png_write_gAMA(png_structp png_ptr, double file_gamma)     png_uint_32 igamma;     png_byte buf[4]; -   png_debug(1, "in png_write_gAMA\n"); +   png_debug(1, "in png_write_gAMA");     /* file_gamma is saved in 1/100,000ths */     igamma = (png_uint_32)(file_gamma * 100000.0 + 0.5);     png_save_uint_32(buf, igamma); -   png_write_chunk(png_ptr, png_gAMA, buf, (png_size_t)4); +   png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4);  }  #endif  #ifdef PNG_FIXED_POINT_SUPPORTED @@ -695,16 +719,16 @@ png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma)  #endif     png_byte buf[4]; -   png_debug(1, "in png_write_gAMA\n"); +   png_debug(1, "in png_write_gAMA");     /* file_gamma is saved in 1/100,000ths */     png_save_uint_32(buf, (png_uint_32)file_gamma); -   png_write_chunk(png_ptr, png_gAMA, buf, (png_size_t)4); +   png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4);  }  #endif  #endif  #if defined(PNG_WRITE_sRGB_SUPPORTED) -/* write a sRGB chunk */ +/* Write a sRGB chunk */  void /* PRIVATE */  png_write_sRGB(png_structp png_ptr, int srgb_intent)  { @@ -713,17 +737,17 @@ png_write_sRGB(png_structp png_ptr, int srgb_intent)  #endif     png_byte buf[1]; -   png_debug(1, "in png_write_sRGB\n"); -   if(srgb_intent >= PNG_sRGB_INTENT_LAST) +   png_debug(1, "in png_write_sRGB"); +   if (srgb_intent >= PNG_sRGB_INTENT_LAST)           png_warning(png_ptr,              "Invalid sRGB rendering intent specified");     buf[0]=(png_byte)srgb_intent; -   png_write_chunk(png_ptr, png_sRGB, buf, (png_size_t)1); +   png_write_chunk(png_ptr, (png_bytep)png_sRGB, buf, (png_size_t)1);  }  #endif  #if defined(PNG_WRITE_iCCP_SUPPORTED) -/* write an iCCP chunk */ +/* Write an iCCP chunk */  void /* PRIVATE */  png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,     png_charp profile, int profile_len) @@ -736,7 +760,7 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,     compression_state comp;     int embedded_profile_len = 0; -   png_debug(1, "in png_write_iCCP\n"); +   png_debug(1, "in png_write_iCCP");     comp.num_output_ptr = 0;     comp.max_output_ptr = 0; @@ -744,12 +768,9 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,     comp.input = NULL;     comp.input_len = 0; -   if (name == NULL || (name_len = png_check_keyword(png_ptr, name, +   if ((name_len = png_check_keyword(png_ptr, name,        &new_name)) == 0) -   { -      png_warning(png_ptr, "Empty keyword in iCCP chunk");        return; -   }     if (compression_type != PNG_COMPRESSION_TYPE_BASE)        png_warning(png_ptr, "Unknown compression type in iCCP chunk"); @@ -759,34 +780,36 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,     if (profile_len > 3)        embedded_profile_len = -          ((*( (png_bytep)profile  ))<<24) | -          ((*( (png_bytep)profile+1))<<16) | -          ((*( (png_bytep)profile+2))<< 8) | -          ((*( (png_bytep)profile+3))    ); +          ((*( (png_bytep)profile    ))<<24) | +          ((*( (png_bytep)profile + 1))<<16) | +          ((*( (png_bytep)profile + 2))<< 8) | +          ((*( (png_bytep)profile + 3))    );     if (profile_len < embedded_profile_len) -     { -        png_warning(png_ptr, -          "Embedded profile length too large in iCCP chunk"); -        return; -     } +   { +      png_warning(png_ptr, +        "Embedded profile length too large in iCCP chunk"); +      png_free(png_ptr, new_name); +      return; +   }     if (profile_len > embedded_profile_len) -     { -        png_warning(png_ptr, -          "Truncating profile to actual length in iCCP chunk"); -        profile_len = embedded_profile_len; -     } +   { +      png_warning(png_ptr, +        "Truncating profile to actual length in iCCP chunk"); +      profile_len = embedded_profile_len; +   }     if (profile_len) -       profile_len = png_text_compress(png_ptr, profile, (png_size_t)profile_len, -          PNG_COMPRESSION_TYPE_BASE, &comp); +      profile_len = png_text_compress(png_ptr, profile, +        (png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp); -   /* make sure we include the NULL after the name and the compression type */ -   png_write_chunk_start(png_ptr, png_iCCP, -          (png_uint_32)name_len+profile_len+2); -   new_name[name_len+1]=0x00; -   png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 2); +   /* Make sure we include the NULL after the name and the compression type */ +   png_write_chunk_start(png_ptr, (png_bytep)png_iCCP, +          (png_uint_32)(name_len + profile_len + 2)); +   new_name[name_len + 1] = 0x00; +   png_write_chunk_data(png_ptr, (png_bytep)new_name, +     (png_size_t)(name_len + 2));     if (profile_len)        png_write_compressed_data_out(png_ptr, &comp); @@ -797,7 +820,7 @@ png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,  #endif  #if defined(PNG_WRITE_sPLT_SUPPORTED) -/* write a sPLT chunk */ +/* Write a sPLT chunk */  void /* PRIVATE */  png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette)  { @@ -814,63 +837,60 @@ png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette)     int i;  #endif -   png_debug(1, "in png_write_sPLT\n"); -   if (spalette->name == NULL || (name_len = png_check_keyword(png_ptr, -      spalette->name, &new_name))==0) -   { -      png_warning(png_ptr, "Empty keyword in sPLT chunk"); +   png_debug(1, "in png_write_sPLT"); +   if ((name_len = png_check_keyword(png_ptr,spalette->name, &new_name))==0)        return; -   } -   /* make sure we include the NULL after the name */ -   png_write_chunk_start(png_ptr, png_sPLT, -          (png_uint_32)(name_len + 2 + palette_size)); -   png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 1); -   png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, 1); +   /* Make sure we include the NULL after the name */ +   png_write_chunk_start(png_ptr, (png_bytep)png_sPLT, +     (png_uint_32)(name_len + 2 + palette_size)); +   png_write_chunk_data(png_ptr, (png_bytep)new_name, +     (png_size_t)(name_len + 1)); +   png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, (png_size_t)1); -   /* loop through each palette entry, writing appropriately */ +   /* Loop through each palette entry, writing appropriately */  #ifndef PNG_NO_POINTER_INDEXING -   for (ep = spalette->entries; ep<spalette->entries+spalette->nentries; ep++) -   { -       if (spalette->depth == 8) -       { -           entrybuf[0] = (png_byte)ep->red; -           entrybuf[1] = (png_byte)ep->green; -           entrybuf[2] = (png_byte)ep->blue; -           entrybuf[3] = (png_byte)ep->alpha; -           png_save_uint_16(entrybuf + 4, ep->frequency); -       } -       else -       { -           png_save_uint_16(entrybuf + 0, ep->red); -           png_save_uint_16(entrybuf + 2, ep->green); -           png_save_uint_16(entrybuf + 4, ep->blue); -           png_save_uint_16(entrybuf + 6, ep->alpha); -           png_save_uint_16(entrybuf + 8, ep->frequency); -       } -       png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size); +   for (ep = spalette->entries; ep<spalette->entries + spalette->nentries; ep++) +   { +      if (spalette->depth == 8) +      { +          entrybuf[0] = (png_byte)ep->red; +          entrybuf[1] = (png_byte)ep->green; +          entrybuf[2] = (png_byte)ep->blue; +          entrybuf[3] = (png_byte)ep->alpha; +          png_save_uint_16(entrybuf + 4, ep->frequency); +      } +      else +      { +          png_save_uint_16(entrybuf + 0, ep->red); +          png_save_uint_16(entrybuf + 2, ep->green); +          png_save_uint_16(entrybuf + 4, ep->blue); +          png_save_uint_16(entrybuf + 6, ep->alpha); +          png_save_uint_16(entrybuf + 8, ep->frequency); +      } +      png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size);     }  #else     ep=spalette->entries;     for (i=0; i>spalette->nentries; i++)     { -       if (spalette->depth == 8) -       { -           entrybuf[0] = (png_byte)ep[i].red; -           entrybuf[1] = (png_byte)ep[i].green; -           entrybuf[2] = (png_byte)ep[i].blue; -           entrybuf[3] = (png_byte)ep[i].alpha; -           png_save_uint_16(entrybuf + 4, ep[i].frequency); -       } -       else -       { -           png_save_uint_16(entrybuf + 0, ep[i].red); -           png_save_uint_16(entrybuf + 2, ep[i].green); -           png_save_uint_16(entrybuf + 4, ep[i].blue); -           png_save_uint_16(entrybuf + 6, ep[i].alpha); -           png_save_uint_16(entrybuf + 8, ep[i].frequency); -       } -       png_write_chunk_data(png_ptr, entrybuf, entry_size); +      if (spalette->depth == 8) +      { +          entrybuf[0] = (png_byte)ep[i].red; +          entrybuf[1] = (png_byte)ep[i].green; +          entrybuf[2] = (png_byte)ep[i].blue; +          entrybuf[3] = (png_byte)ep[i].alpha; +          png_save_uint_16(entrybuf + 4, ep[i].frequency); +      } +      else +      { +          png_save_uint_16(entrybuf + 0, ep[i].red); +          png_save_uint_16(entrybuf + 2, ep[i].green); +          png_save_uint_16(entrybuf + 4, ep[i].blue); +          png_save_uint_16(entrybuf + 6, ep[i].alpha); +          png_save_uint_16(entrybuf + 8, ep[i].frequency); +      } +      png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size);     }  #endif @@ -880,7 +900,7 @@ png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette)  #endif  #if defined(PNG_WRITE_sBIT_SUPPORTED) -/* write the sBIT chunk */ +/* Write the sBIT chunk */  void /* PRIVATE */  png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type)  { @@ -890,8 +910,8 @@ png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type)     png_byte buf[4];     png_size_t size; -   png_debug(1, "in png_write_sBIT\n"); -   /* make sure we don't depend upon the order of PNG_COLOR_8 */ +   png_debug(1, "in png_write_sBIT"); +   /* Make sure we don't depend upon the order of PNG_COLOR_8 */     if (color_type & PNG_COLOR_MASK_COLOR)     {        png_byte maxbits; @@ -931,12 +951,12 @@ png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type)        buf[size++] = sbit->alpha;     } -   png_write_chunk(png_ptr, png_sBIT, buf, size); +   png_write_chunk(png_ptr, (png_bytep)png_sBIT, buf, size);  }  #endif  #if defined(PNG_WRITE_cHRM_SUPPORTED) -/* write the cHRM chunk */ +/* Write the cHRM chunk */  #ifdef PNG_FLOATING_POINT_SUPPORTED  void /* PRIVATE */  png_write_cHRM(png_structp png_ptr, double white_x, double white_y, @@ -947,55 +967,42 @@ png_write_cHRM(png_structp png_ptr, double white_x, double white_y,     PNG_cHRM;  #endif     png_byte buf[32]; -   png_uint_32 itemp; -   png_debug(1, "in png_write_cHRM\n"); -   /* each value is saved in 1/100,000ths */ -   if (white_x < 0 || white_x > 0.8 || white_y < 0 || white_y > 0.8 || -       white_x + white_y > 1.0) -   { -      png_warning(png_ptr, "Invalid cHRM white point specified"); -#if !defined(PNG_NO_CONSOLE_IO) -      fprintf(stderr,"white_x=%f, white_y=%f\n",white_x, white_y); -#endif -      return; -   } -   itemp = (png_uint_32)(white_x * 100000.0 + 0.5); -   png_save_uint_32(buf, itemp); -   itemp = (png_uint_32)(white_y * 100000.0 + 0.5); -   png_save_uint_32(buf + 4, itemp); +   png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, +      int_green_x, int_green_y, int_blue_x, int_blue_y; -   if (red_x < 0 ||  red_y < 0 || red_x + red_y > 1.0) -   { -      png_warning(png_ptr, "Invalid cHRM red point specified"); -      return; -   } -   itemp = (png_uint_32)(red_x * 100000.0 + 0.5); -   png_save_uint_32(buf + 8, itemp); -   itemp = (png_uint_32)(red_y * 100000.0 + 0.5); -   png_save_uint_32(buf + 12, itemp); +   png_debug(1, "in png_write_cHRM"); -   if (green_x < 0 || green_y < 0 || green_x + green_y > 1.0) -   { -      png_warning(png_ptr, "Invalid cHRM green point specified"); -      return; -   } -   itemp = (png_uint_32)(green_x * 100000.0 + 0.5); -   png_save_uint_32(buf + 16, itemp); -   itemp = (png_uint_32)(green_y * 100000.0 + 0.5); -   png_save_uint_32(buf + 20, itemp); +   int_white_x = (png_uint_32)(white_x * 100000.0 + 0.5); +   int_white_y = (png_uint_32)(white_y * 100000.0 + 0.5); +   int_red_x   = (png_uint_32)(red_x   * 100000.0 + 0.5); +   int_red_y   = (png_uint_32)(red_y   * 100000.0 + 0.5); +   int_green_x = (png_uint_32)(green_x * 100000.0 + 0.5); +   int_green_y = (png_uint_32)(green_y * 100000.0 + 0.5); +   int_blue_x  = (png_uint_32)(blue_x  * 100000.0 + 0.5); +   int_blue_y  = (png_uint_32)(blue_y  * 100000.0 + 0.5); -   if (blue_x < 0 || blue_y < 0 || blue_x + blue_y > 1.0) +#if !defined(PNG_NO_CHECK_cHRM) +   if (png_check_cHRM_fixed(png_ptr, int_white_x, int_white_y, +      int_red_x, int_red_y, int_green_x, int_green_y, int_blue_x, int_blue_y)) +#endif     { -      png_warning(png_ptr, "Invalid cHRM blue point specified"); -      return; -   } -   itemp = (png_uint_32)(blue_x * 100000.0 + 0.5); -   png_save_uint_32(buf + 24, itemp); -   itemp = (png_uint_32)(blue_y * 100000.0 + 0.5); -   png_save_uint_32(buf + 28, itemp); +      /* Each value is saved in 1/100,000ths */ +     +      png_save_uint_32(buf, int_white_x); +      png_save_uint_32(buf + 4, int_white_y); -   png_write_chunk(png_ptr, png_cHRM, buf, (png_size_t)32); +      png_save_uint_32(buf + 8, int_red_x); +      png_save_uint_32(buf + 12, int_red_y); + +      png_save_uint_32(buf + 16, int_green_x); +      png_save_uint_32(buf + 20, int_green_y); + +      png_save_uint_32(buf + 24, int_blue_x); +      png_save_uint_32(buf + 28, int_blue_y); + +      png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32); +   }  }  #endif  #ifdef PNG_FIXED_POINT_SUPPORTED @@ -1010,50 +1017,33 @@ png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x,  #endif     png_byte buf[32]; -   png_debug(1, "in png_write_cHRM\n"); -   /* each value is saved in 1/100,000ths */ -   if (white_x > 80000L || white_y > 80000L || white_x + white_y > 100000L) -   { -      png_warning(png_ptr, "Invalid fixed cHRM white point specified"); -#if !defined(PNG_NO_CONSOLE_IO) -      fprintf(stderr,"white_x=%ld, white_y=%ld\n",white_x, white_y); +   png_debug(1, "in png_write_cHRM"); +   /* Each value is saved in 1/100,000ths */ +#if !defined(PNG_NO_CHECK_cHRM) +   if (png_check_cHRM_fixed(png_ptr, white_x, white_y, red_x, red_y, +      green_x, green_y, blue_x, blue_y))  #endif -      return; -   } -   png_save_uint_32(buf, (png_uint_32)white_x); -   png_save_uint_32(buf + 4, (png_uint_32)white_y); - -   if (red_x + red_y > 100000L)     { -      png_warning(png_ptr, "Invalid cHRM fixed red point specified"); -      return; -   } -   png_save_uint_32(buf + 8, (png_uint_32)red_x); -   png_save_uint_32(buf + 12, (png_uint_32)red_y); +      png_save_uint_32(buf, (png_uint_32)white_x); +      png_save_uint_32(buf + 4, (png_uint_32)white_y); -   if (green_x + green_y > 100000L) -   { -      png_warning(png_ptr, "Invalid fixed cHRM green point specified"); -      return; -   } -   png_save_uint_32(buf + 16, (png_uint_32)green_x); -   png_save_uint_32(buf + 20, (png_uint_32)green_y); +      png_save_uint_32(buf + 8, (png_uint_32)red_x); +      png_save_uint_32(buf + 12, (png_uint_32)red_y); -   if (blue_x + blue_y > 100000L) -   { -      png_warning(png_ptr, "Invalid fixed cHRM blue point specified"); -      return; -   } -   png_save_uint_32(buf + 24, (png_uint_32)blue_x); -   png_save_uint_32(buf + 28, (png_uint_32)blue_y); +      png_save_uint_32(buf + 16, (png_uint_32)green_x); +      png_save_uint_32(buf + 20, (png_uint_32)green_y); -   png_write_chunk(png_ptr, png_cHRM, buf, (png_size_t)32); +      png_save_uint_32(buf + 24, (png_uint_32)blue_x); +      png_save_uint_32(buf + 28, (png_uint_32)blue_y); + +      png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32); +   }  }  #endif  #endif  #if defined(PNG_WRITE_tRNS_SUPPORTED) -/* write the tRNS chunk */ +/* Write the tRNS chunk */  void /* PRIVATE */  png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran,     int num_trans, int color_type) @@ -1063,42 +1053,43 @@ png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran,  #endif     png_byte buf[6]; -   png_debug(1, "in png_write_tRNS\n"); +   png_debug(1, "in png_write_tRNS");     if (color_type == PNG_COLOR_TYPE_PALETTE)     {        if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette)        { -         png_warning(png_ptr,"Invalid number of transparent colors specified"); +         png_warning(png_ptr, "Invalid number of transparent colors specified");           return;        } -      /* write the chunk out as it is */ -      png_write_chunk(png_ptr, png_tRNS, trans, (png_size_t)num_trans); +      /* Write the chunk out as it is */ +      png_write_chunk(png_ptr, (png_bytep)png_tRNS, trans, +        (png_size_t)num_trans);     }     else if (color_type == PNG_COLOR_TYPE_GRAY)     { -      /* one 16 bit value */ -      if(tran->gray >= (1 << png_ptr->bit_depth)) +      /* One 16 bit value */ +      if (tran->gray >= (1 << png_ptr->bit_depth))        {           png_warning(png_ptr,             "Ignoring attempt to write tRNS chunk out-of-range for bit_depth");           return;        }        png_save_uint_16(buf, tran->gray); -      png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)2); +      png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)2);     }     else if (color_type == PNG_COLOR_TYPE_RGB)     { -      /* three 16 bit values */ +      /* Three 16 bit values */        png_save_uint_16(buf, tran->red);        png_save_uint_16(buf + 2, tran->green);        png_save_uint_16(buf + 4, tran->blue); -      if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) -         { -            png_warning(png_ptr, -              "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8"); -            return; -         } -      png_write_chunk(png_ptr, png_tRNS, buf, (png_size_t)6); +      if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) +      { +         png_warning(png_ptr, +           "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8"); +         return; +      } +      png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)6);     }     else     { @@ -1108,7 +1099,7 @@ png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran,  #endif  #if defined(PNG_WRITE_bKGD_SUPPORTED) -/* write the background chunk */ +/* Write the background chunk */  void /* PRIVATE */  png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type)  { @@ -1117,7 +1108,7 @@ png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type)  #endif     png_byte buf[6]; -   png_debug(1, "in png_write_bKGD\n"); +   png_debug(1, "in png_write_bKGD");     if (color_type == PNG_COLOR_TYPE_PALETTE)     {        if ( @@ -1125,43 +1116,43 @@ png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type)            (png_ptr->num_palette ||            (!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) &&  #endif -         back->index > png_ptr->num_palette) +         back->index >= png_ptr->num_palette)        {           png_warning(png_ptr, "Invalid background palette index");           return;        }        buf[0] = back->index; -      png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)1); +      png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)1);     }     else if (color_type & PNG_COLOR_MASK_COLOR)     {        png_save_uint_16(buf, back->red);        png_save_uint_16(buf + 2, back->green);        png_save_uint_16(buf + 4, back->blue); -      if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) -         { -            png_warning(png_ptr, -              "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8"); -            return; -         } -      png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)6); +      if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) +      { +         png_warning(png_ptr, +           "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8"); +         return; +      } +      png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)6);     }     else     { -      if(back->gray >= (1 << png_ptr->bit_depth)) +      if (back->gray >= (1 << png_ptr->bit_depth))        {           png_warning(png_ptr,             "Ignoring attempt to write bKGD chunk out-of-range for bit_depth");           return;        }        png_save_uint_16(buf, back->gray); -      png_write_chunk(png_ptr, png_bKGD, buf, (png_size_t)2); +      png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)2);     }  }  #endif  #if defined(PNG_WRITE_hIST_SUPPORTED) -/* write the histogram */ +/* Write the histogram */  void /* PRIVATE */  png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist)  { @@ -1171,16 +1162,17 @@ png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist)     int i;     png_byte buf[3]; -   png_debug(1, "in png_write_hIST\n"); +   png_debug(1, "in png_write_hIST");     if (num_hist > (int)png_ptr->num_palette)     { -      png_debug2(3, "num_hist = %d, num_palette = %d\n", num_hist, +      png_debug2(3, "num_hist = %d, num_palette = %d", num_hist,           png_ptr->num_palette);        png_warning(png_ptr, "Invalid number of histogram entries specified");        return;     } -   png_write_chunk_start(png_ptr, png_hIST, (png_uint_32)(num_hist * 2)); +   png_write_chunk_start(png_ptr, (png_bytep)png_hIST, +     (png_uint_32)(num_hist * 2));     for (i = 0; i < num_hist; i++)     {        png_save_uint_16(buf, hist[i]); @@ -1210,7 +1202,7 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)     int kflag;     int kwarn=0; -   png_debug(1, "in png_check_keyword\n"); +   png_debug(1, "in png_check_keyword");     *new_key = NULL;     if (key == NULL || (key_len = png_strlen(key)) == 0) @@ -1219,7 +1211,7 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)        return ((png_size_t)0);     } -   png_debug1(2, "Keyword to be checked is '%s'\n", key); +   png_debug1(2, "Keyword to be checked is '%s'", key);     *new_key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + 2));     if (*new_key == NULL) @@ -1260,8 +1252,8 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)        while (*kp == ' ')        { -        *(kp--) = '\0'; -        key_len--; +         *(kp--) = '\0'; +         key_len--;        }     } @@ -1273,12 +1265,12 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)        while (*kp == ' ')        { -        kp++; -        key_len--; +         kp++; +         key_len--;        }     } -   png_debug1(2, "Checking for multiple internal spaces in '%s'\n", kp); +   png_debug1(2, "Checking for multiple internal spaces in '%s'", kp);     /* Remove multiple internal spaces. */     for (kflag = 0, dp = *new_key; *kp != '\0'; kp++) @@ -1300,20 +1292,20 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)        }     }     *dp = '\0'; -   if(kwarn) +   if (kwarn)        png_warning(png_ptr, "extra interior spaces removed from keyword");     if (key_len == 0)     {        png_free(png_ptr, *new_key); -      *new_key=NULL; +       *new_key=NULL;        png_warning(png_ptr, "Zero length keyword");     }     if (key_len > 79)     {        png_warning(png_ptr, "keyword length must be 1 - 79 characters"); -      new_key[79] = '\0'; +      (*new_key)[79] = '\0';        key_len = 79;     } @@ -1322,7 +1314,7 @@ png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)  #endif  #if defined(PNG_WRITE_tEXt_SUPPORTED) -/* write a tEXt chunk */ +/* Write a tEXt chunk */  void /* PRIVATE */  png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text,     png_size_t text_len) @@ -1333,29 +1325,28 @@ png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text,     png_size_t key_len;     png_charp new_key; -   png_debug(1, "in png_write_tEXt\n"); -   if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) -   { -      png_warning(png_ptr, "Empty keyword in tEXt chunk"); +   png_debug(1, "in png_write_tEXt"); +   if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0)        return; -   }     if (text == NULL || *text == '\0')        text_len = 0;     else        text_len = png_strlen(text); -   /* make sure we include the 0 after the key */ -   png_write_chunk_start(png_ptr, png_tEXt, (png_uint_32)key_len+text_len+1); +   /* Make sure we include the 0 after the key */ +   png_write_chunk_start(png_ptr, (png_bytep)png_tEXt, +      (png_uint_32)(key_len + text_len + 1));     /*      * We leave it to the application to meet PNG-1.0 requirements on the      * contents of the text.  PNG-1.0 through PNG-1.2 discourage the use of      * any non-Latin-1 characters except for NEWLINE.  ISO PNG will forbid them.      * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.      */ -   png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1); +   png_write_chunk_data(png_ptr, (png_bytep)new_key, +     (png_size_t)(key_len + 1));     if (text_len) -      png_write_chunk_data(png_ptr, (png_bytep)text, text_len); +      png_write_chunk_data(png_ptr, (png_bytep)text, (png_size_t)text_len);     png_write_chunk_end(png_ptr);     png_free(png_ptr, new_key); @@ -1363,7 +1354,7 @@ png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text,  #endif  #if defined(PNG_WRITE_zTXt_SUPPORTED) -/* write a compressed text chunk */ +/* Write a compressed text chunk */  void /* PRIVATE */  png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text,     png_size_t text_len, int compression) @@ -1376,7 +1367,7 @@ png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text,     png_charp new_key;     compression_state comp; -   png_debug(1, "in png_write_zTXt\n"); +   png_debug(1, "in png_write_zTXt");     comp.num_output_ptr = 0;     comp.max_output_ptr = 0; @@ -1384,9 +1375,9 @@ png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text,     comp.input = NULL;     comp.input_len = 0; -   if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) +   if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0)     { -      png_warning(png_ptr, "Empty keyword in zTXt chunk"); +      png_free(png_ptr, new_key);        return;     } @@ -1399,30 +1390,31 @@ png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text,     text_len = png_strlen(text); -   /* compute the compressed data; do it now for the length */ +   /* Compute the compressed data; do it now for the length */     text_len = png_text_compress(png_ptr, text, text_len, compression,         &comp); -   /* write start of chunk */ -   png_write_chunk_start(png_ptr, png_zTXt, (png_uint_32) -      (key_len+text_len+2)); -   /* write key */ -   png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1); +   /* Write start of chunk */ +   png_write_chunk_start(png_ptr, (png_bytep)png_zTXt, +     (png_uint_32)(key_len+text_len + 2)); +   /* Write key */ +   png_write_chunk_data(png_ptr, (png_bytep)new_key, +     (png_size_t)(key_len + 1));     png_free(png_ptr, new_key);     buf[0] = (png_byte)compression; -   /* write compression */ +   /* Write compression */     png_write_chunk_data(png_ptr, (png_bytep)buf, (png_size_t)1); -   /* write the compressed data */ +   /* Write the compressed data */     png_write_compressed_data_out(png_ptr, &comp); -   /* close the chunk */ +   /* Close the chunk */     png_write_chunk_end(png_ptr);  }  #endif  #if defined(PNG_WRITE_iTXt_SUPPORTED) -/* write an iTXt chunk */ +/* Write an iTXt chunk */  void /* PRIVATE */  png_write_iTXt(png_structp png_ptr, int compression, png_charp key,      png_charp lang, png_charp lang_key, png_charp text) @@ -1431,23 +1423,22 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key,     PNG_iTXt;  #endif     png_size_t lang_len, key_len, lang_key_len, text_len; -   png_charp new_lang, new_key; +   png_charp new_lang; +   png_charp new_key = NULL;     png_byte cbuf[2];     compression_state comp; -   png_debug(1, "in png_write_iTXt\n"); +   png_debug(1, "in png_write_iTXt");     comp.num_output_ptr = 0;     comp.max_output_ptr = 0;     comp.output_ptr = NULL;     comp.input = NULL; -   if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0) -   { -      png_warning(png_ptr, "Empty keyword in iTXt chunk"); +   if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0)        return; -   } -   if (lang == NULL || (lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0) + +   if ((lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0)     {        png_warning(png_ptr, "Empty language field in iTXt chunk");        new_lang = NULL; @@ -1455,24 +1446,24 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key,     }     if (lang_key == NULL) -     lang_key_len = 0; +      lang_key_len = 0;     else -     lang_key_len = png_strlen(lang_key); +      lang_key_len = png_strlen(lang_key);     if (text == NULL)        text_len = 0;     else -     text_len = png_strlen(text); +      text_len = png_strlen(text); -   /* compute the compressed data; do it now for the length */ +   /* Compute the compressed data; do it now for the length */     text_len = png_text_compress(png_ptr, text, text_len, compression-2,        &comp); -   /* make sure we include the compression flag, the compression byte, +   /* Make sure we include the compression flag, the compression byte,      * and the NULs after the key, lang, and lang_key parts */ -   png_write_chunk_start(png_ptr, png_iTXt, +   png_write_chunk_start(png_ptr, (png_bytep)png_iTXt,            (png_uint_32)(          5 /* comp byte, comp flag, terminators for key, lang and lang_key */          + key_len @@ -1480,38 +1471,39 @@ png_write_iTXt(png_structp png_ptr, int compression, png_charp key,          + lang_key_len          + text_len)); -   /* -    * We leave it to the application to meet PNG-1.0 requirements on the +   /* We leave it to the application to meet PNG-1.0 requirements on the      * contents of the text.  PNG-1.0 through PNG-1.2 discourage the use of      * any non-Latin-1 characters except for NEWLINE.  ISO PNG will forbid them.      * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.      */ -   png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1); +   png_write_chunk_data(png_ptr, (png_bytep)new_key, +     (png_size_t)(key_len + 1)); -   /* set the compression flag */ +   /* Set the compression flag */     if (compression == PNG_ITXT_COMPRESSION_NONE || \         compression == PNG_TEXT_COMPRESSION_NONE)         cbuf[0] = 0;     else /* compression == PNG_ITXT_COMPRESSION_zTXt */         cbuf[0] = 1; -   /* set the compression method */ +   /* Set the compression method */     cbuf[1] = 0; -   png_write_chunk_data(png_ptr, cbuf, 2); +   png_write_chunk_data(png_ptr, cbuf, (png_size_t)2);     cbuf[0] = 0; -   png_write_chunk_data(png_ptr, (new_lang ? (png_bytep)new_lang : cbuf), lang_len + 1); -   png_write_chunk_data(png_ptr, (lang_key ? (png_bytep)lang_key : cbuf), lang_key_len + 1); +   png_write_chunk_data(png_ptr, (new_lang ? (png_bytep)new_lang : cbuf), +     (png_size_t)(lang_len + 1)); +   png_write_chunk_data(png_ptr, (lang_key ? (png_bytep)lang_key : cbuf), +     (png_size_t)(lang_key_len + 1));     png_write_compressed_data_out(png_ptr, &comp);     png_write_chunk_end(png_ptr);     png_free(png_ptr, new_key); -   if (new_lang) -     png_free(png_ptr, new_lang); +   png_free(png_ptr, new_lang);  }  #endif  #if defined(PNG_WRITE_oFFs_SUPPORTED) -/* write the oFFs chunk */ +/* Write the oFFs chunk */  void /* PRIVATE */  png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,     int unit_type) @@ -1521,7 +1513,7 @@ png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,  #endif     png_byte buf[9]; -   png_debug(1, "in png_write_oFFs\n"); +   png_debug(1, "in png_write_oFFs");     if (unit_type >= PNG_OFFSET_LAST)        png_warning(png_ptr, "Unrecognized unit type for oFFs chunk"); @@ -1529,11 +1521,11 @@ png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,     png_save_int_32(buf + 4, y_offset);     buf[8] = (png_byte)unit_type; -   png_write_chunk(png_ptr, png_oFFs, buf, (png_size_t)9); +   png_write_chunk(png_ptr, (png_bytep)png_oFFs, buf, (png_size_t)9);  }  #endif  #if defined(PNG_WRITE_pCAL_SUPPORTED) -/* write the pCAL chunk (described in the PNG extensions document) */ +/* Write the pCAL chunk (described in the PNG extensions document) */  void /* PRIVATE */  png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,     png_int_32 X1, int type, int nparams, png_charp units, png_charpp params) @@ -1547,31 +1539,33 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,     png_charp new_purpose;     int i; -   png_debug1(1, "in png_write_pCAL (%d parameters)\n", nparams); +   png_debug1(1, "in png_write_pCAL (%d parameters)", nparams);     if (type >= PNG_EQUATION_LAST)        png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");     purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1; -   png_debug1(3, "pCAL purpose length = %d\n", (int)purpose_len); +   png_debug1(3, "pCAL purpose length = %d", (int)purpose_len);     units_len = png_strlen(units) + (nparams == 0 ? 0 : 1); -   png_debug1(3, "pCAL units length = %d\n", (int)units_len); +   png_debug1(3, "pCAL units length = %d", (int)units_len);     total_len = purpose_len + units_len + 10; -   params_len = (png_uint_32p)png_malloc(png_ptr, (png_uint_32)(nparams -      *png_sizeof(png_uint_32))); +   params_len = (png_uint_32p)png_malloc(png_ptr, +      (png_uint_32)(nparams * png_sizeof(png_uint_32)));     /* Find the length of each parameter, making sure we don't count the        null terminator for the last parameter. */     for (i = 0; i < nparams; i++)     {        params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1); -      png_debug2(3, "pCAL parameter %d length = %lu\n", i, params_len[i]); +      png_debug2(3, "pCAL parameter %d length = %lu", i, +        (unsigned long) params_len[i]);        total_len += (png_size_t)params_len[i];     } -   png_debug1(3, "pCAL total length = %d\n", (int)total_len); -   png_write_chunk_start(png_ptr, png_pCAL, (png_uint_32)total_len); -   png_write_chunk_data(png_ptr, (png_bytep)new_purpose, purpose_len); +   png_debug1(3, "pCAL total length = %d", (int)total_len); +   png_write_chunk_start(png_ptr, (png_bytep)png_pCAL, (png_uint_32)total_len); +   png_write_chunk_data(png_ptr, (png_bytep)new_purpose, +     (png_size_t)purpose_len);     png_save_int_32(buf, X0);     png_save_int_32(buf + 4, X1);     buf[8] = (png_byte)type; @@ -1593,7 +1587,7 @@ png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,  #endif  #if defined(PNG_WRITE_sCAL_SUPPORTED) -/* write the sCAL chunk */ +/* Write the sCAL chunk */  #if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)  void /* PRIVATE */  png_write_sCAL(png_structp png_ptr, int unit, double width, double height) @@ -1604,7 +1598,7 @@ png_write_sCAL(png_structp png_ptr, int unit, double width, double height)     char buf[64];     png_size_t total_len; -   png_debug(1, "in png_write_sCAL\n"); +   png_debug(1, "in png_write_sCAL");     buf[0] = (char)unit;  #if defined(_WIN32_WCE) @@ -1629,8 +1623,8 @@ png_write_sCAL(png_structp png_ptr, int unit, double width, double height)     total_len += png_strlen(buf + total_len);  #endif -   png_debug1(3, "sCAL total length = %u\n", (unsigned int)total_len); -   png_write_chunk(png_ptr, png_sCAL, (png_bytep)buf, total_len); +   png_debug1(3, "sCAL total length = %u", (unsigned int)total_len); +   png_write_chunk(png_ptr, (png_bytep)png_sCAL, (png_bytep)buf, total_len);  }  #else  #ifdef PNG_FIXED_POINT_SUPPORTED @@ -1644,7 +1638,7 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width,     png_byte buf[64];     png_size_t wlen, hlen, total_len; -   png_debug(1, "in png_write_sCAL_s\n"); +   png_debug(1, "in png_write_sCAL_s");     wlen = png_strlen(width);     hlen = png_strlen(height); @@ -1656,18 +1650,18 @@ png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width,     }     buf[0] = (png_byte)unit; -   png_memcpy(buf + 1, width, wlen + 1);      /* append the '\0' here */ -   png_memcpy(buf + wlen + 2, height, hlen);  /* do NOT append the '\0' here */ +   png_memcpy(buf + 1, width, wlen + 1);      /* Append the '\0' here */ +   png_memcpy(buf + wlen + 2, height, hlen);  /* Do NOT append the '\0' here */ -   png_debug1(3, "sCAL total length = %u\n", (unsigned int)total_len); -   png_write_chunk(png_ptr, png_sCAL, buf, total_len); +   png_debug1(3, "sCAL total length = %u", (unsigned int)total_len); +   png_write_chunk(png_ptr, (png_bytep)png_sCAL, buf, total_len);  }  #endif  #endif  #endif  #if defined(PNG_WRITE_pHYs_SUPPORTED) -/* write the pHYs chunk */ +/* Write the pHYs chunk */  void /* PRIVATE */  png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,     png_uint_32 y_pixels_per_unit, @@ -1678,7 +1672,7 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,  #endif     png_byte buf[9]; -   png_debug(1, "in png_write_pHYs\n"); +   png_debug(1, "in png_write_pHYs");     if (unit_type >= PNG_RESOLUTION_LAST)        png_warning(png_ptr, "Unrecognized unit type for pHYs chunk"); @@ -1686,7 +1680,7 @@ png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,     png_save_uint_32(buf + 4, y_pixels_per_unit);     buf[8] = (png_byte)unit_type; -   png_write_chunk(png_ptr, png_pHYs, buf, (png_size_t)9); +   png_write_chunk(png_ptr, (png_bytep)png_pHYs, buf, (png_size_t)9);  }  #endif @@ -1702,7 +1696,7 @@ png_write_tIME(png_structp png_ptr, png_timep mod_time)  #endif     png_byte buf[7]; -   png_debug(1, "in png_write_tIME\n"); +   png_debug(1, "in png_write_tIME");     if (mod_time->month  > 12 || mod_time->month  < 1 ||         mod_time->day    > 31 || mod_time->day    < 1 ||         mod_time->hour   > 23 || mod_time->second > 60) @@ -1718,83 +1712,85 @@ png_write_tIME(png_structp png_ptr, png_timep mod_time)     buf[5] = mod_time->minute;     buf[6] = mod_time->second; -   png_write_chunk(png_ptr, png_tIME, buf, (png_size_t)7); +   png_write_chunk(png_ptr, (png_bytep)png_tIME, buf, (png_size_t)7);  }  #endif -/* initializes the row writing capability of libpng */ +/* Initializes the row writing capability of libpng */  void /* PRIVATE */  png_write_start_row(png_structp png_ptr)  {  #ifdef PNG_WRITE_INTERLACING_SUPPORTED  #ifdef PNG_USE_LOCAL_ARRAYS -   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ +   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ -   /* start of interlace block */ +   /* Start of interlace block */     int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; -   /* offset to next interlace block */ +   /* Offset to next interlace block */     int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -   /* start of interlace block in the y direction */ +   /* Start of interlace block in the y direction */     int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; -   /* offset to next interlace block in the y direction */ +   /* Offset to next interlace block in the y direction */     int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};  #endif  #endif     png_size_t buf_size; -   png_debug(1, "in png_write_start_row\n"); +   png_debug(1, "in png_write_start_row");     buf_size = (png_size_t)(PNG_ROWBYTES( -      png_ptr->usr_channels*png_ptr->usr_bit_depth,png_ptr->width)+1); +      png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1); -   /* set up row buffer */ -   png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size); +   /* Set up row buffer */ +   png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, +     (png_uint_32)buf_size);     png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE; -#ifndef PNG_NO_WRITE_FILTERING -   /* set up filtering buffer, if using this filter */ +#ifndef PNG_NO_WRITE_FILTER +   /* Set up filtering buffer, if using this filter */     if (png_ptr->do_filter & PNG_FILTER_SUB)     {        png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, -         (png_ptr->rowbytes + 1)); +         (png_uint_32)(png_ptr->rowbytes + 1));        png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB;     }     /* We only need to keep the previous row if we are using one of these. */     if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH))     { -     /* set up previous row buffer */ -      png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size); -      png_memset(png_ptr->prev_row, 0, buf_size); +     /* Set up previous row buffer */ +     png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, +        (png_uint_32)buf_size); +     png_memset(png_ptr->prev_row, 0, buf_size);        if (png_ptr->do_filter & PNG_FILTER_UP)        {           png_ptr->up_row = (png_bytep)png_malloc(png_ptr, -            (png_ptr->rowbytes + 1)); +           (png_uint_32)(png_ptr->rowbytes + 1));           png_ptr->up_row[0] = PNG_FILTER_VALUE_UP;        }        if (png_ptr->do_filter & PNG_FILTER_AVG)        {           png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, -            (png_ptr->rowbytes + 1)); +           (png_uint_32)(png_ptr->rowbytes + 1));           png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG;        }        if (png_ptr->do_filter & PNG_FILTER_PAETH)        {           png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, -            (png_ptr->rowbytes + 1)); +           (png_uint_32)(png_ptr->rowbytes + 1));           png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH;        } -#endif /* PNG_NO_WRITE_FILTERING */     } +#endif /* PNG_NO_WRITE_FILTER */  #ifdef PNG_WRITE_INTERLACING_SUPPORTED -   /* if interlaced, we need to set up width and height of pass */ +   /* If interlaced, we need to set up width and height of pass */     if (png_ptr->interlaced)     {        if (!(png_ptr->transformations & PNG_INTERLACE)) @@ -1826,34 +1822,34 @@ png_write_finish_row(png_structp png_ptr)  {  #ifdef PNG_WRITE_INTERLACING_SUPPORTED  #ifdef PNG_USE_LOCAL_ARRAYS -   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ +   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ -   /* start of interlace block */ +   /* Start of interlace block */     int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; -   /* offset to next interlace block */ +   /* Offset to next interlace block */     int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; -   /* start of interlace block in the y direction */ +   /* Start of interlace block in the y direction */     int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; -   /* offset to next interlace block in the y direction */ +   /* Offset to next interlace block in the y direction */     int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};  #endif  #endif     int ret; -   png_debug(1, "in png_write_finish_row\n"); -   /* next row */ +   png_debug(1, "in png_write_finish_row"); +   /* Next row */     png_ptr->row_number++; -   /* see if we are done */ +   /* See if we are done */     if (png_ptr->row_number < png_ptr->num_rows)        return;  #ifdef PNG_WRITE_INTERLACING_SUPPORTED -   /* if interlaced, go to next pass */ +   /* If interlaced, go to next pass */     if (png_ptr->interlaced)     {        png_ptr->row_number = 0; @@ -1863,7 +1859,7 @@ png_write_finish_row(png_structp png_ptr)        }        else        { -         /* loop until we find a non-zero width or height pass */ +         /* Loop until we find a non-zero width or height pass */           do           {              png_ptr->pass++; @@ -1883,28 +1879,28 @@ png_write_finish_row(png_structp png_ptr)        } -      /* reset the row above the image for the next pass */ +      /* Reset the row above the image for the next pass */        if (png_ptr->pass < 7)        {           if (png_ptr->prev_row != NULL)              png_memset(png_ptr->prev_row, 0,                 (png_size_t)(PNG_ROWBYTES(png_ptr->usr_channels* -               png_ptr->usr_bit_depth,png_ptr->width))+1); +               png_ptr->usr_bit_depth, png_ptr->width)) + 1);           return;        }     }  #endif -   /* if we get here, we've just written the last row, so we need +   /* If we get here, we've just written the last row, so we need        to flush the compressor */     do     { -      /* tell the compressor we are done */ +      /* Tell the compressor we are done */        ret = deflate(&png_ptr->zstream, Z_FINISH); -      /* check for an error */ +      /* Check for an error */        if (ret == Z_OK)        { -         /* check to see if we need more room */ +         /* Check to see if we need more room */           if (!(png_ptr->zstream.avail_out))           {              png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); @@ -1921,7 +1917,7 @@ png_write_finish_row(png_structp png_ptr)        }     } while (ret != Z_STREAM_END); -   /* write any extra space */ +   /* Write any extra space */     if (png_ptr->zstream.avail_out < png_ptr->zbuf_size)     {        png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - @@ -1944,24 +1940,24 @@ void /* PRIVATE */  png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)  {  #ifdef PNG_USE_LOCAL_ARRAYS -   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */ +   /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ -   /* start of interlace block */ +   /* Start of interlace block */     int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; -   /* offset to next interlace block */ +   /* Offset to next interlace block */     int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};  #endif -   png_debug(1, "in png_do_write_interlace\n"); -   /* we don't have to do anything on the last pass (6) */ +   png_debug(1, "in png_do_write_interlace"); +   /* We don't have to do anything on the last pass (6) */  #if defined(PNG_USELESS_TESTS_SUPPORTED)     if (row != NULL && row_info != NULL && pass < 6)  #else     if (pass < 6)  #endif     { -      /* each pixel depth is handled separately */ +      /* Each pixel depth is handled separately */        switch (row_info->pixel_depth)        {           case 1: @@ -2072,27 +2068,27 @@ png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)              png_uint_32 row_width = row_info->width;              png_size_t pixel_bytes; -            /* start at the beginning */ +            /* Start at the beginning */              dp = row; -            /* find out how many bytes each pixel takes up */ +            /* Find out how many bytes each pixel takes up */              pixel_bytes = (row_info->pixel_depth >> 3); -            /* loop through the row, only looking at the pixels that +            /* Loop through the row, only looking at the pixels that                 matter */              for (i = png_pass_start[pass]; i < row_width;                 i += png_pass_inc[pass])              { -               /* find out where the original pixel is */ +               /* Find out where the original pixel is */                 sp = row + (png_size_t)i * pixel_bytes; -               /* move the pixel */ +               /* Move the pixel */                 if (dp != sp)                    png_memcpy(dp, sp, pixel_bytes); -               /* next pixel */ +               /* Next pixel */                 dp += pixel_bytes;              }              break;           }        } -      /* set new row width */ +      /* Set new row width */        row_info->width = (row_info->width +           png_pass_inc[pass] - 1 -           png_pass_start[pass]) / @@ -2124,8 +2120,8 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)     int num_p_filters = (int)png_ptr->num_prev_filters;  #endif -   png_debug(1, "in png_write_find_filter\n"); -   /* find out how many bytes offset each pixel is */ +   png_debug(1, "in png_write_find_filter"); +   /* Find out how many bytes offset each pixel is */     bpp = (row_info->pixel_depth + 7) >> 3;     prev_row = png_ptr->prev_row; @@ -2212,9 +2208,9 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)        mins = sum;     } -   /* sub filter */ +   /* Sub filter */     if (filter_to_do == PNG_FILTER_SUB) -   /* it's the only filter so no testing is needed */ +   /* It's the only filter so no testing is needed */     {        png_bytep rp, lp, dp;        png_uint_32 i; @@ -2329,7 +2325,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)        }     } -   /* up filter */ +   /* Up filter */     if (filter_to_do == PNG_FILTER_UP)     {        png_bytep rp, dp, pp; @@ -2432,7 +2428,7 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)        }     } -   /* avg filter */ +   /* Avg filter */     if (filter_to_do == PNG_FILTER_AVG)     {        png_bytep rp, dp, pp, lp; @@ -2733,20 +2729,20 @@ png_write_find_filter(png_structp png_ptr, png_row_infop row_info)  void /* PRIVATE */  png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)  { -   png_debug(1, "in png_write_filtered_row\n"); -   png_debug1(2, "filter = %d\n", filtered_row[0]); -   /* set up the zlib input buffer */ +   png_debug(1, "in png_write_filtered_row"); +   png_debug1(2, "filter = %d", filtered_row[0]); +   /* Set up the zlib input buffer */     png_ptr->zstream.next_in = filtered_row;     png_ptr->zstream.avail_in = (uInt)png_ptr->row_info.rowbytes + 1; -   /* repeat until we have compressed all the data */ +   /* Repeat until we have compressed all the data */     do     { -      int ret; /* return of zlib */ +      int ret; /* Return of zlib */ -      /* compress the data */ +      /* Compress the data */        ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); -      /* check for compression errors */ +      /* Check for compression errors */        if (ret != Z_OK)        {           if (png_ptr->zstream.msg != NULL) @@ -2755,18 +2751,18 @@ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)              png_error(png_ptr, "zlib error");        } -      /* see if it is time to write another IDAT */ +      /* See if it is time to write another IDAT */        if (!(png_ptr->zstream.avail_out))        { -         /* write the IDAT and reset the zlib output buffer */ +         /* Write the IDAT and reset the zlib output buffer */           png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);           png_ptr->zstream.next_out = png_ptr->zbuf;           png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;        } -   /* repeat until all data has been compressed */ +   /* Repeat until all data has been compressed */     } while (png_ptr->zstream.avail_in); -   /* swap the current and previous rows */ +   /* Swap the current and previous rows */     if (png_ptr->prev_row != NULL)     {        png_bytep tptr; @@ -2776,7 +2772,7 @@ png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)        png_ptr->row_buf = tptr;     } -   /* finish row - updates counters and flushes zlib if last row */ +   /* Finish row - updates counters and flushes zlib if last row */     png_write_finish_row(png_ptr);  #if defined(PNG_WRITE_FLUSH_SUPPORTED) | 
