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

📄 pngwrite.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 4 页
字号:
/* pngwrite.c - general routines to write a PNG file * * libpng 1.0.12 - June 8, 2001 * For conditions of distribution and use, see copyright notice in png.h * Copyright (c) 1998-2001 Glenn Randers-Pehrson * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) *//* get internal access to png.h */#define PNG_INTERNAL#include "png.h"#ifdef PNG_WRITE_SUPPORTED/* Writes all the PNG information.  This is the suggested way to use the * library.  If you have a new chunk to add, make a function to write it, * and put it in the correct location here.  If you want the chunk written * after the image data, put it in png_write_end().  I strongly encourage * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing * the chunk, as that will keep the code from breaking if you want to just * write a plain PNG file.  If you have long comments, I suggest writing * them in png_write_end(), and compressing them. */void PNGAPIpng_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr){   png_debug(1, "in png_write_info_before_PLTE\n");   if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))   {   png_write_sig(png_ptr); /* write PNG signature */#if defined(PNG_MNG_FEATURES_SUPPORTED)   if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted))   {      png_warning(png_ptr,"MNG features are not allowed in a PNG datastream\n");      png_ptr->mng_features_permitted=0;   }#endif   /* write IHDR information. */   png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,      info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,      info_ptr->filter_type,#if defined(PNG_WRITE_INTERLACING_SUPPORTED)      info_ptr->interlace_type);#else      0);#endif   /* the rest of these check to see if the valid field has the appropriate      flag set, and if it does, writes the chunk. */#if defined(PNG_WRITE_gAMA_SUPPORTED)   if (info_ptr->valid & PNG_INFO_gAMA)   {#  ifdef PNG_FLOATING_POINT_SUPPORTED      png_write_gAMA(png_ptr, info_ptr->gamma);#else#ifdef PNG_FIXED_POINT_SUPPORTED      png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma);#  endif#endif   }#endif#if defined(PNG_WRITE_sRGB_SUPPORTED)   if (info_ptr->valid & PNG_INFO_sRGB)      png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent);#endif#if defined(PNG_WRITE_iCCP_SUPPORTED)   if (info_ptr->valid & PNG_INFO_iCCP)      png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE,                     info_ptr->iccp_profile, (int)info_ptr->iccp_proflen);#endif#if defined(PNG_WRITE_sBIT_SUPPORTED)   if (info_ptr->valid & PNG_INFO_sBIT)      png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);#endif#if defined(PNG_WRITE_cHRM_SUPPORTED)   if (info_ptr->valid & PNG_INFO_cHRM)   {#ifdef PNG_FLOATING_POINT_SUPPORTED      png_write_cHRM(png_ptr,         info_ptr->x_white, info_ptr->y_white,         info_ptr->x_red, info_ptr->y_red,         info_ptr->x_green, info_ptr->y_green,         info_ptr->x_blue, info_ptr->y_blue);#else#  ifdef PNG_FIXED_POINT_SUPPORTED      png_write_cHRM_fixed(png_ptr,         info_ptr->int_x_white, info_ptr->int_y_white,         info_ptr->int_x_red, info_ptr->int_y_red,         info_ptr->int_x_green, info_ptr->int_y_green,         info_ptr->int_x_blue, info_ptr->int_y_blue);#  endif#endif   }#endif#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)   if (info_ptr->unknown_chunks_num)   {       png_unknown_chunk *up;       png_debug(5, "writing extra chunks\n");       for (up = info_ptr->unknown_chunks;            up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;            up++)       {         int keep=png_handle_as_unknown(png_ptr, up->name);         if (keep != HANDLE_CHUNK_NEVER &&            up->location && (!(up->location & PNG_HAVE_PLTE)) &&            ((up->name[3] & 0x20) || keep == HANDLE_CHUNK_ALWAYS ||            (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))         {            png_write_chunk(png_ptr, up->name, up->data, up->size);         }       }   }#endif      png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;   }}void PNGAPIpng_write_info(png_structp png_ptr, png_infop info_ptr){#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)   int i;#endif   png_debug(1, "in png_write_info\n");   png_write_info_before_PLTE(png_ptr, info_ptr);   if (info_ptr->valid & PNG_INFO_PLTE)      png_write_PLTE(png_ptr, info_ptr->palette,         (png_uint_32)info_ptr->num_palette);   else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)      png_error(png_ptr, "Valid palette required for paletted images\n");#if defined(PNG_WRITE_tRNS_SUPPORTED)   if (info_ptr->valid & PNG_INFO_tRNS)      {#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)         /* invert the alpha channel (in tRNS) */         if ((png_ptr->transformations & PNG_INVERT_ALPHA) &&            info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)         {            int j;            for (j=0; j<(int)info_ptr->num_trans; j++)               info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]);         }#endif      png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values),         info_ptr->num_trans, info_ptr->color_type);      }#endif#if defined(PNG_WRITE_bKGD_SUPPORTED)   if (info_ptr->valid & PNG_INFO_bKGD)      png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type);#endif#if defined(PNG_WRITE_hIST_SUPPORTED)   if (info_ptr->valid & PNG_INFO_hIST)      png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette);#endif#if defined(PNG_WRITE_oFFs_SUPPORTED)   if (info_ptr->valid & PNG_INFO_oFFs)      png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset,         info_ptr->offset_unit_type);#endif#if defined(PNG_WRITE_pCAL_SUPPORTED)   if (info_ptr->valid & PNG_INFO_pCAL)      png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0,         info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,         info_ptr->pcal_units, info_ptr->pcal_params);#endif#if defined(PNG_WRITE_sCAL_SUPPORTED)   if (info_ptr->valid & PNG_INFO_sCAL)#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)      png_write_sCAL(png_ptr, (int)info_ptr->scal_unit,          info_ptr->scal_pixel_width, info_ptr->scal_pixel_height);#else#ifdef PNG_FIXED_POINT_SUPPORTED      png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit,          info_ptr->scal_s_width, info_ptr->scal_s_height);#else      png_warning(png_ptr,          "png_write_sCAL not supported; sCAL chunk not written.\n");#endif#endif#endif#if defined(PNG_WRITE_pHYs_SUPPORTED)   if (info_ptr->valid & PNG_INFO_pHYs)      png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,         info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type);#endif#if defined(PNG_WRITE_tIME_SUPPORTED)   if (info_ptr->valid & PNG_INFO_tIME)   {      png_write_tIME(png_ptr, &(info_ptr->mod_time));      png_ptr->mode |= PNG_WROTE_tIME;   }#endif#if defined(PNG_WRITE_sPLT_SUPPORTED)   if (info_ptr->valid & PNG_INFO_sPLT)     for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)       png_write_sPLT(png_ptr, info_ptr->splt_palettes + i);#endif#if defined(PNG_WRITE_TEXT_SUPPORTED)   /* Check to see if we need to write text chunks */   for (i = 0; i < info_ptr->num_text; i++)   {      png_debug2(2, "Writing header text chunk %d, type %d\n", i,         info_ptr->text[i].compression);      /* an internationalized chunk? */      if (info_ptr->text[i].compression > 0)      {#if defined(PNG_WRITE_iTXt_SUPPORTED)          /* write international chunk */          png_write_iTXt(png_ptr,                         info_ptr->text[i].compression,                         info_ptr->text[i].key,                         info_ptr->text[i].lang,                         info_ptr->text[i].lang_key,                         info_ptr->text[i].text);#else          png_warning(png_ptr, "Unable to write international text\n");#endif          /* Mark this chunk as written */          info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;      }      /* If we want a compressed text chunk */      else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt)      {#if defined(PNG_WRITE_zTXt_SUPPORTED)         /* write compressed chunk */         png_write_zTXt(png_ptr, info_ptr->text[i].key,            info_ptr->text[i].text, 0,            info_ptr->text[i].compression);#else         png_warning(png_ptr, "Unable to write compressed text\n");#endif         /* Mark this chunk as written */         info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;      }      else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)      {#if defined(PNG_WRITE_tEXt_SUPPORTED)         /* write uncompressed chunk */         png_write_tEXt(png_ptr, info_ptr->text[i].key,                         info_ptr->text[i].text,                         0);#else         png_warning(png_ptr, "Unable to write uncompressed text\n");#endif         /* Mark this chunk as written */         info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;      }   }#endif#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)   if (info_ptr->unknown_chunks_num)   {       png_unknown_chunk *up;       png_debug(5, "writing extra chunks\n");       for (up = info_ptr->unknown_chunks;            up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;            up++)       {         int keep=png_handle_as_unknown(png_ptr, up->name);         if (keep != HANDLE_CHUNK_NEVER &&            up->location && (up->location & PNG_HAVE_PLTE) &&            !(up->location & PNG_HAVE_IDAT) &&            ((up->name[3] & 0x20) || keep == HANDLE_CHUNK_ALWAYS ||            (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))         {            png_write_chunk(png_ptr, up->name, up->data, up->size);         }       }   }#endif}/* Writes the end of the PNG file.  If you don't want to write comments or * time information, you can pass NULL for info.  If you already wrote these * in png_write_info(), do not write them again here.  If you have long * comments, I suggest writing them here, and compressing them. */void PNGAPIpng_write_end(png_structp png_ptr, png_infop info_ptr){   png_debug(1, "in png_write_end\n");   if (!(png_ptr->mode & PNG_HAVE_IDAT))      png_error(png_ptr, "No IDATs written into file");   /* see if user wants us to write information chunks */   if (info_ptr != NULL)   {#if defined(PNG_WRITE_TEXT_SUPPORTED)      int i; /* local index variable */#endif#if defined(PNG_WRITE_tIME_SUPPORTED)      /* check to see if user has supplied a time chunk */      if ((info_ptr->valid & PNG_INFO_tIME) &&         !(png_ptr->mode & PNG_WROTE_tIME))         png_write_tIME(png_ptr, &(info_ptr->mod_time));#endif#if defined(PNG_WRITE_TEXT_SUPPORTED)      /* loop through comment chunks */      for (i = 0; i < info_ptr->num_text; i++)      {         png_debug2(2, "Writing trailer text chunk %d, type %d\n", i,            info_ptr->text[i].compression);         /* an internationalized chunk? */         if (info_ptr->text[i].compression > 0)         {#if defined(PNG_WRITE_iTXt_SUPPORTED)             /* write international chunk */             png_write_iTXt(png_ptr,                         info_ptr->text[i].compression,                         info_ptr->text[i].key,                         info_ptr->text[i].lang,                         info_ptr->text[i].lang_key,                         info_ptr->text[i].text);#else             png_warning(png_ptr, "Unable to write international text\n");#endif             /* Mark this chunk as written */             info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;         }         else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)         {#if defined(PNG_WRITE_zTXt_SUPPORTED)            /* write compressed chunk */            png_write_zTXt(png_ptr, info_ptr->text[i].key,               info_ptr->text[i].text, 0,               info_ptr->text[i].compression);#else            png_warning(png_ptr, "Unable to write compressed text\n");#endif            /* Mark this chunk as written */            info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;         }         else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)         {#if defined(PNG_WRITE_tEXt_SUPPORTED)            /* write uncompressed chunk */            png_write_tEXt(png_ptr, info_ptr->text[i].key,               info_ptr->text[i].text, 0);#else            png_warning(png_ptr, "Unable to write uncompressed text\n");#endif            /* Mark this chunk as written */            info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;         }      }#endif#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)   if (info_ptr->unknown_chunks_num)   {       png_unknown_chunk *up;       png_debug(5, "writing extra chunks\n");

⌨️ 快捷键说明

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