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

📄 pngread.c

📁 a 3d car ....with color texture..
💻 C
📖 第 1 页 / 共 2 页
字号:
         png_ptr->zstream.next_in = png_ptr->zbuf;         if (png_ptr->zbuf_size > png_ptr->idat_size)            png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;         png_crc_read(png_ptr, png_ptr->zbuf,            (png_size_t)png_ptr->zstream.avail_in);         png_ptr->idat_size -= png_ptr->zstream.avail_in;      }      ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);      if (ret == Z_STREAM_END)      {         if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in ||            png_ptr->idat_size)            png_error(png_ptr, "Extra compressed data");         png_ptr->mode |= PNG_AFTER_IDAT;         png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;         break;      }      if (ret != Z_OK)         png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :                   "Decompression error");   } while (png_ptr->zstream.avail_out);   png_ptr->row_info.color_type = png_ptr->color_type;   png_ptr->row_info.width = png_ptr->iwidth;   png_ptr->row_info.channels = png_ptr->channels;   png_ptr->row_info.bit_depth = png_ptr->bit_depth;   png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;   {      png_ptr->row_info.rowbytes = ((png_ptr->row_info.width *         (png_uint_32)png_ptr->row_info.pixel_depth + 7) >> 3);   }   png_read_filter_row(png_ptr, &(png_ptr->row_info),      png_ptr->row_buf + 1, png_ptr->prev_row + 1,      (int)(png_ptr->row_buf[0]));   png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,      png_ptr->rowbytes + 1);   if (png_ptr->transformations)      png_do_read_transformations(png_ptr);#if defined(PNG_READ_INTERLACING_SUPPORTED)   /* blow up interlaced rows to full size */   if (png_ptr->interlaced &&      (png_ptr->transformations & PNG_INTERLACE))   {      if (png_ptr->pass < 6)         png_do_read_interlace(&(png_ptr->row_info),            png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);      if (dsp_row != NULL)         png_combine_row(png_ptr, dsp_row,            png_pass_dsp_mask[png_ptr->pass]);      if (row != NULL)         png_combine_row(png_ptr, row,            png_pass_mask[png_ptr->pass]);   }   else#endif   {      if (row != NULL)         png_combine_row(png_ptr, row, 0xff);      if (dsp_row != NULL)         png_combine_row(png_ptr, dsp_row, 0xff);   }   png_read_finish_row(png_ptr);   if (png_ptr->read_row_fn != NULL)      (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);}/* Read the entire image.  If the image has an alpha channel or a tRNS * chunk, and you have called png_handle_alpha()[*], you will need to * initialize the image to the current image that PNG will be overlaying. * We set the num_rows again here, in case it was incorrectly set in * png_read_start_row() by a call to png_read_update_info() or * png_start_read_image() if png_set_interlace_handling() wasn't called * prior to either of these functions like it should have been.  You can * only call this function once.  If you desire to have an image for * each pass of a interlaced image, use png_read_rows() instead. * * [*] png_handle_alpha() does not exist yet, as of libpng version 1.0.2. */voidpng_read_image(png_structp png_ptr, png_bytepp image){   png_uint_32 i,image_height;   int pass, j;   png_bytepp rp;   png_debug(1, "in png_read_image\n");   /* save jump buffer and error functions */   pass = png_set_interlace_handling(png_ptr);   image_height=png_ptr->height;   png_ptr->num_rows = image_height; /* Make sure this is set correctly */   for (j = 0; j < pass; j++)   {      rp = image;      for (i = 0; i < image_height; i++)      {         png_read_row(png_ptr, *rp, NULL);         rp++;      }   }}/* Read the end of the PNG file.  Will not read past the end of the * file, will verify the end is accurate, and will read any comments * or time information at the end of the file, if info is not NULL. */voidpng_read_end(png_structp png_ptr, png_infop info_ptr){   png_byte chunk_length[4];   png_uint_32 length;   png_debug(1, "in png_read_end\n");   /* save jump buffer and error functions */   png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */   do   {      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);      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_IDAT, 4))      {         /* Zero length IDATs are legal after the last IDAT has been          * read, but not after other chunks have been read.          */         if (length > 0 || png_ptr->mode & PNG_AFTER_IDAT)            png_error(png_ptr, "Too many IDAT's found");         else            png_crc_finish(png_ptr, 0);      }      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);#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);   } while (!(png_ptr->mode & PNG_HAVE_IEND));}/* free all memory used by the read */voidpng_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,   png_infopp end_info_ptr_ptr){   png_structp png_ptr = NULL;   png_infop info_ptr = NULL, end_info_ptr = NULL;#ifdef PNG_USER_MEM_SUPPORTED   png_free_ptr free_fn = NULL;#endif /* PNG_USER_MEM_SUPPORTED */   png_debug(1, "in png_destroy_read_struct\n");   /* save jump buffer and error functions */   if (png_ptr_ptr != NULL)      png_ptr = *png_ptr_ptr;   if (info_ptr_ptr != NULL)      info_ptr = *info_ptr_ptr;   if (end_info_ptr_ptr != NULL)      end_info_ptr = *end_info_ptr_ptr;#ifdef PNG_USER_MEM_SUPPORTED   free_fn = png_ptr->free_fn;#endif   png_read_destroy(png_ptr, info_ptr, end_info_ptr);   if (info_ptr != NULL)   {#if defined(PNG_READ_tEXt_SUPPORTED) || defined(PNG_READ_zTXt_SUPPORTED)      png_free(png_ptr, info_ptr->text);#endif#ifdef PNG_USER_MEM_SUPPORTED      png_destroy_struct_2((png_voidp)info_ptr, free_fn);#else      png_destroy_struct((png_voidp)info_ptr);#endif      *info_ptr_ptr = (png_infop)NULL;   }   if (end_info_ptr != NULL)   {#if defined(PNG_READ_tEXt_SUPPORTED) || defined(PNG_READ_zTXt_SUPPORTED)      png_free(png_ptr, end_info_ptr->text);#endif#ifdef PNG_USER_MEM_SUPPORTED      png_destroy_struct_2((png_voidp)end_info_ptr, free_fn);#else      png_destroy_struct((png_voidp)end_info_ptr);#endif      *end_info_ptr_ptr = (png_infop)NULL;   }   if (png_ptr != NULL)   {#ifdef PNG_USER_MEM_SUPPORTED      png_destroy_struct_2((png_voidp)png_ptr, free_fn);#else      png_destroy_struct((png_voidp)png_ptr);#endif      *png_ptr_ptr = (png_structp)NULL;   }}/* free all memory used by the read (old method) */voidpng_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr){   jmp_buf tmp_jmp;   png_error_ptr error_fn;   png_error_ptr warning_fn;   png_voidp error_ptr;#ifdef PNG_USER_MEM_SUPPORTED   png_free_ptr free_fn;#endif   png_debug(1, "in png_read_destroy\n");   /* save jump buffer and error functions */   if (info_ptr != NULL)      png_info_destroy(png_ptr, info_ptr);   if (end_info_ptr != NULL)      png_info_destroy(png_ptr, end_info_ptr);   png_free(png_ptr, png_ptr->zbuf);   png_free(png_ptr, png_ptr->row_buf);   png_free(png_ptr, png_ptr->prev_row);#if defined(PNG_READ_DITHER_SUPPORTED)   png_free(png_ptr, png_ptr->palette_lookup);   png_free(png_ptr, png_ptr->dither_index);#endif#if defined(PNG_READ_GAMMA_SUPPORTED)   png_free(png_ptr, png_ptr->gamma_table);#endif#if defined(PNG_READ_BACKGROUND_SUPPORTED)   png_free(png_ptr, png_ptr->gamma_from_1);   png_free(png_ptr, png_ptr->gamma_to_1);#endif   if (png_ptr->flags & PNG_FLAG_FREE_PALETTE)      png_zfree(png_ptr, png_ptr->palette);   if (png_ptr->flags & PNG_FLAG_FREE_TRANS)      png_free(png_ptr, png_ptr->trans);#if defined(PNG_READ_hIST_SUPPORTED)   if (png_ptr->flags & PNG_FLAG_FREE_HIST)      png_free(png_ptr, png_ptr->hist);#endif#if defined(PNG_READ_GAMMA_SUPPORTED)   if (png_ptr->gamma_16_table != NULL)   {      int i;      int istop = (1 << (8 - png_ptr->gamma_shift));      for (i = 0; i < istop; i++)      {         png_free(png_ptr, png_ptr->gamma_16_table[i]);      }   }#if defined(PNG_READ_BACKGROUND_SUPPORTED)   png_free(png_ptr, png_ptr->gamma_16_table);   if (png_ptr->gamma_16_from_1 != NULL)   {      int i;      int istop = (1 << (8 - png_ptr->gamma_shift));      for (i = 0; i < istop; i++)      {         png_free(png_ptr, png_ptr->gamma_16_from_1[i]);      }   }   png_free(png_ptr, png_ptr->gamma_16_from_1);   if (png_ptr->gamma_16_to_1 != NULL)   {      int i;      int istop = (1 << (8 - png_ptr->gamma_shift));      for (i = 0; i < istop; i++)      {         png_free(png_ptr, png_ptr->gamma_16_to_1[i]);      }   }   png_free(png_ptr, png_ptr->gamma_16_to_1);#endif#endif#if defined(PNG_TIME_RFC1123_SUPPORTED)   png_free(png_ptr, png_ptr->time_buffer);#endif /* PNG_TIME_RFC1123_SUPPORTED */   inflateEnd(&png_ptr->zstream);#ifdef PNG_PROGRESSIVE_READ_SUPPORTED   png_free(png_ptr, png_ptr->save_buffer);#endif   /* Save the important info out of the png_struct, in case it is    * being used again.    */   png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf));   error_fn = png_ptr->error_fn;   warning_fn = png_ptr->warning_fn;   error_ptr = png_ptr->error_ptr;#ifdef PNG_USER_MEM_SUPPORTED   free_fn = png_ptr->free_fn;#endif   png_memset(png_ptr, 0, sizeof (png_struct));   png_ptr->error_fn = error_fn;   png_ptr->warning_fn = warning_fn;   png_ptr->error_ptr = error_ptr;#ifdef PNG_USER_MEM_SUPPORTED   png_ptr->free_fn = free_fn;#endif   png_memcpy(png_ptr->jmpbuf, tmp_jmp, sizeof (jmp_buf));}

⌨️ 快捷键说明

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