[FORMATTING]

Fix indentation, no code change

svn path=/trunk/; revision=40465
This commit is contained in:
Timo Kreuzer 2009-04-11 19:04:06 +00:00
parent b917e4e926
commit 41c31152db

View file

@ -26,19 +26,19 @@
VOID VOID
DIB_32BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c) DIB_32BPP_PutPixel(SURFOBJ *SurfObj, LONG x, LONG y, ULONG c)
{ {
PBYTE byteaddr = (PBYTE)SurfObj->pvScan0 + y * SurfObj->lDelta; PBYTE byteaddr = (PBYTE)SurfObj->pvScan0 + y * SurfObj->lDelta;
PDWORD addr = (PDWORD)byteaddr + x; PDWORD addr = (PDWORD)byteaddr + x;
*addr = c; *addr = c;
} }
ULONG ULONG
DIB_32BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y) DIB_32BPP_GetPixel(SURFOBJ *SurfObj, LONG x, LONG y)
{ {
PBYTE byteaddr = (PBYTE)SurfObj->pvScan0 + y * SurfObj->lDelta; PBYTE byteaddr = (PBYTE)SurfObj->pvScan0 + y * SurfObj->lDelta;
PDWORD addr = (PDWORD)byteaddr + x; PDWORD addr = (PDWORD)byteaddr + x;
return (ULONG)(*addr); return (ULONG)(*addr);
} }
@ -47,234 +47,250 @@ DIB_32BPP_VLine(SURFOBJ *SurfObj, LONG x, LONG y1, LONG y2, ULONG c)
{ {
PBYTE byteaddr = (PBYTE)SurfObj->pvScan0 + y1 * SurfObj->lDelta; PBYTE byteaddr = (PBYTE)SurfObj->pvScan0 + y1 * SurfObj->lDelta;
PDWORD addr = (PDWORD)byteaddr + x; PDWORD addr = (PDWORD)byteaddr + x;
LONG lDelta = SurfObj->lDelta >> 2; // >> 2 == / sizeof(DWORD) LONG lDelta = SurfObj->lDelta >> 2; // >> 2 == / sizeof(DWORD)
byteaddr = (PBYTE)addr; byteaddr = (PBYTE)addr;
while(y1++ < y2) while (y1++ < y2)
{ {
*addr = (DWORD)c; *addr = (DWORD)c;
addr += lDelta; addr += lDelta;
} }
} }
BOOLEAN BOOLEAN
DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo) DIB_32BPP_BitBltSrcCopy(PBLTINFO BltInfo)
{ {
LONG i, j, sx, sy, xColor, f1; LONG i, j, sx, sy, xColor, f1;
PBYTE SourceBits, DestBits, SourceLine, DestLine; PBYTE SourceBits, DestBits, SourceLine, DestLine;
PBYTE SourceBits_4BPP, SourceLine_4BPP; PBYTE SourceBits_4BPP, SourceLine_4BPP;
PDWORD Source32, Dest32; PDWORD Source32, Dest32;
DestBits = (PBYTE)BltInfo->DestSurface->pvScan0 + (BltInfo->DestRect.top * BltInfo->DestSurface->lDelta) + 4 * BltInfo->DestRect.left; DestBits = (PBYTE)BltInfo->DestSurface->pvScan0
+ (BltInfo->DestRect.top * BltInfo->DestSurface->lDelta)
+ 4 * BltInfo->DestRect.left;
switch(BltInfo->SourceSurface->iBitmapFormat) switch (BltInfo->SourceSurface->iBitmapFormat)
{ {
case BMF_1BPP: case BMF_1BPP:
sx = BltInfo->SourcePoint.x; sx = BltInfo->SourcePoint.x;
sy = BltInfo->SourcePoint.y; sy = BltInfo->SourcePoint.y;
for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++) for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++)
{ {
sx = BltInfo->SourcePoint.x; sx = BltInfo->SourcePoint.x;
for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++) for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++)
{ {
if(DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0) if (DIB_1BPP_GetPixel(BltInfo->SourceSurface, sx, sy) == 0)
{ {
DIB_32BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0)); DIB_32BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 0));
} else { } else {
DIB_32BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1)); DIB_32BPP_PutPixel(BltInfo->DestSurface, i, j, XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, 1));
} }
sx++; sx++;
} }
sy++; sy++;
} }
break; break;
case BMF_4BPP: case BMF_4BPP:
SourceBits_4BPP = (PBYTE)BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + (BltInfo->SourcePoint.x >> 1); SourceBits_4BPP = (PBYTE)BltInfo->SourceSurface->pvScan0
+ (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta)
+ (BltInfo->SourcePoint.x >> 1);
for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++) for (j=BltInfo->DestRect.top; j<BltInfo->DestRect.bottom; j++)
{ {
SourceLine_4BPP = SourceBits_4BPP; SourceLine_4BPP = SourceBits_4BPP;
sx = BltInfo->SourcePoint.x; sx = BltInfo->SourcePoint.x;
f1 = sx & 1; f1 = sx & 1;
for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++) for (i=BltInfo->DestRect.left; i<BltInfo->DestRect.right; i++)
{ {
xColor = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest,
(*SourceLine_4BPP & altnotmask[f1]) >> (4 * (1 - f1))); (*SourceLine_4BPP & altnotmask[f1]) >> (4 * (1 - f1)));
DIB_32BPP_PutPixel(BltInfo->DestSurface, i, j, xColor); DIB_32BPP_PutPixel(BltInfo->DestSurface, i, j, xColor);
if(f1 == 1) { SourceLine_4BPP++; f1 = 0; } else { f1 = 1; } if (f1 == 1) {
sx++; SourceLine_4BPP++;
} f1 = 0;
} else {
f1 = 1;
}
sx++;
}
SourceBits_4BPP += BltInfo->SourceSurface->lDelta; SourceBits_4BPP += BltInfo->SourceSurface->lDelta;
} }
break; break;
case BMF_8BPP: case BMF_8BPP:
SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x; SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + BltInfo->SourcePoint.x;
DestLine = DestBits; DestLine = DestBits;
for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++)
{ {
SourceBits = SourceLine; SourceBits = SourceLine;
DestBits = DestLine; DestBits = DestLine;
for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++)
{ {
xColor = *SourceBits; xColor = *SourceBits;
*((PDWORD) DestBits) = (DWORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor); *((PDWORD) DestBits) = (DWORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor);
SourceBits += 1; SourceBits += 1;
DestBits += 4; DestBits += 4;
} }
SourceLine += BltInfo->SourceSurface->lDelta; SourceLine += BltInfo->SourceSurface->lDelta;
DestLine += BltInfo->DestSurface->lDelta; DestLine += BltInfo->DestSurface->lDelta;
} }
break; break;
case BMF_16BPP: case BMF_16BPP:
SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 2 * BltInfo->SourcePoint.x; SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 2 * BltInfo->SourcePoint.x;
DestLine = DestBits; DestLine = DestBits;
for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++)
{ {
SourceBits = SourceLine; SourceBits = SourceLine;
DestBits = DestLine; DestBits = DestLine;
for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++)
{ {
xColor = *((PWORD) SourceBits); xColor = *((PWORD) SourceBits);
*((PDWORD) DestBits) = (DWORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor); *((PDWORD) DestBits) = (DWORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor);
SourceBits += 2; SourceBits += 2;
DestBits += 4; DestBits += 4;
} }
SourceLine += BltInfo->SourceSurface->lDelta; SourceLine += BltInfo->SourceSurface->lDelta;
DestLine += BltInfo->DestSurface->lDelta; DestLine += BltInfo->DestSurface->lDelta;
} }
break; break;
case BMF_24BPP: case BMF_24BPP:
SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 3 * BltInfo->SourcePoint.x; SourceLine = (PBYTE)BltInfo->SourceSurface->pvScan0
DestLine = DestBits; + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta)
+ 3 * BltInfo->SourcePoint.x;
DestLine = DestBits;
for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++)
{ {
SourceBits = SourceLine; SourceBits = SourceLine;
DestBits = DestLine; DestBits = DestLine;
for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++)
{ {
xColor = (*(SourceBits + 2) << 0x10) + xColor = (*(SourceBits + 2) << 0x10) +
(*(SourceBits + 1) << 0x08) + (*(SourceBits + 1) << 0x08) +
(*(SourceBits)); (*(SourceBits));
*((PDWORD)DestBits) = (DWORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor); *((PDWORD)DestBits) = (DWORD)XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, xColor);
SourceBits += 3; SourceBits += 3;
DestBits += 4; DestBits += 4;
} }
SourceLine += BltInfo->SourceSurface->lDelta; SourceLine += BltInfo->SourceSurface->lDelta;
DestLine += BltInfo->DestSurface->lDelta; DestLine += BltInfo->DestSurface->lDelta;
} }
break; break;
case BMF_32BPP: case BMF_32BPP:
if (NULL == BltInfo->XlateSourceToDest || 0 != (BltInfo->XlateSourceToDest->flXlate & XO_TRIVIAL)) if (NULL == BltInfo->XlateSourceToDest ||
{ 0 != (BltInfo->XlateSourceToDest->flXlate & XO_TRIVIAL))
if (BltInfo->DestRect.top < BltInfo->SourcePoint.y) {
{ if (BltInfo->DestRect.top < BltInfo->SourcePoint.y)
SourceBits = (PBYTE)BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x; {
for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++) SourceBits = (PBYTE)BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x;
{ for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++)
RtlMoveMemory(DestBits, SourceBits, 4 * (BltInfo->DestRect.right - BltInfo->DestRect.left)); {
SourceBits += BltInfo->SourceSurface->lDelta; RtlMoveMemory(DestBits, SourceBits, 4 * (BltInfo->DestRect.right - BltInfo->DestRect.left));
DestBits += BltInfo->DestSurface->lDelta; SourceBits += BltInfo->SourceSurface->lDelta;
} DestBits += BltInfo->DestSurface->lDelta;
} }
else }
{
SourceBits = (PBYTE)BltInfo->SourceSurface->pvScan0 + ((BltInfo->SourcePoint.y + BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x;
DestBits = (PBYTE)BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 4 * BltInfo->DestRect.left;
for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--)
{
RtlMoveMemory(DestBits, SourceBits, 4 * (BltInfo->DestRect.right - BltInfo->DestRect.left));
SourceBits -= BltInfo->SourceSurface->lDelta;
DestBits -= BltInfo->DestSurface->lDelta;
}
}
}
else
{
if (BltInfo->DestRect.top < BltInfo->SourcePoint.y)
{
SourceBits = ((PBYTE)BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x);
for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++)
{
if (BltInfo->DestRect.left < BltInfo->SourcePoint.x)
{
Dest32 = (DWORD *) DestBits;
Source32 = (DWORD *) SourceBits;
for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++)
{
*Dest32++ = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32++);
}
}
else else
{ {
Dest32 = (DWORD *) DestBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); SourceBits = (PBYTE)BltInfo->SourceSurface->pvScan0
Source32 = (DWORD *) SourceBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); + ((BltInfo->SourcePoint.y
for (i = BltInfo->DestRect.right - 1; BltInfo->DestRect.left <= i; i--) + BltInfo->DestRect.bottom
{ - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta)
*Dest32-- = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32--); + 4 * BltInfo->SourcePoint.x;
} DestBits = (PBYTE)BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 4 * BltInfo->DestRect.left;
} for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--)
SourceBits += BltInfo->SourceSurface->lDelta; {
DestBits += BltInfo->DestSurface->lDelta; RtlMoveMemory(DestBits, SourceBits, 4 * (BltInfo->DestRect.right - BltInfo->DestRect.left));
} SourceBits -= BltInfo->SourceSurface->lDelta;
} DestBits -= BltInfo->DestSurface->lDelta;
else }
{ }
SourceBits = (PBYTE)BltInfo->SourceSurface->pvScan0 + ((BltInfo->SourcePoint.y + BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x; }
DestBits = (PBYTE)BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 4 * BltInfo->DestRect.left; else
for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--) {
{ if (BltInfo->DestRect.top < BltInfo->SourcePoint.y)
if (BltInfo->DestRect.left < BltInfo->SourcePoint.x) {
{ SourceBits = ((PBYTE)BltInfo->SourceSurface->pvScan0 + (BltInfo->SourcePoint.y * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x);
Dest32 = (DWORD *) DestBits; for (j = BltInfo->DestRect.top; j < BltInfo->DestRect.bottom; j++)
Source32 = (DWORD *) SourceBits; {
for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++) if (BltInfo->DestRect.left < BltInfo->SourcePoint.x)
{ {
*Dest32++ = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32++); Dest32 = (DWORD *) DestBits;
} Source32 = (DWORD *) SourceBits;
} for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++)
{
*Dest32++ = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32++);
}
}
else
{
Dest32 = (DWORD *) DestBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1);
Source32 = (DWORD *) SourceBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1);
for (i = BltInfo->DestRect.right - 1; BltInfo->DestRect.left <= i; i--)
{
*Dest32-- = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32--);
}
}
SourceBits += BltInfo->SourceSurface->lDelta;
DestBits += BltInfo->DestSurface->lDelta;
}
}
else else
{ {
Dest32 = (DWORD *) DestBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); SourceBits = (PBYTE)BltInfo->SourceSurface->pvScan0 + ((BltInfo->SourcePoint.y + BltInfo->DestRect.bottom - BltInfo->DestRect.top - 1) * BltInfo->SourceSurface->lDelta) + 4 * BltInfo->SourcePoint.x;
Source32 = (DWORD *) SourceBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1); DestBits = (PBYTE)BltInfo->DestSurface->pvScan0 + ((BltInfo->DestRect.bottom - 1) * BltInfo->DestSurface->lDelta) + 4 * BltInfo->DestRect.left;
for (i = BltInfo->DestRect.right - 1; BltInfo->DestRect.left <= i; i--) for (j = BltInfo->DestRect.bottom - 1; BltInfo->DestRect.top <= j; j--)
{ {
*Dest32-- = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32--); if (BltInfo->DestRect.left < BltInfo->SourcePoint.x)
} {
} Dest32 = (DWORD *) DestBits;
SourceBits -= BltInfo->SourceSurface->lDelta; Source32 = (DWORD *) SourceBits;
DestBits -= BltInfo->DestSurface->lDelta; for (i = BltInfo->DestRect.left; i < BltInfo->DestRect.right; i++)
} {
} *Dest32++ = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32++);
} }
break; }
else
{
Dest32 = (DWORD *) DestBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1);
Source32 = (DWORD *) SourceBits + (BltInfo->DestRect.right - BltInfo->DestRect.left - 1);
for (i = BltInfo->DestRect.right - 1; BltInfo->DestRect.left <= i; i--)
{
*Dest32-- = XLATEOBJ_iXlate(BltInfo->XlateSourceToDest, *Source32--);
}
}
SourceBits -= BltInfo->SourceSurface->lDelta;
DestBits -= BltInfo->DestSurface->lDelta;
}
}
}
break;
default: default:
DPRINT1("DIB_32BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo->SourceSurface->iBitmapFormat)); DPRINT1("DIB_32BPP_Bitblt: Unhandled Source BPP: %u\n", BitsPerFormat(BltInfo->SourceSurface->iBitmapFormat));
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }
BOOLEAN BOOLEAN
@ -282,61 +298,61 @@ DIB_32BPP_TransparentBlt(SURFOBJ *DestSurf, SURFOBJ *SourceSurf,
RECTL* DestRect, RECTL *SourceRect, RECTL* DestRect, RECTL *SourceRect,
XLATEOBJ *ColorTranslation, ULONG iTransColor) XLATEOBJ *ColorTranslation, ULONG iTransColor)
{ {
ULONG X, Y, SourceX, SourceY = 0, Source = 0, wd; ULONG X, Y, SourceX, SourceY = 0, Source = 0, wd;
ULONG *DestBits; ULONG *DestBits;
LONG DstHeight; LONG DstHeight;
LONG DstWidth; LONG DstWidth;
LONG SrcHeight; LONG SrcHeight;
LONG SrcWidth; LONG SrcWidth;
DstHeight = DestRect->bottom - DestRect->top; DstHeight = DestRect->bottom - DestRect->top;
DstWidth = DestRect->right - DestRect->left; DstWidth = DestRect->right - DestRect->left;
SrcHeight = SourceRect->bottom - SourceRect->top; SrcHeight = SourceRect->bottom - SourceRect->top;
SrcWidth = SourceRect->right - SourceRect->left; SrcWidth = SourceRect->right - SourceRect->left;
DestBits = (ULONG*)((PBYTE)DestSurf->pvScan0 + DestBits = (ULONG*)((PBYTE)DestSurf->pvScan0 +
(DestRect->left << 2) + (DestRect->left << 2) +
DestRect->top * DestSurf->lDelta); DestRect->top * DestSurf->lDelta);
wd = DestSurf->lDelta - ((DestRect->right - DestRect->left) << 2); wd = DestSurf->lDelta - ((DestRect->right - DestRect->left) << 2);
for(Y = DestRect->top; Y < DestRect->bottom; Y++) for (Y = DestRect->top; Y < DestRect->bottom; Y++)
{
SourceY = SourceRect->top+(Y - DestRect->top) * SrcHeight / DstHeight;
for(X = DestRect->left; X < DestRect->right; X++, DestBits++)
{ {
SourceX = SourceRect->left+(X - DestRect->left) * SrcWidth / DstWidth; SourceY = SourceRect->top+(Y - DestRect->top) * SrcHeight / DstHeight;
if (SourceX >= 0 && SourceY >= 0 && for (X = DestRect->left; X < DestRect->right; X++, DestBits++)
SourceSurf->sizlBitmap.cx > SourceX && SourceSurf->sizlBitmap.cy > SourceY)
{
Source = DIB_GetSourceIndex(SourceSurf, SourceX, SourceY);
if(Source != iTransColor)
{ {
*DestBits = XLATEOBJ_iXlate(ColorTranslation, Source); SourceX = SourceRect->left+(X - DestRect->left) * SrcWidth / DstWidth;
if (SourceX >= 0 && SourceY >= 0 &&
SourceSurf->sizlBitmap.cx > SourceX && SourceSurf->sizlBitmap.cy > SourceY)
{
Source = DIB_GetSourceIndex(SourceSurf, SourceX, SourceY);
if (Source != iTransColor)
{
*DestBits = XLATEOBJ_iXlate(ColorTranslation, Source);
}
}
} }
}
DestBits = (ULONG*)((ULONG_PTR)DestBits + wd);
} }
DestBits = (ULONG*)((ULONG_PTR)DestBits + wd); return TRUE;
}
return TRUE;
} }
typedef union { typedef union {
ULONG ul; ULONG ul;
struct { struct {
UCHAR red; UCHAR red;
UCHAR green; UCHAR green;
UCHAR blue; UCHAR blue;
UCHAR alpha; UCHAR alpha;
} col; } col;
} NICEPIXEL32; } NICEPIXEL32;
static __inline UCHAR static __inline UCHAR
Clamp8(ULONG val) Clamp8(ULONG val)
{ {
return (val > 255) ? 255 : val; return (val > 255) ? 255 : val;
} }
BOOLEAN BOOLEAN
@ -344,77 +360,77 @@ DIB_32BPP_AlphaBlend(SURFOBJ* Dest, SURFOBJ* Source, RECTL* DestRect,
RECTL* SourceRect, CLIPOBJ* ClipRegion, RECTL* SourceRect, CLIPOBJ* ClipRegion,
XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj) XLATEOBJ* ColorTranslation, BLENDOBJ* BlendObj)
{ {
INT Rows, Cols, SrcX, SrcY; INT Rows, Cols, SrcX, SrcY;
register PULONG Dst; register PULONG Dst;
ULONG DstDelta; ULONG DstDelta;
BLENDFUNCTION BlendFunc; BLENDFUNCTION BlendFunc;
register NICEPIXEL32 DstPixel, SrcPixel; register NICEPIXEL32 DstPixel, SrcPixel;
UCHAR Alpha, SrcBpp; UCHAR Alpha, SrcBpp;
DPRINT("DIB_32BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n", DPRINT("DIB_32BPP_AlphaBlend: srcRect: (%d,%d)-(%d,%d), dstRect: (%d,%d)-(%d,%d)\n",
SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom, SourceRect->left, SourceRect->top, SourceRect->right, SourceRect->bottom,
DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); DestRect->left, DestRect->top, DestRect->right, DestRect->bottom);
ASSERT(DestRect->bottom - DestRect->top == SourceRect->bottom - SourceRect->top && ASSERT(DestRect->bottom - DestRect->top == SourceRect->bottom - SourceRect->top &&
DestRect->right - DestRect->left == SourceRect->right - SourceRect->left); DestRect->right - DestRect->left == SourceRect->right - SourceRect->left);
BlendFunc = BlendObj->BlendFunction; BlendFunc = BlendObj->BlendFunction;
if (BlendFunc.BlendOp != AC_SRC_OVER) if (BlendFunc.BlendOp != AC_SRC_OVER)
{ {
DPRINT1("BlendOp != AC_SRC_OVER\n"); DPRINT1("BlendOp != AC_SRC_OVER\n");
return FALSE; return FALSE;
} }
if (BlendFunc.BlendFlags != 0) if (BlendFunc.BlendFlags != 0)
{ {
DPRINT1("BlendFlags != 0\n"); DPRINT1("BlendFlags != 0\n");
return FALSE; return FALSE;
} }
if ((BlendFunc.AlphaFormat & ~AC_SRC_ALPHA) != 0) if ((BlendFunc.AlphaFormat & ~AC_SRC_ALPHA) != 0)
{ {
DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc.AlphaFormat); DPRINT1("Unsupported AlphaFormat (0x%x)\n", BlendFunc.AlphaFormat);
return FALSE; return FALSE;
} }
if ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0 && if ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0 &&
BitsPerFormat(Source->iBitmapFormat) != 32) BitsPerFormat(Source->iBitmapFormat) != 32)
{ {
DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n"); DPRINT1("Source bitmap must be 32bpp when AC_SRC_ALPHA is set\n");
return FALSE; return FALSE;
} }
Dst = (PULONG)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) + Dst = (PULONG)((ULONG_PTR)Dest->pvScan0 + (DestRect->top * Dest->lDelta) +
(DestRect->left << 2)); (DestRect->left << 2));
DstDelta = Dest->lDelta - ((DestRect->right - DestRect->left) << 2); DstDelta = Dest->lDelta - ((DestRect->right - DestRect->left) << 2);
SrcBpp = BitsPerFormat(Source->iBitmapFormat); SrcBpp = BitsPerFormat(Source->iBitmapFormat);
Rows = DestRect->bottom - DestRect->top; Rows = DestRect->bottom - DestRect->top;
SrcY = SourceRect->top; SrcY = SourceRect->top;
while (--Rows >= 0) while (--Rows >= 0)
{ {
Cols = DestRect->right - DestRect->left; Cols = DestRect->right - DestRect->left;
SrcX = SourceRect->left; SrcX = SourceRect->left;
while (--Cols >= 0) while (--Cols >= 0)
{ {
SrcPixel.ul = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation); SrcPixel.ul = DIB_GetSource(Source, SrcX++, SrcY, ColorTranslation);
SrcPixel.col.red = SrcPixel.col.red * BlendFunc.SourceConstantAlpha / 255; SrcPixel.col.red = SrcPixel.col.red * BlendFunc.SourceConstantAlpha / 255;
SrcPixel.col.green = SrcPixel.col.green * BlendFunc.SourceConstantAlpha / 255; SrcPixel.col.green = SrcPixel.col.green * BlendFunc.SourceConstantAlpha / 255;
SrcPixel.col.blue = SrcPixel.col.blue * BlendFunc.SourceConstantAlpha / 255; SrcPixel.col.blue = SrcPixel.col.blue * BlendFunc.SourceConstantAlpha / 255;
SrcPixel.col.alpha = (SrcBpp == 32) ? (SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha; SrcPixel.col.alpha = (SrcBpp == 32) ? (SrcPixel.col.alpha * BlendFunc.SourceConstantAlpha / 255) : BlendFunc.SourceConstantAlpha;
Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ? Alpha = ((BlendFunc.AlphaFormat & AC_SRC_ALPHA) != 0) ?
SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha; SrcPixel.col.alpha : BlendFunc.SourceConstantAlpha;
DstPixel.ul = *Dst; DstPixel.ul = *Dst;
DstPixel.col.red = Clamp8(DstPixel.col.red * (255 - Alpha) / 255 + SrcPixel.col.red); DstPixel.col.red = Clamp8(DstPixel.col.red * (255 - Alpha) / 255 + SrcPixel.col.red);
DstPixel.col.green = Clamp8(DstPixel.col.green * (255 - Alpha) / 255 + SrcPixel.col.green); DstPixel.col.green = Clamp8(DstPixel.col.green * (255 - Alpha) / 255 + SrcPixel.col.green);
DstPixel.col.blue = Clamp8(DstPixel.col.blue * (255 - Alpha) / 255 + SrcPixel.col.blue); DstPixel.col.blue = Clamp8(DstPixel.col.blue * (255 - Alpha) / 255 + SrcPixel.col.blue);
DstPixel.col.alpha = Clamp8(DstPixel.col.alpha * (255 - Alpha) / 255 + SrcPixel.col.alpha); DstPixel.col.alpha = Clamp8(DstPixel.col.alpha * (255 - Alpha) / 255 + SrcPixel.col.alpha);
*Dst++ = DstPixel.ul; *Dst++ = DstPixel.ul;
} }
Dst = (PULONG)((ULONG_PTR)Dst + DstDelta); Dst = (PULONG)((ULONG_PTR)Dst + DstDelta);
SrcY++; SrcY++;
} }
return TRUE; return TRUE;
} }
/* EOF */ /* EOF */