1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* pngset.c - storage of image information into info struct 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Last changed in libpng 1.5.11 [June 14, 2012] 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * Copyright (c) 1998-2012 Glenn Randers-Pehrson 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * This code is released under the libpng license. 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * For conditions of distribution and use, see the disclaimer 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * and license in png.h 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * The functions here are used during reads to store data from the file 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * into the info struct, and during writes to store application data 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * into the info struct for writing into the file. This abstracts the 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * info struct and allows us to change the structure in the future. 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "pngpriv.h" 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_bKGD_SUPPORTED 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_bKGD(png_structp png_ptr, png_infop info_ptr, 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_const_color_16p background) 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "bKGD"); 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16)); 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_bKGD; 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_cHRM_SUPPORTED 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGFAPI 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed_point blue_x, png_fixed_point blue_y) 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "cHRM fixed"); 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# ifdef PNG_CHECK_cHRM_SUPPORTED 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_check_cHRM_fixed(png_ptr, 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y)) 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->x_white = white_x; 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->y_white = white_y; 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->x_red = red_x; 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->y_red = red_y; 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->x_green = green_x; 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->y_green = green_y; 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->x_blue = blue_x; 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->y_blue = blue_y; 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_cHRM; 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGFAPI 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_cHRM_XYZ_fixed(png_structp png_ptr, png_infop info_ptr, 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed_point int_red_X, png_fixed_point int_red_Y, 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed_point int_red_Z, png_fixed_point int_green_X, 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed_point int_green_Y, png_fixed_point int_green_Z, 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed_point int_blue_X, png_fixed_point int_blue_Y, 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed_point int_blue_Z) 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_XYZ XYZ; 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_xy xy; 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "cHRM XYZ fixed"); 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler XYZ.redX = int_red_X; 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler XYZ.redY = int_red_Y; 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler XYZ.redZ = int_red_Z; 86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler XYZ.greenX = int_green_X; 87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler XYZ.greenY = int_green_Y; 88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler XYZ.greenZ = int_green_Z; 89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler XYZ.blueX = int_blue_X; 90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler XYZ.blueY = int_blue_Y; 91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler XYZ.blueZ = int_blue_Z; 92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_xy_from_XYZ(&xy, XYZ)) 94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_error(png_ptr, "XYZ values out of representable range"); 95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_set_cHRM_fixed(png_ptr, info_ptr, xy.whitex, xy.whitey, xy.redx, xy.redy, 97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler xy.greenx, xy.greeny, xy.bluex, xy.bluey); 98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# ifdef PNG_FLOATING_POINT_SUPPORTED 101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_cHRM(png_structp png_ptr, png_infop info_ptr, 103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double white_x, double white_y, double red_x, double red_y, 104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double green_x, double green_y, double blue_x, double blue_y) 105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_set_cHRM_fixed(png_ptr, info_ptr, 107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, white_x, "cHRM White X"), 108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, white_y, "cHRM White Y"), 109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, red_x, "cHRM Red X"), 110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, red_y, "cHRM Red Y"), 111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, green_x, "cHRM Green X"), 112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, green_y, "cHRM Green Y"), 113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, blue_x, "cHRM Blue X"), 114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, blue_y, "cHRM Blue Y")); 115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_cHRM_XYZ(png_structp png_ptr, png_infop info_ptr, double red_X, 119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double red_Y, double red_Z, double green_X, double green_Y, double green_Z, 120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double blue_X, double blue_Y, double blue_Z) 121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_set_cHRM_XYZ_fixed(png_ptr, info_ptr, 123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, red_X, "cHRM Red X"), 124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, red_Y, "cHRM Red Y"), 125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, red_Z, "cHRM Red Z"), 126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, green_X, "cHRM Red X"), 127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, green_Y, "cHRM Red Y"), 128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, green_Z, "cHRM Red Z"), 129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, blue_X, "cHRM Red X"), 130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, blue_Y, "cHRM Red Y"), 131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed(png_ptr, blue_Z, "cHRM Red Z")); 132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif /* PNG_FLOATING_POINT_SUPPORTED */ 134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* PNG_cHRM_SUPPORTED */ 136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_gAMA_SUPPORTED 138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGFAPI 139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point 140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler file_gamma) 141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "gAMA"); 143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Changed in libpng-1.5.4 to limit the values to ensure overflow can't 148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * occur. Since the fixed point representation is assymetrical it is 149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * possible for 1/gamma to overflow the limit of 21474 and this means the 150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * gamma value must be at least 5/100000 and hence at most 20000.0. For 151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * safety the limits here are a little narrower. The values are 0.00016 to 152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * 6250.0, which are truly ridiculous gamma values (and will produce 153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * displays that are all black or all white.) 154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (file_gamma < 16 || file_gamma > 625000000) 156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Out of range gamma value ignored"); 157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->gamma = file_gamma; 161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_gAMA; 162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# ifdef PNG_FLOATING_POINT_SUPPORTED 166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma) 168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_set_gAMA_fixed(png_ptr, info_ptr, png_fixed(png_ptr, file_gamma, 170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "png_set_gAMA")); 171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif 173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_hIST_SUPPORTED 176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_hIST(png_structp png_ptr, png_infop info_ptr, png_const_uint_16p hist) 178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i; 180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "hIST"); 182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->num_palette == 0 || info_ptr->num_palette 187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler > PNG_MAX_PALETTE_LENGTH) 188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, 190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "Invalid palette size, hIST allocation skipped"); 191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); 196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in 198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * version 1.2.1 199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr, 201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16)); 202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr->hist == NULL) 204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Insufficient memory for hIST chunk data"); 206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (i = 0; i < info_ptr->num_palette; i++) 210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->hist[i] = hist[i]; 211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->hist = png_ptr->hist; 213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_hIST; 214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->free_me |= PNG_FREE_HIST; 215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_IHDR(png_structp png_ptr, png_infop info_ptr, 220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_uint_32 width, png_uint_32 height, int bit_depth, 221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int color_type, int interlace_type, int compression_type, 222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int filter_type) 223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "IHDR"); 225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->width = width; 230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->height = height; 231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->bit_depth = (png_byte)bit_depth; 232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->color_type = (png_byte)color_type; 233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->compression_type = (png_byte)compression_type; 234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->filter_type = (png_byte)filter_type; 235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->interlace_type = (png_byte)interlace_type; 236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height, 238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type, 239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->compression_type, info_ptr->filter_type); 240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->channels = 1; 243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) 245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->channels = 3; 246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->channels = 1; 249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) 251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->channels++; 252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); 254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Check for potential overflow */ 256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (width > 257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (PNG_UINT_32_MAX >> 3) /* 8-byte RRGGBBAA pixels */ 258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - 48 /* bigrowbuf hack */ 259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - 1 /* filter byte */ 260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - 7*8 /* rounding of width to multiple of 8 pixels */ 261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler - 8) /* extra max_pixel_depth pad */ 262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->rowbytes = 0; 263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); 265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_oFFs_SUPPORTED 268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_oFFs(png_structp png_ptr, png_infop info_ptr, 270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_int_32 offset_x, png_int_32 offset_y, int unit_type) 271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "oFFs"); 273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->x_offset = offset_x; 278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->y_offset = offset_y; 279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->offset_unit_type = (png_byte)unit_type; 280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_oFFs; 281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_pCAL_SUPPORTED 285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_pCAL(png_structp png_ptr, png_infop info_ptr, 287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type, 288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int nparams, png_const_charp units, png_charpp params) 289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_size_t length; 291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i; 292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "pCAL"); 294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler length = png_strlen(purpose) + 1; 299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(3, "allocating purpose for info (%lu bytes)", 300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (unsigned long)length); 301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* TODO: validate format of calibration name and unit name */ 303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Check that the type matches the specification. */ 305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (type < 0 || type > 3) 306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_error(png_ptr, "Invalid pCAL equation type"); 307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Validate params[nparams] */ 309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (i=0; i<nparams; ++i) 310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (!png_check_fp_string(params[i], png_strlen(params[i]))) 311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_error(png_ptr, "Invalid format for pCAL parameter"); 312793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 313793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length); 314793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 315793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->pcal_purpose == NULL) 316793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 317793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Insufficient memory for pCAL purpose"); 318793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 319793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 320793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 321793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(info_ptr->pcal_purpose, purpose, length); 322793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 323793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug(3, "storing X0, X1, type, and nparams in info"); 324793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->pcal_X0 = X0; 325793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->pcal_X1 = X1; 326793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->pcal_type = (png_byte)type; 327793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->pcal_nparams = (png_byte)nparams; 328793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 329793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler length = png_strlen(units) + 1; 330793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(3, "allocating units for info (%lu bytes)", 331793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (unsigned long)length); 332793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 333793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length); 334793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 335793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->pcal_units == NULL) 336793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 337793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Insufficient memory for pCAL units"); 338793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 339793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 340793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 341793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(info_ptr->pcal_units, units, length); 342793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 343793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr, 344793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)((nparams + 1) * png_sizeof(png_charp))); 345793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 346793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->pcal_params == NULL) 347793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 348793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Insufficient memory for pCAL params"); 349793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 350793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 351793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 352793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memset(info_ptr->pcal_params, 0, (nparams + 1) * png_sizeof(png_charp)); 353793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 354793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (i = 0; i < nparams; i++) 355793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 356793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler length = png_strlen(params[i]) + 1; 357793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug2(3, "allocating parameter %d for info (%lu bytes)", i, 358793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (unsigned long)length); 359793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 360793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length); 361793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 362793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->pcal_params[i] == NULL) 363793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 364793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Insufficient memory for pCAL parameter"); 365793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 366793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 367793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 368793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(info_ptr->pcal_params[i], params[i], length); 369793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 370793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 371793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_pCAL; 372793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->free_me |= PNG_FREE_PCAL; 373793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 374793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 375793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 376793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_sCAL_SUPPORTED 377793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 378793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sCAL_s(png_structp png_ptr, png_infop info_ptr, 379793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int unit, png_const_charp swidth, png_const_charp sheight) 380793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 381793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_size_t lengthw = 0, lengthh = 0; 382793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 383793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "sCAL"); 384793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 385793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 386793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 387793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 388793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Double check the unit (should never get here with an invalid 389793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * unit unless this is an API call.) 390793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 391793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (unit != 1 && unit != 2) 392793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_error(png_ptr, "Invalid sCAL unit"); 393793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 394793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (swidth == NULL || (lengthw = png_strlen(swidth)) == 0 || 395793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler swidth[0] == 45 /* '-' */ || !png_check_fp_string(swidth, lengthw)) 396793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_error(png_ptr, "Invalid sCAL width"); 397793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 398793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (sheight == NULL || (lengthh = png_strlen(sheight)) == 0 || 399793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler sheight[0] == 45 /* '-' */ || !png_check_fp_string(sheight, lengthh)) 400793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_error(png_ptr, "Invalid sCAL height"); 401793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 402793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->scal_unit = (png_byte)unit; 403793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 404793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ++lengthw; 405793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 406793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthw); 407793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 408793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, lengthw); 409793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 410793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->scal_s_width == NULL) 411793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 412793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Memory allocation failed while processing sCAL"); 413793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 414793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 415793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 416793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(info_ptr->scal_s_width, swidth, lengthw); 417793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 418793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ++lengthh; 419793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 420793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthh); 421793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 422793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, lengthh); 423793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 424793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->scal_s_height == NULL) 425793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 426793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free (png_ptr, info_ptr->scal_s_width); 427793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->scal_s_width = NULL; 428793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 429793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Memory allocation failed while processing sCAL"); 430793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 431793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 432793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 433793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(info_ptr->scal_s_height, sheight, lengthh); 434793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 435793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_sCAL; 436793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->free_me |= PNG_FREE_SCAL; 437793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 438793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 439793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# ifdef PNG_FLOATING_POINT_SUPPORTED 440793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 441793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sCAL(png_structp png_ptr, png_infop info_ptr, int unit, double width, 442793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double height) 443793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 444793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "sCAL"); 445793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 446793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Check the arguments. */ 447793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (width <= 0) 448793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Invalid sCAL width ignored"); 449793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 450793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else if (height <= 0) 451793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Invalid sCAL height ignored"); 452793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 453793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 454793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 455793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Convert 'width' and 'height' to ASCII. */ 456793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char swidth[PNG_sCAL_MAX_DIGITS+1]; 457793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char sheight[PNG_sCAL_MAX_DIGITS+1]; 458793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 459793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ascii_from_fp(png_ptr, swidth, sizeof swidth, width, 460793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PNG_sCAL_PRECISION); 461793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ascii_from_fp(png_ptr, sheight, sizeof sheight, height, 462793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PNG_sCAL_PRECISION); 463793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 464793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight); 465793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 466793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 467793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif 468793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 469793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# ifdef PNG_FIXED_POINT_SUPPORTED 470793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 471793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sCAL_fixed(png_structp png_ptr, png_infop info_ptr, int unit, 472793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_fixed_point width, png_fixed_point height) 473793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 474793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "sCAL"); 475793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 476793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Check the arguments. */ 477793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (width <= 0) 478793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Invalid sCAL width ignored"); 479793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 480793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else if (height <= 0) 481793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Invalid sCAL height ignored"); 482793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 483793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 484793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 485793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Convert 'width' and 'height' to ASCII. */ 486793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char swidth[PNG_sCAL_MAX_DIGITS+1]; 487793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler char sheight[PNG_sCAL_MAX_DIGITS+1]; 488793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 489793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ascii_from_fixed(png_ptr, swidth, sizeof swidth, width); 490793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ascii_from_fixed(png_ptr, sheight, sizeof sheight, height); 491793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 492793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight); 493793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 494793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 495793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif 496793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 497793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 498793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_pHYs_SUPPORTED 499793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 500793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_pHYs(png_structp png_ptr, png_infop info_ptr, 501793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_uint_32 res_x, png_uint_32 res_y, int unit_type) 502793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 503793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "pHYs"); 504793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 505793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 506793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 507793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 508793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->x_pixels_per_unit = res_x; 509793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->y_pixels_per_unit = res_y; 510793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->phys_unit_type = (png_byte)unit_type; 511793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_pHYs; 512793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 513793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 514793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 515793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 516793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_PLTE(png_structp png_ptr, png_infop info_ptr, 517793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_const_colorp palette, int num_palette) 518793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 519793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 520793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "PLTE"); 521793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 522793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 523793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 524793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 525793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH) 526793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 527793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) 528793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_error(png_ptr, "Invalid palette length"); 529793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 530793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 531793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 532793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Invalid palette length"); 533793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 534793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 535793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 536793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 537793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* It may not actually be necessary to set png_ptr->palette here; 538793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * we do it for backward compatibility with the way the png_handle_tRNS 539793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * function used to do the allocation. 540793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 541793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); 542793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 543793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead 544793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * of num_palette entries, in case of an invalid PNG file that has 545793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * too-large sample values. 546793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 547793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->palette = (png_colorp)png_calloc(png_ptr, 548793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color)); 549793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 550793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color)); 551793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->palette = png_ptr->palette; 552793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; 553793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 554793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->free_me |= PNG_FREE_PLTE; 555793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 556793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_PLTE; 557793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 558793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 559793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_sBIT_SUPPORTED 560793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 561793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sBIT(png_structp png_ptr, png_infop info_ptr, 562793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_const_color_8p sig_bit) 563793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 564793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "sBIT"); 565793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 566793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 567793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 568793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 569793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8)); 570793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_sBIT; 571793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 572793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 573793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 574793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_sRGB_SUPPORTED 575793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 576793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sRGB(png_structp png_ptr, png_infop info_ptr, int srgb_intent) 577793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 578793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "sRGB"); 579793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 580793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 581793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 582793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 583793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->srgb_intent = (png_byte)srgb_intent; 584793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_sRGB; 585793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 586793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 587793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 588793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr, 589793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int srgb_intent) 590793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 591793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM"); 592793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 593793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 594793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 595793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 596793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_set_sRGB(png_ptr, info_ptr, srgb_intent); 597793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 598793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# ifdef PNG_gAMA_SUPPORTED 599793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_sRGB_INVERSE); 600793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif 601793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 602793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# ifdef PNG_cHRM_SUPPORTED 603793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_set_cHRM_fixed(png_ptr, info_ptr, 604793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* color x y */ 605793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* white */ 31270, 32900, 606793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* red */ 64000, 33000, 607793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* green */ 30000, 60000, 608793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* blue */ 15000, 6000 609793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ); 610793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif /* cHRM */ 611793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 612793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* sRGB */ 613793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 614793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 615793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_iCCP_SUPPORTED 616793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 617793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_iCCP(png_structp png_ptr, png_infop info_ptr, 618793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_const_charp name, int compression_type, 619793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_const_bytep profile, png_uint_32 proflen) 620793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 621793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_charp new_iccp_name; 622793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_bytep new_iccp_profile; 623793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_size_t length; 624793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 625793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "iCCP"); 626793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 627793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL) 628793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 629793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 630793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler length = png_strlen(name)+1; 631793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length); 632793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 633793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (new_iccp_name == NULL) 634793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 635793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Insufficient memory to process iCCP chunk"); 636793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 637793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 638793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 639793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(new_iccp_name, name, length); 640793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler new_iccp_profile = (png_bytep)png_malloc_warn(png_ptr, proflen); 641793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 642793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (new_iccp_profile == NULL) 643793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 644793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free (png_ptr, new_iccp_name); 645793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, 646793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "Insufficient memory to process iCCP profile"); 647793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 648793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 649793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 650793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(new_iccp_profile, profile, (png_size_t)proflen); 651793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 652793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0); 653793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 654793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->iccp_proflen = proflen; 655793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->iccp_name = new_iccp_name; 656793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->iccp_profile = new_iccp_profile; 657793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Compression is always zero but is here so the API and info structure 658793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * does not have to change if we introduce multiple compression types 659793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 660793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->iccp_compression = (png_byte)compression_type; 661793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->free_me |= PNG_FREE_ICCP; 662793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_iCCP; 663793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 664793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 665793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 666793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_TEXT_SUPPORTED 667793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 668793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_text(png_structp png_ptr, png_infop info_ptr, png_const_textp text_ptr, 669793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int num_text) 670793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 671793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int ret; 672793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); 673793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 674793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (ret) 675793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_error(png_ptr, "Insufficient memory to store text"); 676793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 677793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 678793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerint /* PRIVATE */ 679793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_text_2(png_structp png_ptr, png_infop info_ptr, 680793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_const_textp text_ptr, int num_text) 681793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 682793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i; 683793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 684793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %lx storage function", png_ptr == NULL ? "unexpected" : 685793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (unsigned long)png_ptr->chunk_name); 686793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 687793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL || num_text == 0) 688793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return(0); 689793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 690793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Make sure we have enough space in the "text" array in info_struct 691793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * to hold all of the incoming text_ptr objects. 692793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 693793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->num_text + num_text > info_ptr->max_text) 694793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 695793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int old_max_text = info_ptr->max_text; 696793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int old_num_text = info_ptr->num_text; 697793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 698793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->text != NULL) 699793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 700793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_textp old_text; 701793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 702793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->max_text = info_ptr->num_text + num_text + 8; 703793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler old_text = info_ptr->text; 704793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 705793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->text = (png_textp)png_malloc_warn(png_ptr, 706793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); 707793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 708793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->text == NULL) 709793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 710793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Restore to previous condition */ 711793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->max_text = old_max_text; 712793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->text = old_text; 713793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return(1); 714793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 715793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 716793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max_text * 717793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_sizeof(png_text))); 718793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free(png_ptr, old_text); 719793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 720793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 721793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 722793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 723793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->max_text = num_text + 8; 724793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->num_text = 0; 725793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->text = (png_textp)png_malloc_warn(png_ptr, 726793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)(info_ptr->max_text * png_sizeof(png_text))); 727793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->text == NULL) 728793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 729793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Restore to previous condition */ 730793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->num_text = old_num_text; 731793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->max_text = old_max_text; 732793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return(1); 733793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 734793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->free_me |= PNG_FREE_TEXT; 735793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 736793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 737793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(3, "allocated %d entries for info_ptr->text", 738793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->max_text); 739793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 740793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (i = 0; i < num_text; i++) 741793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 742793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_size_t text_length, key_len; 743793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_size_t lang_len, lang_key_len; 744793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_textp textp = &(info_ptr->text[info_ptr->num_text]); 745793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 746793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (text_ptr[i].key == NULL) 747793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler continue; 748793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 749793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (text_ptr[i].compression < PNG_TEXT_COMPRESSION_NONE || 750793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler text_ptr[i].compression >= PNG_TEXT_COMPRESSION_LAST) 751793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 752793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "text compression mode is out of range"); 753793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler continue; 754793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 755793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 756793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler key_len = png_strlen(text_ptr[i].key); 757793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 758793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (text_ptr[i].compression <= 0) 759793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 760793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler lang_len = 0; 761793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler lang_key_len = 0; 762793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 763793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 764793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 765793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# ifdef PNG_iTXt_SUPPORTED 766793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 767793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Set iTXt data */ 768793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 769793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (text_ptr[i].lang != NULL) 770793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler lang_len = png_strlen(text_ptr[i].lang); 771793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 772793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 773793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler lang_len = 0; 774793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 775793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (text_ptr[i].lang_key != NULL) 776793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler lang_key_len = png_strlen(text_ptr[i].lang_key); 777793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 778793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 779793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler lang_key_len = 0; 780793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 781793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# else /* PNG_iTXt_SUPPORTED */ 782793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 783793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "iTXt chunk not supported"); 784793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler continue; 785793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 786793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif 787793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 788793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0') 789793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 790793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler text_length = 0; 791793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# ifdef PNG_iTXt_SUPPORTED 792793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (text_ptr[i].compression > 0) 793793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->compression = PNG_ITXT_COMPRESSION_NONE; 794793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 795793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 796793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif 797793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->compression = PNG_TEXT_COMPRESSION_NONE; 798793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 799793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 800793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 801793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 802793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler text_length = png_strlen(text_ptr[i].text); 803793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->compression = text_ptr[i].compression; 804793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 805793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 806793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->key = (png_charp)png_malloc_warn(png_ptr, 807793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t) 808793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (key_len + text_length + lang_len + lang_key_len + 4)); 809793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 810793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (textp->key == NULL) 811793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return(1); 812793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 813793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug2(2, "Allocated %lu bytes at %p in png_set_text", 814793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (unsigned long)(png_uint_32) 815793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (key_len + lang_len + lang_key_len + text_length + 4), 816793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->key); 817793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 818793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len)); 819793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *(textp->key + key_len) = '\0'; 820793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 821793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (text_ptr[i].compression > 0) 822793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 823793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->lang = textp->key + key_len + 1; 824793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(textp->lang, text_ptr[i].lang, lang_len); 825793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *(textp->lang + lang_len) = '\0'; 826793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->lang_key = textp->lang + lang_len + 1; 827793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len); 828793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *(textp->lang_key + lang_key_len) = '\0'; 829793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->text = textp->lang_key + lang_key_len + 1; 830793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 831793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 832793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 833793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 834793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->lang=NULL; 835793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->lang_key=NULL; 836793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->text = textp->key + key_len + 1; 837793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 838793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 839793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (text_length) 840793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(textp->text, text_ptr[i].text, 841793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)(text_length)); 842793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 843793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *(textp->text + text_length) = '\0'; 844793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 845793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# ifdef PNG_iTXt_SUPPORTED 846793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (textp->compression > 0) 847793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 848793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->text_length = 0; 849793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->itxt_length = text_length; 850793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 851793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 852793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 853793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler# endif 854793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 855793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->text_length = text_length; 856793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler textp->itxt_length = 0; 857793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 858793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 859793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->num_text++; 860793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(3, "transferred text chunk %d", info_ptr->num_text); 861793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 862793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return(0); 863793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 864793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 865793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 866793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_tIME_SUPPORTED 867793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 868793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_tIME(png_structp png_ptr, png_infop info_ptr, png_const_timep mod_time) 869793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 870793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "tIME"); 871793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 872793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL || 873793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_ptr->mode & PNG_WROTE_tIME)) 874793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 875793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 876793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (mod_time->month == 0 || mod_time->month > 12 || 877793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mod_time->day == 0 || mod_time->day > 31 || 878793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mod_time->hour > 23 || mod_time->minute > 59 || 879793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler mod_time->second > 60) 880793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 881793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Ignoring invalid time value"); 882793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 883793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 884793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 885793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time)); 886793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_tIME; 887793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 888793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 889793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 890793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_tRNS_SUPPORTED 891793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 892793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_tRNS(png_structp png_ptr, png_infop info_ptr, 893793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color) 894793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 895793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "tRNS"); 896793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 897793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 898793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 899793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 900793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (trans_alpha != NULL) 901793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 902793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* It may not actually be necessary to set png_ptr->trans_alpha here; 903793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * we do it for backward compatibility with the way the png_handle_tRNS 904793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * function used to do the allocation. 905793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 906793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 907793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); 908793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 909793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */ 910793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->trans_alpha = info_ptr->trans_alpha = 911793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_bytep)png_malloc(png_ptr, (png_size_t)PNG_MAX_PALETTE_LENGTH); 912793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 913793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) 914793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans); 915793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 916793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 917793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (trans_color != NULL) 918793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 919793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int sample_max = (1 << info_ptr->bit_depth); 920793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 921793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY && 922793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (int)trans_color->gray > sample_max) || 923793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (info_ptr->color_type == PNG_COLOR_TYPE_RGB && 924793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler ((int)trans_color->red > sample_max || 925793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (int)trans_color->green > sample_max || 926793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (int)trans_color->blue > sample_max))) 927793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, 928793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "tRNS chunk has out-of-range samples for bit_depth"); 929793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 930793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(&(info_ptr->trans_color), trans_color, 931793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_sizeof(png_color_16)); 932793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 933793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (num_trans == 0) 934793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler num_trans = 1; 935793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 936793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 937793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->num_trans = (png_uint_16)num_trans; 938793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 939793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (num_trans != 0) 940793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 941793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_tRNS; 942793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->free_me |= PNG_FREE_TRNS; 943793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 944793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 945793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 946793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 947793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_sPLT_SUPPORTED 948793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 949793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_sPLT(png_structp png_ptr, 950793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_infop info_ptr, png_const_sPLT_tp entries, int nentries) 951793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* 952793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * entries - array of png_sPLT_t structures 953793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * to be added to the list of palettes 954793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * in the info structure. 955793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * 956793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * nentries - number of palette structures to be 957793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * added. 958793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 959793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 960793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_sPLT_tp np; 961793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i; 962793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 963793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 964793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 965793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 966793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler np = (png_sPLT_tp)png_malloc_warn(png_ptr, 967793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (info_ptr->splt_palettes_num + nentries) * 968793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)png_sizeof(png_sPLT_t)); 969793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 970793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (np == NULL) 971793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 972793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "No memory for sPLT palettes"); 973793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 974793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 975793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 976793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(np, info_ptr->splt_palettes, 977793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t)); 978793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 979793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free(png_ptr, info_ptr->splt_palettes); 980793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->splt_palettes=NULL; 981793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 982793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (i = 0; i < nentries; i++) 983793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 984793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; 985793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_const_sPLT_tp from = entries + i; 986793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_size_t length; 987793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 988793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler length = png_strlen(from->name) + 1; 989793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->name = (png_charp)png_malloc_warn(png_ptr, length); 990793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 991793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (to->name == NULL) 992793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 993793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, 994793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "Out of memory while processing sPLT chunk"); 995793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler continue; 996793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 997793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 998793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(to->name, from->name, length); 999793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr, 1000793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler from->nentries * png_sizeof(png_sPLT_entry)); 1001793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1002793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (to->entries == NULL) 1003793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1004793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, 1005793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "Out of memory while processing sPLT chunk"); 1006793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free(png_ptr, to->name); 1007793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->name = NULL; 1008793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler continue; 1009793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1010793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1011793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(to->entries, from->entries, 1012793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler from->nentries * png_sizeof(png_sPLT_entry)); 1013793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1014793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->nentries = from->nentries; 1015793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->depth = from->depth; 1016793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1017793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1018793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->splt_palettes = np; 1019793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->splt_palettes_num += nentries; 1020793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_sPLT; 1021793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->free_me |= PNG_FREE_SPLT; 1022793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1023793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* PNG_sPLT_SUPPORTED */ 1024793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1025793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED 1026793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1027793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_unknown_chunks(png_structp png_ptr, 1028793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_infop info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns) 1029793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1030793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_unknown_chunkp np; 1031793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i; 1032793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1033793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0) 1034793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1035793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1036793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler np = (png_unknown_chunkp)png_malloc_warn(png_ptr, 1037793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)(info_ptr->unknown_chunks_num + num_unknowns) * 1038793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_sizeof(png_unknown_chunk)); 1039793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1040793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (np == NULL) 1041793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1042793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, 1043793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "Out of memory while processing unknown chunk"); 1044793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1045793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1046793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1047793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(np, info_ptr->unknown_chunks, 1048793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)info_ptr->unknown_chunks_num * 1049793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_sizeof(png_unknown_chunk)); 1050793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1051793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free(png_ptr, info_ptr->unknown_chunks); 1052793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->unknown_chunks = NULL; 1053793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1054793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (i = 0; i < num_unknowns; i++) 1055793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1056793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; 1057793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_const_unknown_chunkp from = unknowns + i; 1058793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1059793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(to->name, from->name, png_sizeof(from->name)); 1060793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->name[png_sizeof(to->name)-1] = '\0'; 1061793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->size = from->size; 1062793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1063793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Note our location in the read or write sequence */ 1064793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->location = (png_byte)(png_ptr->mode & 0xff); 1065793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1066793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (from->size == 0) 1067793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->data=NULL; 1068793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1069793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1070793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1071793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->data = (png_bytep)png_malloc_warn(png_ptr, 1072793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)from->size); 1073793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1074793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (to->data == NULL) 1075793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1076793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, 1077793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler "Out of memory while processing unknown chunk"); 1078793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler to->size = 0; 1079793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1080793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1081793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1082793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(to->data, from->data, from->size); 1083793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1084793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1085793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1086793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->unknown_chunks = np; 1087793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->unknown_chunks_num += num_unknowns; 1088793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->free_me |= PNG_FREE_UNKN; 1089793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1090793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1091793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1092793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr, 1093793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int chunk, int location) 1094793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1095793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk < 1096793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->unknown_chunks_num) 1097793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->unknown_chunks[chunk].location = (png_byte)location; 1098793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1099793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_MNG_FEATURES_SUPPORTED 1103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_uint_32 PNGAPI 1104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features) 1105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug(1, "in png_permit_mng_features"); 1107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL) 1109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (png_uint_32)0; 1110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->mng_features_permitted = 1112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_byte)(mng_features & PNG_ALL_MNG_FEATURES); 1113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return (png_uint_32)png_ptr->mng_features_permitted; 1115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED 1119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_const_bytep 1121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler chunk_list, int num_chunks) 1122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_bytep new_list, p; 1124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int i, old_num_chunks; 1125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL) 1126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (num_chunks == 0) 1129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE) 1131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS; 1132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS; 1135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (keep == PNG_HANDLE_CHUNK_ALWAYS) 1137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS; 1138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS; 1141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (chunk_list == NULL) 1146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler old_num_chunks = png_ptr->num_chunk_list; 1149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler new_list=(png_bytep)png_malloc(png_ptr, 1150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)(5*(num_chunks + old_num_chunks))); 1151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr->chunk_list != NULL) 1153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(new_list, png_ptr->chunk_list, 1155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)(5*old_num_chunks)); 1156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free(png_ptr, png_ptr->chunk_list); 1157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->chunk_list=NULL; 1158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_memcpy(new_list + 5*old_num_chunks, chunk_list, 1161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler (png_size_t)(5*num_chunks)); 1162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (p = new_list + 5*old_num_chunks + 4, i = 0; i<num_chunks; i++, p += 5) 1164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler *p=(png_byte)keep; 1165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->num_chunk_list = old_num_chunks + num_chunks; 1167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->chunk_list = new_list; 1168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->free_me |= PNG_FREE_LIST; 1169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_READ_USER_CHUNKS_SUPPORTED 1173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr, 1175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_user_chunk_ptr read_user_chunk_fn) 1176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug(1, "in png_set_read_user_chunk_fn"); 1178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL) 1180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->read_user_chunk_fn = read_user_chunk_fn; 1183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->user_chunk_ptr = user_chunk_ptr; 1184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_INFO_IMAGE_SUPPORTED 1188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers) 1190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug1(1, "in %s storage function", "rows"); 1192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL || info_ptr == NULL) 1194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers)) 1197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); 1198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->row_pointers = row_pointers; 1200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (row_pointers) 1202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid |= PNG_INFO_IDAT; 1203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_compression_buffer_size(png_structp png_ptr, png_size_t size) 1208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL) 1210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_free(png_ptr, png_ptr->zbuf); 1213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (size > ZLIB_IO_MAX) 1215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 1216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_warning(png_ptr, "Attempt to set buffer size beyond max ignored"); 1217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->zbuf_size = ZLIB_IO_MAX; 1218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler size = ZLIB_IO_MAX; /* must fit */ 1219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 1220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->zbuf_size = (uInt)size; 1223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size); 1225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* The following ensures a relatively safe failure if this gets called while 1227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * the buffer is actually in use. 1228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 1229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->zstream.next_out = png_ptr->zbuf; 1230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->zstream.avail_out = 0; 1231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->zstream.avail_in = 0; 1232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask) 1236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr && info_ptr) 1238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler info_ptr->valid &= ~mask; 1239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_SET_USER_LIMITS_SUPPORTED 1244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* This function was added to libpng 1.2.6 */ 1245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max, 1247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_uint_32 user_height_max) 1248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler /* Images with dimensions larger than these limits will be 1250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * rejected by png_set_IHDR(). To accept any PNG datastream 1251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * regardless of dimensions, set both limits to 0x7ffffffL. 1252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 1253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr == NULL) 1254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler return; 1255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->user_width_max = user_width_max; 1257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->user_height_max = user_height_max; 1258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* This function was added to libpng 1.4.0 */ 1261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_chunk_cache_max (png_structp png_ptr, 1263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_uint_32 user_chunk_cache_max) 1264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr) 1266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->user_chunk_cache_max = user_chunk_cache_max; 1267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1269793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* This function was added to libpng 1.4.1 */ 1270793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1271793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_chunk_malloc_max (png_structp png_ptr, 1272793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_alloc_size_t user_chunk_malloc_max) 1273793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1274793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (png_ptr) 1275793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->user_chunk_malloc_max = user_chunk_malloc_max; 1276793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1277793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ 1278793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1279793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1280793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_BENIGN_ERRORS_SUPPORTED 1281793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1282793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_benign_errors(png_structp png_ptr, int allowed) 1283793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1284793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug(1, "in png_set_benign_errors"); 1285793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1286793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (allowed) 1287793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN; 1288793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1289793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1290793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->flags &= ~PNG_FLAG_BENIGN_ERRORS_WARN; 1291793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1292793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* PNG_BENIGN_ERRORS_SUPPORTED */ 1293793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1294793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED 1295793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/* Whether to report invalid palette index; added at libng-1.5.10 1296793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler * allowed - one of 0: disable; 1: enable 1297793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler */ 1298793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid PNGAPI 1299793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerpng_set_check_for_invalid_index(png_structp png_ptr, int allowed) 1300793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 1301793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_debug(1, "in png_set_check_for_invalid_index"); 1302793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1303793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (allowed) 1304793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->num_palette_max = 0; 1305793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1306793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else 1307793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler png_ptr->num_palette_max = -1; 1308793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 1309793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif 1310793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 1311793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ 1312