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
This commit is contained in:
Magnus Olsen 2006-01-06 05:27:48 +00:00
parent c1b51155f7
commit 6b3815ef2a
4 changed files with 346 additions and 2336 deletions

View file

@ -502,793 +502,130 @@ BOOLEAN DIB_1BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation,
ULONG Mode) ULONG Mode)
{ {
int SrcSizeY; LONG SrcSizeY;
int SrcSizeX; LONG SrcSizeX;
int DesSizeY; LONG DesSizeY;
int DesSizeX; LONG DesSizeX;
int sx; LONG sx;
int sy; LONG sy;
int DesX; LONG DesX;
int DesY; LONG DesY;
int color; LONG color;
int zoomX;
int zoomY;
int count;
int saveX = 0;
int saveY;
BOOLEAN DesIsBiggerY=FALSE;
SrcSizeY = SourceRect->bottom - SourceRect->top; SrcSizeY = SourceRect->bottom - SourceRect->top;
SrcSizeX = SourceRect->right - SourceRect->left; SrcSizeX = SourceRect->right - SourceRect->left;
DesSizeY = DestRect->bottom; DesSizeY = DestRect->bottom - DestRect->top;
DesSizeX = DestRect->right; DesSizeX = DestRect->right - DestRect->left;
zoomX = DesSizeX / SrcSizeX; switch(SourceSurf->iBitmapFormat)
if (zoomX==0) zoomX=1; {
zoomY = DesSizeY / SrcSizeY;
if (zoomY==0) zoomY=1;
if (DesSizeY>SrcSizeY)
DesIsBiggerY = TRUE;
switch(SourceSurf->iBitmapFormat)
{
case BMF_1BPP: case BMF_1BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) color = DIB_1BPP_GetPixel(SourceSurf, sx, sy);
{ DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0));
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); }
}
if (sx > SourceRect->right) break; break;
saveX = 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>=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;count<saveY;count++)
DIB_1BPP_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>=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;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>=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;count<saveY;count++)
DIB_1BPP_HLine(DestSurf, DesX, DesX + zoomX, count, color);
}
}
}
}
break;
case BMF_4BPP: case BMF_4BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
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>=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;count<saveY;count++)
DIB_1BPP_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>=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;count<saveY;count++)
DIB_1BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) 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_1BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_8BPP: case BMF_8BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_8BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
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>=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;count<saveY;count++)
DIB_1BPP_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>=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;count<saveY;count++)
DIB_1BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) 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_1BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_16BPP: case BMF_16BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_16BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
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>=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;count<saveY;count++)
DIB_1BPP_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>=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;count<saveY;count++)
DIB_1BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy));
for (count=DesY;count<saveY;count++)
DIB_1BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_24BPP: case BMF_24BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
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>=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;count<saveY;count++)
DIB_1BPP_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>=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;count<saveY;count++)
DIB_1BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy));
for (count=DesY;count<saveY;count++)
DIB_1BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_32BPP: case BMF_32BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_32BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_1BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
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>=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;count<saveY;count++)
DIB_1BPP_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>=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;count<saveY;count++)
DIB_1BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy));
for (count=DesY;count<saveY;count++)
DIB_1BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
default: 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; return FALSE;
} }

View file

