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

📄 pngrtran.c

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 C
📖 第 1 页 / 共 5 页
字号:
#if !defined(PNG_READ_EXPAND_SUPPORTED)   if(png_ptr)      return;#endif}/* Transform the row.  The order of transformations is significant, * and is very touchy.  If you add a transformation, take care to * decide how it fits in with the other transformations here. */void /* PRIVATE */png_do_read_transformations(png_structp png_ptr){   png_debug(1, "in png_do_read_transformations\n");#if !defined(PNG_USELESS_TESTS_SUPPORTED)   if (png_ptr->row_buf == NULL)   {#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)      char msg[50];      sprintf(msg, "NULL row buffer for row %ld, pass %d", png_ptr->row_number,         png_ptr->pass);      png_error(png_ptr, msg);#else      png_error(png_ptr, "NULL row buffer");#endif   }#endif#if defined(PNG_READ_EXPAND_SUPPORTED)   if (png_ptr->transformations & PNG_EXPAND)   {      if (png_ptr->row_info.color_type == PNG_COLOR_TYPE_PALETTE)      {         png_do_expand_palette(&(png_ptr->row_info), png_ptr->row_buf + 1,            png_ptr->palette, png_ptr->trans, png_ptr->num_trans);      }      else      {         if (png_ptr->num_trans)            png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1,               &(png_ptr->trans_values));         else            png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1,               NULL);      }   }#endif#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)   if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA)      png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1,         PNG_FLAG_FILLER_AFTER | (png_ptr->flags & PNG_FLAG_STRIP_ALPHA));#endif#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)   if (png_ptr->transformations & PNG_RGB_TO_GRAY)   {      int rgb_error =         png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), png_ptr->row_buf + 1);      if(rgb_error)      {         png_ptr->rgb_to_gray_status=1;         if(png_ptr->transformations == PNG_RGB_TO_GRAY_WARN)            png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel");         if(png_ptr->transformations == PNG_RGB_TO_GRAY_ERR)            png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel");      }   }#endif/*From Andreas Dilger e-mail to png-implement, 26 March 1998:  In most cases, the "simple transparency" should be done prior to doing  gray-to-RGB, or you will have to test 3x as many bytes to check if a  pixel is transparent.  You would also need to make sure that the  transparency information is upgraded to RGB.  To summarize, the current flow is:  - Gray + simple transparency -> compare 1 or 2 gray bytes and composite                                  with background "in place" if transparent,                                  convert to RGB if necessary  - Gray + alpha -> composite with gray background and remove alpha bytes,                                  convert to RGB if necessary  To support RGB backgrounds for gray images we need:  - Gray + simple transparency -> convert to RGB + simple transparency, compare                                  3 or 6 bytes and composite with background                                  "in place" if transparent (3x compare/pixel                                  compared to doing composite with gray bkgrnd)  - Gray + alpha -> convert to RGB + alpha, composite with background and                                  remove alpha bytes (3x float operations/pixel                                  compared with composite on gray background)  Greg's change will do this.  The reason it wasn't done before is for  performance, as this increases the per-pixel operations.  If we would check  in advance if the background was gray or RGB, and position the gray-to-RGB  transform appropriately, then it would save a lot of work/time. */#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)   /* if gray -> RGB, do so now only if background is non-gray; else do later    * for performance reasons */   if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&       !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY))      png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);#endif#if defined(PNG_READ_BACKGROUND_SUPPORTED)   if ((png_ptr->transformations & PNG_BACKGROUND) &&      ((png_ptr->num_trans != 0 ) ||      (png_ptr->color_type & PNG_COLOR_MASK_ALPHA)))      png_do_background(&(png_ptr->row_info), png_ptr->row_buf + 1,         &(png_ptr->trans_values), &(png_ptr->background)#if defined(PNG_READ_GAMMA_SUPPORTED)         , &(png_ptr->background_1),         png_ptr->gamma_table, png_ptr->gamma_from_1,         png_ptr->gamma_to_1, png_ptr->gamma_16_table,         png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1,         png_ptr->gamma_shift#endif);#endif#if defined(PNG_READ_GAMMA_SUPPORTED)   if ((png_ptr->transformations & PNG_GAMMA) &&#if defined(PNG_READ_BACKGROUND_SUPPORTED)      !((png_ptr->transformations & PNG_BACKGROUND) &&      ((png_ptr->num_trans != 0) ||      (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) &&#endif      (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE))      png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1,         png_ptr->gamma_table, png_ptr->gamma_16_table,         png_ptr->gamma_shift);#endif#if defined(PNG_READ_16_TO_8_SUPPORTED)   if (png_ptr->transformations & PNG_16_TO_8)      png_do_chop(&(png_ptr->row_info), png_ptr->row_buf + 1);#endif#if defined(PNG_READ_DITHER_SUPPORTED)   if (png_ptr->transformations & PNG_DITHER)   {      png_do_dither((png_row_infop)&(png_ptr->row_info), png_ptr->row_buf + 1,         png_ptr->palette_lookup, png_ptr->dither_index);      if(png_ptr->row_info.rowbytes == (png_uint_32)0)         png_error(png_ptr, "png_do_dither returned rowbytes=0");   }#endif#if defined(PNG_READ_INVERT_SUPPORTED)   if (png_ptr->transformations & PNG_INVERT_MONO)      png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1);#endif#if defined(PNG_READ_SHIFT_SUPPORTED)   if (png_ptr->transformations & PNG_SHIFT)      png_do_unshift(&(png_ptr->row_info), png_ptr->row_buf + 1,         &(png_ptr->shift));#endif#if defined(PNG_READ_PACK_SUPPORTED)   if (png_ptr->transformations & PNG_PACK)      png_do_unpack(&(png_ptr->row_info), png_ptr->row_buf + 1);#endif#if defined(PNG_READ_BGR_SUPPORTED)   if (png_ptr->transformations & PNG_BGR)      png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1);#endif#if defined(PNG_READ_PACKSWAP_SUPPORTED)   if (png_ptr->transformations & PNG_PACKSWAP)      png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1);#endif#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)   /* if gray -> RGB, do so now only if we did not do so above */   if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&       (png_ptr->mode & PNG_BACKGROUND_IS_GRAY))      png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);#endif#if defined(PNG_READ_FILLER_SUPPORTED)   if (png_ptr->transformations & PNG_FILLER)      png_do_read_filler(&(png_ptr->row_info), png_ptr->row_buf + 1,         (png_uint_32)png_ptr->filler, png_ptr->flags);#endif#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)   if (png_ptr->transformations & PNG_INVERT_ALPHA)      png_do_read_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);#endif#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)   if (png_ptr->transformations & PNG_SWAP_ALPHA)      png_do_read_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);#endif#if defined(PNG_READ_SWAP_SUPPORTED)   if (png_ptr->transformations & PNG_SWAP_BYTES)      png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1);#endif#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)   if (png_ptr->transformations & PNG_USER_TRANSFORM)    {      if(png_ptr->read_user_transform_fn != NULL)        (*(png_ptr->read_user_transform_fn)) /* user read transform function */          (png_ptr,                    /* png_ptr */           &(png_ptr->row_info),       /* row_info:     */             /*  png_uint_32 width;          width of row */             /*  png_uint_32 rowbytes;       number of bytes in row */             /*  png_byte color_type;        color type of pixels */             /*  png_byte bit_depth;         bit depth of samples */             /*  png_byte channels;          number of channels (1-4) */             /*  png_byte pixel_depth;       bits per pixel (depth*channels) */           png_ptr->row_buf + 1);      /* start of pixel data for row */#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)      if(png_ptr->user_transform_depth)         png_ptr->row_info.bit_depth = png_ptr->user_transform_depth;      if(png_ptr->user_transform_channels)         png_ptr->row_info.channels = png_ptr->user_transform_channels;#endif      png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth *         png_ptr->row_info.channels);      png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,         png_ptr->row_info.width);   }#endif}#if defined(PNG_READ_PACK_SUPPORTED)/* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel, * without changing the actual values.  Thus, if you had a row with * a bit depth of 1, you would end up with bytes that only contained * the numbers 0 or 1.  If you would rather they contain 0 and 255, use * png_do_shift() after this. */void /* PRIVATE */png_do_unpack(png_row_infop row_info, png_bytep row){   png_debug(1, "in png_do_unpack\n");#if defined(PNG_USELESS_TESTS_SUPPORTED)   if (row != NULL && row_info != NULL && row_info->bit_depth < 8)#else   if (row_info->bit_depth < 8)#endif   {      png_uint_32 i;      png_uint_32 row_width=row_info->width;      switch (row_info->bit_depth)      {         case 1:         {            png_bytep sp = row + (png_size_t)((row_width - 1) >> 3);            png_bytep dp = row + (png_size_t)row_width - 1;            png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07);            for (i = 0; i < row_width; i++)            {               *dp = (png_byte)((*sp >> shift) & 0x01);               if (shift == 7)               {                  shift = 0;                  sp--;               }               else                  shift++;               dp--;            }            break;         }         case 2:         {            png_bytep sp = row + (png_size_t)((row_width - 1) >> 2);            png_bytep dp = row + (png_size_t)row_width - 1;            png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);            for (i = 0; i < row_width; i++)            {               *dp = (png_byte)((*sp >> shift) & 0x03);               if (shift == 6)               {                  shift = 0;                  sp--;               }               else                  shift += 2;               dp--;            }            break;         }         case 4:         {            png_bytep sp = row + (png_size_t)((row_width - 1) >> 1);            png_bytep dp = row + (png_size_t)row_width - 1;            png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);            for (i = 0; i < row_width; i++)            {               *dp = (png_byte)((*sp >> shift) & 0x0f);               if (shift == 4)               {                  shift = 0;                  sp--;               }               else                  shift = 4;               dp--;            }            break;         }      }      row_info->bit_depth = 8;      row_info->pixel_depth = (png_byte)(8 * row_info->channels);      row_info->rowbytes = row_width * row_info->channels;   }}#endif#if defined(PNG_READ_SHIFT_SUPPORTED)/* Reverse the effects of png_do_shift.  This routine merely shifts the * pixels back to their significant bits values.  Thus, if you have * a row of bit depth 8, but only 5 are significant, this will shift * the values back to 0 through 31. */void /* PRIVATE */png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits){   png_debug(1, "in png_do_unshift\n");   if (#if defined(PNG_USELESS_TESTS_SUPPORTED)       row != NULL && row_info != NULL && sig_bits != NULL &&#endif       row_info->color_type != PNG_COLOR_TYPE_PALETTE)   {      int shift[4];      int channels = 0;      int c;      png_uint_16 value = 0;      png_uint_32 row_width = row_info->width;      if (row_info->color_type & PNG_COLOR_MASK_COLOR)      {         shift[channels++] = row_info->bit_depth - sig_bits->red;         shift[channels++] = row_info->bit_depth - sig_bits->green;         shift[channels++] = row_info->bit_depth - sig_bits->blue;      }      else      {         shift[channels++] = row_info->bit_depth - sig_bits->gray;      }      if (row_info->color_type & PNG_COLOR_MASK_ALPHA)      {         shift[channels++] = row_info->bit_depth - sig_bits->alpha;      }      for (c = 0; c < channels; c++)      {         if (shift[c] <= 0)            shift[c] = 0;         else            value = 1;      }      if (!value)         return;      switch (row_info->bit_depth)      {         case 2:         {            png_bytep bp;            png_uint_32 i;            png_uint_32 istop = row_info->rowbytes;            for (bp = row, i = 0; i < istop; i++)            {               *bp >>= 1;               *bp++ &= 0x55;

⌨️ 快捷键说明

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