--- trunk/reactos/subsys/win32k/dib/dib16bpp.c 2005-06-01 17:28:51 UTC (rev 15715)
+++ trunk/reactos/subsys/win32k/dib/dib16bpp.c 2005-06-01 18:11:26 UTC (rev 15716)
@@ -629,6 +629,9 @@
int zoomX;
int zoomY;
int count;
+ int saveX;
+ int saveY;
+ BOOLEAN DesIsBiggerY=FALSE;
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,
@@ -646,202 +649,656 @@
zoomY = DesSizeY / SrcSizeY;
if (zoomY==0) zoomY=1;
+ if (DesSizeY>SrcSizeY)
+ DesIsBiggerY = TRUE;
+
+
+
switch(SourceSurf->iBitmapFormat)
{
- case BMF_1BPP:
- /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+
+
+ 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>=0; 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;
- for (DesY=0; DesY<DestRect->bottom; DesY+=zoomY)
- {
- if (DesSizeY>SrcSizeY)
- sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
- else
- sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);
+ saveY = DesY+zoomY;
- if (sy > SourceRect->bottom) break;
+ for (DesX=DestRect->right-zoomX; DesX>=0; DesX-=zoomX)
+ {
+ sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+
+ if (sx > SourceRect->right) break;
+
+ saveX = DesX + zoomX;
- for (DesX=0; DesX<DestRect->right; DesX+=zoomX)
+ if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, 0);
+ else
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, 1);
+
+ }
+ }
+ }
+ else
+ {
+ /* Draw one Hline on X - Led to the Des Zoom Out*/
+
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; DesY-=zoomY)
{
- if (DesSizeX>SrcSizeX)
- sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+ 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>=0; DesX-=zoomX)
+ {
sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
- if (sx > SourceRect->right) break;
+ if (sx > SourceRect->right) break;
+
+ saveX = DesX + zoomX;
- if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
+ if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, 0);
+ else
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, 1);
+
+ }
+ }
+ }
+ }
+ else
+ {
+
+ if (DesSizeX>SrcSizeX)
+ {
+ /* Draw one pixel on X - Led to the Des Zoom In*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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>=0; 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;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, 0);
+ else
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, 1);
+
+
+ }
+ }
+ }
+ else
+ {
+ /* Draw one pixel on X - Led to the Des Zoom Out*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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>=0; DesX-=zoomX)
{
- for (count=DesY;count<DesY+zoomY;count++)
- {
- if (zoomX>1)
- DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 0));
- else
- DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 0));
- }
-
- } else {
+ sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
+
+ if (sx > SourceRect->right) break;
+
+ if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, 0);
+ else
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, 1);
+
+ }
+ }
+ }
+ }
+ break;
- for (count=DesY;count<DesY+zoomY;count++)
- {
- if (zoomX>1)
- DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, 1));
- else
- DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, 1));
- }
- }
- }
- }
- break;
-
- case BMF_4BPP:
- /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+ case BMF_4BPP:
+ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */
-
- for (DesY=0; DesY<DestRect->bottom; DesY+=zoomY)
- {
- if (DesSizeY>SrcSizeY)
- sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
- else
- sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);
+ if (zoomX>1)
+ {
+ /* Draw one Hline on X - Led to the Des Zoom In*/
+ if (DesSizeX>SrcSizeX)
+ {
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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;
- if (sy > SourceRect->bottom) break;
+ saveY = DesY+zoomY;
+ for (DesX=DestRect->right-zoomX; DesX>=0; 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;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, color);
+ }
+ }
+ }
+ else
+ {
+ /* Draw one Hline on X - Led to the Des Zoom Out*/
- for (DesX=0; DesX<DestRect->right; DesX+=zoomX)
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; DesY-=zoomY)
{
- if (DesSizeX>SrcSizeX)
- sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+ 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>=0; DesX-=zoomX)
+ {
sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
- if (sx > SourceRect->right) break;
+ if (sx > SourceRect->right) break;
+
+ color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy));
+
+ saveX = DesX + zoomX;
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, color);
+ }
+ }
+ }
+ }
+
+ else
+ {
+
+ if (DesSizeX>SrcSizeX)
+ {
+ /* Draw one pixel on X - Led to the Des Zoom In*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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;
- color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
+ saveY = DesY+zoomY;
+
+ for (DesX=DestRect->right-zoomX; DesX>=0; DesX-=zoomX)
+ {
+ sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+
+ if (sx > SourceRect->right) break;
- for (count=DesY;count<DesY+zoomY;count++)
+ color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy));
+
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, color);
+ }
+ }
+ }
+ else
+ {
+ /* Draw one pixel on X - Led to the Des Zoom Out*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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>=0; DesX-=zoomX)
{
- if (zoomX>1)
- DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color));
- else
- DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color));
- }
+ 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;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, color);
+ }
+ }
+ }
+ }
+ break;
- }
- }
- break;
-
case BMF_8BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */
-
- for (DesY=0; DesY<DestRect->bottom; DesY+=zoomY)
- {
- if (DesSizeY>SrcSizeY)
- sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
- else
- sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);
+ if (zoomX>1)
+ {
+ /* Draw one Hline on X - Led to the Des Zoom In*/
+ if (DesSizeX>SrcSizeX)
+ {
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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;
+ if (sy > SourceRect->bottom) break;
- for (DesX=0; DesX<DestRect->right; DesX+=zoomX)
+ saveY = DesY+zoomY;
+
+ for (DesX=DestRect->right-zoomX; DesX>=0; 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;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, color);
+ }
+ }
+ }
+ else
+ {
+ /* Draw one Hline on X - Led to the Des Zoom Out*/
+
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; DesY-=zoomY)
{
- if (DesSizeX>SrcSizeX)
- sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+ 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>=0; DesX-=zoomX)
+ {
sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
- if (sx > SourceRect->right) break;
+ if (sx > SourceRect->right) break;
+
+ color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy));
+
+ saveX = DesX + zoomX;
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, color);
+ }
+ }
+ }
+ }
+
+ else
+ {
+
+ if (DesSizeX>SrcSizeX)
+ {
+ /* Draw one pixel on X - Led to the Des Zoom In*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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;
- color = DIB_8BPP_GetPixel(SourceSurf, sx, sy);
+ saveY = DesY+zoomY;
- for (count=DesY;count<DesY+zoomY;count++)
+ for (DesX=DestRect->right-zoomX; DesX>=0; 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;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, color);
+ }
+ }
+ }
+ else
+ {
+ /* Draw one pixel on X - Led to the Des Zoom Out*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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>=0; DesX-=zoomX)
{
- if (zoomX>1)
- DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color));
- else
- DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color));
- }
-
- }
- }
+ 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;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, color);
+ }
+ }
+ }
+ }
break;
- case BMF_24BPP:
- /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+ case BMF_16BPP:
+ return ScaleRectAvg16(DestSurf, SourceSurf, DestRect, SourceRect, MaskOrigin, BrushOrigin,
+ ClipRegion, ColorTranslation, Mode);
+ 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>=0; 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;
- for (DesY=0; DesY<DestRect->bottom; DesY+=zoomY)
+ saveY = DesY+zoomY;
+
+ for (DesX=DestRect->right-zoomX; DesX>=0; 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;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, color);
+ }
+ }
+ }
+ else
+ {
+ /* Draw one Hline on X - Led to the Des Zoom Out*/
+
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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>=0; 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;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, color);
+ }
+ }
+ }
+ }
+
+ else
+ {
+
+ if (DesSizeX>SrcSizeX)
{
- if (DesSizeY>SrcSizeY)
- sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
- else
- sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);
+ /* Draw one pixel on X - Led to the Des Zoom In*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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;
+ if (sy > SourceRect->bottom) break;
- for (DesX=0; DesX<DestRect->right; DesX+=zoomX)
+ saveY = DesY+zoomY;
+
+ for (DesX=DestRect->right-zoomX; DesX>=0; 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;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, color);
+ }
+ }
+ }
+ else
+ {
+ /* Draw one pixel on X - Led to the Des Zoom Out*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; DesY-=zoomY)
{
- if (DesSizeX>SrcSizeX)
- sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+ 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>=0; DesX-=zoomX)
+ {
sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
- if (sx > SourceRect->right) break;
+ if (sx > SourceRect->right) break;
+
+ color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy));
+
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, color);
+ }
+ }
+ }
+ }
+ break;
- color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
- for (count=DesY;count<DesY+zoomY;count++)
- {
- if (zoomX>1)
- DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color));
- else
- DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color));
- }
- }
- }
- break;
-
- case BMF_32BPP:
+ 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>=0; 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;
- for (DesY=0; DesY<DestRect->bottom; DesY+=zoomY)
+ saveY = DesY+zoomY;
+
+ for (DesX=DestRect->right-zoomX; DesX>=0; 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;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, color);
+ }
+ }
+ }
+ else
+ {
+ /* Draw one Hline on X - Led to the Des Zoom Out*/
+
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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>=0; 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;count<saveY;count++)
+ DIB_16BPP_HLine(DestSurf, DesX, saveX, count, color);
+ }
+ }
+ }
+ }
+
+ else
+ {
+
+ if (DesSizeX>SrcSizeX)
{
- if (DesSizeY>SrcSizeY)
- sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
- else
- sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);
+ /* Draw one pixel on X - Led to the Des Zoom In*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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;
+ if (sy > SourceRect->bottom) break;
- for (DesX=0; DesX<DestRect->right; DesX+=zoomX)
+ saveY = DesY+zoomY;
+
+ for (DesX=DestRect->right-zoomX; DesX>=0; 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;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, color);
+ }
+ }
+ }
+ else
+ {
+ /* Draw one pixel on X - Led to the Des Zoom Out*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; DesY-=zoomY)
{
- if (DesSizeX>SrcSizeX)
- sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+ 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>=0; DesX-=zoomX)
+ {
sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
- if (sx > SourceRect->right) break;
+ if (sx > SourceRect->right) break;
+
+ color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy));
+
+ for (count=DesY;count<saveY;count++)
+ DIB_16BPP_PutPixel(DestSurf, DesX, count, color);
+ }
+ }
+ }
+ }
+ break;
- color = DIB_32BPP_GetPixel(SourceSurf, sx, sy);
- for (count=DesY;count<DesY+zoomY;count++)
- {
- if (zoomX>1)
- DIB_16BPP_HLine(DestSurf, DesX, DesX + zoomX, count, XLATEOBJ_iXlate(ColorTranslation, color));
- else
- DIB_16BPP_PutPixel(DestSurf, DesX, count, XLATEOBJ_iXlate(ColorTranslation, color));
- }
- }
- }
break;
-
- case BMF_16BPP:
- return ScaleRectAvg16(DestSurf, SourceSurf, DestRect, SourceRect, MaskOrigin, BrushOrigin,
- ClipRegion, ColorTranslation, Mode);
- break;
-
default:
DPRINT1("DIB_16BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat));
return FALSE;
--- trunk/reactos/subsys/win32k/dib/dib1bpp.c 2005-06-01 17:28:51 UTC (rev 15715)
+++ trunk/reactos/subsys/win32k/dib/dib1bpp.c 2005-06-01 18:11:26 UTC (rev 15716)
@@ -497,6 +497,9 @@
int zoomX;
int zoomY;
int count;
+ int saveX;
+ int saveY;
+ BOOLEAN DesIsBiggerY=FALSE;
SrcSizeY = SourceRect->bottom;
SrcSizeX = SourceRect->right;
@@ -510,225 +513,762 @@
zoomY = DesSizeY / SrcSizeY;
if (zoomY==0) zoomY=1;
+ if (DesSizeY>SrcSizeY)
+ DesIsBiggerY = TRUE;
+
switch(SourceSurf->iBitmapFormat)
{
- case BMF_1BPP:
- /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+ case BMF_1BPP:
+ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */
-
- for (DesY=0; DesY<DestRect->bottom; DesY+=zoomY)
- {
- if (DesSizeY>SrcSizeY)
- sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
- else
- sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);
+ if (zoomX>1)
+ {
+ /* Draw one Hline on X - Led to the Des Zoom In*/
+ if (DesSizeX>SrcSizeX)
+ {
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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;
- if (sy > SourceRect->bottom) break;
+ saveY = DesY+zoomY;
+ for (DesX=DestRect->right-zoomX; DesX>=0; DesX-=zoomX)
+ {
+ sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+
+ if (sx > SourceRect->right) break;
+
+ saveX = DesX + zoomX;
- for (DesX=0; DesX<DestRect->right; DesX+=zoomX)
+ color = DIB_1BPP_GetPixel(SourceSurf, sx, sy);
+
+ for (count=DesY;count<saveY;count++)
+ DIB_1BPP_HLine(DestSurf, DesX, saveX, count, color);
+
+
+ }
+ }
+ }
+ else
+ {
+ /* Draw one Hline on X - Led to the Des Zoom Out*/
+
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; DesY-=zoomY)
{
- if (DesSizeX>SrcSizeX)
- sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX);
+ 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>=0; DesX-=zoomX)
+ {
sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
- if (sx > SourceRect->right) break;
-
- color = DIB_1BPP_GetPixel(SourceSurf, sx, sy);
+ if (sx > SourceRect->right) break;
- for (count=DesY;count<DesY+zoomY;count++)
- {
- if (zoomX>1)
- DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, count, color);
- else
- DIB_1BPP_PutPixel(DestSurf, DesX, count, color);
- }
+ saveX = DesX + zoomX;
+ color = DIB_1BPP_GetPixel(SourceSurf, sx, sy);
+
+ for (count=DesY;count<saveY;count++)
+ DIB_1BPP_HLine(DestSurf, DesX, saveX, count, color);
+
+
+ }
}
- }
- break;
+ }
+ }
+ else
+ {
+
+ if (DesSizeX>SrcSizeX)
+ {
+ /* Draw one pixel on X - Led to the Des Zoom In*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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;
- case BMF_4BPP:
- /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
- /* This is a reference implementation, it hasn't been optimized for speed */
+ saveY = DesY+zoomY;
- for (DesY=0; DesY<DestRect->bottom; DesY+=zoomY)
- {
- if (DesSizeY>SrcSizeY)
- sy = (int) ((ULONG) SrcSizeY * (ULONG) DesY) / ((ULONG) DesSizeY);
- else
- sy = (int) ((ULONG) DesSizeY * (ULONG) DesY) / ((ULONG) SrcSizeY);
+ for (DesX=DestRect->right-zoomX; DesX>=0; 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;count<saveY;count++)
+ DIB_1BPP_HLine(DestSurf, DesX, saveX, count, color);
+
+ }
+ }
+ }
+ else
+ {
+ /* Draw one pixel on X - Led to the Des Zoom Out*/
+ for (DesY=DestRect->bottom-zoomY; DesY>=0; 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;
- if (sy > SourceRect->bottom) break;
+ saveY = DesY+zoomY;
+ for (DesX=DestRect->right-zoomX; DesX>=0; DesX-=zoomX)
+ {
+ sx = (int) ((ULONG) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
+
+ if (sx > SourceRect->right) break;
+
+ color = DIB_1BPP_GetPixel(SourceSurf, sx, sy);
+
+ for (count=DesY;count<saveY;count++)
+ DIB_1BPP_HLine(DestSurf, DesX, saveX, count, color);
+
+ }
+ }
+ }
+ }
+ break;
- for (DesX=0; DesX<DestRect->right; DesX+=zoomX)
+ case BMF_4BPP:
+ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
+ /* This is a reference implementation, it hasn't been optimized for speed */
+ if (zoomX>1)
+ {
[truncated at 1000 lines; 4182 more skipped]