diff --git a/reactos/subsystems/win32/win32k/dib/dib16bpp.c b/reactos/subsystems/win32/win32k/dib/dib16bpp.c index 0be2e3e0e3f..09329eb9a5a 100644 --- a/reactos/subsystems/win32/win32k/dib/dib16bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib16bpp.c @@ -788,12 +788,12 @@ 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 */ - for (DesY=0; DesYtop; DesYbottom; DesY++) { sx = SourceRect->left; sx_dec = 0; - for (DesX=0; DesXleft; DesXright; DesX++) { color = XLATEOBJ_iXlate(ColorTranslation, DIB_1BPP_GetPixel(SourceSurf, sx, sy)); @@ -823,12 +823,12 @@ 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 */ - for (DesY=0; DesYtop; DesYbottom; DesY++) { sx = SourceRect->left; sx_dec = 0; - for (DesX=0; DesXleft; DesXright; DesX++) { color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); @@ -858,12 +858,12 @@ 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 */ - for (DesY=0; DesYtop; DesYbottom; DesY++) { sx = SourceRect->left; sx_dec = 0; - for (DesX=0; DesXleft; DesXright; DesX++) { color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); @@ -894,12 +894,12 @@ 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 */ - for (DesY=0; DesYtop; DesYbottom; DesY++) { sx = SourceRect->left; sx_dec = 0; - for (DesX=0; DesXleft; DesXright; DesX++) { color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)); @@ -929,12 +929,12 @@ 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 */ - for (DesY=0; DesYtop; DesYbottom; DesY++) { sx = SourceRect->left; sx_dec = 0; - for (DesX=0; DesXleft; DesXright; DesX++) { color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); diff --git a/reactos/subsystems/win32/win32k/dib/dib24bpp.c b/reactos/subsystems/win32/win32k/dib/dib24bpp.c index e639eea2c02..acfc460946d 100644 --- a/reactos/subsystems/win32/win32k/dib/dib24bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib24bpp.c @@ -414,20 +414,50 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, LONG SrcSizeX; LONG DesSizeY; LONG DesSizeX; - LONG sx; - LONG sy; + LONG sx = 0; + LONG sy = 0; LONG DesX; LONG DesY; - LONG color; + + LONG SrcZoomXHight; + LONG SrcZoomXLow; + LONG SrcZoomYHight; + LONG SrcZoomYLow; + + LONG sy_dec = 0; + LONG sy_max; + + LONG sx_dec = 0; + LONG sx_max; + ULONG color; DPRINT("DIB_24BPP_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); - SrcSizeY = SourceRect->bottom - SourceRect->top; - SrcSizeX = SourceRect->right - SourceRect->left; + + /* Calc the Zoom height of Source */ + SrcSizeY = SourceRect->bottom - SourceRect->top; - DesSizeY = DestRect->bottom - DestRect->top; - DesSizeX = DestRect->right - DestRect->left; + /* Calc the Zoom Width of Source */ + SrcSizeX = SourceRect->right - SourceRect->left; + + /* Calc the Zoom height of Destinations */ + DesSizeY = DestRect->bottom - DestRect->top; + + /* Calc the Zoom width of Destinations */ + DesSizeX = DestRect->right - DestRect->left; + + /* Calc the zoom factor of source height */ + SrcZoomYHight = SrcSizeY / DesSizeY; + SrcZoomYLow = SrcSizeY - (SrcZoomYHight * DesSizeY); + + /* Calc the zoom factor of source width */ + SrcZoomXHight = SrcSizeX / DesSizeX; + SrcZoomXLow = SrcSizeX - (SrcZoomXHight * DesSizeX); + + sx_max = DesSizeX; + sy_max = DesSizeY; + sy = SourceRect->top; switch(SourceSurf->iBitmapFormat) { @@ -437,20 +467,31 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (DesY=DestRect->top; DesYbottom; DesY++) { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; + sx = SourceRect->left; + sx_dec = 0; for (DesX=DestRect->left; DesXright; DesX++) { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; + color = XLATEOBJ_iXlate(ColorTranslation, + DIB_1BPP_GetPixel(SourceSurf, sx, sy)); - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - { - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); - } - else - { - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); - } + DIB_24BPP_PutPixel(DestSurf, DesX, DesY, color); + + sx += SrcZoomXHight; + sx_dec += SrcZoomXLow; + if (sx_dec >= sx_max) + { + sx++; + sx_dec -= sx_max; + } + } + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; } } @@ -462,13 +503,31 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (DesY=DestRect->top; DesYbottom; DesY++) { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; + sx = SourceRect->left; + sx_dec = 0; for (DesX=DestRect->left; DesXright; DesX++) { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; - color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + color = XLATEOBJ_iXlate(ColorTranslation, + DIB_4BPP_GetPixel(SourceSurf, sx, sy)); + + DIB_24BPP_PutPixel(DestSurf, DesX, DesY, color); + + sx += SrcZoomXHight; + sx_dec += SrcZoomXLow; + if (sx_dec >= sx_max) + { + sx++; + sx_dec -= sx_max; + } + } + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; } } break; @@ -479,13 +538,31 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (DesY=DestRect->top; DesYbottom; DesY++) { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; + sx = SourceRect->left; + sx_dec = 0; for (DesX=DestRect->left; DesXright; DesX++) { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; - color = DIB_8BPP_GetPixel(SourceSurf, sx, sy); - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + color = XLATEOBJ_iXlate(ColorTranslation, + DIB_8BPP_GetPixel(SourceSurf, sx, sy)); + + DIB_24BPP_PutPixel(DestSurf, DesX, DesY, color); + + sx += SrcZoomXHight; + sx_dec += SrcZoomXLow; + if (sx_dec >= sx_max) + { + sx++; + sx_dec -= sx_max; + } + } + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; } } break; @@ -496,13 +573,31 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (DesY=DestRect->top; DesYbottom; DesY++) { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; + sx = SourceRect->left; + sx_dec = 0; for (DesX=DestRect->left; DesXright; DesX++) { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; - color = DIB_16BPP_GetPixel(SourceSurf, sx, sy); - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + color = XLATEOBJ_iXlate(ColorTranslation, + DIB_16BPP_GetPixel(SourceSurf, sx, sy)); + + DIB_24BPP_PutPixel(DestSurf, DesX, DesY, color); + + sx += SrcZoomXHight; + sx_dec += SrcZoomXLow; + if (sx_dec >= sx_max) + { + sx++; + sx_dec -= sx_max; + } + } + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; } } break; @@ -513,13 +608,31 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (DesY=DestRect->top; DesYbottom; DesY++) { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; + sx = SourceRect->left; + sx_dec = 0; for (DesX=DestRect->left; DesXright; DesX++) { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; - color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + color = XLATEOBJ_iXlate(ColorTranslation, + DIB_24BPP_GetPixel(SourceSurf, sx, sy)); + + DIB_24BPP_PutPixel(DestSurf, DesX, DesY, color); + + sx += SrcZoomXHight; + sx_dec += SrcZoomXLow; + if (sx_dec >= sx_max) + { + sx++; + sx_dec -= sx_max; + } + } + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; } } break; @@ -530,13 +643,31 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, for (DesY=DestRect->top; DesYbottom; DesY++) { - sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top; + sx = SourceRect->left; + sx_dec = 0; for (DesX=DestRect->left; DesXright; DesX++) { - sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left; - color = DIB_32BPP_GetPixel(SourceSurf, sx, sy); - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + color = XLATEOBJ_iXlate(ColorTranslation, + DIB_32BPP_GetPixel(SourceSurf, sx, sy)); + + DIB_24BPP_PutPixel(DestSurf, DesX, DesY, color); + + sx += SrcZoomXHight; + sx_dec += SrcZoomXLow; + if (sx_dec >= sx_max) + { + sx++; + sx_dec -= sx_max; + } + } + + sy += SrcZoomYHight; + sy_dec += SrcZoomYLow; + if (sy_dec >= sy_max) + { + sy++; + sy_dec -= sy_max; } } break; diff --git a/reactos/subsystems/win32/win32k/dib/dib4bpp.c b/reactos/subsystems/win32/win32k/dib/dib4bpp.c index 6118eb6f821..0f5ac60fdc7 100644 --- a/reactos/subsystems/win32/win32k/dib/dib4bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib4bpp.c @@ -510,7 +510,7 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; default: - //DPRINT1("DIB_4BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); + DPRINT1("DIB_4BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } diff --git a/reactos/subsystems/win32/win32k/dib/dib8bpp.c b/reactos/subsystems/win32/win32k/dib/dib8bpp.c index 0d71e2a949c..66ba47e26bf 100644 --- a/reactos/subsystems/win32/win32k/dib/dib8bpp.c +++ b/reactos/subsystems/win32/win32k/dib/dib8bpp.c @@ -522,11 +522,11 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, case BMF_1BPP: /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* This is a reference implementation, it hasn't been optimized for speed */ - for (DesY=0; DesYtop; DesYbottom; DesY++) { sx = SourceRect->left; sx_dec = 0; - for (DesX=0; DesXleft; DesXright; DesX++) { color = XLATEOBJ_iXlate(ColorTranslation, DIB_1BPP_GetPixel(SourceSurf, sx, sy)); @@ -555,11 +555,11 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, case BMF_4BPP: /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* This is a reference implementation, it hasn't been optimized for speed */ - for (DesY=0; DesYtop; DesYbottom; DesY++) { sx = SourceRect->left; sx_dec = 0; - for (DesX=0; DesXleft; DesXright; DesX++) { color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); @@ -593,11 +593,11 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, case BMF_16BPP: /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* This is a reference implementation, it hasn't been optimized for speed */ - for (DesY=0; DesYtop; DesYbottom; DesY++) { sx = SourceRect->left; sx_dec = 0; - for (DesX=0; DesXleft; DesXright; DesX++) { color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); @@ -624,11 +624,11 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, break; case BMF_24BPP: - for (DesY=0; DesYtop; DesYbottom; DesY++) { sx = SourceRect->left; sx_dec = 0; - for (DesX=0; DesXleft; DesXright; DesX++) { color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)); @@ -657,11 +657,11 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, case BMF_32BPP: /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* This is a reference implementation, it hasn't been optimized for speed */ - for (DesY=0; DesYtop; DesYbottom; DesY++) { sx = SourceRect->left; sx_dec = 0; - for (DesX=0; DesXleft; DesXright; DesX++) { color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy));