mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 18:06:04 +00:00
start of new strechblt huge speed incress, the idea is not doing any mul or the div in the for loop. this is only done for 16bpp, same code will be copy to rest later.
1. remove all div and mul from for Y loops 2. todo remove so much as psoible mul and div from X loop svn path=/trunk/; revision=25202
This commit is contained in:
parent
d747ce9acb
commit
f2bddbce01
1 changed files with 166 additions and 108 deletions
|
@ -613,170 +613,228 @@ BOOLEAN DIB_16BPP_StretchBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
|
|||
LONG SrcSizeY;
|
||||
LONG SrcSizeX;
|
||||
LONG DesSizeY;
|
||||
LONG DesSizeX;
|
||||
LONG sx;
|
||||
LONG sy;
|
||||
LONG DesSizeX;
|
||||
LONG sx = 0;
|
||||
LONG sy = 0;
|
||||
LONG DesX;
|
||||
LONG DesY;
|
||||
LONG color;
|
||||
PULONG DestBits;
|
||||
LONG DifflDelta;
|
||||
|
||||
|
||||
LONG SrcZoomXHight;
|
||||
LONG SrcZoomXLow;
|
||||
LONG DstZoomXHight;
|
||||
LONG DstZoomXLow;
|
||||
LONG SrcZoomYHight;
|
||||
LONG SrcZoomYLow;
|
||||
LONG DstZoomYHight;
|
||||
LONG DstZoomYLow;
|
||||
|
||||
LONG sy_dec = 0;
|
||||
LONG sy_max;
|
||||
|
||||
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,
|
||||
DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
|
||||
|
||||
/* Calc the Zoom height of Source */
|
||||
SrcSizeY = SourceRect->bottom - SourceRect->top;
|
||||
|
||||
/* Calc the Zoom Width of Source */
|
||||
SrcSizeX = SourceRect->right - SourceRect->left;
|
||||
|
||||
/* Calc the Zoom height of Destions */
|
||||
DesSizeY = DestRect->bottom - DestRect->top;
|
||||
|
||||
/* Calc the Zoom width of Destions */
|
||||
DesSizeX = DestRect->right - DestRect->left;
|
||||
|
||||
|
||||
/* Calc the zoom factor of destions height */
|
||||
DstZoomYHight = DesSizeY / SrcSizeY;
|
||||
DstZoomYLow = DesSizeY - (DstZoomXHight * SrcSizeY);
|
||||
|
||||
/* Calc the zoom factor of destions width */
|
||||
DstZoomXHight = DesSizeX / SrcSizeX;
|
||||
DstZoomXLow = DesSizeX - (DstZoomXHight * SrcSizeX);
|
||||
|
||||
/* Calc the zoom factor of soruce height */
|
||||
SrcZoomYHight = SrcSizeY / DesSizeY;
|
||||
SrcZoomYLow = SrcSizeY - (SrcZoomYHight * SrcSizeY);
|
||||
|
||||
/* Calc the zoom factor of soruce width */
|
||||
SrcZoomXHight = SrcSizeX / DesSizeX;
|
||||
SrcZoomXLow = SrcSizeX - (SrcZoomXHight * DesSizeX);
|
||||
|
||||
sy_max = DesSizeX;
|
||||
sy = SourceRect->top;
|
||||
|
||||
switch(SourceSurf->iBitmapFormat)
|
||||
{
|
||||
|
||||
case BMF_1BPP:
|
||||
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
|
||||
/* This is a reference implementation, it hasn't been optimized for speed */
|
||||
|
||||
case BMF_1BPP:
|
||||
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
|
||||
/* This is a reference implementation, it hasn't been optimized for speed */
|
||||
|
||||
DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) +
|
||||
DestRect->top * DestSurf->lDelta);
|
||||
|
||||
DifflDelta = DestSurf->lDelta - (DesSizeX << 1);
|
||||
|
||||
DifflDelta = DestSurf->lDelta - (DesSizeX << 1);
|
||||
|
||||
for (DesY=0; DesY<DesSizeY; DesY++)
|
||||
{
|
||||
sy = ((DesY * SrcSizeY) / DesSizeY) + SourceRect->top;
|
||||
|
||||
{
|
||||
for (DesX=0; DesX<DesSizeX; DesX++)
|
||||
{
|
||||
|
||||
sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left;
|
||||
|
||||
if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
|
||||
{
|
||||
*DestBits = XLATEOBJ_iXlate(ColorTranslation, 0);
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
*DestBits = XLATEOBJ_iXlate(ColorTranslation, 1);
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
}
|
||||
{
|
||||
sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left;
|
||||
if(DIB_1BPP_GetPixel(SourceSurf, sx, sy) == 0)
|
||||
{
|
||||
*DestBits = XLATEOBJ_iXlate(ColorTranslation, 0);
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
*DestBits = XLATEOBJ_iXlate(ColorTranslation, 1);
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
}
|
||||
}
|
||||
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
|
||||
|
||||
sy += SrcZoomYHight;
|
||||
sy_dec += SrcZoomXLow;
|
||||
if (sy_dec >= sy_max)
|
||||
{
|
||||
sy++;
|
||||
sy_dec -= sy_max;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case BMF_4BPP:
|
||||
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
|
||||
/* This is a reference implementation, it hasn't been optimized for speed */
|
||||
case BMF_4BPP:
|
||||
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
|
||||
/* This is a reference implementation, it hasn't been optimized for speed */
|
||||
|
||||
DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) +
|
||||
DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) +
|
||||
DestRect->top * DestSurf->lDelta);
|
||||
|
||||
DifflDelta = DestSurf->lDelta - (DesSizeX << 1);
|
||||
|
||||
for (DesY=0; DesY<DesSizeY; DesY++)
|
||||
{
|
||||
sy = ((DesY * SrcSizeY) / DesSizeY) + SourceRect->top;
|
||||
|
||||
|
||||
DifflDelta = DestSurf->lDelta - (DesSizeX << 1);
|
||||
|
||||
for (DesY=0; DesY<DesSizeY; DesY++)
|
||||
{
|
||||
for (DesX=0; DesX<DesSizeX; DesX++)
|
||||
{
|
||||
|
||||
sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left;
|
||||
{
|
||||
sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left;
|
||||
color = DIB_4BPP_GetPixel(SourceSurf, sx, sy);
|
||||
color = XLATEOBJ_iXlate(ColorTranslation, color);
|
||||
|
||||
*DestBits = color;
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
*DestBits = color;
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
}
|
||||
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
|
||||
|
||||
sy += SrcZoomYHight;
|
||||
sy_dec += SrcZoomXLow;
|
||||
if (sy_dec >= sy_max)
|
||||
{
|
||||
sy++;
|
||||
sy_dec -= sy_max;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case BMF_8BPP:
|
||||
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
|
||||
/* This is a reference implementation, it hasn't been optimized for speed */
|
||||
|
||||
DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) +
|
||||
case BMF_8BPP:
|
||||
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
|
||||
/* This is a reference implementation, it hasn't been optimized for speed */
|
||||
|
||||
DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) +
|
||||
DestRect->top * DestSurf->lDelta);
|
||||
|
||||
DifflDelta = DestSurf->lDelta - (DesSizeX << 1);
|
||||
|
||||
for (DesY=0; DesY<DesSizeY; DesY++)
|
||||
{
|
||||
sy = ((DesY * SrcSizeY) / DesSizeY) + SourceRect->top;
|
||||
|
||||
DifflDelta = DestSurf->lDelta - (DesSizeX << 1);
|
||||
|
||||
for (DesY=0; DesY<DesSizeY; DesY++)
|
||||
{
|
||||
for (DesX=0; DesX<DesSizeX; DesX++)
|
||||
{
|
||||
|
||||
{
|
||||
sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left;
|
||||
color = DIB_8BPP_GetPixel(SourceSurf, sx, sy);
|
||||
color = XLATEOBJ_iXlate(ColorTranslation, color);
|
||||
*DestBits = color;
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
*DestBits = color;
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
}
|
||||
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
|
||||
|
||||
sy += SrcZoomYHight;
|
||||
sy_dec += SrcZoomXLow;
|
||||
if (sy_dec >= sy_max)
|
||||
{
|
||||
sy++;
|
||||
sy_dec -= sy_max;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case BMF_24BPP:
|
||||
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
|
||||
/* This is a reference implementation, it hasn't been optimized for speed */
|
||||
|
||||
DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) +
|
||||
DestRect->top * DestSurf->lDelta);
|
||||
|
||||
DifflDelta = DestSurf->lDelta - (DesSizeX << 1);
|
||||
|
||||
for (DesY=0; DesY<DesSizeY; DesY++)
|
||||
{
|
||||
sy = ((DesY * SrcSizeY) / DesSizeY) + SourceRect->top;
|
||||
|
||||
for (DesX=0; DesX<DesSizeX; DesX++)
|
||||
{
|
||||
|
||||
sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left;
|
||||
color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
|
||||
color = XLATEOBJ_iXlate(ColorTranslation, color);
|
||||
|
||||
*DestBits = color;
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
}
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
|
||||
}
|
||||
break;
|
||||
case BMF_24BPP:
|
||||
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
|
||||
/* This is a reference implementation, it hasn't been optimized for speed */
|
||||
|
||||
case BMF_32BPP:
|
||||
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
|
||||
/* This is a reference implementation, it hasn't been optimized for speed */
|
||||
|
||||
DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) +
|
||||
DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) +
|
||||
DestRect->top * DestSurf->lDelta);
|
||||
|
||||
DifflDelta = DestSurf->lDelta - (DesSizeX << 1);
|
||||
|
||||
for (DesY=0; DesY<DesSizeY; DesY++)
|
||||
{
|
||||
sy = ((DesY * SrcSizeY) / DesSizeY) + SourceRect->top;
|
||||
|
||||
|
||||
DifflDelta = DestSurf->lDelta - (DesSizeX << 1);
|
||||
|
||||
for (DesY=0; DesY<DesSizeY; DesY++)
|
||||
{
|
||||
for (DesX=0; DesX<DesSizeX; DesX++)
|
||||
{
|
||||
|
||||
sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left;
|
||||
color = DIB_32BPP_GetPixel(SourceSurf, sx, sy);
|
||||
color = XLATEOBJ_iXlate(ColorTranslation, color);
|
||||
|
||||
*DestBits = color;
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
{
|
||||
sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left;
|
||||
color = DIB_24BPP_GetPixel(SourceSurf, sx, sy);
|
||||
color = XLATEOBJ_iXlate(ColorTranslation, color);
|
||||
*DestBits = color;
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
}
|
||||
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
|
||||
|
||||
sy += SrcZoomYHight;
|
||||
sy_dec += SrcZoomXLow;
|
||||
if (sy_dec >= sy_max)
|
||||
{
|
||||
sy++;
|
||||
sy_dec -= sy_max;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case BMF_32BPP:
|
||||
/* FIXME : MaskOrigin, BrushOrigin, ClipRegion, Mode ? */
|
||||
/* This is a reference implementation, it hasn't been optimized for speed */
|
||||
|
||||
DestBits = (PULONG)((PBYTE)DestSurf->pvScan0 + (DestRect->left << 1) +
|
||||
DestRect->top * DestSurf->lDelta);
|
||||
DifflDelta = DestSurf->lDelta - (DesSizeX << 1);
|
||||
|
||||
for (DesY=0; DesY<DesSizeY; DesY++)
|
||||
{
|
||||
for (DesX=0; DesX<DesSizeX; DesX++)
|
||||
{
|
||||
sx = ((DesX * SrcSizeX) / DesSizeX) + SourceRect->left;
|
||||
color = DIB_32BPP_GetPixel(SourceSurf, sx, sy);
|
||||
color = XLATEOBJ_iXlate(ColorTranslation, color);
|
||||
*DestBits = color;
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + 2);
|
||||
}
|
||||
DestBits = (PULONG)((ULONG_PTR)DestBits + DifflDelta);
|
||||
|
||||
sy += SrcZoomYHight;
|
||||
sy_dec += SrcZoomXLow;
|
||||
if (sy_dec >= sy_max)
|
||||
{
|
||||
sy++;
|
||||
sy_dec -= sy_max;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case BMF_16BPP:
|
||||
return ScaleRectAvg16(DestSurf, SourceSurf, DestRect, SourceRect, MaskOrigin, BrushOrigin,
|
||||
ClipRegion, ColorTranslation, Mode);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue