From f2bddbce012bc3d4861eacfd640ba70a4f8ad67e Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Thu, 21 Dec 2006 21:57:17 +0000 Subject: [PATCH] start of new strechblt huge speed incress, the idea is not doing any mul or the div in the for loop. this is only done for 16bpp, same code will be copy to rest later. 1. remove all div and mul from for Y loops 2. todo remove so much as psoible mul and div from X loop svn path=/trunk/; revision=25202 --- .../subsystems/win32/win32k/dib/dib16bpp.c | 274 +++++++++++------- 1 file changed, 166 insertions(+), 108 deletions(-) diff --git a/reactos/subsystems/win32/win32k/dib/dib16bpp.c b/reactos/subsystems/win32/win32k/dib/dib16bpp.c index ac5b2a289f0..8d38629df01 100644 --- a/reactos/subsystems/win32/win32k/dib/dib16bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib16bpp.c @@ -613,170 +613,228 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, LONG SrcSizeY; LONG SrcSizeX; LONG DesSizeY; - LONG DesSizeX; - LONG sx; - LONG sy; + LONG DesSizeX; + LONG sx = 0; + LONG sy = 0; LONG DesX; LONG DesY; LONG color; PULONG DestBits; LONG DifflDelta; - + LONG SrcZoomXHight; + LONG SrcZoomXLow; + LONG DstZoomXHight; + LONG DstZoomXLow; + LONG SrcZoomYHight; + LONG SrcZoomYLow; + LONG DstZoomYHight; + LONG DstZoomYLow; + + LONG sy_dec = 0; + LONG sy_max; + DPRINT("DIB_16BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", BitsPerFormat(SourceSurf->iBitmapFormat), SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); + /* Calc the Zoom height of Source */ SrcSizeY = SourceRect->bottom - SourceRect->top; + + /* Calc the Zoom Width of Source */ SrcSizeX = SourceRect->right - SourceRect->left; + /* Calc the Zoom height of Destions */ DesSizeY = DestRect->bottom - DestRect->top; + + /* Calc the Zoom width of Destions */ DesSizeX = DestRect->right - DestRect->left; - + + /* Calc the zoom factor of destions height */ + DstZoomYHight = DesSizeY / SrcSizeY; + DstZoomYLow = DesSizeY - (DstZoomXHight * SrcSizeY); + + /* Calc the zoom factor of destions width */ + DstZoomXHight = DesSizeX / SrcSizeX; + DstZoomXLow = DesSizeX - (DstZoomXHight * SrcSizeX); + + /* Calc the zoom factor of soruce height */ + SrcZoomYHight = SrcSizeY / DesSizeY; + SrcZoomYLow = SrcSizeY - (SrcZoomYHight * SrcSizeY); + + /* Calc the zoom factor of soruce width */ + SrcZoomXHight = SrcSizeX / DesSizeX; + SrcZoomXLow = SrcSizeX - (SrcZoomXHight * DesSizeX); + + sy_max = DesSizeX; + sy = SourceRect->top; + switch(SourceSurf->iBitmapFormat) { - case BMF_1BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - + case BMF_1BPP: + /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ + /* This is a reference implementation, it hasn't been optimized for speed */ + DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) + DestRect->top * DestSurf->lDelta); - - DifflDelta = DestSurf->lDelta - (DesSizeX << 1); - + DifflDelta = DestSurf->lDelta - (DesSizeX << 1); + for (DesY=0; DesYtop; - + { for (DesX=0; DesXleft; - - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - { - *DestBits = XLATEOBJ_iXlate(ColorTranslation, 0); - DestBits = (PULONG)((ULONG_PTR)DestBits + 2); - } - else - { - *DestBits = XLATEOBJ_iXlate(ColorTranslation, 1); - DestBits = (PULONG)((ULONG_PTR)DestBits + 2); - } + { + sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left; + if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) + { + *DestBits = XLATEOBJ_iXlate(ColorTranslation, 0); + DestBits = (PULONG)((ULONG_PTR)DestBits + 2); + } + else + { + *DestBits = XLATEOBJ_iXlate(ColorTranslation, 1); + DestBits = (PULONG)((ULONG_PTR)DestBits + 2); + } } + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); + + sy += SrcZoomYHight; + sy_dec += SrcZoomXLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; + } } break; - case BMF_4BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ + case BMF_4BPP: + /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ + /* This is a reference implementation, it hasn't been optimized for speed */ - DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) + + DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) + DestRect->top * DestSurf->lDelta); - - DifflDelta = DestSurf->lDelta - (DesSizeX << 1); - - for (DesY=0; DesYtop; - + + DifflDelta = DestSurf->lDelta - (DesSizeX << 1); + + for (DesY=0; DesYleft; + { + sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left; color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); color = XLATEOBJ_iXlate(ColorTranslation, color); - - *DestBits = color; - DestBits = (PULONG)((ULONG_PTR)DestBits + 2); + *DestBits = color; + DestBits = (PULONG)((ULONG_PTR)DestBits + 2); } + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); + + sy += SrcZoomYHight; + sy_dec += SrcZoomXLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; + } } break; - case BMF_8BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - - DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) + + case BMF_8BPP: + /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ + /* This is a reference implementation, it hasn't been optimized for speed */ + + DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) + DestRect->top * DestSurf->lDelta); - - DifflDelta = DestSurf->lDelta - (DesSizeX << 1); - - for (DesY=0; DesYtop; - + DifflDelta = DestSurf->lDelta - (DesSizeX << 1); + + for (DesY=0; DesYleft; color = DIB_8BPP_GetPixel(SourceSurf, sx, sy); color = XLATEOBJ_iXlate(ColorTranslation, color); - *DestBits = color; - DestBits = (PULONG)((ULONG_PTR)DestBits + 2); + *DestBits = color; + DestBits = (PULONG)((ULONG_PTR)DestBits + 2); } + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); + + sy += SrcZoomYHight; + sy_dec += SrcZoomXLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; + } } break; - case BMF_24BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - - DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) + - DestRect->top * DestSurf->lDelta); - - DifflDelta = DestSurf->lDelta - (DesSizeX << 1); - - for (DesY=0; DesYtop; - - for (DesX=0; DesXleft; - color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - color = XLATEOBJ_iXlate(ColorTranslation, color); - - *DestBits = color; - DestBits = (PULONG)((ULONG_PTR)DestBits + 2); - } - DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); - } - break; + case BMF_24BPP: + /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ + /* This is a reference implementation, it hasn't been optimized for speed */ - case BMF_32BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - - DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) + + DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) + DestRect->top * DestSurf->lDelta); - - DifflDelta = DestSurf->lDelta - (DesSizeX << 1); - - for (DesY=0; DesYtop; - + + DifflDelta = DestSurf->lDelta - (DesSizeX << 1); + + for (DesY=0; DesYleft; - color = DIB_32BPP_GetPixel(SourceSurf, sx, sy); - color = XLATEOBJ_iXlate(ColorTranslation, color); - - *DestBits = color; - DestBits = (PULONG)((ULONG_PTR)DestBits + 2); + { + sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left; + color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); + color = XLATEOBJ_iXlate(ColorTranslation, color); + *DestBits = color; + DestBits = (PULONG)((ULONG_PTR)DestBits + 2); } + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); + + sy += SrcZoomYHight; + sy_dec += SrcZoomXLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; + } } break; + case BMF_32BPP: + /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ + /* This is a reference implementation, it hasn't been optimized for speed */ + + DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) + + DestRect->top * DestSurf->lDelta); + DifflDelta = DestSurf->lDelta - (DesSizeX << 1); + + for (DesY=0; DesYleft; + color = DIB_32BPP_GetPixel(SourceSurf, sx, sy); + color = XLATEOBJ_iXlate(ColorTranslation, color); + *DestBits = color; + DestBits = (PULONG)((ULONG_PTR)DestBits + 2); + } + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); + + sy += SrcZoomYHight; + sy_dec += SrcZoomXLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; + } + } + break; + case BMF_16BPP: return ScaleRectAvg16(DestSurf, SourceSurf, DestRect, SourceRect, MaskOrigin, BrushOrigin, ClipRegion, ColorTranslation, Mode);