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

📄 pngrutil.c

📁 游戏编程精华01-含有几十个游戏编程例子
💻 C
📖 第 1 页 / 共 5 页
字号:
      png_crc_finish(png_ptr, length);      return;   }   num = (int)length / 2;   png_ptr->hist = (png_uint_16p)png_malloc(png_ptr,      (png_uint_32)(num * sizeof (png_uint_16)));   png_ptr->flags |= PNG_FLAG_FREE_HIST;   for (i = 0; i < num; i++)   {      png_byte buf[2];      png_crc_read(png_ptr, buf, 2);      png_ptr->hist[i] = png_get_uint_16(buf);   }   if (png_crc_finish(png_ptr, 0))      return;   png_set_hIST(png_ptr, info_ptr, png_ptr->hist);}#endif#if defined(PNG_READ_pHYs_SUPPORTED)voidpng_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)voidpng_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length){   png_byte buf[9];   png_uint_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_uint_32(buf);   offset_y = png_get_uint_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 (png-scivis-19970203) */voidpng_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 (%d bytes)\n",      length + 1);   purpose = (png_charp)png_malloc(png_ptr, length + 1);   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(png_ptr, (png_uint_32)(nparams      *sizeof(png_charp))) ;   /* 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_tIME_SUPPORTED)voidpng_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;   }   if (png_ptr->mode & PNG_HAVE_IDAT)      png_ptr->mode |= PNG_AFTER_IDAT;   if (length != 7)   {      png_warning(png_ptr, "Incorrect tIME chunk length");      png_crc_finish(png_ptr, length);      return;   }   png_crc_read(png_ptr, buf, 7);   if (png_crc_finish(png_ptr, 0))      return;   mod_time.second = buf[6];   mod_time.minute = buf[5];   mod_time.hour = buf[4];   mod_time.day = buf[3];   mod_time.month = buf[2];   mod_time.year = png_get_uint_16(buf);   png_set_tIME(png_ptr, info_ptr, &mod_time);}#endif#if defined(PNG_READ_tEXt_SUPPORTED)/* Note: this does not properly handle chunks that are > 64K under DOS */voidpng_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length){   png_textp text_ptr;   png_charp key;   png_charp text;   png_uint_32 skip = 0;   png_size_t slength;   png_debug(1, "in png_handle_tEXt\n");   if (!(png_ptr->mode & PNG_HAVE_IHDR))      png_error(png_ptr, "Missing IHDR before tEXt");   if (png_ptr->mode & PNG_HAVE_IDAT)      png_ptr->mode |= PNG_AFTER_IDAT;#ifdef PNG_MAX_MALLOC_64K   if (length > (png_uint_32)65535L)   {      png_warning(png_ptr, "tEXt chunk too large to fit in memory");      skip = length - (png_uint_32)65535L;      length = (png_uint_32)65535L;   }#endif   key = (png_charp)png_malloc(png_ptr, length + 1);   slength = (png_size_t)length;   png_crc_read(png_ptr, (png_bytep)key, slength);   if (png_crc_finish(png_ptr, skip))   {      png_free(png_ptr, key);      return;   }   key[slength] = 0x00;   for (text = key; *text; text++)      /* empty loop to find end of key */ ;   if (text != key + slength)      text++;   text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));   text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;   text_ptr->key = key;   text_ptr->text = text;   png_set_text(png_ptr, info_ptr, text_ptr, 1);   png_free(png_ptr, text_ptr);}#endif#if defined(PNG_READ_zTXt_SUPPORTED)/* note: this does not correctly handle chunks that are > 64K under DOS */voidpng_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length){   static char msg[] = "Error decoding zTXt chunk";   png_textp text_ptr;   png_charp key;   png_charp text;   int comp_type = PNG_TEXT_COMPRESSION_NONE;   png_size_t slength;   png_debug(1, "in png_handle_zTXt\n");   if (!(png_ptr->mode & PNG_HAVE_IHDR))      png_error(png_ptr, "Missing IHDR before zTXt");   if (png_ptr->mode & PNG_HAVE_IDAT)      png_ptr->mode |= PNG_AFTER_IDAT;#ifdef PNG_MAX_MALLOC_64K   /* We will no doubt have problems with chunks even half this size, but      there is no hard and fast rule to tell us where to stop. */   if (length > (png_uint_32)65535L)   {     png_warning(png_ptr,"zTXt chunk too large to fit in memory");     png_crc_finish(png_ptr, length);     return;   }#endif   key = (png_charp)png_malloc(png_ptr, length + 1);   slength = (png_size_t)length;   png_crc_read(png_ptr, (png_bytep)key, slength);   if (png_crc_finish(png_ptr, 0))   {      png_free(png_ptr, key);      return;   }   key[slength] = 0x00;   for (text = key; *text; text++)      /* empty loop */ ;   /* zTXt must have some text after the keyword */   if (text == key + slength)   {      png_warning(png_ptr, "Zero length zTXt chunk");   }   else if ((comp_type = *(++text)) == PNG_TEXT_COMPRESSION_zTXt)   {      png_size_t text_size, key_size;      text++;      png_ptr->zstream.next_in = (png_bytep)text;      png_ptr->zstream.avail_in = (uInt)(length - (text - key));      png_ptr->zstream.next_out = png_ptr->zbuf;      png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;      key_size = (png_size_t)(text - key);      text_size = 0;      text = NULL;      while (png_ptr->zstream.avail_in)      {         int ret;         ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);         if (ret != Z_OK && ret != Z_STREAM_END)         {            if (png_ptr->zstream.msg != NULL)               png_warning(png_ptr, png_ptr->zstream.msg);            else               png_warning(png_ptr, msg);            inflateReset(&png_ptr->zstream);            png_ptr->zstream.avail_in = 0;            if (text ==  NULL)            {               text_size = key_size + sizeof(msg) + 1;               text = (png_charp)png_malloc(png_ptr, (png_uint_32)text_size);               png_memcpy(text, key, key_size);            }            text[text_size - 1] = 0x00;            /* Copy what we can of the error message into the text chunk */            text_size = (png_size_t)(slength - (text - key) - 1);            text_size = sizeof(msg) > text_size ? text_size : sizeof(msg);            png_memcpy(text + key_size, msg, text_size + 1);            break;         }         if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END)         {            if (text == NULL)            {               text = (png_charp)png_malloc(png_ptr,                  (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out                     + key_size + 1));               png_memcpy(text + key_size, png_ptr->zbuf,                  png_ptr->zbuf_size - png_ptr->zstream.avail_out);               png_memcpy(text, key, key_size);               text_size = key_size + png_ptr->zbuf_size -                  png_ptr->zstream.avail_out;               *(text + text_size) = 0x00;            }            else            {               png_charp tmp;               tmp = text;               text = (png_charp)png_malloc(png_ptr, (png_uint_32)(text_size +                  png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1));               png_memcpy(text, tmp, text_size);               png_free(png_ptr, tmp);               png_memcpy(text + text_size, png_ptr->zbuf,                  (png_ptr->zbuf_size - png_ptr->zstream.avail_out));               text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;               *(text + text_size) = 0x00;            }            if (ret != Z_STREAM_END)            {               png_ptr->zstream.next_out = png_ptr->zbuf;               png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;            }            else            {               break;            }         }      }      inflateReset(&png_ptr->zstream);      png_ptr->zstream.avail_in = 0;

⌨️ 快捷键说明

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