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

📄 pngread.c

📁 a 3d car ....with color texture..
💻 C
📖 第 1 页 / 共 2 页
字号:
/* pngread.c - read a PNG file * * libpng 1.0.2 - June 14, 1998 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. * Copyright (c) 1996, 1997 Andreas Dilger * Copyright (c) 1998, Glenn Randers-Pehrson * * This file contains routines that an application calls directly to * read a PNG file or stream. */#define PNG_INTERNAL#include "png.h"/* Create a PNG structure for reading, and allocate any memory needed. */png_structppng_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr,   png_error_ptr error_fn, png_error_ptr warn_fn){#ifdef PNG_USER_MEM_SUPPORTED   return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn,      warn_fn, NULL, NULL, NULL));}/* Alternate create PNG structure for reading, and allocate any memory needed. */png_structppng_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,   png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,   png_malloc_ptr malloc_fn, png_free_ptr free_fn){#endif /* PNG_USER_MEM_SUPPORTED */   png_structp png_ptr;#ifdef USE_FAR_KEYWORD   jmp_buf jmpbuf;#endif   png_debug(1, "in png_create_read_struct\n");#ifdef PNG_USER_MEM_SUPPORTED   if ((png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,      (png_malloc_ptr)malloc_fn)) == NULL)#else   if ((png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG)) == NULL)#endif   {      return (png_structp)NULL;   }#ifdef USE_FAR_KEYWORD   if (setjmp(jmpbuf))#else   if (setjmp(png_ptr->jmpbuf))#endif   {      png_free(png_ptr, png_ptr->zbuf);      png_destroy_struct(png_ptr);      return (png_structp)NULL;   }#ifdef USE_FAR_KEYWORD   png_memcpy(png_ptr->jmpbuf,jmpbuf,sizeof(jmp_buf));#endif#ifdef PNG_USER_MEM_SUPPORTED   png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);#endif /* PNG_USER_MEM_SUPPORTED */   png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);   /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so    * we must recompile any applications that use any older library version.    * For versions after libpng 1.0, we will be compatible, so we need    * only check the first digit.    */   if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||       (user_png_ver[0] == '0' && user_png_ver[2] < '9'))   {      png_error(png_ptr,         "Incompatible libpng version in application and library");   }   /* initialize zbuf - compression buffer */   png_ptr->zbuf_size = PNG_ZBUF_SIZE;   png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,     (png_uint_32)png_ptr->zbuf_size);   png_ptr->zstream.zalloc = png_zalloc;   png_ptr->zstream.zfree = png_zfree;   png_ptr->zstream.opaque = (voidpf)png_ptr;   switch (inflateInit(&png_ptr->zstream))   {     case Z_OK: /* Do nothing */ break;     case Z_MEM_ERROR:     case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break;     case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); break;     default: png_error(png_ptr, "Unknown zlib error");   }   png_ptr->zstream.next_out = png_ptr->zbuf;   png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;   png_set_read_fn(png_ptr, NULL, NULL);   return (png_ptr);}/* Read the information before the actual image data.  This has been * changed in v0.90 to allow reading a file that already has the magic * bytes read from the stream.  You can tell libpng how many bytes have * been read from the beginning of the stream (up to the maximum of 8) * via png_set_sig_bytes(), and we will only check the remaining bytes * here.  The application can then have access to the signature bytes we * read if it is determined that this isn't a valid PNG file. */voidpng_read_info(png_structp png_ptr, png_infop info_ptr){   png_debug(1, "in png_read_info\n");   /* save jump buffer and error functions */   /* If we haven't checked all of the PNG signature bytes, do so now. */   if (png_ptr->sig_bytes < 8)   {      png_size_t num_checked = png_ptr->sig_bytes,                 num_to_check = 8 - num_checked;      png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);      png_ptr->sig_bytes = 8;      if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))      {         if (num_checked < 4 &&             png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))            png_error(png_ptr, "Not a PNG file");         else            png_error(png_ptr, "PNG file corrupted by ASCII conversion");      }   }   for(;;)   {      png_byte chunk_length[4];      png_uint_32 length;      png_read_data(png_ptr, chunk_length, 4);      length = png_get_uint_32(chunk_length);      png_reset_crc(png_ptr);      png_crc_read(png_ptr, png_ptr->chunk_name, 4);      png_debug1(0, "Reading %s chunk.\n", png_ptr->chunk_name);      /* This should be a binary subdivision search or a hash for       * matching the chunk name rather than a linear search.       */      if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))         png_handle_IHDR(png_ptr, info_ptr, length);      else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))         png_handle_PLTE(png_ptr, info_ptr, length);      else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))         png_handle_IEND(png_ptr, info_ptr, length);      else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))      {         if (!(png_ptr->mode & PNG_HAVE_IHDR))            png_error(png_ptr, "Missing IHDR before IDAT");         else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&                  !(png_ptr->mode & PNG_HAVE_PLTE))            png_error(png_ptr, "Missing PLTE before IDAT");         png_ptr->idat_size = length;         png_ptr->mode |= PNG_HAVE_IDAT;         break;      }#if defined(PNG_READ_bKGD_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))         png_handle_bKGD(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_cHRM_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))         png_handle_cHRM(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_gAMA_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))         png_handle_gAMA(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_hIST_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))         png_handle_hIST(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_oFFs_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))         png_handle_oFFs(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_pCAL_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))         png_handle_pCAL(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_pHYs_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))         png_handle_pHYs(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_sBIT_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))         png_handle_sBIT(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_sRGB_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))         png_handle_sRGB(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_tEXt_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))         png_handle_tEXt(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_tIME_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))         png_handle_tIME(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_tRNS_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))         png_handle_tRNS(png_ptr, info_ptr, length);#endif#if defined(PNG_READ_zTXt_SUPPORTED)      else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))         png_handle_zTXt(png_ptr, info_ptr, length);#endif      else         png_handle_unknown(png_ptr, info_ptr, length);   }}/* optional call to update the users info_ptr structure */voidpng_read_update_info(png_structp png_ptr, png_infop info_ptr){   png_debug(1, "in png_read_update_info\n");   /* save jump buffer and error functions */   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))      png_read_start_row(png_ptr);   png_read_transform_info(png_ptr, info_ptr);}voidpng_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row){   int ret;   png_debug2(1, "in png_read_row (row %d, pass %d)\n",      png_ptr->row_number, png_ptr->pass);   /* save jump buffer and error functions */   if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))      png_read_start_row(png_ptr);   if (png_ptr->row_number == 0 && png_ptr->pass == 0)   {   /* check for transforms that have been set but were defined out */#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)   if (png_ptr->transformations & PNG_INVERT_MONO)      png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined.");#endif#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)   if (png_ptr->transformations & PNG_FILLER)      png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined.");#endif#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && !defined(PNG_READ_PACKSWAP_SUPPORTED)   if (png_ptr->transformations & PNG_PACKSWAP)      png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined.");#endif#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)   if (png_ptr->transformations & PNG_PACK)      png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined.");#endif#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)   if (png_ptr->transformations & PNG_SHIFT)      png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined.");#endif#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)   if (png_ptr->transformations & PNG_BGR)      png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined.");#endif#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)   if (png_ptr->transformations & PNG_SWAP_BYTES)      png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined.");#endif   }#if defined(PNG_READ_INTERLACING_SUPPORTED)   /* if interlaced and we do not need a new row, combine row and return */   if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))   {      switch (png_ptr->pass)      {         case 0:            if (png_ptr->row_number & 7)            {               if (dsp_row != NULL)                  png_combine_row(png_ptr, dsp_row,                     png_pass_dsp_mask[png_ptr->pass]);               png_read_finish_row(png_ptr);               return;            }            break;         case 1:            if ((png_ptr->row_number & 7) || png_ptr->width < 5)            {               if (dsp_row != NULL)                  png_combine_row(png_ptr, dsp_row,                     png_pass_dsp_mask[png_ptr->pass]);               png_read_finish_row(png_ptr);               return;            }            break;         case 2:            if ((png_ptr->row_number & 7) != 4)            {               if (dsp_row != NULL && (png_ptr->row_number & 4))                  png_combine_row(png_ptr, dsp_row,                     png_pass_dsp_mask[png_ptr->pass]);               png_read_finish_row(png_ptr);               return;            }            break;         case 3:            if ((png_ptr->row_number & 3) || png_ptr->width < 3)            {               if (dsp_row != NULL)                  png_combine_row(png_ptr, dsp_row,                     png_pass_dsp_mask[png_ptr->pass]);               png_read_finish_row(png_ptr);               return;            }            break;         case 4:            if ((png_ptr->row_number & 3) != 2)            {               if (dsp_row != NULL && (png_ptr->row_number & 2))                  png_combine_row(png_ptr, dsp_row,                     png_pass_dsp_mask[png_ptr->pass]);               png_read_finish_row(png_ptr);               return;            }            break;         case 5:            if ((png_ptr->row_number & 1) || png_ptr->width < 2)            {               if (dsp_row != NULL)                  png_combine_row(png_ptr, dsp_row,                     png_pass_dsp_mask[png_ptr->pass]);               png_read_finish_row(png_ptr);               return;            }            break;         case 6:            if (!(png_ptr->row_number & 1))            {               png_read_finish_row(png_ptr);               return;            }            break;      }   }#endif   if (!(png_ptr->mode & PNG_HAVE_IDAT))      png_error(png_ptr, "Invalid attempt to read row data");   png_ptr->zstream.next_out = png_ptr->row_buf;   png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;   do   {      if (!(png_ptr->zstream.avail_in))      {         while (!png_ptr->idat_size)         {            png_byte chunk_length[4];            png_crc_finish(png_ptr, 0);            png_read_data(png_ptr, chunk_length, 4);            png_ptr->idat_size = png_get_uint_32(chunk_length);            png_reset_crc(png_ptr);            png_crc_read(png_ptr, png_ptr->chunk_name, 4);            if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))               png_error(png_ptr, "Not enough image data");         }         png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;

⌨️ 快捷键说明

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