From 32b82baa21d02ad5194922485d7dda59209a525f Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Fri, 29 Dec 2006 13:16:53 +0000 Subject: [PATCH] commit same strechblt code for 8,16,32, it does not using putpixel anylong for 8 and 32, and small cleanup this code can be makefaster, how remove getpixel that will doing huge incress in speed, split calc to simple 1x 2x .. zoom in/out now we are using 1.1x 2.2x Zoom and 1x 2x zoom same code. if we split it we will see a speed incress. svn path=/trunk/; revision=25237 --- .../subsystems/win32/win32k/dib/dib16bpp.c | 62 ++-- .../subsystems/win32/win32k/dib/dib32bpp.c | 277 ++++++++++++------ reactos/subsystems/win32/win32k/dib/dib8bpp.c | 273 ++++++++++++----- 3 files changed, 395 insertions(+), 217 deletions(-) diff --git a/reactos/subsystems/win32/win32k/dib/dib16bpp.c b/reactos/subsystems/win32/win32k/dib/dib16bpp.c index 61bf1b4770d..e729691f33c 100644 --- a/reactos/subsystems/win32/win32k/dib/dib16bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib16bpp.c @@ -741,7 +741,6 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, LONG sy = 0; LONG DesX; LONG DesY; - LONG color; PULONG DestBits; LONG DifflDelta; @@ -784,6 +783,10 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, sy_max = DesSizeY; sy = SourceRect->top; + DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) + + DestRect->top * DestSurf->lDelta); + + DifflDelta = DestSurf->lDelta - (DesSizeX << 1); switch(SourceSurf->iBitmapFormat) { @@ -792,10 +795,6 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, /* 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; @@ -803,17 +802,11 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (DesX=0; DesX= sx_max) @@ -839,11 +832,6 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, /* 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; @@ -851,9 +839,9 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (DesX=0; DesXpvScan0 + (DestRect->left << 1) + - DestRect->top * DestSurf->lDelta); - DifflDelta = DestSurf->lDelta - (DesSizeX << 1); - for (DesY=0; DesYleft; @@ -892,9 +876,9 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (DesX=0; DesXpvScan0 + (DestRect->left << 1) + - DestRect->top * DestSurf->lDelta); - DifflDelta = DestSurf->lDelta - (DesSizeX << 1); - for (DesY=0; DesYleft; @@ -976,9 +956,9 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (DesX=0; DesXiBitmapFormat), 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; - DesSizeX = DestRect->right - DestRect->left; + /* Calc the Zoom width of Destions */ + DesSizeX = DestRect->right - DestRect->left; + + /* Calc the zoom factor of soruce height */ + SrcZoomYHight = SrcSizeY / DesSizeY; + SrcZoomYLow = SrcSizeY - (SrcZoomYHight * DesSizeY); + + /* Calc the zoom factor of soruce width */ + SrcZoomXHight = SrcSizeX / DesSizeX; + SrcZoomXLow = SrcSizeX - (SrcZoomXHight * DesSizeX); + + sx_max = DesSizeX; + sy_max = DesSizeY; + sy = SourceRect->top; + + DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 2) + + DestRect->top * DestSurf->lDelta); + + DifflDelta = DestSurf->lDelta - (DesSizeX << 2); switch(SourceSurf->iBitmapFormat) { - 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 << 2) + - DestRect->top * DestSurf->lDelta); - - DifflDelta = DestSurf->lDelta - (DesSizeX << 2); - + case BMF_1BPP: + /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ + /* This is a reference implementation, it hasn't been optimized for speed */ for (DesY=0; DesYtop; - - for (DesX=0; DesXleft; - - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - { - *DestBits = XLATEOBJ_iXlate(ColorTranslation, 0); - } - else - { - *DestBits = XLATEOBJ_iXlate(ColorTranslation, 1); - } + { + sx = SourceRect->left; + sx_dec = 0; + for (DesX=0; DesX= sx_max) + { + sx++; + sx_dec -= sx_max; + } } + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); - } - break; + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; + } + } + break; - case BMF_4BPP: + 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 << 2) + - DestRect->top * DestSurf->lDelta); - - DifflDelta = DestSurf->lDelta - (DesSizeX << 2); - for (DesY=0; DesYtop; - - for (DesX=0; DesXleft; - color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - color = XLATEOBJ_iXlate(ColorTranslation, color); - *DestBits = color; + { + sx = SourceRect->left; + sx_dec = 0; + for (DesX=0; DesX= sx_max) + { + sx++; + sx_dec -= sx_max; + } } - + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); - } + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + 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 << 2) + - DestRect->top * DestSurf->lDelta); - - DifflDelta = DestSurf->lDelta - (DesSizeX << 2); - for (DesY=0; DesYtop; - - for (DesX=0; DesXleft; - color = DIB_8BPP_GetPixel(SourceSurf, sx, sy); - color = XLATEOBJ_iXlate(ColorTranslation, color); - *DestBits = color; + { + sx = SourceRect->left; + sx_dec = 0; + for (DesX=0; DesX= sx_max) + { + sx++; + sx_dec -= sx_max; + } } + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); - } + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; + } + } break; - case BMF_16BPP: + case BMF_16BPP: /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* This is a reference implementation, it hasn't been optimized for speed */ - DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 2) + - DestRect->top * DestSurf->lDelta); - - DifflDelta = DestSurf->lDelta - (DesSizeX << 2); - for (DesY=0; DesYtop; - - for (DesX=0; DesXleft; - color = DIB_16BPP_GetPixel(SourceSurf, sx, sy); - color = XLATEOBJ_iXlate(ColorTranslation, color); - *DestBits = color; + { + sx = SourceRect->left; + sx_dec = 0; + for (DesX=0; DesX= sx_max) + { + sx++; + sx_dec -= sx_max; + } } + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); - } - break; + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + 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 << 2) + - DestRect->top * DestSurf->lDelta); - - DifflDelta = DestSurf->lDelta - (DesSizeX << 2); - for (DesY=0; DesYtop; - - for (DesX=0; DesXleft; - color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - color = XLATEOBJ_iXlate(ColorTranslation, color); - *DestBits = color; + { + sx = SourceRect->left; + sx_dec = 0; + for (DesX=0; DesX= sx_max) + { + sx++; + sx_dec -= sx_max; + } } + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); - } - break; + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; + } + } + break; case BMF_32BPP: return ScaleRectAvg32(DestSurf, SourceSurf, DestRect, SourceRect, MaskOrigin, BrushOrigin, diff --git a/reactos/subsystems/win32/win32k/dib/dib8bpp.c b/reactos/subsystems/win32/win32k/dib/dib8bpp.c index 03440a50dde..e38e856e5ea 100644 --- a/reactos/subsystems/win32/win32k/dib/dib8bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib8bpp.c @@ -463,65 +463,128 @@ BOOLEAN DIB_8BPP_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 SrcZoomYHight; + LONG SrcZoomYLow; + + LONG sy_dec = 0; + LONG sy_max; + + LONG sx_dec = 0; + LONG sx_max; DPRINT("DIB_8BPP_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 soruce height */ + SrcZoomYHight = SrcSizeY / DesSizeY; + SrcZoomYLow = SrcSizeY - (SrcZoomYHight * DesSizeY); + + /* Calc the zoom factor of soruce width */ + SrcZoomXHight = SrcSizeX / DesSizeX; + SrcZoomXLow = SrcSizeX - (SrcZoomXHight * DesSizeX); + + sx_max = DesSizeX; + sy_max = DesSizeY; + sy = SourceRect->top; + + DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left) + + DestRect->top * DestSurf->lDelta); + + DifflDelta = DestSurf->lDelta - DesSizeX ; + switch(SourceSurf->iBitmapFormat) { case BMF_1BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - - for (DesY=DestRect->top; DesYbottom; DesY++) - { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; - - for (DesX=DestRect->left; DesXright; DesX++) - { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; - - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - { - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); - } - else - { - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); - } - } - } - - break; - - case BMF_4BPP: /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* This is a reference implementation, it hasn't been optimized for speed */ - - for (DesY=DestRect->top; DesYbottom; DesY++) - { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; - - for (DesX=DestRect->left; DesXright; DesX++) - { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; - color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (DesY=0; DesYleft; + sx_dec = 0; + for (DesX=0; DesX= sx_max) + { + sx++; + sx_dec -= sx_max; + } } - } + + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + 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 */ + for (DesY=0; DesYleft; + sx_dec = 0; + for (DesX=0; DesX= sx_max) + { + sx++; + sx_dec -= sx_max; + } + } + + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; + } + } break; case BMF_8BPP: @@ -529,56 +592,108 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, ClipRegion, ColorTranslation, Mode); break; - case BMF_16BPP: + case BMF_16BPP: /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* This is a reference implementation, it hasn't been optimized for speed */ - - for (DesY=DestRect->top; DesYbottom; DesY++) - { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; - - for (DesX=DestRect->left; DesXright; DesX++) - { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; - color = DIB_16BPP_GetPixel(SourceSurf, sx, sy); - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (DesY=0; DesYleft; + sx_dec = 0; + for (DesX=0; DesX= sx_max) + { + sx++; + sx_dec -= sx_max; + } } - } - break; + + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + 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 */ - - for (DesY=DestRect->top; DesYbottom; DesY++) - { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; - - for (DesX=DestRect->left; DesXright; DesX++) - { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; - color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (DesY=0; DesYleft; + sx_dec = 0; + for (DesX=0; DesX= sx_max) + { + sx++; + sx_dec -= sx_max; + } } - } - break; + + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + 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 */ - - for (DesY=DestRect->top; DesYbottom; DesY++) - { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; - - for (DesX=DestRect->left; DesXright; DesX++) - { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; - color = DIB_32BPP_GetPixel(SourceSurf, sx, sy); - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (DesY=0; DesYleft; + sx_dec = 0; + for (DesX=0; DesX= sx_max) + { + sx++; + sx_dec -= sx_max; + } } - } - break; + + DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta); + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; + } + } + break;