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

📄 pngwutil.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
   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");      return;   }   lang_key_len = png_strlen(lang_key);   text_len = png_strlen(text);   if (text == NULL || *text == '\0')      text_len = 0;   /* 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);   png_write_chunk_data(png_ptr, (png_bytep)new_lang, lang_len + 1);   png_write_chunk_data(png_ptr, (png_bytep)lang_key, lang_key_len+1);   png_write_chunk_data(png_ptr, '\0', 1);   png_write_compressed_data_out(png_ptr, &comp);   png_write_chunk_end(png_ptr);   png_free(png_ptr, new_key);   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_uint_32 x_offset,   png_uint_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_uint_32(buf, x_offset);   png_save_uint_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;      }   }#ifdef PNG_WRITE_INTERLACING_SUPPORTED   /* if interlaced, we need to set up width and height of pass */   if (png_ptr->interlaced)   {      if (!(png_ptr->transformations & PNG_INTERLACE))      {         png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -            png_pass_ystart[0]) / png_pass_yinc[0];         png_ptr->usr_width = (png_ptr->width + png_pass_inc[0] - 1 -            png_pass_start[0]) / png_pass_inc[0];      }      else      {         png_ptr->num_rows = png_ptr->height;         png_ptr->usr_width = png_ptr->width;      }   }   else#endif   {      png_ptr->num_rows = png_ptr->height;      png_ptr->usr_width = png_ptr->width;   }   png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;   png_ptr->zstream.next_out = png_ptr->zbuf;}/* Internal use only.  Called when finished processing a row of data. */void /* PRIVATE */png_write_finish_row(png_structp png_ptr){#ifdef PNG_USE_LOCAL_ARRAYS   /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */

⌨️ 快捷键说明

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