symbian-qemu-0.9.1-12/libpng-1.2.32/pngset.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 
       
     2 /* pngset.c - storage of image information into info struct
       
     3  *
       
     4  * Last changed in libpng 1.2.30 [August 15, 2008]
       
     5  * For conditions of distribution and use, see copyright notice in png.h
       
     6  * Copyright (c) 1998-2008 Glenn Randers-Pehrson
       
     7  * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
       
     8  * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
       
     9  *
       
    10  * The functions here are used during reads to store data from the file
       
    11  * into the info struct, and during writes to store application data
       
    12  * into the info struct for writing into the file.  This abstracts the
       
    13  * info struct and allows us to change the structure in the future.
       
    14  */
       
    15 
       
    16 #define PNG_INTERNAL
       
    17 #include "png.h"
       
    18 #if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
       
    19 
       
    20 #if defined(PNG_bKGD_SUPPORTED)
       
    21 void PNGAPI
       
    22 png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background)
       
    23 {
       
    24    png_debug1(1, "in %s storage function\n", "bKGD");
       
    25    if (png_ptr == NULL || info_ptr == NULL)
       
    26       return;
       
    27 
       
    28    png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16));
       
    29    info_ptr->valid |= PNG_INFO_bKGD;
       
    30 }
       
    31 #endif
       
    32 
       
    33 #if defined(PNG_cHRM_SUPPORTED)
       
    34 #ifdef PNG_FLOATING_POINT_SUPPORTED
       
    35 void PNGAPI
       
    36 png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
       
    37    double white_x, double white_y, double red_x, double red_y,
       
    38    double green_x, double green_y, double blue_x, double blue_y)
       
    39 {
       
    40    png_debug1(1, "in %s storage function\n", "cHRM");
       
    41    if (png_ptr == NULL || info_ptr == NULL)
       
    42       return;
       
    43    if (!(white_x || white_y || red_x || red_y || green_x || green_y ||
       
    44        blue_x || blue_y))
       
    45    {
       
    46       png_warning(png_ptr,
       
    47         "Ignoring attempt to set all-zero chromaticity values");
       
    48       return;
       
    49    }
       
    50    if (white_x < 0.0 || white_y < 0.0 ||
       
    51          red_x < 0.0 ||   red_y < 0.0 ||
       
    52        green_x < 0.0 || green_y < 0.0 ||
       
    53         blue_x < 0.0 ||  blue_y < 0.0)
       
    54    {
       
    55       png_warning(png_ptr,
       
    56         "Ignoring attempt to set negative chromaticity value");
       
    57       return;
       
    58    }
       
    59    if (white_x > 21474.83 || white_y > 21474.83 ||
       
    60          red_x > 21474.83 ||   red_y > 21474.83 ||
       
    61        green_x > 21474.83 || green_y > 21474.83 ||
       
    62         blue_x > 21474.83 ||  blue_y > 21474.83)
       
    63    {
       
    64       png_warning(png_ptr,
       
    65         "Ignoring attempt to set chromaticity value exceeding 21474.83");
       
    66       return;
       
    67    }
       
    68 
       
    69    info_ptr->x_white = (float)white_x;
       
    70    info_ptr->y_white = (float)white_y;
       
    71    info_ptr->x_red   = (float)red_x;
       
    72    info_ptr->y_red   = (float)red_y;
       
    73    info_ptr->x_green = (float)green_x;
       
    74    info_ptr->y_green = (float)green_y;
       
    75    info_ptr->x_blue  = (float)blue_x;
       
    76    info_ptr->y_blue  = (float)blue_y;
       
    77 #ifdef PNG_FIXED_POINT_SUPPORTED
       
    78    info_ptr->int_x_white = (png_fixed_point)(white_x*100000.+0.5);
       
    79    info_ptr->int_y_white = (png_fixed_point)(white_y*100000.+0.5);
       
    80    info_ptr->int_x_red   = (png_fixed_point)(  red_x*100000.+0.5);
       
    81    info_ptr->int_y_red   = (png_fixed_point)(  red_y*100000.+0.5);
       
    82    info_ptr->int_x_green = (png_fixed_point)(green_x*100000.+0.5);
       
    83    info_ptr->int_y_green = (png_fixed_point)(green_y*100000.+0.5);
       
    84    info_ptr->int_x_blue  = (png_fixed_point)( blue_x*100000.+0.5);
       
    85    info_ptr->int_y_blue  = (png_fixed_point)( blue_y*100000.+0.5);
       
    86 #endif
       
    87    info_ptr->valid |= PNG_INFO_cHRM;
       
    88 }
       
    89 #endif
       
    90 #ifdef PNG_FIXED_POINT_SUPPORTED
       
    91 void PNGAPI
       
    92 png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
       
    93    png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
       
    94    png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
       
    95    png_fixed_point blue_x, png_fixed_point blue_y)
       
    96 {
       
    97    png_debug1(1, "in %s storage function\n", "cHRM");
       
    98    if (png_ptr == NULL || info_ptr == NULL)
       
    99       return;
       
   100 
       
   101    if (!(white_x || white_y || red_x || red_y || green_x || green_y ||
       
   102        blue_x || blue_y))
       
   103    {
       
   104       png_warning(png_ptr,
       
   105         "Ignoring attempt to set all-zero chromaticity values");
       
   106       return;
       
   107    }
       
   108    if (white_x < 0 || white_y < 0 ||
       
   109          red_x < 0 ||   red_y < 0 ||
       
   110        green_x < 0 || green_y < 0 ||
       
   111         blue_x < 0 ||  blue_y < 0)
       
   112    {
       
   113       png_warning(png_ptr,
       
   114         "Ignoring attempt to set negative chromaticity value");
       
   115       return;
       
   116    }
       
   117    if (white_x > (png_fixed_point) PNG_UINT_31_MAX ||
       
   118        white_y > (png_fixed_point) PNG_UINT_31_MAX ||
       
   119          red_x > (png_fixed_point) PNG_UINT_31_MAX ||
       
   120          red_y > (png_fixed_point) PNG_UINT_31_MAX ||
       
   121        green_x > (png_fixed_point) PNG_UINT_31_MAX ||
       
   122        green_y > (png_fixed_point) PNG_UINT_31_MAX ||
       
   123         blue_x > (png_fixed_point) PNG_UINT_31_MAX ||
       
   124         blue_y > (png_fixed_point) PNG_UINT_31_MAX )
       
   125    {
       
   126       png_warning(png_ptr,
       
   127         "Ignoring attempt to set chromaticity value exceeding 21474.83");
       
   128       return;
       
   129    }
       
   130    info_ptr->int_x_white = white_x;
       
   131    info_ptr->int_y_white = white_y;
       
   132    info_ptr->int_x_red   = red_x;
       
   133    info_ptr->int_y_red   = red_y;
       
   134    info_ptr->int_x_green = green_x;
       
   135    info_ptr->int_y_green = green_y;
       
   136    info_ptr->int_x_blue  = blue_x;
       
   137    info_ptr->int_y_blue  = blue_y;
       
   138 #ifdef PNG_FLOATING_POINT_SUPPORTED
       
   139    info_ptr->x_white = (float)(white_x/100000.);
       
   140    info_ptr->y_white = (float)(white_y/100000.);
       
   141    info_ptr->x_red   = (float)(  red_x/100000.);
       
   142    info_ptr->y_red   = (float)(  red_y/100000.);
       
   143    info_ptr->x_green = (float)(green_x/100000.);
       
   144    info_ptr->y_green = (float)(green_y/100000.);
       
   145    info_ptr->x_blue  = (float)( blue_x/100000.);
       
   146    info_ptr->y_blue  = (float)( blue_y/100000.);
       
   147 #endif
       
   148    info_ptr->valid |= PNG_INFO_cHRM;
       
   149 }
       
   150 #endif
       
   151 #endif
       
   152 
       
   153 #if defined(PNG_gAMA_SUPPORTED)
       
   154 #ifdef PNG_FLOATING_POINT_SUPPORTED
       
   155 void PNGAPI
       
   156 png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
       
   157 {
       
   158    double gamma;
       
   159    png_debug1(1, "in %s storage function\n", "gAMA");
       
   160    if (png_ptr == NULL || info_ptr == NULL)
       
   161       return;
       
   162 
       
   163    /* Check for overflow */
       
   164    if (file_gamma > 21474.83)
       
   165    {
       
   166       png_warning(png_ptr, "Limiting gamma to 21474.83");
       
   167       gamma=21474.83;
       
   168    }
       
   169    else
       
   170       gamma = file_gamma;
       
   171    info_ptr->gamma = (float)gamma;
       
   172 #ifdef PNG_FIXED_POINT_SUPPORTED
       
   173    info_ptr->int_gamma = (int)(gamma*100000.+.5);
       
   174 #endif
       
   175    info_ptr->valid |= PNG_INFO_gAMA;
       
   176    if (gamma == 0.0)
       
   177       png_warning(png_ptr, "Setting gamma=0");
       
   178 }
       
   179 #endif
       
   180 void PNGAPI
       
   181 png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point
       
   182    int_gamma)
       
   183 {
       
   184    png_fixed_point gamma;
       
   185 
       
   186    png_debug1(1, "in %s storage function\n", "gAMA");
       
   187    if (png_ptr == NULL || info_ptr == NULL)
       
   188       return;
       
   189 
       
   190    if (int_gamma > (png_fixed_point) PNG_UINT_31_MAX)
       
   191    {
       
   192      png_warning(png_ptr, "Limiting gamma to 21474.83");
       
   193      gamma=PNG_UINT_31_MAX;
       
   194    }
       
   195    else
       
   196    {
       
   197      if (int_gamma < 0)
       
   198      {
       
   199        png_warning(png_ptr, "Setting negative gamma to zero");
       
   200        gamma = 0;
       
   201      }
       
   202      else
       
   203        gamma = int_gamma;
       
   204    }
       
   205 #ifdef PNG_FLOATING_POINT_SUPPORTED
       
   206    info_ptr->gamma = (float)(gamma/100000.);
       
   207 #endif
       
   208 #ifdef PNG_FIXED_POINT_SUPPORTED
       
   209    info_ptr->int_gamma = gamma;
       
   210 #endif
       
   211    info_ptr->valid |= PNG_INFO_gAMA;
       
   212    if (gamma == 0)
       
   213       png_warning(png_ptr, "Setting gamma=0");
       
   214 }
       
   215 #endif
       
   216 
       
   217 #if defined(PNG_hIST_SUPPORTED)
       
   218 void PNGAPI
       
   219 png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)
       
   220 {
       
   221    int i;
       
   222 
       
   223    png_debug1(1, "in %s storage function\n", "hIST");
       
   224    if (png_ptr == NULL || info_ptr == NULL)
       
   225       return;
       
   226    if (info_ptr->num_palette == 0 || info_ptr->num_palette
       
   227        > PNG_MAX_PALETTE_LENGTH)
       
   228    {
       
   229        png_warning(png_ptr,
       
   230           "Invalid palette size, hIST allocation skipped.");
       
   231        return;
       
   232    }
       
   233 
       
   234 #ifdef PNG_FREE_ME_SUPPORTED
       
   235    png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0);
       
   236 #endif
       
   237    /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in version
       
   238       1.2.1 */
       
   239    png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr,
       
   240       (png_uint_32)(PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16)));
       
   241    if (png_ptr->hist == NULL)
       
   242      {
       
   243        png_warning(png_ptr, "Insufficient memory for hIST chunk data.");
       
   244        return;
       
   245      }
       
   246 
       
   247    for (i = 0; i < info_ptr->num_palette; i++)
       
   248        png_ptr->hist[i] = hist[i];
       
   249    info_ptr->hist = png_ptr->hist;
       
   250    info_ptr->valid |= PNG_INFO_hIST;
       
   251 
       
   252 #ifdef PNG_FREE_ME_SUPPORTED
       
   253    info_ptr->free_me |= PNG_FREE_HIST;
       
   254 #else
       
   255    png_ptr->flags |= PNG_FLAG_FREE_HIST;
       
   256 #endif
       
   257 }
       
   258 #endif
       
   259 
       
   260 void PNGAPI
       
   261 png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
       
   262    png_uint_32 width, png_uint_32 height, int bit_depth,
       
   263    int color_type, int interlace_type, int compression_type,
       
   264    int filter_type)
       
   265 {
       
   266    png_debug1(1, "in %s storage function\n", "IHDR");
       
   267    if (png_ptr == NULL || info_ptr == NULL)
       
   268       return;
       
   269 
       
   270    /* check for width and height valid values */
       
   271    if (width == 0 || height == 0)
       
   272       png_error(png_ptr, "Image width or height is zero in IHDR");
       
   273 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
       
   274    if (width > png_ptr->user_width_max || height > png_ptr->user_height_max)
       
   275       png_error(png_ptr, "image size exceeds user limits in IHDR");
       
   276 #else
       
   277    if (width > PNG_USER_WIDTH_MAX || height > PNG_USER_HEIGHT_MAX)
       
   278       png_error(png_ptr, "image size exceeds user limits in IHDR");
       
   279 #endif
       
   280    if (width > PNG_UINT_31_MAX || height > PNG_UINT_31_MAX)
       
   281       png_error(png_ptr, "Invalid image size in IHDR");
       
   282    if ( width > (PNG_UINT_32_MAX
       
   283                  >> 3)      /* 8-byte RGBA pixels */
       
   284                  - 64       /* bigrowbuf hack */
       
   285                  - 1        /* filter byte */
       
   286                  - 7*8      /* rounding of width to multiple of 8 pixels */
       
   287                  - 8)       /* extra max_pixel_depth pad */
       
   288       png_warning(png_ptr, "Width is too large for libpng to process pixels");
       
   289 
       
   290    /* check other values */
       
   291    if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 &&
       
   292       bit_depth != 8 && bit_depth != 16)
       
   293       png_error(png_ptr, "Invalid bit depth in IHDR");
       
   294 
       
   295    if (color_type < 0 || color_type == 1 ||
       
   296       color_type == 5 || color_type > 6)
       
   297       png_error(png_ptr, "Invalid color type in IHDR");
       
   298 
       
   299    if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) ||
       
   300        ((color_type == PNG_COLOR_TYPE_RGB ||
       
   301          color_type == PNG_COLOR_TYPE_GRAY_ALPHA ||
       
   302          color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8))
       
   303       png_error(png_ptr, "Invalid color type/bit depth combination in IHDR");
       
   304 
       
   305    if (interlace_type >= PNG_INTERLACE_LAST)
       
   306       png_error(png_ptr, "Unknown interlace method in IHDR");
       
   307 
       
   308    if (compression_type != PNG_COMPRESSION_TYPE_BASE)
       
   309       png_error(png_ptr, "Unknown compression method in IHDR");
       
   310 
       
   311 #if defined(PNG_MNG_FEATURES_SUPPORTED)
       
   312    /* Accept filter_method 64 (intrapixel differencing) only if
       
   313     * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
       
   314     * 2. Libpng did not read a PNG signature (this filter_method is only
       
   315     *    used in PNG datastreams that are embedded in MNG datastreams) and
       
   316     * 3. The application called png_permit_mng_features with a mask that
       
   317     *    included PNG_FLAG_MNG_FILTER_64 and
       
   318     * 4. The filter_method is 64 and
       
   319     * 5. The color_type is RGB or RGBA
       
   320     */
       
   321    if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted)
       
   322       png_warning(png_ptr, "MNG features are not allowed in a PNG datastream");
       
   323    if (filter_type != PNG_FILTER_TYPE_BASE)
       
   324    {
       
   325      if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
       
   326         (filter_type == PNG_INTRAPIXEL_DIFFERENCING) &&
       
   327         ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) &&
       
   328         (color_type == PNG_COLOR_TYPE_RGB ||
       
   329          color_type == PNG_COLOR_TYPE_RGB_ALPHA)))
       
   330         png_error(png_ptr, "Unknown filter method in IHDR");
       
   331      if (png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)
       
   332         png_warning(png_ptr, "Invalid filter method in IHDR");
       
   333    }
       
   334 #else
       
   335    if (filter_type != PNG_FILTER_TYPE_BASE)
       
   336       png_error(png_ptr, "Unknown filter method in IHDR");
       
   337 #endif
       
   338 
       
   339    info_ptr->width = width;
       
   340    info_ptr->height = height;
       
   341    info_ptr->bit_depth = (png_byte)bit_depth;
       
   342    info_ptr->color_type =(png_byte) color_type;
       
   343    info_ptr->compression_type = (png_byte)compression_type;
       
   344    info_ptr->filter_type = (png_byte)filter_type;
       
   345    info_ptr->interlace_type = (png_byte)interlace_type;
       
   346    if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
       
   347       info_ptr->channels = 1;
       
   348    else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
       
   349       info_ptr->channels = 3;
       
   350    else
       
   351       info_ptr->channels = 1;
       
   352    if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
       
   353       info_ptr->channels++;
       
   354    info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);
       
   355 
       
   356    /* check for potential overflow */
       
   357    if (width > (PNG_UINT_32_MAX
       
   358                  >> 3)      /* 8-byte RGBA pixels */
       
   359                  - 64       /* bigrowbuf hack */
       
   360                  - 1        /* filter byte */
       
   361                  - 7*8      /* rounding of width to multiple of 8 pixels */
       
   362                  - 8)       /* extra max_pixel_depth pad */
       
   363       info_ptr->rowbytes = (png_size_t)0;
       
   364    else
       
   365       info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
       
   366 }
       
   367 
       
   368 #if defined(PNG_oFFs_SUPPORTED)
       
   369 void PNGAPI
       
   370 png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
       
   371    png_int_32 offset_x, png_int_32 offset_y, int unit_type)
       
   372 {
       
   373    png_debug1(1, "in %s storage function\n", "oFFs");
       
   374    if (png_ptr == NULL || info_ptr == NULL)
       
   375       return;
       
   376 
       
   377    info_ptr->x_offset = offset_x;
       
   378    info_ptr->y_offset = offset_y;
       
   379    info_ptr->offset_unit_type = (png_byte)unit_type;
       
   380    info_ptr->valid |= PNG_INFO_oFFs;
       
   381 }
       
   382 #endif
       
   383 
       
   384 #if defined(PNG_pCAL_SUPPORTED)
       
   385 void PNGAPI
       
   386 png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
       
   387    png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams,
       
   388    png_charp units, png_charpp params)
       
   389 {
       
   390    png_uint_32 length;
       
   391    int i;
       
   392 
       
   393    png_debug1(1, "in %s storage function\n", "pCAL");
       
   394    if (png_ptr == NULL || info_ptr == NULL)
       
   395       return;
       
   396 
       
   397    length = png_strlen(purpose) + 1;
       
   398    png_debug1(3, "allocating purpose for info (%lu bytes)\n",
       
   399      (unsigned long)length);
       
   400    info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length);
       
   401    if (info_ptr->pcal_purpose == NULL)
       
   402    {
       
   403        png_warning(png_ptr, "Insufficient memory for pCAL purpose.");
       
   404       return;
       
   405    }
       
   406    png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length);
       
   407 
       
   408    png_debug(3, "storing X0, X1, type, and nparams in info\n");
       
   409    info_ptr->pcal_X0 = X0;
       
   410    info_ptr->pcal_X1 = X1;
       
   411    info_ptr->pcal_type = (png_byte)type;
       
   412    info_ptr->pcal_nparams = (png_byte)nparams;
       
   413 
       
   414    length = png_strlen(units) + 1;
       
   415    png_debug1(3, "allocating units for info (%lu bytes)\n",
       
   416      (unsigned long)length);
       
   417    info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length);
       
   418    if (info_ptr->pcal_units == NULL)
       
   419    {
       
   420        png_warning(png_ptr, "Insufficient memory for pCAL units.");
       
   421       return;
       
   422    }
       
   423    png_memcpy(info_ptr->pcal_units, units, (png_size_t)length);
       
   424 
       
   425    info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr,
       
   426       (png_uint_32)((nparams + 1) * png_sizeof(png_charp)));
       
   427    if (info_ptr->pcal_params == NULL)
       
   428    {
       
   429        png_warning(png_ptr, "Insufficient memory for pCAL params.");
       
   430       return;
       
   431    }
       
   432 
       
   433    info_ptr->pcal_params[nparams] = NULL;
       
   434 
       
   435    for (i = 0; i < nparams; i++)
       
   436    {
       
   437       length = png_strlen(params[i]) + 1;
       
   438       png_debug2(3, "allocating parameter %d for info (%lu bytes)\n", i,
       
   439         (unsigned long)length);
       
   440       info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length);
       
   441       if (info_ptr->pcal_params[i] == NULL)
       
   442       {
       
   443           png_warning(png_ptr, "Insufficient memory for pCAL parameter.");
       
   444           return;
       
   445       }
       
   446       png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length);
       
   447    }
       
   448 
       
   449    info_ptr->valid |= PNG_INFO_pCAL;
       
   450 #ifdef PNG_FREE_ME_SUPPORTED
       
   451    info_ptr->free_me |= PNG_FREE_PCAL;
       
   452 #endif
       
   453 }
       
   454 #endif
       
   455 
       
   456 #if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED)
       
   457 #ifdef PNG_FLOATING_POINT_SUPPORTED
       
   458 void PNGAPI
       
   459 png_set_sCAL(png_structp png_ptr, png_infop info_ptr,
       
   460              int unit, double width, double height)
       
   461 {
       
   462    png_debug1(1, "in %s storage function\n", "sCAL");
       
   463    if (png_ptr == NULL || info_ptr == NULL)
       
   464       return;
       
   465 
       
   466    info_ptr->scal_unit = (png_byte)unit;
       
   467    info_ptr->scal_pixel_width = width;
       
   468    info_ptr->scal_pixel_height = height;
       
   469 
       
   470    info_ptr->valid |= PNG_INFO_sCAL;
       
   471 }
       
   472 #else
       
   473 #ifdef PNG_FIXED_POINT_SUPPORTED
       
   474 void PNGAPI
       
   475 png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
       
   476              int unit, png_charp swidth, png_charp sheight)
       
   477 {
       
   478    png_uint_32 length;
       
   479 
       
   480    png_debug1(1, "in %s storage function\n", "sCAL");
       
   481    if (png_ptr == NULL || info_ptr == NULL)
       
   482       return;
       
   483 
       
   484    info_ptr->scal_unit = (png_byte)unit;
       
   485 
       
   486    length = png_strlen(swidth) + 1;
       
   487    png_debug1(3, "allocating unit for info (%u bytes)\n",
       
   488       (unsigned int)length);
       
   489    info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, length);
       
   490    if (info_ptr->scal_s_width == NULL)
       
   491    {
       
   492       png_warning(png_ptr,
       
   493        "Memory allocation failed while processing sCAL.");
       
   494       return;
       
   495    }
       
   496    png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length);
       
   497 
       
   498    length = png_strlen(sheight) + 1;
       
   499    png_debug1(3, "allocating unit for info (%u bytes)\n",
       
   500       (unsigned int)length);
       
   501    info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, length);
       
   502    if (info_ptr->scal_s_height == NULL)
       
   503    {
       
   504       png_free (png_ptr, info_ptr->scal_s_width);
       
   505       info_ptr->scal_s_width = NULL;
       
   506       png_warning(png_ptr,
       
   507        "Memory allocation failed while processing sCAL.");
       
   508       return;
       
   509    }
       
   510    png_memcpy(info_ptr->scal_s_height, sheight, (png_size_t)length);
       
   511    info_ptr->valid |= PNG_INFO_sCAL;
       
   512 #ifdef PNG_FREE_ME_SUPPORTED
       
   513    info_ptr->free_me |= PNG_FREE_SCAL;
       
   514 #endif
       
   515 }
       
   516 #endif
       
   517 #endif
       
   518 #endif
       
   519 
       
   520 #if defined(PNG_pHYs_SUPPORTED)
       
   521 void PNGAPI
       
   522 png_set_pHYs(png_structp png_ptr, png_infop info_ptr,
       
   523    png_uint_32 res_x, png_uint_32 res_y, int unit_type)
       
   524 {
       
   525    png_debug1(1, "in %s storage function\n", "pHYs");
       
   526    if (png_ptr == NULL || info_ptr == NULL)
       
   527       return;
       
   528 
       
   529    info_ptr->x_pixels_per_unit = res_x;
       
   530    info_ptr->y_pixels_per_unit = res_y;
       
   531    info_ptr->phys_unit_type = (png_byte)unit_type;
       
   532    info_ptr->valid |= PNG_INFO_pHYs;
       
   533 }
       
   534 #endif
       
   535 
       
   536 void PNGAPI
       
   537 png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
       
   538    png_colorp palette, int num_palette)
       
   539 {
       
   540 
       
   541    png_debug1(1, "in %s storage function\n", "PLTE");
       
   542    if (png_ptr == NULL || info_ptr == NULL)
       
   543       return;
       
   544 
       
   545    if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH)
       
   546      {
       
   547        if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
       
   548          png_error(png_ptr, "Invalid palette length");
       
   549        else
       
   550        {
       
   551          png_warning(png_ptr, "Invalid palette length");
       
   552          return;
       
   553        }
       
   554      }
       
   555 
       
   556    /*
       
   557     * It may not actually be necessary to set png_ptr->palette here;
       
   558     * we do it for backward compatibility with the way the png_handle_tRNS
       
   559     * function used to do the allocation.
       
   560     */
       
   561 #ifdef PNG_FREE_ME_SUPPORTED
       
   562    png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0);
       
   563 #endif
       
   564 
       
   565    /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead
       
   566       of num_palette entries,
       
   567       in case of an invalid PNG file that has too-large sample values. */
       
   568    png_ptr->palette = (png_colorp)png_malloc(png_ptr,
       
   569       PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color));
       
   570    png_memset(png_ptr->palette, 0, PNG_MAX_PALETTE_LENGTH *
       
   571       png_sizeof(png_color));
       
   572    png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color));
       
   573    info_ptr->palette = png_ptr->palette;
       
   574    info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
       
   575 
       
   576 #ifdef PNG_FREE_ME_SUPPORTED
       
   577    info_ptr->free_me |= PNG_FREE_PLTE;
       
   578 #else
       
   579    png_ptr->flags |= PNG_FLAG_FREE_PLTE;
       
   580 #endif
       
   581 
       
   582    info_ptr->valid |= PNG_INFO_PLTE;
       
   583 }
       
   584 
       
   585 #if defined(PNG_sBIT_SUPPORTED)
       
   586 void PNGAPI
       
   587 png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
       
   588    png_color_8p sig_bit)
       
   589 {
       
   590    png_debug1(1, "in %s storage function\n", "sBIT");
       
   591    if (png_ptr == NULL || info_ptr == NULL)
       
   592       return;
       
   593 
       
   594    png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8));
       
   595    info_ptr->valid |= PNG_INFO_sBIT;
       
   596 }
       
   597 #endif
       
   598 
       
   599 #if defined(PNG_sRGB_SUPPORTED)
       
   600 void PNGAPI
       
   601 png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent)
       
   602 {
       
   603    png_debug1(1, "in %s storage function\n", "sRGB");
       
   604    if (png_ptr == NULL || info_ptr == NULL)
       
   605       return;
       
   606 
       
   607    info_ptr->srgb_intent = (png_byte)intent;
       
   608    info_ptr->valid |= PNG_INFO_sRGB;
       
   609 }
       
   610 
       
   611 void PNGAPI
       
   612 png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
       
   613    int intent)
       
   614 {
       
   615 #if defined(PNG_gAMA_SUPPORTED)
       
   616 #ifdef PNG_FLOATING_POINT_SUPPORTED
       
   617    float file_gamma;
       
   618 #endif
       
   619 #ifdef PNG_FIXED_POINT_SUPPORTED
       
   620    png_fixed_point int_file_gamma;
       
   621 #endif
       
   622 #endif
       
   623 #if defined(PNG_cHRM_SUPPORTED)
       
   624 #ifdef PNG_FLOATING_POINT_SUPPORTED
       
   625    float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;
       
   626 #endif
       
   627 #ifdef PNG_FIXED_POINT_SUPPORTED
       
   628    png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
       
   629       int_green_y, int_blue_x, int_blue_y;
       
   630 #endif
       
   631 #endif
       
   632    png_debug1(1, "in %s storage function\n", "sRGB_gAMA_and_cHRM");
       
   633    if (png_ptr == NULL || info_ptr == NULL)
       
   634       return;
       
   635 
       
   636    png_set_sRGB(png_ptr, info_ptr, intent);
       
   637 
       
   638 #if defined(PNG_gAMA_SUPPORTED)
       
   639 #ifdef PNG_FLOATING_POINT_SUPPORTED
       
   640    file_gamma = (float).45455;
       
   641    png_set_gAMA(png_ptr, info_ptr, file_gamma);
       
   642 #endif
       
   643 #ifdef PNG_FIXED_POINT_SUPPORTED
       
   644    int_file_gamma = 45455L;
       
   645    png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma);
       
   646 #endif
       
   647 #endif
       
   648 
       
   649 #if defined(PNG_cHRM_SUPPORTED)
       
   650 #ifdef PNG_FIXED_POINT_SUPPORTED
       
   651    int_white_x = 31270L;
       
   652    int_white_y = 32900L;
       
   653    int_red_x   = 64000L;
       
   654    int_red_y   = 33000L;
       
   655    int_green_x = 30000L;
       
   656    int_green_y = 60000L;
       
   657    int_blue_x  = 15000L;
       
   658    int_blue_y  =  6000L;
       
   659 
       
   660    png_set_cHRM_fixed(png_ptr, info_ptr,
       
   661       int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, int_green_y,
       
   662       int_blue_x, int_blue_y);
       
   663 #endif
       
   664 #ifdef PNG_FLOATING_POINT_SUPPORTED
       
   665    white_x = (float).3127;
       
   666    white_y = (float).3290;
       
   667    red_x   = (float).64;
       
   668    red_y   = (float).33;
       
   669    green_x = (float).30;
       
   670    green_y = (float).60;
       
   671    blue_x  = (float).15;
       
   672    blue_y  = (float).06;
       
   673 
       
   674    png_set_cHRM(png_ptr, info_ptr,
       
   675       white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y);
       
   676 #endif
       
   677 #endif
       
   678 }
       
   679 #endif
       
   680 
       
   681 
       
   682 #if defined(PNG_iCCP_SUPPORTED)
       
   683 void PNGAPI
       
   684 png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
       
   685              png_charp name, int compression_type,
       
   686              png_charp profile, png_uint_32 proflen)
       
   687 {
       
   688    png_charp new_iccp_name;
       
   689    png_charp new_iccp_profile;
       
   690    png_uint_32 length;
       
   691 
       
   692    png_debug1(1, "in %s storage function\n", "iCCP");
       
   693    if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)
       
   694       return;
       
   695 
       
   696    length = png_strlen(name)+1;
       
   697    new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length);
       
   698    if (new_iccp_name == NULL)
       
   699    {
       
   700       png_warning(png_ptr, "Insufficient memory to process iCCP chunk.");
       
   701       return;
       
   702    }
       
   703    png_memcpy(new_iccp_name, name, length);
       
   704    new_iccp_profile = (png_charp)png_malloc_warn(png_ptr, proflen);
       
   705    if (new_iccp_profile == NULL)
       
   706    {
       
   707       png_free (png_ptr, new_iccp_name);
       
   708       png_warning(png_ptr,
       
   709       "Insufficient memory to process iCCP profile.");
       
   710       return;
       
   711    }
       
   712    png_memcpy(new_iccp_profile, profile, (png_size_t)proflen);
       
   713 
       
   714    png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0);
       
   715 
       
   716    info_ptr->iccp_proflen = proflen;
       
   717    info_ptr->iccp_name = new_iccp_name;
       
   718    info_ptr->iccp_profile = new_iccp_profile;
       
   719    /* Compression is always zero but is here so the API and info structure
       
   720     * does not have to change if we introduce multiple compression types */
       
   721    info_ptr->iccp_compression = (png_byte)compression_type;
       
   722 #ifdef PNG_FREE_ME_SUPPORTED
       
   723    info_ptr->free_me |= PNG_FREE_ICCP;
       
   724 #endif
       
   725    info_ptr->valid |= PNG_INFO_iCCP;
       
   726 }
       
   727 #endif
       
   728 
       
   729 #if defined(PNG_TEXT_SUPPORTED)
       
   730 void PNGAPI
       
   731 png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
       
   732    int num_text)
       
   733 {
       
   734    int ret;
       
   735    ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text);
       
   736    if (ret)
       
   737      png_error(png_ptr, "Insufficient memory to store text");
       
   738 }
       
   739 
       
   740 int /* PRIVATE */
       
   741 png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
       
   742    int num_text)
       
   743 {
       
   744    int i;
       
   745 
       
   746    png_debug1(1, "in %s storage function\n", (png_ptr->chunk_name[0] == '\0' ?
       
   747       "text" : (png_const_charp)png_ptr->chunk_name));
       
   748 
       
   749    if (png_ptr == NULL || info_ptr == NULL || num_text == 0)
       
   750       return(0);
       
   751 
       
   752    /* Make sure we have enough space in the "text" array in info_struct
       
   753     * to hold all of the incoming text_ptr objects.
       
   754     */
       
   755    if (info_ptr->num_text + num_text > info_ptr->max_text)
       
   756    {
       
   757       if (info_ptr->text != NULL)
       
   758       {
       
   759          png_textp old_text;
       
   760          int old_max;
       
   761 
       
   762          old_max = info_ptr->max_text;
       
   763          info_ptr->max_text = info_ptr->num_text + num_text + 8;
       
   764          old_text = info_ptr->text;
       
   765          info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
       
   766             (png_uint_32)(info_ptr->max_text * png_sizeof(png_text)));
       
   767          if (info_ptr->text == NULL)
       
   768            {
       
   769              png_free(png_ptr, old_text);
       
   770              return(1);
       
   771            }
       
   772          png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max *
       
   773             png_sizeof(png_text)));
       
   774          png_free(png_ptr, old_text);
       
   775       }
       
   776       else
       
   777       {
       
   778          info_ptr->max_text = num_text + 8;
       
   779          info_ptr->num_text = 0;
       
   780          info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
       
   781             (png_uint_32)(info_ptr->max_text * png_sizeof(png_text)));
       
   782          if (info_ptr->text == NULL)
       
   783            return(1);
       
   784 #ifdef PNG_FREE_ME_SUPPORTED
       
   785          info_ptr->free_me |= PNG_FREE_TEXT;
       
   786 #endif
       
   787       }
       
   788       png_debug1(3, "allocated %d entries for info_ptr->text\n",
       
   789          info_ptr->max_text);
       
   790    }
       
   791    for (i = 0; i < num_text; i++)
       
   792    {
       
   793       png_size_t text_length, key_len;
       
   794       png_size_t lang_len, lang_key_len;
       
   795       png_textp textp = &(info_ptr->text[info_ptr->num_text]);
       
   796 
       
   797       if (text_ptr[i].key == NULL)
       
   798           continue;
       
   799 
       
   800       key_len = png_strlen(text_ptr[i].key);
       
   801 
       
   802       if (text_ptr[i].compression <= 0)
       
   803       {
       
   804         lang_len = 0;
       
   805         lang_key_len = 0;
       
   806       }
       
   807       else
       
   808 #ifdef PNG_iTXt_SUPPORTED
       
   809       {
       
   810         /* set iTXt data */
       
   811         if (text_ptr[i].lang != NULL)
       
   812           lang_len = png_strlen(text_ptr[i].lang);
       
   813         else
       
   814           lang_len = 0;
       
   815         if (text_ptr[i].lang_key != NULL)
       
   816           lang_key_len = png_strlen(text_ptr[i].lang_key);
       
   817         else
       
   818           lang_key_len = 0;
       
   819       }
       
   820 #else
       
   821       {
       
   822         png_warning(png_ptr, "iTXt chunk not supported.");
       
   823         continue;
       
   824       }
       
   825 #endif
       
   826 
       
   827       if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0')
       
   828       {
       
   829          text_length = 0;
       
   830 #ifdef PNG_iTXt_SUPPORTED
       
   831          if (text_ptr[i].compression > 0)
       
   832             textp->compression = PNG_ITXT_COMPRESSION_NONE;
       
   833          else
       
   834 #endif
       
   835             textp->compression = PNG_TEXT_COMPRESSION_NONE;
       
   836       }
       
   837       else
       
   838       {
       
   839          text_length = png_strlen(text_ptr[i].text);
       
   840          textp->compression = text_ptr[i].compression;
       
   841       }
       
   842 
       
   843       textp->key = (png_charp)png_malloc_warn(png_ptr,
       
   844          (png_uint_32)
       
   845          (key_len + text_length + lang_len + lang_key_len + 4));
       
   846       if (textp->key == NULL)
       
   847         return(1);
       
   848       png_debug2(2, "Allocated %lu bytes at %x in png_set_text\n",
       
   849          (png_uint_32)
       
   850          (key_len + lang_len + lang_key_len + text_length + 4),
       
   851          (int)textp->key);
       
   852 
       
   853       png_memcpy(textp->key, text_ptr[i].key,
       
   854          (png_size_t)(key_len));
       
   855       *(textp->key + key_len) = '\0';
       
   856 #ifdef PNG_iTXt_SUPPORTED
       
   857       if (text_ptr[i].compression > 0)
       
   858       {
       
   859          textp->lang = textp->key + key_len + 1;
       
   860          png_memcpy(textp->lang, text_ptr[i].lang, lang_len);
       
   861          *(textp->lang + lang_len) = '\0';
       
   862          textp->lang_key = textp->lang + lang_len + 1;
       
   863          png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);
       
   864          *(textp->lang_key + lang_key_len) = '\0';
       
   865          textp->text = textp->lang_key + lang_key_len + 1;
       
   866       }
       
   867       else
       
   868 #endif
       
   869       {
       
   870 #ifdef PNG_iTXt_SUPPORTED
       
   871          textp->lang=NULL;
       
   872          textp->lang_key=NULL;
       
   873 #endif
       
   874          textp->text = textp->key + key_len + 1;
       
   875       }
       
   876       if (text_length)
       
   877          png_memcpy(textp->text, text_ptr[i].text,
       
   878             (png_size_t)(text_length));
       
   879       *(textp->text + text_length) = '\0';
       
   880 
       
   881 #ifdef PNG_iTXt_SUPPORTED
       
   882       if (textp->compression > 0)
       
   883       {
       
   884          textp->text_length = 0;
       
   885          textp->itxt_length = text_length;
       
   886       }
       
   887       else
       
   888 #endif
       
   889       {
       
   890          textp->text_length = text_length;
       
   891 #ifdef PNG_iTXt_SUPPORTED
       
   892          textp->itxt_length = 0;
       
   893 #endif
       
   894       }
       
   895       info_ptr->num_text++;
       
   896       png_debug1(3, "transferred text chunk %d\n", info_ptr->num_text);
       
   897    }
       
   898    return(0);
       
   899 }
       
   900 #endif
       
   901 
       
   902 #if defined(PNG_tIME_SUPPORTED)
       
   903 void PNGAPI
       
   904 png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time)
       
   905 {
       
   906    png_debug1(1, "in %s storage function\n", "tIME");
       
   907    if (png_ptr == NULL || info_ptr == NULL ||
       
   908        (png_ptr->mode & PNG_WROTE_tIME))
       
   909       return;
       
   910 
       
   911    png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time));
       
   912    info_ptr->valid |= PNG_INFO_tIME;
       
   913 }
       
   914 #endif
       
   915 
       
   916 #if defined(PNG_tRNS_SUPPORTED)
       
   917 void PNGAPI
       
   918 png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
       
   919    png_bytep trans, int num_trans, png_color_16p trans_values)
       
   920 {
       
   921    png_debug1(1, "in %s storage function\n", "tRNS");
       
   922    if (png_ptr == NULL || info_ptr == NULL)
       
   923       return;
       
   924 
       
   925    if (trans != NULL)
       
   926    {
       
   927        /*
       
   928         * It may not actually be necessary to set png_ptr->trans here;
       
   929         * we do it for backward compatibility with the way the png_handle_tRNS
       
   930         * function used to do the allocation.
       
   931         */
       
   932 
       
   933 #ifdef PNG_FREE_ME_SUPPORTED
       
   934        png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
       
   935 #endif
       
   936 
       
   937        /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */
       
   938        png_ptr->trans = info_ptr->trans = (png_bytep)png_malloc(png_ptr,
       
   939            (png_uint_32)PNG_MAX_PALETTE_LENGTH);
       
   940        if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH)
       
   941          png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans);
       
   942    }
       
   943 
       
   944    if (trans_values != NULL)
       
   945    {
       
   946       int sample_max = (1 << info_ptr->bit_depth);
       
   947       if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY &&
       
   948           (int)trans_values->gray > sample_max) ||
       
   949           (info_ptr->color_type == PNG_COLOR_TYPE_RGB &&
       
   950           ((int)trans_values->red > sample_max ||
       
   951           (int)trans_values->green > sample_max ||
       
   952           (int)trans_values->blue > sample_max)))
       
   953         png_warning(png_ptr,
       
   954            "tRNS chunk has out-of-range samples for bit_depth");
       
   955       png_memcpy(&(info_ptr->trans_values), trans_values,
       
   956          png_sizeof(png_color_16));
       
   957       if (num_trans == 0)
       
   958         num_trans = 1;
       
   959    }
       
   960 
       
   961    info_ptr->num_trans = (png_uint_16)num_trans;
       
   962    if (num_trans != 0)
       
   963    {
       
   964       info_ptr->valid |= PNG_INFO_tRNS;
       
   965 #ifdef PNG_FREE_ME_SUPPORTED
       
   966       info_ptr->free_me |= PNG_FREE_TRNS;
       
   967 #else
       
   968       png_ptr->flags |= PNG_FLAG_FREE_TRNS;
       
   969 #endif
       
   970    }
       
   971 }
       
   972 #endif
       
   973 
       
   974 #if defined(PNG_sPLT_SUPPORTED)
       
   975 void PNGAPI
       
   976 png_set_sPLT(png_structp png_ptr,
       
   977              png_infop info_ptr, png_sPLT_tp entries, int nentries)
       
   978 /*
       
   979  *  entries        - array of png_sPLT_t structures
       
   980  *                   to be added to the list of palettes
       
   981  *                   in the info structure.
       
   982  *  nentries       - number of palette structures to be
       
   983  *                   added.
       
   984  */
       
   985 {
       
   986     png_sPLT_tp np;
       
   987     int i;
       
   988 
       
   989     if (png_ptr == NULL || info_ptr == NULL)
       
   990        return;
       
   991 
       
   992     np = (png_sPLT_tp)png_malloc_warn(png_ptr,
       
   993         (info_ptr->splt_palettes_num + nentries) *
       
   994         (png_uint_32)png_sizeof(png_sPLT_t));
       
   995     if (np == NULL)
       
   996     {
       
   997       png_warning(png_ptr, "No memory for sPLT palettes.");
       
   998       return;
       
   999     }
       
  1000 
       
  1001     png_memcpy(np, info_ptr->splt_palettes,
       
  1002            info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t));
       
  1003     png_free(png_ptr, info_ptr->splt_palettes);
       
  1004     info_ptr->splt_palettes=NULL;
       
  1005 
       
  1006     for (i = 0; i < nentries; i++)
       
  1007     {
       
  1008         png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
       
  1009         png_sPLT_tp from = entries + i;
       
  1010         png_uint_32 length;
       
  1011 
       
  1012         length = png_strlen(from->name) + 1;
       
  1013         to->name = (png_charp)png_malloc_warn(png_ptr, length);
       
  1014         if (to->name == NULL)
       
  1015         {
       
  1016            png_warning(png_ptr,
       
  1017              "Out of memory while processing sPLT chunk");
       
  1018            continue;
       
  1019         }
       
  1020         png_memcpy(to->name, from->name, length);
       
  1021         to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr,
       
  1022             (png_uint_32)(from->nentries * png_sizeof(png_sPLT_entry)));
       
  1023         if (to->entries == NULL)
       
  1024         {
       
  1025            png_warning(png_ptr,
       
  1026              "Out of memory while processing sPLT chunk");
       
  1027            png_free(png_ptr, to->name);
       
  1028            to->name = NULL;
       
  1029            continue;
       
  1030         }
       
  1031         png_memcpy(to->entries, from->entries,
       
  1032             from->nentries * png_sizeof(png_sPLT_entry));
       
  1033         to->nentries = from->nentries;
       
  1034         to->depth = from->depth;
       
  1035     }
       
  1036 
       
  1037     info_ptr->splt_palettes = np;
       
  1038     info_ptr->splt_palettes_num += nentries;
       
  1039     info_ptr->valid |= PNG_INFO_sPLT;
       
  1040 #ifdef PNG_FREE_ME_SUPPORTED
       
  1041     info_ptr->free_me |= PNG_FREE_SPLT;
       
  1042 #endif
       
  1043 }
       
  1044 #endif /* PNG_sPLT_SUPPORTED */
       
  1045 
       
  1046 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
       
  1047 void PNGAPI
       
  1048 png_set_unknown_chunks(png_structp png_ptr,
       
  1049    png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)
       
  1050 {
       
  1051     png_unknown_chunkp np;
       
  1052     int i;
       
  1053 
       
  1054     if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0)
       
  1055         return;
       
  1056 
       
  1057     np = (png_unknown_chunkp)png_malloc_warn(png_ptr,
       
  1058         (png_uint_32)((info_ptr->unknown_chunks_num + num_unknowns) *
       
  1059         png_sizeof(png_unknown_chunk)));
       
  1060     if (np == NULL)
       
  1061     {
       
  1062        png_warning(png_ptr,
       
  1063           "Out of memory while processing unknown chunk.");
       
  1064        return;
       
  1065     }
       
  1066 
       
  1067     png_memcpy(np, info_ptr->unknown_chunks,
       
  1068            info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk));
       
  1069     png_free(png_ptr, info_ptr->unknown_chunks);
       
  1070     info_ptr->unknown_chunks=NULL;
       
  1071 
       
  1072     for (i = 0; i < num_unknowns; i++)
       
  1073     {
       
  1074        png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i;
       
  1075        png_unknown_chunkp from = unknowns + i;
       
  1076 
       
  1077        png_memcpy((png_charp)to->name, 
       
  1078                   (png_charp)from->name, 
       
  1079                   png_sizeof(from->name));
       
  1080        to->name[png_sizeof(to->name)-1] = '\0';
       
  1081        to->size = from->size;
       
  1082        /* note our location in the read or write sequence */
       
  1083        to->location = (png_byte)(png_ptr->mode & 0xff);
       
  1084 
       
  1085        if (from->size == 0)
       
  1086           to->data=NULL;
       
  1087        else
       
  1088        {
       
  1089           to->data = (png_bytep)png_malloc_warn(png_ptr,
       
  1090             (png_uint_32)from->size);
       
  1091           if (to->data == NULL)
       
  1092           {
       
  1093              png_warning(png_ptr,
       
  1094               "Out of memory while processing unknown chunk.");
       
  1095              to->size = 0;
       
  1096           }
       
  1097           else
       
  1098              png_memcpy(to->data, from->data, from->size);
       
  1099        }
       
  1100     }
       
  1101 
       
  1102     info_ptr->unknown_chunks = np;
       
  1103     info_ptr->unknown_chunks_num += num_unknowns;
       
  1104 #ifdef PNG_FREE_ME_SUPPORTED
       
  1105     info_ptr->free_me |= PNG_FREE_UNKN;
       
  1106 #endif
       
  1107 }
       
  1108 void PNGAPI
       
  1109 png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr,
       
  1110    int chunk, int location)
       
  1111 {
       
  1112    if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk <
       
  1113          (int)info_ptr->unknown_chunks_num)
       
  1114       info_ptr->unknown_chunks[chunk].location = (png_byte)location;
       
  1115 }
       
  1116 #endif
       
  1117 
       
  1118 #if defined(PNG_1_0_X) || defined(PNG_1_2_X)
       
  1119 #if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
       
  1120     defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
       
  1121 void PNGAPI
       
  1122 png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)
       
  1123 {
       
  1124    /* This function is deprecated in favor of png_permit_mng_features()
       
  1125       and will be removed from libpng-1.3.0 */
       
  1126    png_debug(1, "in png_permit_empty_plte, DEPRECATED.\n");
       
  1127    if (png_ptr == NULL)
       
  1128       return;
       
  1129    png_ptr->mng_features_permitted = (png_byte)
       
  1130      ((png_ptr->mng_features_permitted & (~PNG_FLAG_MNG_EMPTY_PLTE)) |
       
  1131      ((empty_plte_permitted & PNG_FLAG_MNG_EMPTY_PLTE)));
       
  1132 }
       
  1133 #endif
       
  1134 #endif
       
  1135 
       
  1136 #if defined(PNG_MNG_FEATURES_SUPPORTED)
       
  1137 png_uint_32 PNGAPI
       
  1138 png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features)
       
  1139 {
       
  1140    png_debug(1, "in png_permit_mng_features\n");
       
  1141    if (png_ptr == NULL)
       
  1142       return (png_uint_32)0;
       
  1143    png_ptr->mng_features_permitted =
       
  1144      (png_byte)(mng_features & PNG_ALL_MNG_FEATURES);
       
  1145    return (png_uint_32)png_ptr->mng_features_permitted;
       
  1146 }
       
  1147 #endif
       
  1148 
       
  1149 #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
       
  1150 void PNGAPI
       
  1151 png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep
       
  1152    chunk_list, int num_chunks)
       
  1153 {
       
  1154     png_bytep new_list, p;
       
  1155     int i, old_num_chunks;
       
  1156     if (png_ptr == NULL)
       
  1157        return;
       
  1158     if (num_chunks == 0)
       
  1159     {
       
  1160       if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE)
       
  1161         png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
       
  1162       else
       
  1163         png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
       
  1164 
       
  1165       if (keep == PNG_HANDLE_CHUNK_ALWAYS)
       
  1166         png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS;
       
  1167       else
       
  1168         png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS;
       
  1169       return;
       
  1170     }
       
  1171     if (chunk_list == NULL)
       
  1172       return;
       
  1173     old_num_chunks = png_ptr->num_chunk_list;
       
  1174     new_list=(png_bytep)png_malloc(png_ptr,
       
  1175        (png_uint_32)
       
  1176        (5*(num_chunks + old_num_chunks)));
       
  1177     if (png_ptr->chunk_list != NULL)
       
  1178     {
       
  1179        png_memcpy(new_list, png_ptr->chunk_list,
       
  1180           (png_size_t)(5*old_num_chunks));
       
  1181        png_free(png_ptr, png_ptr->chunk_list);
       
  1182        png_ptr->chunk_list=NULL;
       
  1183     }
       
  1184     png_memcpy(new_list + 5*old_num_chunks, chunk_list,
       
  1185        (png_size_t)(5*num_chunks));
       
  1186     for (p = new_list + 5*old_num_chunks + 4, i = 0; i<num_chunks; i++, p += 5)
       
  1187        *p=(png_byte)keep;
       
  1188     png_ptr->num_chunk_list = old_num_chunks + num_chunks;
       
  1189     png_ptr->chunk_list = new_list;
       
  1190 #ifdef PNG_FREE_ME_SUPPORTED
       
  1191     png_ptr->free_me |= PNG_FREE_LIST;
       
  1192 #endif
       
  1193 }
       
  1194 #endif
       
  1195 
       
  1196 #if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
       
  1197 void PNGAPI
       
  1198 png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
       
  1199    png_user_chunk_ptr read_user_chunk_fn)
       
  1200 {
       
  1201    png_debug(1, "in png_set_read_user_chunk_fn\n");
       
  1202    if (png_ptr == NULL)
       
  1203       return;
       
  1204    png_ptr->read_user_chunk_fn = read_user_chunk_fn;
       
  1205    png_ptr->user_chunk_ptr = user_chunk_ptr;
       
  1206 }
       
  1207 #endif
       
  1208 
       
  1209 #if defined(PNG_INFO_IMAGE_SUPPORTED)
       
  1210 void PNGAPI
       
  1211 png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)
       
  1212 {
       
  1213    png_debug1(1, "in %s storage function\n", "rows");
       
  1214 
       
  1215    if (png_ptr == NULL || info_ptr == NULL)
       
  1216       return;
       
  1217 
       
  1218    if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
       
  1219       png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
       
  1220    info_ptr->row_pointers = row_pointers;
       
  1221    if (row_pointers)
       
  1222       info_ptr->valid |= PNG_INFO_IDAT;
       
  1223 }
       
  1224 #endif
       
  1225 
       
  1226 #ifdef PNG_WRITE_SUPPORTED
       
  1227 void PNGAPI
       
  1228 png_set_compression_buffer_size(png_structp png_ptr,
       
  1229     png_uint_32 size)
       
  1230 {
       
  1231     if (png_ptr == NULL)
       
  1232        return;
       
  1233     png_free(png_ptr, png_ptr->zbuf);
       
  1234     png_ptr->zbuf_size = (png_size_t)size;
       
  1235     png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size);
       
  1236     png_ptr->zstream.next_out = png_ptr->zbuf;
       
  1237     png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
       
  1238 }
       
  1239 #endif
       
  1240 
       
  1241 void PNGAPI
       
  1242 png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask)
       
  1243 {
       
  1244    if (png_ptr && info_ptr)
       
  1245       info_ptr->valid &= ~mask;
       
  1246 }
       
  1247 
       
  1248 
       
  1249 #ifndef PNG_1_0_X
       
  1250 #ifdef PNG_ASSEMBLER_CODE_SUPPORTED
       
  1251 /* function was added to libpng 1.2.0 and should always exist by default */
       
  1252 void PNGAPI
       
  1253 png_set_asm_flags (png_structp png_ptr, png_uint_32 asm_flags)
       
  1254 {
       
  1255 /* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */
       
  1256     if (png_ptr != NULL)
       
  1257     png_ptr->asm_flags = 0;
       
  1258     asm_flags = asm_flags; /* Quiet the compiler */
       
  1259 }
       
  1260 
       
  1261 /* this function was added to libpng 1.2.0 */
       
  1262 void PNGAPI
       
  1263 png_set_mmx_thresholds (png_structp png_ptr,
       
  1264                         png_byte mmx_bitdepth_threshold,
       
  1265                         png_uint_32 mmx_rowbytes_threshold)
       
  1266 {
       
  1267 /* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */
       
  1268     if (png_ptr == NULL)
       
  1269        return;
       
  1270     /* Quiet the compiler */
       
  1271     mmx_bitdepth_threshold = mmx_bitdepth_threshold;
       
  1272     mmx_rowbytes_threshold = mmx_rowbytes_threshold;
       
  1273 }
       
  1274 #endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */
       
  1275 
       
  1276 #ifdef PNG_SET_USER_LIMITS_SUPPORTED
       
  1277 /* this function was added to libpng 1.2.6 */
       
  1278 void PNGAPI
       
  1279 png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max,
       
  1280     png_uint_32 user_height_max)
       
  1281 {
       
  1282     /* Images with dimensions larger than these limits will be
       
  1283      * rejected by png_set_IHDR().  To accept any PNG datastream
       
  1284      * regardless of dimensions, set both limits to 0x7ffffffL.
       
  1285      */
       
  1286     if (png_ptr == NULL) return;
       
  1287     png_ptr->user_width_max = user_width_max;
       
  1288     png_ptr->user_height_max = user_height_max;
       
  1289 }
       
  1290 #endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */
       
  1291 
       
  1292 #endif /* ?PNG_1_0_X */
       
  1293 #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */