由于目前大多数显示器都是设置为32bit, 而我内部图象是按16bit存放,要画到窗口上必须要进行转换. 是每画一幅都进行转换快,还是先将所有的图都画到一个16bit内存缓冲中,再统一转成32bit快 ? 目前我采用的是后者,因为这样比较方便,但是效果不是太理想. 另外有没有快速16bit转32bit的代码,谢谢!
下面是我自己写的16bit转32bit代码,有时间帮我看看,有什么地方可以优化的,再次谢谢!
static __int64 MASKB=0x0000001F0000001F; static __int64 MASKG=0x000007E0000007E0; static __int64 MASKR=0x0000F8000000F800;
BYTE* pDstBp = m_pMDrawSuface->GetLockData(); BYTE* pSrcBp = (BYTE*)m_pwBitData;
int nDstLineSize = m_pMDrawSuface->GetLockLinearSize(); int nSrcLineSize = m_nLinearSize;
int nWidth = m_nWidth >> 1; int nHeight = m_nHeight; _asm{
mov esi,pSrcBp;
mov edi,pDstBp;
mov ecx,nWidth;
mov edx,nHeight;
xor eax,eax;//eax = 0
xor ebx,ebx;//ebx = 0 movq mm0,MASKR; movq mm1,MASKG; movq mm2,MASKB;
bitloop: pxor mm6,mm6;//mm6 = 0 movd mm3,[esi];//mm3 = 0000 0000 src1 src0
punpcklwd mm3,mm6;//mm3 = 0000 src1 0000 src0 add esi,4;
movq mm5,mm3; movq mm6,mm3;
add edi,8;
movq mm7,mm3;
pand mm5,mm0; //得到R分量 pand mm6,mm1; //得到G分量
pslld mm5,8; pslld mm6,5; pand mm7,mm2; //得到B分量 por mm5,mm6;//合并RG
pslld mm7,3;
por mm5,mm7;//和合并RGB
inc ebx;//ebx++
movq [edi],mm5;
cmp ebx,ecx;//ebx == width ? je nextline;
jmp bitloop;
nextline: inc eax;//eax++ cmp eax,edx;//eax == height ? je done;
xor ebx,ebx;//ebx = 0;
mov esi,pSrcBp; mov edi,pDstBp;
add esi,nSrcLineSize; add edi,nDstLineSize;
mov pSrcBp,esi; mov pDstBp,edi; jmp bitloop;done: emms }