From 6b3815ef2ad580d77eac7d9adaac2c64fc3f8592 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Fri, 6 Jan 2006 05:27:48 +0000 Subject: [PATCH] fixed working strechblt for all dibxx now. do not say it does not take offset of source and destantion into accunt, it does. left implement CliprRegion. but last no longer black windows with or corupt images showing. svn path=/trunk/; revision=20602 --- reactos/subsys/win32k/dib/dib1bpp.c | 885 ++++---------------------- reactos/subsys/win32k/dib/dib24bpp.c | 893 ++++---------------------- reactos/subsys/win32k/dib/dib4bpp.c | 894 ++++----------------------- reactos/subsys/win32k/dib/dib8bpp.c | 18 +- 4 files changed, 350 insertions(+), 2340 deletions(-) diff --git a/reactos/subsys/win32k/dib/dib1bpp.c b/reactos/subsys/win32k/dib/dib1bpp.c index 8bec3353def..8777f634805 100644 --- a/reactos/subsys/win32k/dib/dib1bpp.c +++ b/reactos/subsys/win32k/dib/dib1bpp.c @@ -502,793 +502,130 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { - int SrcSizeY; - int SrcSizeX; - int DesSizeY; - int DesSizeX; - int sx; - int sy; - int DesX; - int DesY; - int color; - int zoomX; - int zoomY; - int count; - int saveX = 0; - int saveY; - BOOLEAN DesIsBiggerY=FALSE; - - SrcSizeY = SourceRect->bottom - SourceRect->top; - SrcSizeX = SourceRect->right - SourceRect->left; + LONG SrcSizeY; + LONG SrcSizeX; + LONG DesSizeY; + LONG DesSizeX; + LONG sx; + LONG sy; + LONG DesX; + LONG DesY; + LONG color; - DesSizeY = DestRect->bottom; - DesSizeX = DestRect->right; - - zoomX = DesSizeX / SrcSizeX; - if (zoomX==0) zoomX=1; - - zoomY = DesSizeY / SrcSizeY; - if (zoomY==0) zoomY=1; - - if (DesSizeY>SrcSizeY) - DesIsBiggerY = TRUE; - - - switch(SourceSurf->iBitmapFormat) - { - case BMF_1BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - saveX = DesX + zoomX; - - color = DIB_1BPP_GetPixel(SourceSurf, sx, sy); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - saveX = DesX + zoomX; - - color = DIB_1BPP_GetPixel(SourceSurf, sx, sy); - - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = DIB_1BPP_GetPixel(SourceSurf, sx, sy); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - else - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = DIB_1BPP_GetPixel(SourceSurf, sx, sy); - - for (count=DesY;countbottom - SourceRect->top; + SrcSizeX = SourceRect->right - SourceRect->left; + + DesSizeY = DestRect->bottom - DestRect->top; + DesSizeX = DestRect->right - DestRect->left; + + 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; + + color = DIB_1BPP_GetPixel(SourceSurf, sx, sy); + DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); + } + } + + break; case BMF_4BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; case BMF_8BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_8BPP_GetPixel(SourceSurf, sx, sy); + DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; case BMF_16BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; case BMF_24BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_1BPP_PutPixel(DestSurf, DesX, DesY, 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 */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; default: - //DPRINT1("DIB_4BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); + //DPRINT1("DIB_1BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; } diff --git a/reactos/subsys/win32k/dib/dib24bpp.c b/reactos/subsys/win32k/dib/dib24bpp.c index 960bc8c2347..30493e1e01d 100644 --- a/reactos/subsys/win32k/dib/dib24bpp.c +++ b/reactos/subsys/win32k/dib/dib24bpp.c @@ -497,796 +497,133 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { - int SrcSizeY; - int SrcSizeX; - int DesSizeY; - int DesSizeX; - int sx; - int sy; - int DesX; - int DesY; - int color; - int zoomX; - int zoomY; - int count; - int saveX; - int saveY; - BOOLEAN DesIsBiggerY=FALSE; - - SrcSizeY = SourceRect->bottom - SourceRect->top; - SrcSizeX = SourceRect->right - SourceRect->left; + LONG SrcSizeY; + LONG SrcSizeX; + LONG DesSizeY; + LONG DesSizeX; + LONG sx; + LONG sy; + LONG DesX; + LONG DesY; + LONG color; - DesSizeY = DestRect->bottom ; - DesSizeX = DestRect->right; - - zoomX = DesSizeX / SrcSizeX; - if (zoomX==0) zoomX=1; - - zoomY = DesSizeY / SrcSizeY; - if (zoomY==0) zoomY=1; - - if (DesSizeY>SrcSizeY) - DesIsBiggerY = TRUE; + SrcSizeY = SourceRect->bottom - SourceRect->top; + SrcSizeX = SourceRect->right - SourceRect->left; + + DesSizeY = DestRect->bottom - DestRect->top; + DesSizeX = DestRect->right - DestRect->left; - switch(SourceSurf->iBitmapFormat) - { - case BMF_1BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - saveX = DesX + zoomX; - - if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - saveX = DesX + zoomX; - - if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - for (count=DesY;countiBitmapFormat) + { + 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_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); + } + else + { + DIB_24BPP_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 */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; case BMF_8BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_8BPP_GetPixel(SourceSurf, sx, sy); + DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; case BMF_16BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; case BMF_24BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = DIB_24BPP_GetPixel(SourceSurf, sx, sy); - - for (count=DesY;counttop; 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_24BPP_PutPixel(DestSurf, DesX, DesY, 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 */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; default: //DPRINT1("DIB_24BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); diff --git a/reactos/subsys/win32k/dib/dib4bpp.c b/reactos/subsys/win32k/dib/dib4bpp.c index 3e6f6475b51..d3afbd37efa 100644 --- a/reactos/subsys/win32k/dib/dib4bpp.c +++ b/reactos/subsys/win32k/dib/dib4bpp.c @@ -381,802 +381,138 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { - int SrcSizeY; - int SrcSizeX; - int DesSizeY; - int DesSizeX; - int sx; - int sy; - int DesX; - int DesY; - int color; - int zoomX; - int zoomY; - int count; - int saveX; - int saveY; - BOOLEAN DesIsBiggerY=FALSE; + LONG SrcSizeY; + LONG SrcSizeX; + LONG DesSizeY; + LONG DesSizeX; + LONG sx; + LONG sy; + LONG DesX; + LONG DesY; + LONG color; - SrcSizeY = SourceRect->bottom - SourceRect->top; - SrcSizeX = SourceRect->right - SourceRect->left; + SrcSizeY = SourceRect->bottom - SourceRect->top; + SrcSizeX = SourceRect->right - SourceRect->left; - DesSizeY = DestRect->bottom; - DesSizeX = DestRect->right; + DesSizeY = DestRect->bottom - DestRect->top; + DesSizeX = DestRect->right - DestRect->left; - zoomX = DesSizeX / SrcSizeX; - if (zoomX==0) zoomX=1; - - zoomY = DesSizeY / SrcSizeY; - if (zoomY==0) zoomY=1; - - if (DesSizeY>SrcSizeY) - DesIsBiggerY = TRUE; - - switch(SourceSurf->iBitmapFormat) - { - case BMF_1BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - saveX = DesX + zoomX; - - if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - saveX = DesX + zoomX; - - if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0) - for (count=DesY;countiBitmapFormat) + { + 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_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0)); + } + else + { + DIB_4BPP_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 */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = DIB_4BPP_GetPixel(SourceSurf, sx, sy); - - for (count=DesY;counttop; 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_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; case BMF_8BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_8BPP_GetPixel(SourceSurf, sx, sy); + DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; case BMF_16BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; case BMF_24BPP: - /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ - /* This is a reference implementation, it hasn't been optimized for speed */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_4BPP_PutPixel(DestSurf, DesX, DesY, 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 */ - if (zoomX>1) - { - /* Draw one Hline on X - Led to the Des Zoom In*/ - if (DesSizeX>SrcSizeX) - { - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - saveX = DesX + zoomX; - for (count=DesY;countSrcSizeX) - { - /* Draw one pixel on X - Led to the Des Zoom In*/ - for (DesY=DestRect->bottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;countbottom-zoomY; DesY>=DestRect->top; DesY-=zoomY) - { - if (DesIsBiggerY) - sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY); - else - sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY); - - if (sy > SourceRect->bottom) break; - - saveY = DesY+zoomY; - - for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) - { - sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX); - - if (sx > SourceRect->right) break; - - color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy)); - - for (count=DesY;counttop; 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_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color)); + } + } + break; default: //DPRINT1("DIB_4BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); return FALSE; - } + } return TRUE; } diff --git a/reactos/subsys/win32k/dib/dib8bpp.c b/reactos/subsys/win32k/dib/dib8bpp.c index 9feefb44503..dde6e9e347e 100644 --- a/reactos/subsys/win32k/dib/dib8bpp.c +++ b/reactos/subsys/win32k/dib/dib8bpp.c @@ -460,15 +460,15 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, ULONG Mode) { - int SrcSizeY; - int SrcSizeX; - int DesSizeY; - int DesSizeX; - int sx; - int sy; - int DesX; - int DesY; - int color; + LONG SrcSizeY; + LONG SrcSizeX; + LONG DesSizeY; + LONG DesSizeX; + LONG sx; + LONG sy; + LONG DesX; + LONG DesY; + LONG color; 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, -- 2.17.1