@ -497,796 +497,133 @@ BOOLEAN DIB_24BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation,
ULONG Mode) ULONG Mode)
{ {
int SrcSizeY; LONG SrcSizeY;
int SrcSizeX; LONG SrcSizeX;
int DesSizeY; LONG DesSizeY;
int DesSizeX; LONG DesSizeX;
int sx; LONG sx;
int sy; LONG sy;
int DesX; LONG DesX;
int DesY; LONG DesY;
int color; LONG color;
int zoomX;
int zoomY;
int count;
int saveX;
int saveY;
BOOLEAN DesIsBiggerY=FALSE;
SrcSizeY = SourceRect->bottom - SourceRect->top; SrcSizeY = SourceRect->bottom - SourceRect->top;
SrcSizeX = SourceRect->right - SourceRect->left; SrcSizeX = SourceRect->right - SourceRect->left;
DesSizeY = DestRect->bottom ; DesSizeY = DestRect->bottom - DestRect->top;
DesSizeX = DestRect->right; DesSizeX = DestRect->right - DestRect->left;
zoomX = DesSizeX / SrcSizeX; switch(SourceSurf->iBitmapFormat)
if (zoomX==0) zoomX=1; {
case BMF_1BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */
zoomY = DesSizeY / SrcSizeY; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
if (zoomY==0) zoomY=1; {
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
if (DesSizeY>SrcSizeY) for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
DesIsBiggerY = TRUE; {
sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
switch(SourceSurf->iBitmapFormat) if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
{ {
case BMF_1BPP: DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0));
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ }
/* This is a reference implementation, it hasn't been optimized for speed */ else
if (zoomX>1) {
{ DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 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; 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;count<saveY;count++)
DIB_24BPP_HLine(DestSurf, DesX, saveX, count, 0);
else
for (count=DesY;count<saveY;count++)
DIB_24BPP_HLine(DestSurf, DesX, saveX, count, 1);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
saveX = DesX + zoomX;
if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
for (count=DesY;count<saveY;count++)
DIB_24BPP_HLine(DestSurf, DesX, saveX, count, 0);
else
for (count=DesY;count<saveY;count++)
DIB_24BPP_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>=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;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, 0);
else
for (count=DesY;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, 1);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) 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_24BPP_PutPixel(DestSurf, DesX, count, 0);
else
for (count=DesY;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, 1);
}
}
}
}
break;
case BMF_4BPP: case BMF_4BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_4BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_24BPP_HLine(DestSurf, DesX, saveX, count, color);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) 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;count<saveY;count++)
DIB_24BPP_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>=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;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) 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_24BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_8BPP: case BMF_8BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_8BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_24BPP_HLine(DestSurf, DesX, saveX, count, color);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) 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;count<saveY;count++)
DIB_24BPP_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>=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;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) 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_24BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_16BPP: case BMF_16BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_16BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_24BPP_HLine(DestSurf, DesX, saveX, count, color);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) 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;count<saveY;count++)
DIB_24BPP_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>=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;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy));
for (count=DesY;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_24BPP: case BMF_24BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_24BPP_HLine(DestSurf, DesX, saveX, count, color);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_24BPP_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>=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;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
for (count=DesY;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_32BPP: case BMF_32BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_32BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_24BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_24BPP_HLine(DestSurf, DesX, saveX, count, color);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) 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_24BPP_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>=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;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy));
for (count=DesY;count<saveY;count++)
DIB_24BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
default: default:
//DPRINT1("DIB_24BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); //DPRINT1("DIB_24BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat));

View file

