more optimze of blt. icon draw lite faster Modified: trunk/reactos/subsys/win32k/dib/dib.h Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c _____
Modified: trunk/reactos/subsys/win32k/dib/dib.h --- trunk/reactos/subsys/win32k/dib/dib.h 2005-06-03 22:44:38 UTC (rev 15761) +++ trunk/reactos/subsys/win32k/dib/dib.h 2005-06-03 23:21:21 UTC (rev 15762) @@ -120,6 +120,11 @@
BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ*,SURFOBJ*,RECTL*,RECTL*,POINTL*,POINTL,CLIP OBJ*,XLATEOBJ*,ULONG); BOOLEAN DIB_32BPP_TransparentBlt(SURFOBJ*,SURFOBJ*,RECTL*,POINTL*,XLATEOBJ*,ULON G);
+BOOLEAN DIB_32DstInvert(PBLTINFO); +BOOLEAN DIB32_Srccopy(PBLTINFO BltInfo); +BOOLEAN DIB32_ColorFill(PBLTINFO BltInfo, ULONG); +BOOLEAN DIB32_SrcPaint(PBLTINFO BltInfo); + extern unsigned char notmask[2]; extern unsigned char altnotmask[2]; #define MASK1BPP(x) (1<<(7-((x)&7))) _____
Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c --- trunk/reactos/subsys/win32k/dib/dib32bpp.c 2005-06-03 22:44:38 UTC (rev 15761) +++ trunk/reactos/subsys/win32k/dib/dib32bpp.c 2005-06-03 23:21:21 UTC (rev 15762) @@ -19,6 +19,7 @@
/* $Id$ */ #include <w32k.h>
+ VOID DIB_32BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) { @@ -311,205 +312,31 @@
case ROP4_BLACKNESS: //return(0x00000000); - - -#ifdef _M_IX86 - if (BltInfo->DestRect.left!=0) - { - SourceX = (BltInfo->DestRect.right - BltInfo->DestRect.left) << 2; - for (DestY=BltInfo->DestRect.bottom-1;DestY>=BltInfo->DestRect.top;DestY--) - { - memset4( (PDWORD) (BltInfo->DestSurface->pvScan0 + DestY * - BltInfo->DestSurface->lDelta + - BltInfo->DestRect.left), 0x00000000, SourceX); - } - - } - else - { - SourceX = ((BltInfo->DestRect.bottom - BltInfo->DestRect.top) * - BltInfo->DestRect.right); - - memset4(BltInfo->DestSurface->pvScan0 + BltInfo->DestRect.top * - BltInfo->DestSurface->lDelta, 0x00000000, SourceX); - - - } -#else - for (DestY=BltInfo->DestRect.bottom-1;DestY>=BltInfo->DestRect.top;DestY--) - { - DIB_32BPP_HLine(BltInfo->DestSurface, BltInfo->DestRect.left, BltInfo->DestRect.right, DestY, 0x00000000); - } -#endif - - return TRUE; + return DIB32_ColorFill(BltInfo, 0x00000000); break;
case ROP4_WHITENESS: //return(0xFFFFFFFF); -#ifdef _M_IX86 - if (BltInfo->DestRect.left!=0) - { - SourceX = (BltInfo->DestRect.right - BltInfo->DestRect.left) << 2; - for (DestY=BltInfo->DestRect.bottom-1;DestY>=BltInfo->DestRect.top;DestY--) - { - memset4( (PDWORD) (BltInfo->DestSurface->pvScan0 + DestY * - BltInfo->DestSurface->lDelta + - BltInfo->DestRect.left), 0xFFFFFFFF, SourceX); - } - - } - else - { - SourceX = ((BltInfo->DestRect.bottom - BltInfo->DestRect.top) * - BltInfo->DestRect.right); - - memset4(BltInfo->DestSurface->pvScan0 + BltInfo->DestRect.top * - BltInfo->DestSurface->lDelta, 0xFFFFFFFF, SourceX); - - - } -#else - for (DestY=BltInfo->DestRect.bottom-1;DestY>=BltInfo->DestRect.top;DestY--) - { - DIB_32BPP_HLine(BltInfo->DestSurface, BltInfo->DestRect.left, BltInfo->DestRect.left, DestY, 0xFFFFFFFF); - } -#endif - return TRUE; + return DIB32_ColorFill(BltInfo, 0xFFFFFFFF); break;
case ROP4_SRCCOPY: - // return(Source); - switch (BltInfo->SourceSurface->iBitmapFormat) - { - case BMF_1BPP: - case BMF_4BPP: - case BMF_16BPP: - case BMF_24BPP: - { - /* calc dest start position */ - PBYTE Destbyteaddr = BltInfo->SourceSurface->pvScan0 + BltInfo->DestRect.top * BltInfo->SourceSurface->lDelta; - PDWORD Destaddr = (PDWORD)Destbyteaddr + BltInfo->DestRect.left; - LONG DestxlDelta = BltInfo->SourceSurface->lDelta - (BltInfo->DestRect.right - BltInfo->DestRect.left) ; - - /* calc src start position */ - - SourceY = BltInfo->SourcePoint.y; - - for (DestY=BltInfo->DestRect.top; DestY<BltInfo->DestRect.bottom; DestY++) - { - - if (SourceY > BltInfo->SourceSurface->sizlBitmap.cy) break; - - SourceX = BltInfo->SourcePoint.x; - - for (DestX=BltInfo->DestRect.left; DestX<BltInfo->DestRect.right; DestX++, SourceX++, Destaddr++) - { - if (SourceX > BltInfo->SourceSurface->sizlBitmap.cx) break; - - *Destaddr = DIB_GetSource(BltInfo->SourceSurface, SourceX, - SourceY, BltInfo->XlateSourceToDest); - } - Destaddr+=DestxlDelta; - } - return TRUE; - break; - } - - - case BMF_32BPP: - { - INT Destdelta; - INT Sourcedelta; - register PBYTE Destaddr; - register PBYTE Srcaddr; - LONG DesmaxX, DesmaxY; - LONG SrcmaxX, SrcmaxY; - - - SrcmaxX = BltInfo->SourceSurface->sizlBitmap.cx - BltInfo->SourcePoint.x; - SrcmaxY = BltInfo->SourceSurface->sizlBitmap.cy - BltInfo->SourcePoint.y; - - - DesmaxX = BltInfo->DestRect.right - BltInfo->DestRect.left; - DesmaxY = BltInfo->DestRect.bottom - BltInfo->DestRect.top; - - - if (DesmaxX > SrcmaxX ) DesmaxX = SrcmaxX; - if (DesmaxY > SrcmaxY ) DesmaxY = SrcmaxY; - - - Destdelta = BltInfo->DestSurface->lDelta; - Sourcedelta = BltInfo->SourceSurface->lDelta; - Destaddr = BltInfo->DestSurface->pvScan0 + BltInfo->DestRect.top * Destdelta + BltInfo->DestRect.left; - Srcaddr = BltInfo->SourceSurface->pvScan0 + BltInfo->SourcePoint.y * Sourcedelta + BltInfo->SourcePoint.x; - - DesmaxX *= 4; - if (DesmaxY > 0) - { - do - { - RtlCopyMemory(Destaddr, Srcaddr, DesmaxX); - Destaddr += Destdelta; - Srcaddr += Sourcedelta; - } - while (--DesmaxY); - } - return TRUE; - break; - } - - default: - break; - } - - break; + // return(Source); + return DIB32_Srccopy(BltInfo); + break;
- case ROP4_NOTSRCERASE: - // return(~(Dest | Source)); - switch (BltInfo->SourceSurface->iBitmapFormat) - { - case BMF_1BPP: - case BMF_4BPP: - case BMF_16BPP: - case BMF_24BPP: - case BMF_32BPP: - { - /* calc dest start position */ - PBYTE Destbyteaddr = BltInfo->SourceSurface->pvScan0 + BltInfo->DestRect.top * BltInfo->SourceSurface->lDelta; - PDWORD Destaddr = (PDWORD)Destbyteaddr + BltInfo->DestRect.left; - LONG DestxlDelta = BltInfo->SourceSurface->lDelta - (BltInfo->DestRect.right - BltInfo->DestRect.left) ; + case ROP4_DSTINVERT: + // return(~Dest); + return DIB_32DstInvert(BltInfo); + break;
- SourceY = BltInfo->SourcePoint.y; - - for (DestY=BltInfo->DestRect.top; DestY<BltInfo->DestRect.bottom; DestY++) - { - - if (SourceY > BltInfo->SourceSurface->sizlBitmap.cy) break; - - SourceX = BltInfo->SourcePoint.x; - - for (DestX=BltInfo->DestRect.left; DestX<BltInfo->DestRect.right; DestX++, SourceX++, Destaddr++) - { - if (SourceX > BltInfo->SourceSurface->sizlBitmap.cx) break; - - *Destaddr = ~(*Destaddr | DIB_GetSource(BltInfo->SourceSurface, SourceX, - SourceY, BltInfo->XlateSourceToDest)); - } - Destaddr+=DestxlDelta; - } - return TRUE; - break; - - default: - break; - } - } - break; - + case ROP4_SRCPAINT: + // return(Dest | Source); + return DIB32_SrcPaint(BltInfo); + break; - default: - break; + default: + break; }
UsesSource = ROP4_USES_SOURCE(BltInfo->Rop4); @@ -570,6 +397,250 @@ return TRUE; }
+/* optimze functions for bitblt */ +BOOLEAN +DIB_32DstInvert(PBLTINFO BltInfo) +{ + // return(~Dest); + ULONG DestX, DestY; + ULONG Dest; + PULONG DestBits; + + ULONG bottom = BltInfo->DestRect.bottom; + ULONG right = BltInfo->DestRect.right; + ULONG delta = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2) ; + + DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) + + BltInfo->DestRect.top * BltInfo->DestSurface->lDelta); + + for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++) + { + for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++) + { + Dest = *DestBits; + *DestBits = ~Dest; + } + + DestBits = (PULONG)((ULONG_PTR)DestBits + delta); + } +return TRUE; +} + +BOOLEAN +DIB32_SrcPaint(PBLTINFO BltInfo) +{ + BOOLEAN status = FALSE; + + // return(Source); + switch (BltInfo->SourceSurface->iBitmapFormat) + { + case BMF_1BPP: + case BMF_4BPP: + case BMF_16BPP: + case BMF_24BPP: + { + ULONG DestX, DestY; + ULONG SourceX, SourceY; + ULONG Dest; + PULONG DestBits; + + ULONG bottom = BltInfo->DestRect.bottom; + ULONG right = BltInfo->DestRect.right; + ULONG delta = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2) ; + + DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) + + BltInfo->DestRect.top * BltInfo->DestSurface->lDelta); + + SourceY = BltInfo->SourcePoint.y; + + for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++) + { + SourceX = BltInfo->SourcePoint.x; + for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++) + { + + Dest = *DestBits; + *DestBits = (Dest | DIB_GetSource(BltInfo->SourceSurface, SourceX, + SourceY, BltInfo->XlateSourceToDest)); + } + + DestBits = (PULONG)((ULONG_PTR)DestBits + delta); + SourceY++; + } + + } + status = TRUE; + break; + + case BMF_32BPP: + { + ULONG DestX, DestY; + ULONG SourceX, SourceY; + ULONG Dest; + PULONG DestBits; + + ULONG bottom = BltInfo->DestRect.bottom; + ULONG right = BltInfo->DestRect.right; + ULONG delta = BltInfo->DestSurface->lDelta - ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2) ; + + DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) + + BltInfo->DestRect.top * BltInfo->DestSurface->lDelta); + + SourceY = BltInfo->SourcePoint.y; + + for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++) + { + + SourceX = BltInfo->SourcePoint.x; + for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++) + { + + Dest = *DestBits; + *DestBits = (Dest | DIB_32BPP_GetPixel(BltInfo->SourceSurface, SourceX, SourceY)); + } + + DestBits = (PULONG)((ULONG_PTR)DestBits + delta); + SourceY++; + } + + } + status = TRUE; + break; + + default: + break; + } + + return status; +} +BOOLEAN +DIB32_Srccopy(PBLTINFO BltInfo) +{ + BOOLEAN status = FALSE; + + // return(Source); + switch (BltInfo->SourceSurface->iBitmapFormat) + { + case BMF_1BPP: + case BMF_4BPP: + case BMF_16BPP: + case BMF_24BPP: + { + ULONG DestX, DestY; + ULONG SourceX, SourceY; + ULONG Dest; + PULONG DestBits; + + ULONG bottom = BltInfo->DestRect.bottom; + ULONG right = BltInfo->DestRect.right; + ULONG delta = ((BltInfo->DestRect.right - BltInfo->DestRect.left) <<2) + BltInfo->DestSurface->lDelta; + + DestBits = (PULONG)(BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.left << 2) + + BltInfo->DestRect.top * BltInfo->DestSurface->lDelta); + + SourceY = BltInfo->SourcePoint.y; + + for (DestY = BltInfo->DestRect.top; DestY < bottom; DestY++) + { + + SourceX = BltInfo->SourcePoint.x; + for (DestX = BltInfo->DestRect.left; DestX < right; DestX++, DestBits++, SourceX++) + { + if (SourceX > BltInfo->SourceSurface->sizlBitmap.cx) break; + + Dest = *DestBits; + *DestBits = DIB_GetSource(BltInfo->SourceSurface, SourceX, + SourceY, BltInfo->XlateSourceToDest); + } + + DestBits = (PULONG)((ULONG_PTR)DestBits - delta); + SourceY++; + } + + } + status = TRUE; + break; + + case BMF_32BPP: + { + INT Destdelta; + INT Sourcedelta; + register PBYTE Destaddr; + register PBYTE Srcaddr; + LONG DesmaxX, DesmaxY; + LONG SrcmaxX, SrcmaxY; + + SrcmaxX = BltInfo->SourceSurface->sizlBitmap.cx - BltInfo->SourcePoint.x; + SrcmaxY = BltInfo->SourceSurface->sizlBitmap.cy - BltInfo->SourcePoint.y; + + DesmaxX = BltInfo->DestRect.right - BltInfo->DestRect.left; + DesmaxY = BltInfo->DestRect.bottom - BltInfo->DestRect.top; + + if (DesmaxX > SrcmaxX ) DesmaxX = SrcmaxX; + if (DesmaxY > SrcmaxY ) DesmaxY = SrcmaxY; + + Destdelta = BltInfo->DestSurface->lDelta; + Sourcedelta = BltInfo->SourceSurface->lDelta; + Destaddr = BltInfo->DestSurface->pvScan0 + BltInfo->DestRect.top * Destdelta + BltInfo->DestRect.left; + Srcaddr = BltInfo->SourceSurface->pvScan0 + BltInfo->SourcePoint.y * Sourcedelta + BltInfo->SourcePoint.x; + + DesmaxX *= 4; + if (DesmaxY > 0) + { + do + { + RtlCopyMemory(Destaddr, Srcaddr, DesmaxX); + Destaddr += Destdelta; + Srcaddr += Sourcedelta; + } + while (--DesmaxY); + } + status = TRUE; + break; + } + default: + break; + } + +return status; +} + +BOOLEAN +DIB32_ColorFill(PBLTINFO BltInfo, ULONG color) +{ + ULONG DestY; + +#ifdef _M_IX86 + ULONG SourceX; + + if (BltInfo->DestRect.left!=0) + { + SourceX = (BltInfo->DestRect.right - BltInfo->DestRect.left) << 2; + for (DestY=BltInfo->DestRect.bottom-1;DestY>=BltInfo->DestRect.top;DestY--) + { + memset4( (PDWORD) (BltInfo->DestSurface->pvScan0 + DestY * + BltInfo->DestSurface->lDelta + + BltInfo->DestRect.left), color, SourceX); + } + + } else { + SourceX = ((BltInfo->DestRect.bottom - BltInfo->DestRect.top) * BltInfo->DestRect.right); + + memset4(BltInfo->DestSurface->pvScan0 + BltInfo->DestRect.top * + BltInfo->DestSurface->lDelta, color, SourceX); + + } +#else + ULONG SourceY; + + for (DestY=BltInfo->DestRect.bottom-1;DestY>=BltInfo->DestRect.top;DestY--) + { + DIB_32BPP_HLine(BltInfo->DestSurface, BltInfo->DestRect.left, BltInfo->DestRect.right, DestY, color); + } +#endif + + return TRUE; +} /* ======================================= Stretching functions goes below