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

📄 pngrtran.c

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 C
📖 第 1 页 / 共 5 页
字号:
            }            break;         }         case 4:         {            png_bytep bp = row;            png_uint_32 i;            png_uint_32 istop = row_info->rowbytes;            png_byte mask = (png_byte)((((int)0xf0 >> shift[0]) & (int)0xf0) |               (png_byte)((int)0xf >> shift[0]));            for (i = 0; i < istop; i++)            {               *bp >>= shift[0];               *bp++ &= mask;            }            break;         }         case 8:         {            png_bytep bp = row;            png_uint_32 i;            png_uint_32 istop = row_width * channels;            for (i = 0; i < istop; i++)            {               *bp++ >>= shift[i%channels];            }            break;         }         case 16:         {            png_bytep bp = row;            png_uint_32 i;            png_uint_32 istop = channels * row_width;            for (i = 0; i < istop; i++)            {               value = (png_uint_16)((*bp << 8) + *(bp + 1));               value >>= shift[i%channels];               *bp++ = (png_byte)(value >> 8);               *bp++ = (png_byte)(value & 0xff);            }            break;         }      }   }}#endif#if defined(PNG_READ_16_TO_8_SUPPORTED)/* chop rows of bit depth 16 down to 8 */void /* PRIVATE */png_do_chop(png_row_infop row_info, png_bytep row){   png_debug(1, "in png_do_chop\n");#if defined(PNG_USELESS_TESTS_SUPPORTED)   if (row != NULL && row_info != NULL && row_info->bit_depth == 16)#else   if (row_info->bit_depth == 16)#endif   {      png_bytep sp = row;      png_bytep dp = row;      png_uint_32 i;      png_uint_32 istop = row_info->width * row_info->channels;      for (i = 0; i<istop; i++, sp += 2, dp++)      {#if defined(PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED)      /* This does a more accurate scaling of the 16-bit color       * value, rather than a simple low-byte truncation.       *       * What the ideal calculation should be:       *   *dp = (((((png_uint_32)(*sp) << 8) |       *          (png_uint_32)(*(sp + 1))) * 255 + 127) / (png_uint_32)65535L;       *       * GRR: no, I think this is what it really should be:       *   *dp = (((((png_uint_32)(*sp) << 8) |       *           (png_uint_32)(*(sp + 1))) + 128L) / (png_uint_32)257L;       *       * GRR: here's the exact calculation with shifts:       *   temp = (((png_uint_32)(*sp) << 8) | (png_uint_32)(*(sp + 1))) + 128L;       *   *dp = (temp - (temp >> 8)) >> 8;       *       * Approximate calculation with shift/add instead of multiply/divide:       *   *dp = ((((png_uint_32)(*sp) << 8) |       *          (png_uint_32)((int)(*(sp + 1)) - *sp)) + 128) >> 8;       *       * What we actually do to avoid extra shifting and conversion:       */         *dp = *sp + ((((int)(*(sp + 1)) - *sp) > 128) ? 1 : 0);#else       /* Simply discard the low order byte */         *dp = *sp;#endif      }      row_info->bit_depth = 8;      row_info->pixel_depth = (png_byte)(8 * row_info->channels);      row_info->rowbytes = row_info->width * row_info->channels;   }}#endif#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)void /* PRIVATE */png_do_read_swap_alpha(png_row_infop row_info, png_bytep row){   png_debug(1, "in png_do_read_swap_alpha\n");#if defined(PNG_USELESS_TESTS_SUPPORTED)   if (row != NULL && row_info != NULL)#endif   {      png_uint_32 row_width = row_info->width;      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)      {         /* This converts from RGBA to ARGB */         if (row_info->bit_depth == 8)         {            png_bytep sp = row + row_info->rowbytes;            png_bytep dp = sp;            png_byte save;            png_uint_32 i;            for (i = 0; i < row_width; i++)            {               save = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = save;            }         }         /* This converts from RRGGBBAA to AARRGGBB */         else         {            png_bytep sp = row + row_info->rowbytes;            png_bytep dp = sp;            png_byte save[2];            png_uint_32 i;            for (i = 0; i < row_width; i++)            {               save[0] = *(--sp);               save[1] = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = save[0];               *(--dp) = save[1];            }         }      }      else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)      {         /* This converts from GA to AG */         if (row_info->bit_depth == 8)         {            png_bytep sp = row + row_info->rowbytes;            png_bytep dp = sp;            png_byte save;            png_uint_32 i;            for (i = 0; i < row_width; i++)            {               save = *(--sp);               *(--dp) = *(--sp);               *(--dp) = save;            }         }         /* This converts from GGAA to AAGG */         else         {            png_bytep sp = row + row_info->rowbytes;            png_bytep dp = sp;            png_byte save[2];            png_uint_32 i;            for (i = 0; i < row_width; i++)            {               save[0] = *(--sp);               save[1] = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = save[0];               *(--dp) = save[1];            }         }      }   }}#endif#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)void /* PRIVATE */png_do_read_invert_alpha(png_row_infop row_info, png_bytep row){   png_debug(1, "in png_do_read_invert_alpha\n");#if defined(PNG_USELESS_TESTS_SUPPORTED)   if (row != NULL && row_info != NULL)#endif   {      png_uint_32 row_width = row_info->width;      if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)      {         /* This inverts the alpha channel in RGBA */         if (row_info->bit_depth == 8)         {            png_bytep sp = row + row_info->rowbytes;            png_bytep dp = sp;            png_uint_32 i;            for (i = 0; i < row_width; i++)            {               *(--dp) = (png_byte)(255 - *(--sp));/*             This does nothing:               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               We can replace it with:*/               sp-=3;               dp=sp;            }         }         /* This inverts the alpha channel in RRGGBBAA */         else         {            png_bytep sp = row + row_info->rowbytes;            png_bytep dp = sp;            png_uint_32 i;            for (i = 0; i < row_width; i++)            {               *(--dp) = (png_byte)(255 - *(--sp));               *(--dp) = (png_byte)(255 - *(--sp));/*             This does nothing:               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               We can replace it with:*/               sp-=6;               dp=sp;            }         }      }      else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)      {         /* This inverts the alpha channel in GA */         if (row_info->bit_depth == 8)         {            png_bytep sp = row + row_info->rowbytes;            png_bytep dp = sp;            png_uint_32 i;            for (i = 0; i < row_width; i++)            {               *(--dp) = (png_byte)(255 - *(--sp));               *(--dp) = *(--sp);            }         }         /* This inverts the alpha channel in GGAA */         else         {            png_bytep sp  = row + row_info->rowbytes;            png_bytep dp = sp;            png_uint_32 i;            for (i = 0; i < row_width; i++)            {               *(--dp) = (png_byte)(255 - *(--sp));               *(--dp) = (png_byte)(255 - *(--sp));/*               *(--dp) = *(--sp);               *(--dp) = *(--sp);*/               sp-=2;               dp=sp;            }         }      }   }}#endif#if defined(PNG_READ_FILLER_SUPPORTED)/* Add filler channel if we have RGB color */void /* PRIVATE */png_do_read_filler(png_row_infop row_info, png_bytep row,   png_uint_32 filler, png_uint_32 flags){   png_uint_32 i;   png_uint_32 row_width = row_info->width;   png_byte hi_filler = (png_byte)((filler>>8) & 0xff);   png_byte lo_filler = (png_byte)(filler & 0xff);   png_debug(1, "in png_do_read_filler\n");   if (#if defined(PNG_USELESS_TESTS_SUPPORTED)       row != NULL  && row_info != NULL &&#endif       row_info->color_type == PNG_COLOR_TYPE_GRAY)   {      if(row_info->bit_depth == 8)      {         /* This changes the data from G to GX */         if (flags & PNG_FLAG_FILLER_AFTER)         {            png_bytep sp = row + (png_size_t)row_width;            png_bytep dp =  sp + (png_size_t)row_width;            for (i = 1; i < row_width; i++)            {               *(--dp) = lo_filler;               *(--dp) = *(--sp);            }            *(--dp) = lo_filler;            row_info->channels = 2;            row_info->pixel_depth = 16;            row_info->rowbytes = row_width * 2;         }      /* This changes the data from G to XG */         else         {            png_bytep sp = row + (png_size_t)row_width;            png_bytep dp = sp  + (png_size_t)row_width;            for (i = 0; i < row_width; i++)            {               *(--dp) = *(--sp);               *(--dp) = lo_filler;            }            row_info->channels = 2;            row_info->pixel_depth = 16;            row_info->rowbytes = row_width * 2;         }      }      else if(row_info->bit_depth == 16)      {         /* This changes the data from GG to GGXX */         if (flags & PNG_FLAG_FILLER_AFTER)         {            png_bytep sp = row + (png_size_t)row_width * 2;            png_bytep dp = sp  + (png_size_t)row_width * 2;            for (i = 1; i < row_width; i++)            {               *(--dp) = hi_filler;               *(--dp) = lo_filler;               *(--dp) = *(--sp);               *(--dp) = *(--sp);            }            *(--dp) = hi_filler;            *(--dp) = lo_filler;            row_info->channels = 2;            row_info->pixel_depth = 32;            row_info->rowbytes = row_width * 4;         }         /* This changes the data from GG to XXGG */         else         {            png_bytep sp = row + (png_size_t)row_width * 2;            png_bytep dp = sp  + (png_size_t)row_width * 2;            for (i = 0; i < row_width; i++)            {               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = hi_filler;               *(--dp) = lo_filler;            }            row_info->channels = 2;            row_info->pixel_depth = 32;            row_info->rowbytes = row_width * 4;         }      }   } /* COLOR_TYPE == GRAY */   else if (row_in

⌨️ 快捷键说明

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