内联汇编优化的TAlpha::FillSolidColor

#ifndef __GNUC__
   #define _calpha_using_inlineasm_  1
#else
   #define _calpha_using_gccinlineasm_  1
   #ifdef _calpha_using_inlineasm_
      #undef _calpha_using_inlineasm_
   #endif
#endif


void __fastcall TAlpha::FillSolidColor(byte * const ptrBuffer, int Width, int Height, int iLineAdd, int iPixelAdd, COLORREF Color)
{
 #ifdef _calpha_using_inlineasm_
    byte *ptrDest;
    register int i;
 #else
    #ifdef _calpha_using_gccinlineasm_
       byte *ptrDest;
       int i;
    #else
       register byte *ptrDest;
       register int i;
    #endif
 #endif

 ptrDest = ptrBuffer;
 if (iPixelAdd == 0)
  {
   register const unsigned short int igb = ((byte)(Color>>16)) | (((byte)((WORD)Color>>8))<<8);
   register const byte br = (byte)Color;

   #ifdef _calpha_using_inlineasm_
      #ifdef _regptrdest32_
         #undef _regptrdest32_
      #endif
      #ifdef _regloop32_
         #undef _regloop32_
      #endif
      #ifdef _reggreenblue16_
         #undef _reggreenblue16_
      #endif
      #ifdef _regred8_
         #undef _regred8_
      #endif
      #define _regptrdest32_ ebx
      #define _regloop32_ ecx
      #define _reggreenblue16_ dx
      #define _regred8_ al

      __asm
       {
        mov _regptrdest32_, ptrBuffer
        mov _regloop32_, Width
        mov _reggreenblue16_, igb
        mov _regred8_, br
        dec _regloop32_
        @1:
        mov word ptr [_regptrdest32_], _reggreenblue16_
        dec _regloop32_
        mov byte ptr [_regptrdest32_+02], _regred8_
        add _regptrdest32_, 00000003
        test _regloop32_, _regloop32_
        jge short @1
       }
      ptrDest += Width << 1;
      ptrDest += Width;
   #else
      i = Width - 1;
      do
       {
        i--;
        *((unsigned short int *)ptrDest) = igb;
        ptrDest++;
        ptrDest++;
        *ptrDest++ = br;
       }while(i >= 0);
   #endif
  }
 else
  {
   register const unsigned short int irg = ((byte)((WORD)Color>>8)) | ((byte)Color<<8);
   register const byte bb = (byte)(Color>>16);

   #ifdef _calpha_using_inlineasm_
      #ifdef _regptrdest32_
         #undef _regptrdest32_
      #endif
      #ifdef _regloop32_
         #undef _regloop32_
      #endif
      #ifdef _regredgreen16_
         #undef _regredgreen16_
      #endif
      #ifdef _regblue8_
         #undef _regblue8_
      #endif
      #define _regptrdest32_ ebx
      #define _regloop32_ ecx
      #define _regredgreen16_ dx
      #define _regblue8_ al

      __asm
       {
        mov _regptrdest32_, ptrBuffer
        mov _regloop32_, Width
        mov _regredgreen16_, irg
        dec _regloop32_
        mov _regblue8_, bb
        @2:
        dec _regloop32_
        mov byte ptr [_regptrdest32_], _regblue8_
        mov word ptr [_regptrdest32_+01], _regredgreen16_
        add _regptrdest32_, 00000004
        test _regloop32_, _regloop32_
        jge short @2
       }
      ptrDest += Width << 2;
   #else
      i = Width - 1;
      do
       {
        i--;
        *ptrDest++ = bb;
        *((unsigned short int *)ptrDest) = irg;

        ptrDest += 3;
       }while(i >= 0);
   #endif
  }

 register int lr = (iPixelAdd + 3) * Width;
 int ld = lr + iLineAdd;
 ptrDest += iLineAdd;
 i = Height;
 i--;
 i--;
 if ((i & 1) == 0)
  {
   memcpy(ptrDest, ptrBuffer, lr);
   ptrDest += ld;
   i--;
  }
 #ifdef _calpha_using_inlineasm_
    #ifdef _regptrdest32_
       #undef _regptrdest32_
    #endif
    #ifdef _regadd32_
       #undef _regadd32_
    #endif
    #ifdef _regptrdest8_
       #undef _regptrdest8_
    #endif
    #define _regptrdest32_ edx
    #define _regadd32_ eax
    #define _regptrdest8_ cl

    if ((lr & 1) == 1)
     {
      lr >>= 1;
      __asm
       {
        cld
        mov _regptrdest32_, ptrDest
        mov _regadd32_, ld
       }
      for (; i >= 0; i--)
       {
        i--;
        __asm
         {
          mov esi, ptrBuffer
          mov edi, _regptrdest32_
          mov _regptrdest8_, byte ptr [esi]
          mov byte ptr [edi], _regptrdest8_
          inc esi
          inc edi
          mov ecx, lr
          rep movsw
          add _regptrdest32_, _regadd32_
          mov esi, ptrBuffer
          mov edi, _regptrdest32_
          mov _regptrdest8_, byte ptr [esi]
          mov byte ptr [edi], _regptrdest8_
          inc esi
          inc edi
          mov ecx, lr
          rep movsw
          add _regptrdest32_, _regadd32_
         }
       }
     }
    else
     {
      lr >>= 1;
      __asm
       {
        cld
        mov _regptrdest32_, ptrDest
        mov _regadd32_, ld
       }
      for (; i >= 0; i--)
       {
        i--;
        __asm
         {
          mov ecx, lr
          mov esi, ptrBuffer
          mov edi, _regptrdest32_
          rep movsw
          add _regptrdest32_, _regadd32_
          mov ecx, lr
          mov esi, ptrBuffer
          mov edi, _regptrdest32_
          rep movsw
          add _regptrdest32_, _regadd32_
         }
       }
     }
 #else
    for (; i >= 0; i--)
     {
      i--;
      memcpy(ptrDest, ptrBuffer, lr);
      ptrDest += ld;
      memcpy(ptrDest, ptrBuffer, lr);
      ptrDest += ld;
     }
 #endif
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值