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

📄 pngvcrd.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                  add        ebx,4                  dec        ecx                  jnz        secondloop32end32:                  emms               }            }            else /* mmx _not supported - Use modified C routine */            {               register unsigned int incr1, initial_val, final_val;               png_size_t pixel_bytes;               png_uint_32 i;               register int disp = png_pass_inc[png_ptr->pass];               int offset_table[7] = {0, 4, 0, 2, 0, 1, 0};               pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);               srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]*                  pixel_bytes;               dstptr = row + offset_table[png_ptr->pass]*pixel_bytes;               initial_val = offset_table[png_ptr->pass]*pixel_bytes;               final_val = png_ptr->width*pixel_bytes;               incr1 = (disp)*pixel_bytes;               for (i = initial_val; i < final_val; i += incr1)               {                  if (pixel_bytes > (png_size_t)(final_val-i))                    pixel_bytes = (png_size_t)(final_val-i);                  png_memcpy(dstptr, srcptr, pixel_bytes);                  srcptr += incr1;                  dstptr += incr1;               }            } /* end of else */            break;         }       // end 32 bpp         case 48:         {            png_bytep srcptr;            png_bytep dstptr;            png_uint_32 len;            int unmask, diff;            __int64 mask5=0x0101010101010202,                    mask4=0x0202020204040404,                    mask3=0x0404080808080808,                    mask2=0x1010101010102020,                    mask1=0x2020202040404040,                    mask0=0x4040808080808080;            if ( mmx_supported )            {               srcptr = png_ptr->row_buf + 1;               dstptr = row;               unmask = ~mask;               len     = (png_ptr->width)&~7;               diff = (png_ptr->width)&7;               _asm               {                  movd       mm7, unmask       //load bit pattern                  psubb      mm6,mm6           //zero mm6                  punpcklbw  mm7,mm7                  punpcklwd  mm7,mm7                  punpckldq  mm7,mm7           //fill register with 8 masks                  movq       mm0,mask0                  movq       mm1,mask1                  movq       mm2,mask2                  movq       mm3,mask3                  movq       mm4,mask4                  movq       mm5,mask5                  pand       mm0,mm7                  pand       mm1,mm7                  pand       mm2,mm7                  pand       mm3,mm7                  pand       mm4,mm7                  pand       mm5,mm7                  pcmpeqb    mm0,mm6                  pcmpeqb    mm1,mm6                  pcmpeqb    mm2,mm6                  pcmpeqb    mm3,mm6                  pcmpeqb    mm4,mm6                  pcmpeqb    mm5,mm6                  mov        ecx,len           //load length of line                  mov        esi,srcptr        //load source                  mov        ebx,dstptr        //load dest                  cmp        ecx,0                  jz         mainloop48endmainloop48:                  movq       mm7,[esi]                  pand       mm7,mm0                  movq       mm6,mm0                  pandn      mm6,[ebx]                  por        mm7,mm6                  movq       [ebx],mm7                  movq       mm6,[esi+8]                  pand       mm6,mm1                  movq       mm7,mm1                  pandn      mm7,[ebx+8]                  por        mm6,mm7                  movq       [ebx+8],mm6                  movq       mm6,[esi+16]                  pand       mm6,mm2                  movq       mm7,mm2                  pandn      mm7,[ebx+16]                  por        mm6,mm7                  movq       [ebx+16],mm6                  movq       mm7,[esi+24]                  pand       mm7,mm3                  movq       mm6,mm3                  pandn      mm6,[ebx+24]                  por        mm7,mm6                  movq       [ebx+24],mm7                  movq       mm6,[esi+32]                  pand       mm6,mm4                  movq       mm7,mm4                  pandn      mm7,[ebx+32]                  por        mm6,mm7                  movq       [ebx+32],mm6                  movq       mm7,[esi+40]                  pand       mm7,mm5                  movq       mm6,mm5                  pandn      mm6,[ebx+40]                  por        mm7,mm6                  movq       [ebx+40],mm7                  add        esi,48            //inc by 32 bytes processed                  add        ebx,48                  sub        ecx,8             //dec by 8 pixels processed                  ja         mainloop48mainloop48end:                  mov        ecx,diff                  cmp        ecx,0                  jz         end48                  mov        edx,mask                  sal        edx,24            //make low byte the high bytesecondloop48:                  sal        edx,1             //move high bit to CF                  jnc        skip48            //if CF = 0                  mov        eax,[esi]                  mov        [ebx],eaxskip48:                  add        esi,4                  add        ebx,4                  dec        ecx                  jnz        secondloop48end48:                  emms               }            }            else /* mmx _not supported - Use modified C routine */            {               register unsigned int incr1, initial_val, final_val;               png_size_t pixel_bytes;               png_uint_32 i;               register int disp = png_pass_inc[png_ptr->pass];               int offset_table[7] = {0, 4, 0, 2, 0, 1, 0};               pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);               srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]*                  pixel_bytes;               dstptr = row + offset_table[png_ptr->pass]*pixel_bytes;               initial_val = offset_table[png_ptr->pass]*pixel_bytes;               final_val = png_ptr->width*pixel_bytes;               incr1 = (disp)*pixel_bytes;               for (i = initial_val; i < final_val; i += incr1)               {                  if (pixel_bytes > (png_size_t)(final_val-i))                    pixel_bytes = (png_size_t)(final_val-i);                  png_memcpy(dstptr, srcptr, pixel_bytes);                  srcptr += incr1;                  dstptr += incr1;               }            } /* end of else */            break;         }       // end 48 bpp         default:         {            png_bytep sptr;            png_bytep dp;            png_size_t pixel_bytes;            int offset_table[7] = {0, 4, 0, 2, 0, 1, 0};            unsigned int i;            register int disp = png_pass_inc[png_ptr->pass];  // get the offset            register unsigned int incr1, initial_val, final_val;            pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);            sptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]*               pixel_bytes;            dp = row + offset_table[png_ptr->pass]*pixel_bytes;            initial_val = offset_table[png_ptr->pass]*pixel_bytes;            final_val = png_ptr->width*pixel_bytes;            incr1 = (disp)*pixel_bytes;            for (i = initial_val; i < final_val; i += incr1)            {               if (pixel_bytes > (png_size_t)(final_val-i))                 pixel_bytes = (png_size_t)(final_val-i);               png_memcpy(dp, sptr, pixel_bytes);               sptr += incr1;               dp += incr1;            }            break;         }      } /* end switch (png_ptr->row_info.pixel_depth) */   } /* end if (non-trivial mask) */} /* end png_combine_row() */#if defined(PNG_READ_INTERLACING_SUPPORTED)void /* PRIVATE */png_do_read_interlace(png_structp png_ptr){   png_row_infop row_info = &(png_ptr->row_info);   png_bytep row = png_ptr->row_buf + 1;   int pass = png_ptr->pass;   png_uint_32 transformations = png_ptr->transformations;#ifdef PNG_USE_LOCAL_ARRAYS   const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};#endif   png_debug(1,"in png_do_read_interlace\n");   if (mmx_supported == 2) {       png_mmx_support();   }   if (row != NULL && row_info != NULL)   {      png_uint_32 final_width;      final_width = row_info->width * png_pass_inc[pass];      switch (row_info->pixel_depth)      {         case 1:         {            png_bytep sp, dp;            int sshift, dshift;            int s_start, s_end, s_inc;            png_byte v;            png_uint_32 i;            int j;            sp = row + (png_size_t)((row_info->width - 1) >> 3);            dp = row + (png_size_t)((final_width - 1) >> 3);#if defined(PNG_READ_PACKSWAP_SUPPORTED)            if (transformations & PNG_PACKSWAP)            {               sshift = (int)((row_info->width + 7) & 7);               dshift = (int)((final_width + 7) & 7);               s_start = 7;               s_end = 0;               s_inc = -1;            }            else#endif            {               sshift = 7 - (int)((row_info->width + 7) & 7);               dshift = 7 - (int)((final_width + 7) & 7);               s_start = 0;               s_end = 7;               s_inc = 1;            }            for (i = row_info->width; i; i--)            {               v = (png_byte)((*sp >> sshift) & 0x1);               for (j = 0; j < png_pass_inc[pass]; j++)               {                  *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff);                  *dp |= (png_byte)(v << dshift);                  if (dshift == s_end)                  {                     dshift = s_start;                     dp--;                  }                  else                     dshift += s_inc;               }               if (sshift == s_end)               {                  sshift = s_start;                  sp--;               }               else                  sshift += s_inc;            }            break;         }         case 2:         {            png_bytep sp, dp;            int sshift, dshift;            int s_start, s_end, s_inc;            png_uint_32 i;            sp = row + (png_size_t)((row_info->width - 1) >> 2);            dp = row + (png_size_t)((final_width - 1) >> 2);#if defined(PNG_READ_PACKSWAP_SUPPORTED)            if (transformations & PNG_PACKSWAP)            {               sshift = (png_size_t)(((row_info->width + 3) & 3) << 1);               dshift = (png_size_t)(((final_width + 3) & 3) << 1);               s_start = 6;               s_end = 0;               s_inc = -2;            }            else#endif            {               sshift = (png_size_t)((3 - ((row_info->width + 3) & 3)) << 1);               dshift = (png_size_t)((3 - ((final_width + 3) & 3)) << 1);               s_start = 0;               s_end = 6;               s_inc = 2;            }            for (i = row_info->width; i; i--)            {               png_byte v;               int j;               v = (png_byte)((*sp >> sshift) & 0x3);               for (j = 0; j < png_pass_inc[pass]; j++)               {                  *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff);                  *dp |= (png_byte)(v << dshift);                  if (dshift == s_end)                  {                     dshift = s_start;                     dp--;                  }                  else                     dshift += s_inc;               }               if (sshift == s_end)               {                  sshift = s_start;                  sp--;               }               else                  sshift += s_inc;            }            break;         }         case 4:         {            png_bytep sp, dp;

⌨️ 快捷键说明

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