From bf6e782ee1b3cd32fbcf672c8c33e27eba82387c Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Tue, 31 May 2005 23:58:14 +0000 Subject: [PATCH] small optimze for StretchBlt now do only getpixel ones instead call hole time on getpixel for the color value when it stretch to biger BMP the hole stretchblt need to be optimze this code are geting it working bit faster and it is reference implementation svn path=/trunk/; revision=15710 --- reactos/subsys/win32k/dib/dib16bpp.c | 83 ++++++++++++-------- reactos/subsys/win32k/dib/dib1bpp.c | 91 ++++++++++++++-------- reactos/subsys/win32k/dib/dib24bpp.c | 111 +++++++++++++++++---------- reactos/subsys/win32k/dib/dib32bpp.c | 93 ++++++++++++++-------- reactos/subsys/win32k/dib/dib4bpp.c | 95 ++++++++++++++--------- reactos/subsys/win32k/dib/dib8bpp.c | 88 +++++++++++++-------- 6 files changed, 357 insertions(+), 204 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib16bpp.c b/reactos/subsys/win32k/dib/dib16bpp.c index 8e4cc89b0df..10620b63f60 100644 --- a/reactos/subsys/win32k/dib/dib16bpp.c +++ b/reactos/subsys/win32k/dib/dib16bpp.c @@ -627,6 +627,8 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, int DesY; int color; int zoomX; + int zoomY; + int count; 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, @@ -641,13 +643,16 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, zoomX = DesSizeX / SrcSizeX; if (zoomX==0) zoomX=1; + zoomY = DesSizeY / SrcSizeY; + if (zoomY==0) zoomY=1; + 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=0; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -665,19 +670,25 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (sx > SourceRect->right) break; - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) + if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) { - if (zoomX>1) - DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); - else - DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); + for (count=DesY;count1) + DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 0)); + else + DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 0)); + } } else { - if (zoomX>1) - DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); - else - DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); + for (count=DesY;count1) + DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 1)); + else + DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 1)); + } } } } @@ -687,7 +698,7 @@ 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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -709,10 +720,13 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (count=DesY;count1) + DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + } } } @@ -722,7 +736,7 @@ 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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -742,10 +756,13 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_8BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (count=DesY;count1) + DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + } } } @@ -755,7 +772,7 @@ 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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -774,10 +791,13 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (sx > SourceRect->right) break; color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (count=DesY;count1) + DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + } } } break; @@ -786,7 +806,7 @@ 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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -805,10 +825,13 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (sx > SourceRect->right) break; color = DIB_32BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_16BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (count=DesY;count1) + DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + } } } break; diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 8ff435723ee..e12771f943d 100644 --- a/reactos/subsys/win32k/dib/dib1bpp.c +++ b/reactos/subsys/win32k/dib/dib1bpp.c @@ -495,6 +495,8 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, int DesY; int color; int zoomX; + int zoomY; + int count; SrcSizeY = SourceRect->bottom; SrcSizeX = SourceRect->right; @@ -505,6 +507,9 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, zoomX = DesSizeX / SrcSizeX; if (zoomX==0) zoomX=1; + zoomY = DesSizeY / SrcSizeY; + if (zoomY==0) zoomY=1; + switch(SourceSurf->iBitmapFormat) { @@ -512,7 +517,7 @@ BOOLEAN DIB_1BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -534,11 +539,15 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_1BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, color); - else - DIB_1BPP_PutPixel(DestSurf, DesX, DesY, color); + for (count=DesY;count1) + DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, count, color); + else + DIB_1BPP_PutPixel(DestSurf, DesX, count, color); } + + } } break; @@ -546,7 +555,7 @@ BOOLEAN DIB_1BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -568,12 +577,14 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - + for (count=DesY;count1) + DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_1BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + } } break; @@ -581,7 +592,7 @@ BOOLEAN DIB_1BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -601,12 +612,15 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_8BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - + for (count=DesY;count1) + DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_1BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + + } } break; @@ -614,7 +628,7 @@ BOOLEAN DIB_1BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -634,12 +648,15 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_16BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - + for (count=DesY;count1) + DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_1BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + + } } break; @@ -647,7 +664,7 @@ BOOLEAN DIB_1BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -667,19 +684,22 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - + for (count=DesY;count1) + DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_1BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + + } } break; case BMF_32BPP: /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* This is a reference implementation, it hasn't been optimized for speed */ - for (DesY=0; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -699,11 +719,14 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_32BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (count=DesY;count1) + DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_1BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + } } break; diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 7adb080dc4f..4269041ac98 100644 --- a/reactos/subsys/win32k/dib/dib24bpp.c +++ b/reactos/subsys/win32k/dib/dib24bpp.c @@ -319,6 +319,8 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, int DesY; int color; int zoomX; + int zoomY; + int count; SrcSizeY = SourceRect->bottom; SrcSizeX = SourceRect->right; @@ -329,13 +331,16 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, zoomX = DesSizeX / SrcSizeX; if (zoomX==0) zoomX=1; + zoomY = DesSizeY / SrcSizeY; + if (zoomY==0) zoomY=1; + 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=0; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -351,21 +356,25 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, else sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - if (sx > SourceRect->right) break; - - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) + if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) { - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); - if (zoomX>1) - DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); - else - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); - + for (count=DesY;count1) + DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 0)); + else + DIB_24BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 0)); + } + } else { - if (zoomX>1) - DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); - else - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); + + for (count=DesY;count1) + DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 1)); + else + DIB_24BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 1)); + } } } } @@ -375,7 +384,7 @@ BOOLEAN DIB_24BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -394,11 +403,15 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (sx > SourceRect->right) break; color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - } + + for (count=DesY;count1) + DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_24BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } } break; @@ -406,7 +419,7 @@ BOOLEAN DIB_24BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -425,10 +438,15 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (sx > SourceRect->right) break; color = DIB_8BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + + for (count=DesY;count1) + DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_24BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } } break; @@ -437,7 +455,7 @@ BOOLEAN DIB_24BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -456,11 +474,16 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (sx > SourceRect->right) break; color = DIB_16BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + + for (count=DesY;count1) + DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_24BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + + } } break; @@ -468,7 +491,7 @@ BOOLEAN DIB_24BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -487,11 +510,16 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (sx > SourceRect->right) break; color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, color); - else - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, color); + + for (count=DesY;count1) + DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, count, color); + else + DIB_24BPP_PutPixel(DestSurf, DesX, count, color); } + + } } break; @@ -499,7 +527,7 @@ BOOLEAN DIB_24BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -519,11 +547,14 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_32BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (count=DesY;count1) + DIB_24BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_24BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + } } break; diff --git a/reactos/subsys/win32k/dib/dib32bpp.c b/reactos/subsys/win32k/dib/dib32bpp.c index 2e872e9cbef..4cb2c17b3bd 100644 --- a/reactos/subsys/win32k/dib/dib32bpp.c +++ b/reactos/subsys/win32k/dib/dib32bpp.c @@ -561,6 +561,8 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, int DesY; int color; int zoomX; + int zoomY; + int count; DPRINT("DIB_32BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", @@ -575,14 +577,17 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, zoomX = DesSizeX / SrcSizeX; if (zoomX==0) zoomX=1; - + + zoomY = DesSizeY / SrcSizeY; + if (zoomY==0) zoomY=1; + 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=0; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -602,16 +607,23 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) { - if (zoomX>1) - DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); - else - DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); + for (count=DesY;count1) + DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 0)); + else + DIB_32BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 0)); + } } else { - if (zoomX>1) - DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); - else - DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); + + for (count=DesY;count1) + DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 1)); + else + DIB_32BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 1)); + } } } } @@ -621,7 +633,7 @@ BOOLEAN DIB_32BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -644,10 +656,13 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (count=DesY;count1) + DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_32BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + } } } @@ -657,7 +672,7 @@ BOOLEAN DIB_32BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -677,10 +692,15 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_8BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (count=DesY;count1) + DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_32BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + } + + } } break; @@ -689,7 +709,7 @@ BOOLEAN DIB_32BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -708,11 +728,15 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (sx > SourceRect->right) break; color = DIB_16BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - } + + for (count=DesY;count1) + DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_32BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } } break; @@ -720,7 +744,7 @@ BOOLEAN DIB_32BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -739,11 +763,16 @@ BOOLEAN DIB_32BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (sx > SourceRect->right) break; color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_32BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - } + + for (count=DesY;count1) + DIB_32BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_32BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + } + + } } break; diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index 4a0419720e6..25134ca40ce 100644 --- a/reactos/subsys/win32k/dib/dib4bpp.c +++ b/reactos/subsys/win32k/dib/dib4bpp.c @@ -373,6 +373,9 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, int DesY; int color; int zoomX; + int zoomY; + int count; + SrcSizeY = SourceRect->bottom; SrcSizeX = SourceRect->right; @@ -383,13 +386,16 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, zoomX = DesSizeX / SrcSizeX; if (zoomX==0) zoomX=1; + zoomY = DesSizeY / SrcSizeY; + if (zoomY==0) zoomY=1; + 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=0; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -407,19 +413,25 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if (sx > SourceRect->right) break; - if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) + if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) { - if (zoomX>1) - DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); - else - DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); + for (count=DesY;count1) + DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 0)); + else + DIB_4BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 0)); + } - } else { - if (zoomX>1) - DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); - else - DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); + } else { + for (count=DesY;count1) + DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 1)); + else + DIB_4BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 1)); + } } } } @@ -429,7 +441,7 @@ BOOLEAN DIB_4BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -451,12 +463,15 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, color); - else - DIB_4BPP_PutPixel(DestSurf, DesX, DesY, color); - + for (count=DesY;count1) + DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, count, color); + else + DIB_4BPP_PutPixel(DestSurf, DesX, count, color); } + + } } break; @@ -464,7 +479,7 @@ BOOLEAN DIB_4BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -497,7 +512,7 @@ BOOLEAN DIB_4BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -517,12 +532,15 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_16BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - + for (count=DesY;count1) + DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_4BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + + } } break; @@ -530,7 +548,7 @@ BOOLEAN DIB_4BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -550,12 +568,15 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - + for (count=DesY;count1) + DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_4BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + + } } break; @@ -563,7 +584,7 @@ BOOLEAN DIB_4BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -583,12 +604,14 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_32BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - + for (count=DesY;count1) + DIB_4BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_4BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + } } break; diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index 7d6b5237209..97a5c0bb8e7 100644 --- a/reactos/subsys/win32k/dib/dib8bpp.c +++ b/reactos/subsys/win32k/dib/dib8bpp.c @@ -551,6 +551,8 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, int DesY; int color; int zoomX; + int zoomY; + int count; 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, @@ -565,13 +567,16 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, zoomX = DesSizeX / SrcSizeX; if (zoomX==0) zoomX=1; + zoomY = DesSizeY / SrcSizeY; + if (zoomY==0) zoomY=1; + 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=0; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -591,15 +596,23 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) { - if (zoomX>1) - DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); - else - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); + for (count=DesY;count1) + DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 0)); + else + DIB_8BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 0)); + } + } else { - if (zoomX>1) - DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); - else - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 1)); + + for (count=DesY;count1) + DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 1)); + else + DIB_8BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 1)); + } } } } @@ -609,7 +622,7 @@ BOOLEAN DIB_8BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -631,11 +644,14 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + for (count=DesY;count1) + DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_8BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + } } break; @@ -643,7 +659,7 @@ BOOLEAN DIB_8BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -663,12 +679,15 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_16BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - + for (count=DesY;count1) + DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_8BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + + } } break; @@ -676,7 +695,7 @@ BOOLEAN DIB_8BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -696,12 +715,14 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - + for (count=DesY;count1) + DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_8BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + } } break; @@ -709,7 +730,7 @@ BOOLEAN DIB_8BPP_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; DesYbottom; DesY++) + for (DesY=0; DesYbottom; DesY+=zoomY) { if (DesSizeY>SrcSizeY) sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); @@ -729,12 +750,15 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, color = DIB_32BPP_GetPixel(SourceSurf, sx, sy); - if (zoomX>1) - DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - else - DIB_8BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); - + for (count=DesY;count1) + DIB_8BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color)); + else + DIB_8BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color)); } + + } } break;