void CGraphView::Blit(const Canvas& src,int x,int y,bool trans) { if (trans) { AlphaBlit(src,x,y); return; } const int bpp=4; int nDestwidth=pDib->Width(); int nDestheight=pDib->Height(); int xstart=0; int ystart=0; int xlen=src.Width(); int ylen=src.Height(); int ox=x; int oy=y; DoClipping(x,y,xstart,xlen,ystart,ylen); if (xlen<1 || ylen<1) return; // offscreen u32* pDest=(u32*)(pDib->GetPixels())+(y*nDestwidth+x); u32* pSrc =(u32*)src.GetPixels() +(ystart*src.Width()+xstart); while (ylen) { int x=xlen; while (x) { // convert from ARGB to ABGR /* u32 c=*pSrc++; u8 r=(u8)((c>>16)&255); u8 b=(u8)(c&255); c&=0xFF00FF00; // the alpha and green channels don't move, keep them intact *pDest++=c|(b<<16)|r; /*/ // Did I need to convert this to ASM? Doubt it. ;D __asm { mov ebx,[pSrc] mov eax,[ebx] mov ebx,[pDest] mov [ebx],eax mov al,[ebx] mov ah,[ebx+2] mov [ebx],ah // have to switch from BGRA to RGBA mov [ebx+2],al } ++pSrc; ++pDest; //*/ x--; } pDest+=nDestwidth-xlen; pSrc+=src.Width()-xlen; --ylen; } }
void CGraphView::AlphaBlit(const Canvas& src,int x,int y) { const int bpp=4; int nDestwidth=pDib->Width(); int nDestheight=pDib->Height(); int xstart=0; int ystart=0; int xlen=src.Width(); int ylen=src.Height(); int ox=x; int oy=y; DoClipping(x,y,xstart,xlen,ystart,ylen); if (xlen<1 || ylen<1) return; // offscreen u32* pDest=(u32*)(pDib->GetPixels())+(y*nDestwidth+x); u32* pSrc =(u32*)src.GetPixels() +(ystart*src.Width()+xstart); while (ylen) { int x=xlen; while (x) { // convert from ARGB to ABGR /* u32 c=*pSrc++; u8 r=(u8)((c>>16)&255); u8 b=(u8)(c&255); c&=0xFF00FF00; // the alpha and green channels don't move, keep them intact *pDest++=c|(b<<16)|r; /*/ // Did I need to convert this to ASM? Doubt it. ;D __asm { mov ebx,[pSrc] mov eax,[ebx] test eax,0xFF000000 jz nodraw mov ebx,[pDest] mov [ebx],eax mov al,[ebx] mov ah,[ebx+2] mov [ebx],ah // have to switch from BGRA to RGBA mov [ebx+2],al nodraw: } ++pSrc; ++pDest; //*/ x--; } pDest+=nDestwidth-xlen; pSrc+=src.Width()-xlen; --ylen; } } void CGraphView::HLine(int x1,int x2,int y,u32 colour) { if (x1>x2) std::swap<int>(x1,x2); if (y<0 || y>=nDIBsize) return; if (x1<0) x1=0; if (x2<0) return; if (x1>=nDIBsize) return; if (x2>=nDIBsize) x2=nDIBsize-1; u32* p=(u32*)pDib->GetPixels()+(y*pDib->Width())+x1; int xlen=x2-x1+1; while (xlen--) *p++=colour; } void CGraphView::VLine(int x,int y1,int y2,u32 colour) { if (y1>y2) std::swap<int>(y1,y2); if (x<0 || x>=nDIBsize) return; if (y1<0) y1=0; if (y2<0) return; if (y1>=nDIBsize) return; if (y2>=nDIBsize) y2=nDIBsize-1; u32* p=(u32*)pDib->GetPixels()+(y1*pDib->Width())+x; int ylen=y2-y1+1; while (ylen--) { *p=colour; p+=pDib->Width(); } } void CGraphView::DrawRect(int x1,int y1,int x2,int y2,u32 colour) { HLine(x1,x2,y1,colour); HLine(x1,x2,y2,colour); VLine(x1,y1,y2,colour); VLine(x2,y1,y2,colour); }