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

📄 pngvcrd.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                           punpckhdq mm1, mm1     ; v1 v0 v1 v0 v1 v0 v1 v0                           movq [edi], mm0                           movq [edi + 8], mm0                           movq [edi + 16], mm1                           movq [edi + 24], mm1                           sub esi, 4                           sub edi, 32                           sub ecx, 2                           jnz loop2_pass0                           EMMS                        }                     }                     sptr -= (width_mmx*2 - 2);            // sign fixed                     dp -= (width_mmx*16 - 2);            // sign fixed                     for (i = width; i; i--)                     {                        png_byte v[8];                        int j;                        sptr -= 2;                        png_memcpy(v, sptr, 2);                        for (j = 0; j < png_pass_inc[pass]; j++)                        {                           dp -= 2;                           png_memcpy(dp, v, 2);                        }                     }                  }                  else if (((pass == 2) || (pass == 3)) && width)                  {                     int width_mmx = ((width >> 1) << 1) ;                     width -= width_mmx;                     if (width_mmx)                     {                        _asm                        {                           mov esi, sptr                           mov edi, dp                           mov ecx, width_mmx                           sub esi, 2                           sub edi, 14loop2_pass2:                           movd mm0, [esi]        ; X X X X v1 v0 v3 v2                           punpcklwd mm0, mm0     ; v1 v0 v1 v0 v3 v2 v3 v2                           movq mm1, mm0          ; v1 v0 v1 v0 v3 v2 v3 v2                           punpckldq mm0, mm0     ; v3 v2 v3 v2 v3 v2 v3 v2                           punpckhdq mm1, mm1     ; v1 v0 v1 v0 v1 v0 v1 v0                           movq [edi], mm0                           sub esi, 4                           movq [edi + 8], mm1                           //sub esi, 4                           sub edi, 16                           sub ecx, 2                           jnz loop2_pass2                           EMMS                        }                     }                     sptr -= (width_mmx*2 - 2);            // sign fixed                     dp -= (width_mmx*8 - 2);            // sign fixed                     for (i = width; i; i--)                     {                        png_byte v[8];                        int j;                        sptr -= 2;                        png_memcpy(v, sptr, 2);                        for (j = 0; j < png_pass_inc[pass]; j++)                        {                           dp -= 2;                           png_memcpy(dp, v, 2);                        }                     }                  }                  else if (width)  // pass == 4 or 5                  {                     int width_mmx = ((width >> 1) << 1) ;                     width -= width_mmx;                     if (width_mmx)                     {                        _asm                        {                           mov esi, sptr                           mov edi, dp                           mov ecx, width_mmx                           sub esi, 2                           sub edi, 6loop2_pass4:                           movd mm0, [esi]        ; X X X X v1 v0 v3 v2                           punpcklwd mm0, mm0     ; v1 v0 v1 v0 v3 v2 v3 v2                           sub esi, 4                           movq [edi], mm0                           sub edi, 8                           sub ecx, 2                           jnz loop2_pass4                           EMMS                        }                     }                     sptr -= (width_mmx*2 - 2);            // sign fixed                     dp -= (width_mmx*4 - 2);            // sign fixed                     for (i = width; i; i--)                     {                        png_byte v[8];                        int j;                        sptr -= 2;                        png_memcpy(v, sptr, 2);                        for (j = 0; j < png_pass_inc[pass]; j++)                        {                           dp -= 2;                           png_memcpy(dp, v, 2);                        }                     }                  }               } /* end of pixel_bytes == 2 */               else if (pixel_bytes == 4)               {                  if (((pass == 0) || (pass == 1)) && width)                  {                     int width_mmx = ((width >> 1) << 1) ;                     width -= width_mmx;                     if (width_mmx)                     {                        _asm                        {                           mov esi, sptr                           mov edi, dp                           mov ecx, width_mmx                           sub esi, 4                           sub edi, 60loop4_pass0:                           movq mm0, [esi]        ; v3 v2 v1 v0 v7 v6 v5 v4                           movq mm1, mm0          ; v3 v2 v1 v0 v7 v6 v5 v4                           punpckldq mm0, mm0     ; v7 v6 v5 v4 v7 v6 v5 v4                           punpckhdq mm1, mm1     ; v3 v2 v1 v0 v3 v2 v1 v0                           movq [edi], mm0                           movq [edi + 8], mm0                           movq [edi + 16], mm0                           movq [edi + 24], mm0                           movq [edi+32], mm1                           movq [edi + 40], mm1                           movq [edi+ 48], mm1                           sub esi, 8                           movq [edi + 56], mm1                           sub edi, 64                           sub ecx, 2                           jnz loop4_pass0                           EMMS                        }                     }                     sptr -= (width_mmx*4 - 4);            // sign fixed                     dp -= (width_mmx*32 - 4);            // sign fixed                     for (i = width; i; i--)                     {                        png_byte v[8];                        int j;                        sptr -= 4;                        png_memcpy(v, sptr, 4);                        for (j = 0; j < png_pass_inc[pass]; j++)                        {                           dp -= 4;                           png_memcpy(dp, v, 4);                        }                     }                  }                  else if (((pass == 2) || (pass == 3)) && width)                  {                     int width_mmx = ((width >> 1) << 1) ;                     width -= width_mmx;                     if (width_mmx)                     {                        _asm                        {                           mov esi, sptr                           mov edi, dp                           mov ecx, width_mmx                           sub esi, 4                           sub edi, 28loop4_pass2:                           movq mm0, [esi]      ; v3 v2 v1 v0 v7 v6 v5 v4                           movq mm1, mm0        ; v3 v2 v1 v0 v7 v6 v5 v4                           punpckldq mm0, mm0   ; v7 v6 v5 v4 v7 v6 v5 v4                           punpckhdq mm1, mm1   ; v3 v2 v1 v0 v3 v2 v1 v0                           movq [edi], mm0                           movq [edi + 8], mm0                           movq [edi+16], mm1                           movq [edi + 24], mm1                           sub esi, 8                           sub edi, 32                           sub ecx, 2                           jnz loop4_pass2                           EMMS                        }                     }                     sptr -= (width_mmx*4 - 4);            // sign fixed                     dp -= (width_mmx*16 - 4);            // sign fixed                     for (i = width; i; i--)                     {                        png_byte v[8];                        int j;                        sptr -= 4;                        png_memcpy(v, sptr, 4);                        for (j = 0; j < png_pass_inc[pass]; j++)                        {                           dp -= 4;                           png_memcpy(dp, v, 4);                        }                     }                  }                  else if (width)  // pass == 4 or 5                  {                     int width_mmx = ((width >> 1) << 1) ;                     width -= width_mmx;                     if (width_mmx)                     {                        _asm                        {                           mov esi, sptr                           mov edi, dp                           mov ecx, width_mmx                           sub esi, 4                           sub edi, 12loop4_pass4:                           movq mm0, [esi]      ; v3 v2 v1 v0 v7 v6 v5 v4                           movq mm1, mm0        ; v3 v2 v1 v0 v7 v6 v5 v4                           punpckldq mm0, mm0   ; v7 v6 v5 v4 v7 v6 v5 v4                           punpckhdq mm1, mm1   ; v3 v2 v1 v0 v3 v2 v1 v0                           movq [edi], mm0                           sub esi, 8                           movq [edi + 8], mm1                           sub edi, 16                           sub ecx, 2                           jnz loop4_pass4                           EMMS                        }                     }                     sptr -= (width_mmx*4 - 4);          // sign fixed                     dp -= (width_mmx*8 - 4);            // sign fixed                     for (i = width; i; i--)                     {                        png_byte v[8];                        int j;                        sptr -= 4;                        png_memcpy(v, sptr, 4);                        for (j = 0; j < png_pass_inc[pass]; j++)                        {                           dp -= 4;                           png_memcpy(dp, v, 4);                        }                     }                  }               } /* end of pixel_bytes == 4 */               else if (pixel_bytes == 6)               {                  for (i = width; i; i--)                  {                     png_byte v[8];                     int j;                     png_memcpy(v, sptr, 6);                     for (j = 0; j < png_pass_inc[pass]; j++)                     {                        png_memcpy(dp, v, 6);                        dp -= 6;                     }                     sptr -= 6;                  }               } /* end of pixel_bytes == 6 */               else               {                  for (i = width; i; i--)                  {                     png_byte v[8];                     int j;                     png_memcpy(v, sptr, pixel_bytes);                     for (j = 0; j < png_pass_inc[pass]; j++)                     {                        png_memcpy(dp, v, pixel_bytes);                        dp -= pixel_bytes;                     }                     sptr-= pixel_bytes;                  }               }            } /* end of mmx_supported */            else /* MMX not supported:  use modified C code - takes advantage                  * of inlining of png_memcpy for a constant */            {               if (pixel_bytes == 1)               {                  for (i = width; i; i--)                  {                     int j;                     for (j = 0; j < png_pass_inc[pass]; j++)                        *dp-- = *sptr;                     sptr--;                  }               }               else if (pixel_bytes == 3)               {                  for (i = width; i; i--)                  {                     png_byte v[8];                     int j;                     png_memcpy(v, sptr, pixel_bytes);                     for (j = 0; j < png_pass_inc[pass]; j++)                     {                        png_memcpy(dp, v, pixel_bytes);                        dp -= pixel_bytes;                     }                     sptr -= pixel_bytes;                  }               }               else if (pixel_bytes == 2)               {                  for (i = width; i; i--)                  {                     png_byte v[8];                     int j;                     png_memcpy(v, sptr, pixel_bytes);                     for (j = 0; j < png_pass_inc[pass]; j++)                     {                        png_memcpy(dp, v, pixel_bytes);                        dp -= pixel_bytes;                     }                     sptr -= pixel_bytes;                  }               }               else if (pixel_bytes == 4)               {                  for (i = width; i; i--)                  {                     png_byte v[8];                     int j;                     png_memcpy(v, sptr, pixel_bytes);                     for (j = 0; j < png_pass_inc[pass]; j++)                     {                        png_memcpy(dp, v, pixel_bytes);                        dp -= pixel_bytes;                     }                     sptr -= pixel_bytes;                  }               }               else if (pixel_bytes == 6)               {                  for (i = width; i; i--)                  {                     png_byte v[8];                     int j;                     png_memcpy(v, sptr, pixel_bytes);                     for (j = 0; j < png_pass_inc[pass]; j++)                     {                        png_memcpy(dp, v, pixel_bytes);                        dp -= pixel_bytes;                     }                     sptr -= pixel_bytes;                  }               }               else               {                  for (i = width; i; i--)                  {                     png_byte v[8];                     int j;                     png_memcpy(v, sptr, pixel_bytes);                     for (j = 0; j < png_pas

⌨️ 快捷键说明

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