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

📄 pngwutil.c

📁 Linux下的基于X11的图形开发环境。
💻 C
📖 第 1 页 / 共 5 页
字号:
    * We leave it to the application to meet PNG-1.0 requirements on the    * contents of the text.  PNG-1.0 through PNG-1.2 discourage the use of    * any non-Latin-1 characters except for NEWLINE.  ISO PNG will forbid them.    * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.    */   png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1);   if (text_len)      png_write_chunk_data(png_ptr, (png_bytep)text, text_len);   png_write_chunk_end(png_ptr);   png_free(png_ptr, new_key);}#endif#if defined(PNG_WRITE_zTXt_SUPPORTED)/* write a compressed text chunk */void /* PRIVATE */png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text,   png_size_t text_len, int compression){#ifdef PNG_USE_LOCAL_ARRAYS   PNG_zTXt;#endif   png_size_t key_len;   char buf[1];   png_charp new_key;   compression_state comp;   png_debug(1, "in png_write_zTXt\n");   if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)   {      png_warning(png_ptr, "Empty keyword in zTXt chunk");      return;   }   if (text == NULL || *text == '\0' || compression==PNG_TEXT_COMPRESSION_NONE)   {      png_write_tEXt(png_ptr, new_key, text, (png_size_t)0);      png_free(png_ptr, new_key);      return;   }   text_len = png_strlen(text);   png_free(png_ptr, new_key);   /* compute the compressed data; do it now for the length */   text_len = png_text_compress(png_ptr, text, text_len, compression,       &comp);   /* write start of chunk */   png_write_chunk_start(png_ptr, (png_bytep)png_zTXt, (png_uint_32)      (key_len+text_len+2));   /* write key */   png_write_chunk_data(png_ptr, (png_bytep)key, key_len + 1);   buf[0] = (png_byte)compression;   /* write compression */   png_write_chunk_data(png_ptr, (png_bytep)buf, (png_size_t)1);   /* write the compressed data */   png_write_compressed_data_out(png_ptr, &comp);   /* close the chunk */   png_write_chunk_end(png_ptr);}#endif#if defined(PNG_WRITE_iTXt_SUPPORTED)/* write an iTXt chunk */void /* PRIVATE */png_write_iTXt(png_structp png_ptr, int compression, png_charp key,    png_charp lang, png_charp lang_key, png_charp text){#ifdef PNG_USE_LOCAL_ARRAYS   PNG_iTXt;#endif   png_size_t lang_len, key_len, lang_key_len, text_len;   png_charp new_lang, new_key;   png_byte cbuf[2];   compression_state comp;   png_debug(1, "in png_write_iTXt\n");   if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)   {      png_warning(png_ptr, "Empty keyword in iTXt chunk");      return;   }   if (lang == NULL || (lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0)   {      png_warning(png_ptr, "Empty language field in iTXt chunk");      new_lang = NULL;      lang_len = 0;         }   if (lang_key == NULL)     lang_key_len = 0;   else     lang_key_len = png_strlen(lang_key);   if (text == NULL)      text_len = 0;   else     text_len = png_strlen(text);   /* compute the compressed data; do it now for the length */   text_len = png_text_compress(png_ptr, text, text_len, compression-2,      &comp);   /* make sure we include the compression flag, the compression byte,    * and the NULs after the key, lang, and lang_key parts */   png_write_chunk_start(png_ptr, (png_bytep)png_iTXt,          (png_uint_32)(        5 /* comp byte, comp flag, terminators for key, lang and lang_key */        + key_len        + lang_len        + lang_key_len        + text_len));   /*    * We leave it to the application to meet PNG-1.0 requirements on the    * contents of the text.  PNG-1.0 through PNG-1.2 discourage the use of    * any non-Latin-1 characters except for NEWLINE.  ISO PNG will forbid them.    * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.    */   png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1);   /* set the compression flag */   if (compression == PNG_ITXT_COMPRESSION_NONE || \       compression == PNG_TEXT_COMPRESSION_NONE)       cbuf[0] = 0;   else /* compression == PNG_ITXT_COMPRESSION_zTXt */       cbuf[0] = 1;   /* set the compression method */   cbuf[1] = 0;   png_write_chunk_data(png_ptr, cbuf, 2);   cbuf[0] = 0;   png_write_chunk_data(png_ptr, (new_lang ? (png_bytep)new_lang : cbuf), lang_len + 1);   png_write_chunk_data(png_ptr, (lang_key ? (png_bytep)lang_key : cbuf), lang_key_len + 1);   png_write_compressed_data_out(png_ptr, &comp);   png_write_chunk_end(png_ptr);   png_free(png_ptr, new_key);   if (new_lang)     png_free(png_ptr, new_lang);}#endif#if defined(PNG_WRITE_oFFs_SUPPORTED)/* write the oFFs chunk */void /* PRIVATE */png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,   int unit_type){#ifdef PNG_USE_LOCAL_ARRAYS   PNG_oFFs;#endif   png_byte buf[9];   png_debug(1, "in png_write_oFFs\n");   if (unit_type >= PNG_OFFSET_LAST)      png_warning(png_ptr, "Unrecognized unit type for oFFs chunk");   png_save_int_32(buf, x_offset);   png_save_int_32(buf + 4, y_offset);   buf[8] = (png_byte)unit_type;   png_write_chunk(png_ptr, (png_bytep)png_oFFs, buf, (png_size_t)9);}#endif#if defined(PNG_WRITE_pCAL_SUPPORTED)/* write the pCAL chunk (described in the PNG extensions document) */void /* PRIVATE */png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,   png_int_32 X1, int type, int nparams, png_charp units, png_charpp params){#ifdef PNG_USE_LOCAL_ARRAYS   PNG_pCAL;#endif   png_size_t purpose_len, units_len, total_len;   png_uint_32p params_len;   png_byte buf[10];   png_charp new_purpose;   int i;   png_debug1(1, "in png_write_pCAL (%d parameters)\n", nparams);   if (type >= PNG_EQUATION_LAST)      png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");   purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1;   png_debug1(3, "pCAL purpose length = %d\n", (int)purpose_len);   units_len = png_strlen(units) + (nparams == 0 ? 0 : 1);   png_debug1(3, "pCAL units length = %d\n", (int)units_len);   total_len = purpose_len + units_len + 10;   params_len = (png_uint_32p)png_malloc(png_ptr, (png_uint_32)(nparams      *sizeof(png_uint_32)));   /* Find the length of each parameter, making sure we don't count the      null terminator for the last parameter. */   for (i = 0; i < nparams; i++)   {      params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1);      png_debug2(3, "pCAL parameter %d length = %lu\n", i, params_len[i]);      total_len += (png_size_t)params_len[i];   }   png_debug1(3, "pCAL total length = %d\n", (int)total_len);   png_write_chunk_start(png_ptr, (png_bytep)png_pCAL, (png_uint_32)total_len);   png_write_chunk_data(png_ptr, (png_bytep)new_purpose, purpose_len);   png_save_int_32(buf, X0);   png_save_int_32(buf + 4, X1);   buf[8] = (png_byte)type;   buf[9] = (png_byte)nparams;   png_write_chunk_data(png_ptr, buf, (png_size_t)10);   png_write_chunk_data(png_ptr, (png_bytep)units, (png_size_t)units_len);   png_free(png_ptr, new_purpose);   for (i = 0; i < nparams; i++)   {      png_write_chunk_data(png_ptr, (png_bytep)params[i],         (png_size_t)params_len[i]);   }   png_free(png_ptr, params_len);   png_write_chunk_end(png_ptr);}#endif#if defined(PNG_WRITE_sCAL_SUPPORTED)/* write the sCAL chunk */#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)void /* PRIVATE */png_write_sCAL(png_structp png_ptr, int unit, double width,double height){#ifdef PNG_USE_LOCAL_ARRAYS   PNG_sCAL;#endif   png_size_t total_len;   char wbuf[32], hbuf[32];   png_debug(1, "in png_write_sCAL\n");#if defined(_WIN32_WCE)/* sprintf() function is not supported on WindowsCE */   {      wchar_t wc_buf[32];      swprintf(wc_buf, TEXT("%12.12e"), width);      WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, wbuf, 32, NULL, NULL);      swprintf(wc_buf, TEXT("%12.12e"), height);      WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, hbuf, 32, NULL, NULL);   }#else   sprintf(wbuf, "%12.12e", width);   sprintf(hbuf, "%12.12e", height);#endif   total_len = 1 + png_strlen(wbuf)+1 + png_strlen(hbuf);   png_debug1(3, "sCAL total length = %d\n", (int)total_len);   png_write_chunk_start(png_ptr, (png_bytep)png_sCAL, (png_uint_32)total_len);   png_write_chunk_data(png_ptr, (png_bytep)&unit, 1);   png_write_chunk_data(png_ptr, (png_bytep)wbuf, png_strlen(wbuf)+1);   png_write_chunk_data(png_ptr, (png_bytep)hbuf, png_strlen(hbuf));   png_write_chunk_end(png_ptr);}#else#ifdef PNG_FIXED_POINT_SUPPORTEDvoid /* PRIVATE */png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width,   png_charp height){#ifdef PNG_USE_LOCAL_ARRAYS   PNG_sCAL;#endif   png_size_t total_len;   char wbuf[32], hbuf[32];   png_debug(1, "in png_write_sCAL_s\n");   png_strcpy(wbuf,(const char *)width);   png_strcpy(hbuf,(const char *)height);   total_len = 1 + png_strlen(wbuf)+1 + png_strlen(hbuf);   png_debug1(3, "sCAL total length = %d\n", total_len);   png_write_chunk_start(png_ptr, (png_bytep)png_sCAL, (png_uint_32)total_len);   png_write_chunk_data(png_ptr, (png_bytep)&unit, 1);   png_write_chunk_data(png_ptr, (png_bytep)wbuf, png_strlen(wbuf)+1);   png_write_chunk_data(png_ptr, (png_bytep)hbuf, png_strlen(hbuf));   png_write_chunk_end(png_ptr);}#endif#endif#endif#if defined(PNG_WRITE_pHYs_SUPPORTED)/* write the pHYs chunk */void /* PRIVATE */png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,   png_uint_32 y_pixels_per_unit,   int unit_type){#ifdef PNG_USE_LOCAL_ARRAYS   PNG_pHYs;#endif   png_byte buf[9];   png_debug(1, "in png_write_pHYs\n");   if (unit_type >= PNG_RESOLUTION_LAST)      png_warning(png_ptr, "Unrecognized unit type for pHYs chunk");   png_save_uint_32(buf, x_pixels_per_unit);   png_save_uint_32(buf + 4, y_pixels_per_unit);   buf[8] = (png_byte)unit_type;   png_write_chunk(png_ptr, (png_bytep)png_pHYs, buf, (png_size_t)9);}#endif#if defined(PNG_WRITE_tIME_SUPPORTED)/* Write the tIME chunk.  Use either png_convert_from_struct_tm() * or png_convert_from_time_t(), or fill in the structure yourself. */void /* PRIVATE */png_write_tIME(png_structp png_ptr, png_timep mod_time){#ifdef PNG_USE_LOCAL_ARRAYS   PNG_tIME;#endif   png_byte buf[7];   png_debug(1, "in png_write_tIME\n");   if (mod_time->month  > 12 || mod_time->month  < 1 ||       mod_time->day    > 31 || mod_time->day    < 1 ||       mod_time->hour   > 23 || mod_time->second > 60)   {      png_warning(png_ptr, "Invalid time specified for tIME chunk");      return;   }   png_save_uint_16(buf, mod_time->year);   buf[2] = mod_time->month;   buf[3] = mod_time->day;   buf[4] = mod_time->hour;   buf[5] = mod_time->minute;   buf[6] = mod_time->second;   png_write_chunk(png_ptr, (png_bytep)png_tIME, buf, (png_size_t)7);}#endif/* initializes the row writing capability of libpng */void /* PRIVATE */png_write_start_row(png_structp png_ptr){#ifdef PNG_USE_LOCAL_ARRAYS   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */   /* start of interlace block */   int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};   /* offset to next interlace block */   int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};   /* start of interlace block in the y direction */   int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};   /* offset to next interlace block in the y direction */   int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};#endif   png_size_t buf_size;   png_debug(1, "in png_write_start_row\n");   buf_size = (png_size_t)(((png_ptr->width * png_ptr->usr_channels *                            png_ptr->usr_bit_depth + 7) >> 3) + 1);   /* set up row buffer */   png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size);   png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE;   /* set up filtering buffer, if using this filter */   if (png_ptr->do_filter & PNG_FILTER_SUB)   {      png_ptr->sub_row = (png_bytep)png_malloc(png_ptr,         (png_ptr->rowbytes + 1));      png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB;   }   /* We only need to keep the previous row if we are using one of these. */   if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH))   {     /* set up previous row buffer */      png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size);      png_memset(png_ptr->prev_row, 0, buf_size);      if (png_ptr->do_filter & PNG_FILTER_UP)      {         png_ptr->up_row = (png_bytep )png_malloc(png_ptr,            (png_ptr->rowbytes + 1));         png_ptr->up_row[0] = PNG_FILTER_VALUE_UP;      }      if (png_ptr->do_filter & PNG_FILTER_AVG)      {         png_ptr->avg_row = (png_bytep)png_malloc(png_ptr,            (png_ptr->rowbytes + 1));         png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG;      }      if (png_ptr->do_filter & PNG_FILTER_PAETH)      {         png_ptr->paeth_row = (png_bytep )png_malloc(png_ptr,            (png_ptr->rowbytes + 1));         png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH;

⌨️ 快捷键说明

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