⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pngrutil.c

📁 Linux下的基于X11的图形开发环境。
💻 C
📖 第 1 页 / 共 5 页
字号:
    * arbitrary RGB values for background when we have transparency, and    * so it is easy to determine the RGB values of the background color    * from the info_ptr struct. */   if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)   {      png_ptr->background.index = buf[0];      if(info_ptr->num_palette)      {          if(buf[0] > info_ptr->num_palette)          {             png_warning(png_ptr, "Incorrect bKGD chunk index value");             return;          }          png_ptr->background.red =             (png_uint_16)png_ptr->palette[buf[0]].red;          png_ptr->background.green =             (png_uint_16)png_ptr->palette[buf[0]].green;          png_ptr->background.blue =             (png_uint_16)png_ptr->palette[buf[0]].blue;      }   }   else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */   {      png_ptr->background.red =      png_ptr->background.green =      png_ptr->background.blue =      png_ptr->background.gray = png_get_uint_16(buf);   }   else   {      png_ptr->background.red = png_get_uint_16(buf);      png_ptr->background.green = png_get_uint_16(buf + 2);      png_ptr->background.blue = png_get_uint_16(buf + 4);   }   png_set_bKGD(png_ptr, info_ptr, &(png_ptr->background));}#endif#if defined(PNG_READ_hIST_SUPPORTED)void /* PRIVATE */png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length){   int num, i;   png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH];   png_debug(1, "in png_handle_hIST\n");   if (!(png_ptr->mode & PNG_HAVE_IHDR))      png_error(png_ptr, "Missing IHDR before hIST");   else if (png_ptr->mode & PNG_HAVE_IDAT)   {      png_warning(png_ptr, "Invalid hIST after IDAT");      png_crc_finish(png_ptr, length);      return;   }   else if (!(png_ptr->mode & PNG_HAVE_PLTE))   {      png_warning(png_ptr, "Missing PLTE before hIST");      png_crc_finish(png_ptr, length);      return;   }   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST))   {      png_warning(png_ptr, "Duplicate hIST chunk");      png_crc_finish(png_ptr, length);      return;   }   num = (int)length / 2 ;   if (num != png_ptr->num_palette)   {      png_warning(png_ptr, "Incorrect hIST chunk length");      png_crc_finish(png_ptr, length);      return;   }   for (i = 0; i < num; i++)   {      png_byte buf[2];      png_crc_read(png_ptr, buf, 2);      readbuf[i] = png_get_uint_16(buf);   }   if (png_crc_finish(png_ptr, 0))      return;   png_set_hIST(png_ptr, info_ptr, readbuf);}#endif#if defined(PNG_READ_pHYs_SUPPORTED)void /* PRIVATE */png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length){   png_byte buf[9];   png_uint_32 res_x, res_y;   int unit_type;   png_debug(1, "in png_handle_pHYs\n");   if (!(png_ptr->mode & PNG_HAVE_IHDR))      png_error(png_ptr, "Missing IHDR before pHYs");   else if (png_ptr->mode & PNG_HAVE_IDAT)   {      png_warning(png_ptr, "Invalid pHYs after IDAT");      png_crc_finish(png_ptr, length);      return;   }   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))   {      png_warning(png_ptr, "Duplicate pHYs chunk");      png_crc_finish(png_ptr, length);      return;   }   if (length != 9)   {      png_warning(png_ptr, "Incorrect pHYs chunk length");      png_crc_finish(png_ptr, length);      return;   }   png_crc_read(png_ptr, buf, 9);   if (png_crc_finish(png_ptr, 0))      return;   res_x = png_get_uint_32(buf);   res_y = png_get_uint_32(buf + 4);   unit_type = buf[8];   png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type);}#endif#if defined(PNG_READ_oFFs_SUPPORTED)void /* PRIVATE */png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length){   png_byte buf[9];   png_int_32 offset_x, offset_y;   int unit_type;   png_debug(1, "in png_handle_oFFs\n");   if (!(png_ptr->mode & PNG_HAVE_IHDR))      png_error(png_ptr, "Missing IHDR before oFFs");   else if (png_ptr->mode & PNG_HAVE_IDAT)   {      png_warning(png_ptr, "Invalid oFFs after IDAT");      png_crc_finish(png_ptr, length);      return;   }   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))   {      png_warning(png_ptr, "Duplicate oFFs chunk");      png_crc_finish(png_ptr, length);      return;   }   if (length != 9)   {      png_warning(png_ptr, "Incorrect oFFs chunk length");      png_crc_finish(png_ptr, length);      return;   }   png_crc_read(png_ptr, buf, 9);   if (png_crc_finish(png_ptr, 0))      return;   offset_x = png_get_int_32(buf);   offset_y = png_get_int_32(buf + 4);   unit_type = buf[8];   png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type);}#endif#if defined(PNG_READ_pCAL_SUPPORTED)/* read the pCAL chunk (described in the PNG Extensions document) */void /* PRIVATE */png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length){   png_charp purpose;   png_int_32 X0, X1;   png_byte type, nparams;   png_charp buf, units, endptr;   png_charpp params;   png_size_t slength;   int i;   png_debug(1, "in png_handle_pCAL\n");   if (!(png_ptr->mode & PNG_HAVE_IHDR))      png_error(png_ptr, "Missing IHDR before pCAL");   else if (png_ptr->mode & PNG_HAVE_IDAT)   {      png_warning(png_ptr, "Invalid pCAL after IDAT");      png_crc_finish(png_ptr, length);      return;   }   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL))   {      png_warning(png_ptr, "Duplicate pCAL chunk");      png_crc_finish(png_ptr, length);      return;   }   png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)\n",      length + 1);   purpose = (png_charp)png_malloc_warn(png_ptr, length + 1);   if (purpose == NULL)     {       png_warning(png_ptr, "No memory for pCAL purpose.");       return;     }   slength = (png_size_t)length;   png_crc_read(png_ptr, (png_bytep)purpose, slength);   if (png_crc_finish(png_ptr, 0))   {      png_free(png_ptr, purpose);      return;   }   purpose[slength] = 0x00; /* null terminate the last string */   png_debug(3, "Finding end of pCAL purpose string\n");   for (buf = purpose; *buf; buf++)      /* empty loop */ ;   endptr = purpose + slength;   /* We need to have at least 12 bytes after the purpose string      in order to get the parameter information. */   if (endptr <= buf + 12)   {      png_warning(png_ptr, "Invalid pCAL data");      png_free(png_ptr, purpose);      return;   }   png_debug(3, "Reading pCAL X0, X1, type, nparams, and units\n");   X0 = png_get_int_32((png_bytep)buf+1);   X1 = png_get_int_32((png_bytep)buf+5);   type = buf[9];   nparams = buf[10];   units = buf + 11;   png_debug(3, "Checking pCAL equation type and number of parameters\n");   /* Check that we have the right number of parameters for known      equation types. */   if ((type == PNG_EQUATION_LINEAR && nparams != 2) ||       (type == PNG_EQUATION_BASE_E && nparams != 3) ||       (type == PNG_EQUATION_ARBITRARY && nparams != 3) ||       (type == PNG_EQUATION_HYPERBOLIC && nparams != 4))   {      png_warning(png_ptr, "Invalid pCAL parameters for equation type");      png_free(png_ptr, purpose);      return;   }   else if (type >= PNG_EQUATION_LAST)   {      png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");   }   for (buf = units; *buf; buf++)      /* Empty loop to move past the units string. */ ;   png_debug(3, "Allocating pCAL parameters array\n");   params = (png_charpp)png_malloc_warn(png_ptr, (png_uint_32)(nparams      *sizeof(png_charp))) ;   if (params == NULL)     {       png_free(png_ptr, purpose);       png_warning(png_ptr, "No memory for pCAL params.");       return;     }   /* Get pointers to the start of each parameter string. */   for (i = 0; i < (int)nparams; i++)   {      buf++; /* Skip the null string terminator from previous parameter. */      png_debug1(3, "Reading pCAL parameter %d\n", i);      for (params[i] = buf; *buf != 0x00 && buf <= endptr; buf++)         /* Empty loop to move past each parameter string */ ;      /* Make sure we haven't run out of data yet */      if (buf > endptr)      {         png_warning(png_ptr, "Invalid pCAL data");         png_free(png_ptr, purpose);         png_free(png_ptr, params);         return;      }   }   png_set_pCAL(png_ptr, info_ptr, purpose, X0, X1, type, nparams,      units, params);   png_free(png_ptr, purpose);   png_free(png_ptr, params);}#endif#if defined(PNG_READ_sCAL_SUPPORTED)/* read the sCAL chunk */void /* PRIVATE */png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length){   png_charp buffer, ep;#ifdef PNG_FLOATING_POINT_SUPPORTED   double width, height;   png_charp vp;#else#ifdef PNG_FIXED_POINT_SUPPORTED   png_charp swidth, sheight;#endif#endif   png_size_t slength;   png_debug(1, "in png_handle_sCAL\n");   if (!(png_ptr->mode & PNG_HAVE_IHDR))      png_error(png_ptr, "Missing IHDR before sCAL");   else if (png_ptr->mode & PNG_HAVE_IDAT)   {      png_warning(png_ptr, "Invalid sCAL after IDAT");      png_crc_finish(png_ptr, length);      return;   }   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL))   {      png_warning(png_ptr, "Duplicate sCAL chunk");      png_crc_finish(png_ptr, length);      return;   }   png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)\n",      length + 1);   buffer = (png_charp)png_malloc_warn(png_ptr, length + 1);   if (buffer == NULL)     {       png_warning(png_ptr, "Out of memory while processing sCAL chunk");       return;     }   slength = (png_size_t)length;   png_crc_read(png_ptr, (png_bytep)buffer, slength);   if (png_crc_finish(png_ptr, 0))   {      png_free(png_ptr, buffer);      return;   }   buffer[slength] = 0x00; /* null terminate the last string */   ep = buffer + 1;        /* skip unit byte */#ifdef PNG_FLOATING_POINT_SUPPORTED   width = strtod(ep, &vp);   if (*vp)   {       png_warning(png_ptr, "malformed width string in sCAL chunk");       return;   }#else#ifdef PNG_FIXED_POINT_SUPPORTED   swidth = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1);   if (swidth == NULL)     {       png_warning(png_ptr, "Out of memory while processing sCAL chunk width");       return;     }   png_memcpy(swidth, ep, (png_size_t)png_strlen(ep));#endif#endif   for (ep = buffer; *ep; ep++)      /* empty loop */ ;   ep++;#ifdef PNG_FLOATING_POINT_SUPPORTED   height = strtod(ep, &vp);   if (*vp)   {       png_warning(png_ptr, "malformed height string in sCAL chunk");       return;   }#else#ifdef PNG_FIXED_POINT_SUPPORTED   sheight = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1);   if (swidth == NULL)     {       png_warning(png_ptr, "Out of memory while processing sCAL chunk height");       return;     }   png_memcpy(sheight, ep, (png_size_t)png_strlen(ep));#endif#endif   if (buffer + slength < ep#ifdef PNG_FLOATING_POINT_SUPPORTED      || width <= 0. || height <= 0.#endif      )   {      png_warning(png_ptr, "Invalid sCAL data");      png_free(png_ptr, buffer);#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)      png_free(png_ptr, swidth);      png_free(png_ptr, sheight);#endif      return;   }#ifdef PNG_FLOATING_POINT_SUPPORTED   png_set_sCAL(png_ptr, info_ptr, buffer[0], width, height);#else#ifdef PNG_FIXED_POINT_SUPPORTED   png_set_sCAL_s(png_ptr, info_ptr, buffer[0], swidth, sheight);#endif#endif   png_free(png_ptr, buffer);#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)   png_free(png_ptr, swidth);   png_free(png_ptr, sheight);#endif}#endif#if defined(PNG_READ_tIME_SUPPORTED)void /* PRIVATE */png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length){   png_byte buf[7];   png_time mod_time;   png_debug(1, "in png_handle_tIME\n");   if (!(png_ptr->mode & PNG_HAVE_IHDR))      png_error(png_ptr, "Out of place tIME chunk");   else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME))   {      png_warning(png_ptr, "Duplicate tIME chunk");      png_crc_finish(png_ptr, length);      return;   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -