pngtrans.c

来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 651 行 · 第 1/2 页

C
651
字号
   0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,   0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,   0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,   0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,   0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,   0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,   0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,   0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,   0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,   0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,   0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,   0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,   0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,   0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,   0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,   0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,   0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,   0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,   0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,   0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF};/* swaps pixel packing order within bytes */void /* PRIVATE */png_do_packswap(png_row_infop row_info, png_bytep row){   png_debug(1, "in png_do_packswap\n");   if (#if defined(PNG_USELESS_TESTS_SUPPORTED)       row != NULL && row_info != NULL &&#endif       row_info->bit_depth < 8)   {      png_bytep rp, end, table;      end = row + row_info->rowbytes;      if (row_info->bit_depth == 1)         table = onebppswaptable;      else if (row_info->bit_depth == 2)         table = twobppswaptable;      else if (row_info->bit_depth == 4)         table = fourbppswaptable;      else         return;      for (rp = row; rp < end; rp++)         *rp = table[*rp];   }}#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */#if defined(PNG_WRITE_FILLER_SUPPORTED) || \    defined(PNG_READ_STRIP_ALPHA_SUPPORTED)/* remove filler or alpha byte(s) */void /* PRIVATE */png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags){   png_debug(1, "in png_do_strip_filler\n");#if defined(PNG_USELESS_TESTS_SUPPORTED)   if (row != NULL && row_info != NULL)#endif   {      png_bytep sp=row;      png_bytep dp=row;      png_uint_32 row_width=row_info->width;      png_uint_32 i;      if ((row_info->color_type == PNG_COLOR_TYPE_RGB ||         (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&         (flags & PNG_FLAG_STRIP_ALPHA))) &&         row_info->channels == 4)      {         if (row_info->bit_depth == 8)         {            /* This converts from RGBX or RGBA to RGB */            if (flags & PNG_FLAG_FILLER_AFTER)            {               dp+=3; sp+=4;               for (i = 1; i < row_width; i++)               {                  *dp++ = *sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;                  sp++;               }            }            /* This converts from XRGB or ARGB to RGB */            else            {               for (i = 0; i < row_width; i++)               {                  sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;               }            }            row_info->pixel_depth = 24;            row_info->rowbytes = row_width * 3;         }         else /* if (row_info->bit_depth == 16) */         {            if (flags & PNG_FLAG_FILLER_AFTER)            {               /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */               sp += 8; dp += 6;               for (i = 1; i < row_width; i++)               {                  /* This could be (although png_memcpy is probably slower):                  png_memcpy(dp, sp, 6);                  sp += 8;                  dp += 6;                  */                  *dp++ = *sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;                  sp += 2;               }            }            else            {               /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */               for (i = 0; i < row_width; i++)               {                  /* This could be (although png_memcpy is probably slower):                  png_memcpy(dp, sp, 6);                  sp += 8;                  dp += 6;                  */                  sp+=2;                  *dp++ = *sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;                  *dp++ = *sp++;               }            }            row_info->pixel_depth = 48;            row_info->rowbytes = row_width * 6;         }         row_info->channels = 3;      }      else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY ||         (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&         (flags & PNG_FLAG_STRIP_ALPHA))) &&          row_info->channels == 2)      {         if (row_info->bit_depth == 8)         {            /* This converts from GX or GA to G */            if (flags & PNG_FLAG_FILLER_AFTER)            {               for (i = 0; i < row_width; i++)               {                  *dp++ = *sp++;                  sp++;               }            }            /* This converts from XG or AG to G */            else            {               for (i = 0; i < row_width; i++)               {                  sp++;                  *dp++ = *sp++;               }            }            row_info->pixel_depth = 8;            row_info->rowbytes = row_width;         }         else /* if (row_info->bit_depth == 16) */         {            if (flags & PNG_FLAG_FILLER_AFTER)            {               /* This converts from GGXX or GGAA to GG */               sp += 4; dp += 2;               for (i = 1; i < row_width; i++)               {                  *dp++ = *sp++;                  *dp++ = *sp++;                  sp += 2;               }            }            else            {               /* This converts from XXGG or AAGG to GG */               for (i = 0; i < row_width; i++)               {                  sp += 2;                  *dp++ = *sp++;                  *dp++ = *sp++;               }            }            row_info->pixel_depth = 16;            row_info->rowbytes = row_width * 2;         }         row_info->channels = 1;      }      if (flags & PNG_FLAG_STRIP_ALPHA)        row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;   }}#endif#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)/* swaps red and blue bytes within a pixel */void /* PRIVATE */png_do_bgr(png_row_infop row_info, png_bytep row){   png_debug(1, "in png_do_bgr\n");   if (#if defined(PNG_USELESS_TESTS_SUPPORTED)       row != NULL && row_info != NULL &&#endif       (row_info->color_type & PNG_COLOR_MASK_COLOR))   {      png_uint_32 row_width = row_info->width;      if (row_info->bit_depth == 8)      {         if (row_info->color_type == PNG_COLOR_TYPE_RGB)         {            png_bytep rp;            png_uint_32 i;            for (i = 0, rp = row; i < row_width; i++, rp += 3)            {               png_byte save = *rp;               *rp = *(rp + 2);               *(rp + 2) = save;            }         }         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)         {            png_bytep rp;            png_uint_32 i;            for (i = 0, rp = row; i < row_width; i++, rp += 4)            {               png_byte save = *rp;               *rp = *(rp + 2);               *(rp + 2) = save;            }         }      }      else if (row_info->bit_depth == 16)      {         if (row_info->color_type == PNG_COLOR_TYPE_RGB)         {            png_bytep rp;            png_uint_32 i;            for (i = 0, rp = row; i < row_width; i++, rp += 6)            {               png_byte save = *rp;               *rp = *(rp + 4);               *(rp + 4) = save;               save = *(rp + 1);               *(rp + 1) = *(rp + 5);               *(rp + 5) = save;            }         }         else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)         {            png_bytep rp;            png_uint_32 i;            for (i = 0, rp = row; i < row_width; i++, rp += 8)            {               png_byte save = *rp;               *rp = *(rp + 4);               *(rp + 4) = save;               save = *(rp + 1);               *(rp + 1) = *(rp + 5);               *(rp + 5) = save;            }         }      }   }}#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \    defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \    defined(PNG_LEGACY_SUPPORTED)void PNGAPIpng_set_user_transform_info(png_structp png_ptr, png_voidp   user_transform_ptr, int user_transform_depth, int user_transform_channels){   png_debug(1, "in png_set_user_transform_info\n");#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)   png_ptr->user_transform_ptr = user_transform_ptr;   png_ptr->user_transform_depth = (png_byte)user_transform_depth;   png_ptr->user_transform_channels = (png_byte)user_transform_channels;#else   if(user_transform_ptr || user_transform_depth || user_transform_channels)      png_warning(png_ptr,        "This version of libpng does not support user transform info");#endif}#endif/* This function returns a pointer to the user_transform_ptr associated with * the user transform functions.  The application should free any memory * associated with this pointer before png_write_destroy and png_read_destroy * are called. */png_voidp PNGAPIpng_get_user_transform_ptr(png_structp png_ptr){#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)   return ((png_voidp)png_ptr->user_transform_ptr);#else   if(png_ptr)     return (NULL);   return (NULL);#endif}

⌨️ 快捷键说明

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