optimze for bitblt dib32bpp.c NOTSRCERASE, DSTINVERT you can gain more speed from these Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c _____
Modified: trunk/reactos/subsys/win32k/dib/dib32bpp.c --- trunk/reactos/subsys/win32k/dib/dib32bpp.c 2005-06-03 18:33:15 UTC (rev 15755) +++ trunk/reactos/subsys/win32k/dib/dib32bpp.c 2005-06-03 18:57:53 UTC (rev 15756) @@ -387,30 +387,36 @@
case BMF_16BPP: case BMF_24BPP: { - PBYTE byteaddr = BltInfo->SourceSurface->pvScan0 + BltInfo->DestRect.top * BltInfo->SourceSurface->lDelta; - PDWORD addr = (PDWORD)byteaddr + BltInfo->DestRect.left; - LONG xlDelta = BltInfo->SourceSurface->lDelta - (BltInfo->DestRect.right - BltInfo->DestRect.left) ; + /* 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; + if (SourceY > BltInfo->SourceSurface->sizlBitmap.cy) break; - SourceX = BltInfo->SourcePoint.x; + SourceX = BltInfo->SourcePoint.x;
- for (DestX=BltInfo->DestRect.left; DestX<BltInfo->DestRect.right; DestX++, SourceX++, addr++) - { + for (DestX=BltInfo->DestRect.left; DestX<BltInfo->DestRect.right; DestX++, SourceX++, Destaddr++) + { if (SourceX > BltInfo->SourceSurface->sizlBitmap.cx) break; - *addr = DIB_GetSource(BltInfo->SourceSurface, SourceX, + *Destaddr = DIB_GetSource(BltInfo->SourceSurface, SourceX,
SourceY, BltInfo->XlateSourceToDest); - } + } + Destaddr+=DestxlDelta; } - addr+=xlDelta; + return TRUE; + break; } - break; + + case BMF_32BPP: { INT Destdelta; @@ -449,16 +455,78 @@ } while (--DesmaxY); } - return TRUE; - break; + return TRUE; + break; } - + + default: + break; + }
+ break; + case ROP4_DSTINVERT: + // return(~Dest); + { + /* 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) ; + + for (DestY=BltInfo->DestRect.top; DestY<BltInfo->DestRect.bottom; DestY++) + { + for (DestX=BltInfo->DestRect.left; DestX<BltInfo->DestRect.right; DestX++, Destaddr++) + { + *Destaddr = ~(*Destaddr); + } + Destaddr+=DestxlDelta; + } + return TRUE; + } + 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) ; + + 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; + } + break;
+ default: break; }