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

📄 pngrtran.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
#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;            png_bytep dp = sp  + (png_size_t)row_width;            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;            png_bytep dp = sp  + (png_size_t)row_width;            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_info->color_type == PNG_COLOR_TYPE_RGB)   {      if(row_info->bit_depth == 8)      {         /* This changes the data from RGB to RGBX */         if (flags & PNG_FLAG_FILLER_AFTER)         {            png_bytep sp = row + (png_size_t)row_width * 3;            png_bytep dp = sp  + (png_size_t)row_width;            for (i = 1; i < row_width; i++)            {               *(--dp) = lo_filler;               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);            }            *(--dp) = lo_filler;            row_info->channels = 4;            row_info->pixel_depth = 32;            row_info->rowbytes = row_width * 4;         }      /* This changes the data from RGB to XRGB */         else         {            png_bytep sp = row + (png_size_t)row_width * 3;            png_bytep dp = sp + (png_size_t)row_width;            for (i = 0; i < row_width; i++)            {               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = lo_filler;            }            row_info->channels = 4;            row_info->pixel_depth = 32;            row_info->rowbytes = row_width * 4;         }      }      else if(row_info->bit_depth == 16)      {         /* This changes the data from RRGGBB to RRGGBBXX */         if (flags & PNG_FLAG_FILLER_AFTER)         {            png_bytep sp = row + (png_size_t)row_width * 3;            png_bytep dp = sp  + (png_size_t)row_width;            for (i = 1; i < row_width; i++)            {               *(--dp) = hi_filler;               *(--dp) = lo_filler;               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);            }            *(--dp) = hi_filler;            *(--dp) = lo_filler;            row_info->channels = 4;            row_info->pixel_depth = 64;            row_info->rowbytes = row_width * 8;         }         /* This changes the data from RRGGBB to XXRRGGBB */         else         {            png_bytep sp = row + (png_size_t)row_width * 3;            png_bytep dp = sp  + (png_size_t)row_width;            for (i = 0; i < row_width; i++)            {               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--sp);               *(--dp) = *(--

⌨️ 快捷键说明

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