@ -381,802 +381,138 @@ BOOLEAN DIB_4BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation,
ULONG Mode) ULONG Mode)
{ {
int SrcSizeY; LONG SrcSizeY;
int SrcSizeX; LONG SrcSizeX;
int DesSizeY; LONG DesSizeY;
int DesSizeX; LONG DesSizeX;
int sx; LONG sx;
int sy; LONG sy;
int DesX; LONG DesX;
int DesY; LONG DesY;
int color; LONG color;
int zoomX;
int zoomY;
int count;
int saveX;
int saveY;
BOOLEAN DesIsBiggerY=FALSE;
SrcSizeY = SourceRect->bottom - SourceRect->top; SrcSizeY = SourceRect->bottom - SourceRect->top;
SrcSizeX = SourceRect->right - SourceRect->left; SrcSizeX = SourceRect->right - SourceRect->left;
DesSizeY = DestRect->bottom; DesSizeY = DestRect->bottom - DestRect->top;
DesSizeX = DestRect->right; DesSizeX = DestRect->right - DestRect->left;
zoomX = DesSizeX / SrcSizeX; switch(SourceSurf->iBitmapFormat)
if (zoomX==0) zoomX=1; {
case BMF_1BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */
zoomY = DesSizeY / SrcSizeY; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
if (zoomY==0) zoomY=1; {
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
if (DesSizeY>SrcSizeY) for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
DesIsBiggerY = TRUE; {
sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
switch(SourceSurf->iBitmapFormat) if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
{ {
case BMF_1BPP: DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 0));
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ }
/* This is a reference implementation, it hasn't been optimized for speed */ else
if (zoomX>1) {
{ DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, 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; 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;count<saveY;count++)
DIB_4BPP_HLine(DestSurf, DesX, saveX, count, 0);
else
for (count=DesY;count<saveY;count++)
DIB_4BPP_HLine(DestSurf, DesX, saveX, count, 1);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
saveX = DesX + zoomX;
if (DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
for (count=DesY;count<saveY;count++)
DIB_4BPP_HLine(DestSurf, DesX, saveX, count, 0);
else
for (count=DesY;count<saveY;count++)
DIB_4BPP_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>=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;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, 0);
else
for (count=DesY;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, 1);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) 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_4BPP_PutPixel(DestSurf, DesX, count, 0);
else
for (count=DesY;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, 1);
}
}
}
}
break;
case BMF_4BPP: case BMF_4BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_4BPP_HLine(DestSurf, DesX, saveX, count, color);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_4BPP_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>=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;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
for (count=DesY;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_8BPP: case BMF_8BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_8BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_8BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_4BPP_HLine(DestSurf, DesX, saveX, count, color);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) 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;count<saveY;count++)
DIB_4BPP_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>=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;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) 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_4BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_16BPP: case BMF_16BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_16BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_4BPP_HLine(DestSurf, DesX, saveX, count, color);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) 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;count<saveY;count++)
DIB_4BPP_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>=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;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_16BPP_GetPixel(SourceSurf, sx, sy));
for (count=DesY;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_24BPP: case BMF_24BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
saveY = DesY+zoomY; for (DesX=DestRect->left; DesX<DestRect->right; DesX++)
{
for (DesX=DestRect->right-zoomX; DesX>=DestRect->left; DesX-=zoomX) sx = (((DesX - DestRect->left) * SrcSizeX) / DesSizeX) + SourceRect->left;
{ color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
sx = (int) ((ULONG) SrcSizeX * (ULONG) DesX) / ((ULONG) DesSizeX); DIB_4BPP_PutPixel(DestSurf, DesX, DesY, XLATEOBJ_iXlate(ColorTranslation, color));
}
if (sx > SourceRect->right) break; }
break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy));
saveX = DesX + zoomX;
for (count=DesY;count<saveY;count++)
DIB_4BPP_HLine(DestSurf, DesX, saveX, count, color);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) 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_4BPP_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>=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;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_24BPP_GetPixel(SourceSurf, sx, sy));
for (count=DesY;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
case BMF_32BPP: case BMF_32BPP:
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */ /* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
/* This is a reference implementation, it hasn't been optimized for speed */ /* 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; for (DesY=DestRect->top; DesY<DestRect->bottom; DesY++)
{
saveY = DesY+zoomY; sy = (((DesY - DestRect->top) * SrcSizeY) / DesSizeY) + SourceRect->top;
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;count<saveY;count++)
DIB_4BPP_HLine(DestSurf, DesX, saveX, count, color);
}
}
}
else
{
/* Draw one Hline on X - Led to the Des Zoom Out*/
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) 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_4BPP_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>=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;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
else
{
/* Draw one pixel on X - Led to the Des Zoom Out*/
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) DesSizeX * (ULONG) DesX) / ((ULONG) SrcSizeX);
if (sx > SourceRect->right) break;
color = XLATEOBJ_iXlate(ColorTranslation, DIB_32BPP_GetPixel(SourceSurf, sx, sy));
for (count=DesY;count<saveY;count++)
DIB_4BPP_PutPixel(DestSurf, DesX, count, color);
}
}
}
}
break;
for (DesX=DestRect->left; DesX<DestRect->right; 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: default:
//DPRINT1("DIB_4BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat)); //DPRINT1("DIB_4BPP_StretchBlt: Unhandled Source BPP: %u\n", BitsPerFormat(SourceSurf->iBitmapFormat));
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }

View file

@ -460,15 +460,15 @@ BOOLEAN DIB_8BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation, CLIPOBJ *ClipRegion, XLATEOBJ *ColorTranslation,
ULONG Mode) ULONG Mode)
{ {
int SrcSizeY; LONG SrcSizeY;
int SrcSizeX; LONG SrcSizeX;
int DesSizeY; LONG DesSizeY;
int DesSizeX; LONG DesSizeX;
int sx; LONG sx;
int sy; LONG sy;
int DesX; LONG DesX;
int DesY; LONG DesY;
int color; LONG color;
DPRINT("DIB_8BPP_StretchBlt: Source BPP: %u, srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", 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, BitsPerFormat(SourceSurf->iBitmapFormat), SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,