Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1433 lines
29 KiB

/******************************Module*Header*******************************\
* Module Name: tranblt.cxx
*
* Transparent BLT
*
* Created: 21-Jun-1996
* Author: Mark Enstrom [marke]
*
* Copyright (c) 1996-1999 Microsoft Corporation
\**************************************************************************/
#include "precomp.hxx"
/**************************************************************************\
*
* XLATE_TO_BGRA - match palette indexed color to BGRA
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 4/9/1997 Mark Enstrom [marke]
*
\**************************************************************************/
#define XLATE_TO_BGRA(pxlo,cIndex,ulDst) \
if (cIndex > pxlo->cEntries) \
{ \
cIndex = cIndex % pxlo->cEntries; \
} \
\
ulDst = ((XLATE *) pxlo)->ai[cIndex]
/******************************Public*Routine******************************\
* Routines to load a pixel and convert it to BGRA representaion for
* blending operations
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 12/2/1996 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vLoadAndConvert1ToBGRA(
PULONG pulDstAddr,
PBYTE pSrcAddr,
LONG SrcX,
LONG SrcCx,
XLATEOBJ *pxlo
)
{
BYTE SrcByte;
ASSERTGDI((pxlo->flXlate & XO_TABLE),"vLoadAndConvert1ToBGRA: xlate must be XO_TABLE");
if (pxlo->flXlate & XO_TABLE)
{
pSrcAddr = pSrcAddr + (SrcX >> 3);
LONG cxUnalignedStart = 7 & (8 - (SrcX & 7));
cxUnalignedStart = MIN(SrcCx,cxUnalignedStart);
//
// unaligned start
//
if (cxUnalignedStart)
{
LONG iDst = 7 - (SrcX & 0x07);
SrcByte = *pSrcAddr;
pSrcAddr++;
while (cxUnalignedStart--)
{
ULONG ulDst = ((SrcByte & (1 << iDst)) >> iDst);
XLATE_TO_BGRA(pxlo,ulDst,ulDst);
ulDst = ulDst | 0xFF000000;
*pulDstAddr = ulDst;
pulDstAddr++;
SrcCx--;
iDst--;
}
}
//
// aligned whole bytes
//
while (SrcCx >= 8)
{
ULONG ulDst;
ULONG ulIndex;
SrcCx -= 8;
SrcByte = *pSrcAddr;
ulIndex = (ULONG)((SrcByte & 0x80) >> 7);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*(pulDstAddr + 0) = ulDst | 0xff000000;
ulIndex = ((SrcByte & 0x40) >> 6);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*(pulDstAddr + 1) = ulDst | 0xff000000;
ulIndex = ((SrcByte & 0x20) >> 5);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*(pulDstAddr + 2) = ulDst | 0xff000000;
ulIndex = ((SrcByte & 0x10) >> 4);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*(pulDstAddr + 3) = ulDst | 0xff000000;
ulIndex = ((SrcByte & 0x08) >> 3);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*(pulDstAddr + 4) = ulDst | 0xff000000;
ulIndex = ((SrcByte & 0x04) >> 2);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*(pulDstAddr + 5) = ulDst | 0xff000000;
ulIndex = ((SrcByte & 0x02) >> 1);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*(pulDstAddr + 6) = ulDst | 0xff000000;
ulIndex = ((SrcByte & 0x01) >> 0);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*(pulDstAddr + 7) = ulDst | 0xff000000;
pSrcAddr++;
pulDstAddr+=8;
}
//
// unaligned end
//
if (SrcCx)
{
BYTE SrcByte = *pSrcAddr;
LONG iDst = 7;
while (SrcCx)
{
ULONG ulDst = ((SrcByte & (1 << iDst)) >> iDst);
XLATE_TO_BGRA(pxlo,ulDst,ulDst);
*pulDstAddr = ulDst | 0xff000000;
pulDstAddr++;
SrcCx--;
iDst--;
}
}
}
}
/**************************************************************************\
* vLoadAndConvert4ToBGRA
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vLoadAndConvert4ToBGRA(
PULONG pulDstAddr,
PBYTE pSrcAddr,
LONG SrcX,
LONG SrcCx,
XLATEOBJ *pxlo
)
{
ASSERTGDI((pxlo->flXlate & XO_TABLE),"vLoadAndConvert1ToBGRA: xlate must be XO_TABLE");
if (pxlo->flXlate & XO_TABLE)
{
ULONG ulIndex;
ULONG ulDst;
BYTE SrcByte;
LONG cxUnalignedStart;
pSrcAddr = pSrcAddr + (SrcX >> 1);
cxUnalignedStart = 1 & (2 - (SrcX & 1));
cxUnalignedStart = MIN(SrcCx,cxUnalignedStart);
//
// unaligned start
//
if (cxUnalignedStart)
{
SrcByte = *pSrcAddr;
ulIndex = (SrcByte & 0x0f);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*pulDstAddr = ulDst | 0xff000000;
pSrcAddr++;
pulDstAddr++;
SrcCx--;
}
//
// aligned whole bytes
//
while (SrcCx >= 2)
{
SrcCx -= 2;
SrcByte = *pSrcAddr;
ulIndex = (SrcByte >> 4);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*(pulDstAddr + 0) = ulDst | 0xff000000;
ulIndex = (SrcByte & 0x0f);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*(pulDstAddr + 1) = ulDst | 0xff000000;
pSrcAddr++;
pulDstAddr+=2;
}
//
// unaligned end
//
if (SrcCx)
{
SrcByte = *pSrcAddr;
ulIndex = (SrcByte >> 4);
XLATE_TO_BGRA(pxlo,ulIndex,ulDst);
*pulDstAddr = ulDst | 0xff000000;
}
}
}
/**************************************************************************\
* vLoadAndConvert8ToBGRA
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vLoadAndConvert8ToBGRA(
PULONG pulDstAddr,
PBYTE pSrcAddr,
LONG SrcX,
LONG SrcCx,
XLATEOBJ *pxlo
)
{
ASSERTGDI((pxlo->flXlate & XO_TABLE),"vLoadAndConvert1ToBGRA: xlate must be XO_TABLE");
if (pxlo->flXlate & XO_TABLE)
{
PBYTE pjSrc = pSrcAddr + SrcX;
PBYTE pjEnd = pjSrc + SrcCx;
while (pjSrc != pjEnd)
{
ALPHAPIX apix;
BYTE jTemp;
ULONG ulDst;
ulDst = (ULONG)*pjSrc;
XLATE_TO_BGRA(pxlo,ulDst,ulDst);
apix.ul = ulDst | 0xff000000;
*pulDstAddr = apix.ul;
pulDstAddr++;
pjSrc++;
}
}
}
/**************************************************************************\
* vLoadAndConvertRGB16_565ToBGRA
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vLoadAndConvertRGB16_565ToBGRA(
PULONG pulDstAddr,
PBYTE pSrcAddr,
LONG SrcX,
LONG SrcCx,
XLATEOBJ *pxlo
)
{
PUSHORT pusSrc = (PUSHORT)pSrcAddr + SrcX;
ULONG ul;
//
// unaligned single at start
//
if ((ULONG_PTR)pusSrc & 0x02)
{
ul = *pusSrc;
*pulDstAddr = (((ul << 8) & 0xf80000)
| ((ul << 3) & 0x070000)
| ((ul << 5) & 0x00fc00)
| ((ul >> 1) & 0x000300)
| ((ul << 3) & 0x0000f8)
| ((ul >> 2) & 0x000007)
| 0xff000000);
pusSrc++;
pulDstAddr++;
SrcCx--;
}
//
// aligned
//
PUSHORT pusEnd = pusSrc + (SrcCx & ~1);
while (pusSrc != pusEnd)
{
ul = *(PULONG)pusSrc;
*pulDstAddr = (((ul << 8) & 0xf80000)
| ((ul << 3) & 0x070000)
| ((ul << 5) & 0x00fc00)
| ((ul >> 1) & 0x000300)
| ((ul << 3) & 0x0000f8)
| ((ul >> 2) & 0x000007)
| 0xff000000);
*(pulDstAddr+1) = (((ul >> 8) & 0xf80000)
| ((ul >> 13) & 0x070000)
| ((ul >> 11) & 0x00fc00)
| ((ul >> 17) & 0x000300)
| ((ul >> 13) & 0x0000f8)
| ((ul >> 18) & 0x000007)
| 0xff000000);
pusSrc+= 2;
pulDstAddr+=2;
}
//
// end unaligned
//
if (SrcCx & 1)
{
ul = *pusSrc;
*pulDstAddr = (((ul << 8) & 0xf80000)
| ((ul << 3) & 0x070000)
| ((ul << 5) & 0x00fc00)
| ((ul >> 1) & 0x000300)
| ((ul << 3) & 0x0000f8)
| ((ul >> 2) & 0x000007)
| 0xff000000);
}
}
/**************************************************************************\
* vLoadAndConvertRGB16_555ToBGRA
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vLoadAndConvertRGB16_555ToBGRA(
PULONG pulDstAddr,
PBYTE pSrcAddr,
LONG SrcX,
LONG SrcCx,
XLATEOBJ *pxlo
)
{
PUSHORT pusSrc = (PUSHORT)pSrcAddr + SrcX;
ULONG ul;
//
// unaligned single at start
//
if ((ULONG_PTR)pusSrc & 0x02)
{
ul = *pusSrc;
*pulDstAddr = (((ul << 9) & 0xf80000)
| ((ul << 4) & 0x070000)
| ((ul << 6) & 0x00f800)
| ((ul << 1) & 0x000700)
| ((ul << 3) & 0x0000f8)
| ((ul >> 2) & 0x000007)
| 0xff000000);
pusSrc++;
pulDstAddr++;
SrcCx--;
}
//
// aligned
//
PUSHORT pusEnd = pusSrc + (SrcCx & ~1);
while (pusSrc != pusEnd)
{
ULONG ul = *(PULONG)pusSrc;
*pulDstAddr = (((ul << 9) & 0xf80000)
| ((ul << 4) & 0x070000)
| ((ul << 6) & 0x00f800)
| ((ul << 1) & 0x000700)
| ((ul << 3) & 0x0000f8)
| ((ul >> 2) & 0x000007)
| 0xff000000);
*(pulDstAddr+1) = (((ul >> 7) & 0xf80000)
| ((ul >> 12) & 0x070000)
| ((ul >> 10) & 0x00f800)
| ((ul >> 15) & 0x000700)
| ((ul >> 13) & 0x0000f8)
| ((ul >> 18) & 0x000007)
| 0xff000000);
pusSrc+= 2;
pulDstAddr+=2;
}
//
// end unaligned
//
if (SrcCx & 1)
{
ul = *pusSrc;
*pulDstAddr = (((ul << 9) & 0xf80000)
| ((ul << 4) & 0x070000)
| ((ul << 6) & 0x00f800)
| ((ul << 1) & 0x000700)
| ((ul << 3) & 0x0000f8)
| ((ul >> 2) & 0x000007)
| 0xff000000);
}
}
/**************************************************************************\
* vLoadAndConvert16BitfieldsToBGRA
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vLoadAndConvert16BitfieldsToBGRA(
PULONG pulDstAddr,
PBYTE pSrcAddr,
LONG SrcX,
LONG SrcCx,
XLATEOBJ *pxlo
)
{
PUSHORT pusSrc = (PUSHORT)pSrcAddr + SrcX;
PUSHORT pusEnd = pusSrc + SrcCx;
while (pusSrc != pusEnd)
{
ULONG ulTmp;
ulTmp = *pusSrc;
ulTmp = (((XLATE *)pxlo)->ulTranslate(ulTmp));
*pulDstAddr = ulTmp | 0xff000000;
pusSrc++;
pulDstAddr++;
}
}
/**************************************************************************\
* vLoadAndConvertRGB24ToBGRA
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vLoadAndConvertRGB24ToBGRA(
PULONG pulDstAddr,
PBYTE pSrcAddr,
LONG SrcX,
LONG SrcCx,
XLATEOBJ *pxlo
)
{
PBYTE pjSrc = pSrcAddr + 3 * SrcX;
PBYTE pjEnd = pjSrc + 3 * SrcCx;
while (pjSrc != pjEnd)
{
ALPHAPIX pixRet;
pixRet.pix.r = *(((PBYTE)pjSrc));
pixRet.pix.g = *(((PBYTE)pjSrc)+1);
pixRet.pix.b = *(((PBYTE)pjSrc)+2);
pixRet.pix.a = 0xff;
*pulDstAddr = pixRet.ul;
pjSrc += 3;
pulDstAddr++;
}
}
/**************************************************************************\
* vLoadAndConvertBGR24ToBGRA
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 5/4/2000 bhouse
*
\**************************************************************************/
VOID
vLoadAndConvertBGR24ToBGRA(
PULONG pulDstAddr,
PBYTE pSrcAddr,
LONG SrcX,
LONG SrcCx,
XLATEOBJ *pxlo
)
{
PBYTE pjSrc = pSrcAddr + 3 * SrcX;
PBYTE pjEnd = pjSrc + 3 * SrcCx;
while (pjSrc != pjEnd)
{
ALPHAPIX pixRet;
pixRet.pix.b = *(((PBYTE)pjSrc));
pixRet.pix.g = *(((PBYTE)pjSrc)+1);
pixRet.pix.r = *(((PBYTE)pjSrc)+2);
pixRet.pix.a = 0xff;
*pulDstAddr = pixRet.ul;
pjSrc += 3;
pulDstAddr++;
}
}
/**************************************************************************\
* vLoadAndConvertRGB32ToBGRA
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vLoadAndConvertRGB32ToBGRA(
PULONG pulDstAddr,
PBYTE pSrcAddr,
LONG SrcX,
LONG SrcCx,
XLATEOBJ *pxlo
)
{
PULONG pulSrc = (PULONG)pSrcAddr + SrcX;
PULONG pulEnd = pulSrc + SrcCx;
while (pulSrc != pulEnd)
{
ALPHAPIX pixIn;
ALPHAPIX pixOut;
pixIn.ul = *pulSrc;
pixOut.pix.r = pixIn.pix.b;
pixOut.pix.g = pixIn.pix.g;
pixOut.pix.b = pixIn.pix.r;
pixOut.pix.a = 0xff;
*pulDstAddr = pixOut.ul;
pulSrc++;
pulDstAddr++;
}
}
/**************************************************************************\
* vLoadAndConvert32BitfieldsToBGRA
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vLoadAndConvert32BitfieldsToBGRA(
PULONG pulDstAddr,
PBYTE pSrcAddr,
LONG SrcX,
LONG SrcCx,
XLATEOBJ *pxlo
)
{
PULONG pulSrc = (PULONG)pSrcAddr + SrcX;
PULONG pulEnd = pulSrc + SrcCx;
while (pulSrc != pulEnd)
{
ULONG ulTmp;
ulTmp = *pulSrc;
ulTmp = (((XLATE *)pxlo)->ulTranslate(ulTmp));
ulTmp |= 0xff000000;
*pulDstAddr = ulTmp;
pulSrc++;
pulDstAddr++;
}
}
//
//
// STORE ROUTINES
//
//
#define PALETTE_MATCH(pixIn,ppalDst,ppalDstDC) \
{ \
BYTE jSwap; \
\
pixIn.pix.a = 0x02; \
jSwap = pixIn.pix.r; \
pixIn.pix.r = pixIn.pix.b; \
pixIn.pix.b = jSwap; \
\
pixIn.ul = ulGetNearestIndexFromColorref( \
ppalDst, \
ppalDstDC, \
pixIn.ul, \
ppalDst.cEntries() ? \
SE_DO_SEARCH_EXACT_FIRST : \
SE_DONT_SEARCH_EXACT_FIRST \
\
); \
} \
/**************************************************************************\
* vConvertAndSaveBGRATo1
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vConvertAndSaveBGRATo1(
PBYTE pDst,
PULONG pulSrc,
LONG cx,
LONG DstX,
XLATEOBJ *pxlo,
XEPALOBJ ppalDst,
XEPALOBJ ppalDstDC
)
{
PBYTE pjDst = pDst + (DstX >> 3);
LONG iDst = DstX & 7;
//
// unaligned byte
//
if (iDst)
{
BYTE DstByte = *pjDst;
LONG iShift = 7 - iDst;
LONG cxUnaligned = iShift + 1;
cxUnaligned = MIN(cxUnaligned,cx);
cx -= cxUnaligned;
while (cxUnaligned--)
{
ALPHAPIX pixIn;
pixIn.ul = *pulSrc;
PALETTE_MATCH(pixIn,ppalDst,ppalDstDC);
pixIn.ul = pixIn.ul << iShift;
DstByte = DstByte & (~(1 << iShift));
DstByte |= (BYTE)pixIn.ul;
pulSrc++;
iShift--;
}
*pjDst = DstByte;
pjDst++;
}
//
// aligned whole bytes
//
while (cx >= 8)
{
ALPHAPIX pixIn;
BYTE DstByte;
pixIn.ul = *pulSrc;
PALETTE_MATCH(pixIn,ppalDst,ppalDstDC);
DstByte = (BYTE)(pixIn.ul << 7);
pixIn.ul = *(pulSrc+1);
PALETTE_MATCH(pixIn,ppalDst,ppalDstDC);
DstByte |= (BYTE)(pixIn.ul << 6);
pixIn.ul = *(pulSrc+2);
PALETTE_MATCH(pixIn,ppalDst,ppalDstDC);
DstByte |= (BYTE)(pixIn.ul << 5);
pixIn.ul = *(pulSrc+3);
PALETTE_MATCH(pixIn,ppalDst,ppalDstDC);
DstByte |= (BYTE)(pixIn.ul << 4);
pixIn.ul = *(pulSrc+4);
PALETTE_MATCH(pixIn,ppalDst,ppalDstDC);
DstByte |= (BYTE)(pixIn.ul << 3);
pixIn.ul = *(pulSrc+5);
PALETTE_MATCH(pixIn,ppalDst,ppalDstDC);
DstByte |= (BYTE)(pixIn.ul << 2);
pixIn.ul = *(pulSrc+6);
PALETTE_MATCH(pixIn,ppalDst,ppalDstDC);
DstByte |= (BYTE)(pixIn.ul << 1);
pixIn.ul = *(pulSrc+7);
PALETTE_MATCH(pixIn,ppalDst,ppalDstDC);
DstByte |= (BYTE)(pixIn.ul << 0);
*pjDst = DstByte;
pjDst++;
pulSrc += 8;
cx -= 8;
}
//
// unaligned end
//
if (cx)
{
BYTE iShift = 7;
BYTE DstByte = *pjDst;
while (cx--)
{
ALPHAPIX pixIn;
pixIn.ul = *pulSrc;
PALETTE_MATCH(pixIn,ppalDst,ppalDstDC);
pixIn.ul = pixIn.ul << iShift;
DstByte = DstByte & (~(1 << iShift));
DstByte |= (BYTE)pixIn.ul;
pulSrc++;
iShift--;
}
*pjDst = DstByte;
}
}
/**************************************************************************\
* vConvertAndSaveBGRATo4
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vConvertAndSaveBGRATo4(
PBYTE pDst,
PULONG pulSrc,
LONG cx,
LONG DstX,
XLATEOBJ *pxlo,
XEPALOBJ ppalDst,
XEPALOBJ ppalDstDC
)
{
PBYTE pjDst = pDst + (DstX >> 1);
LONG iDst = DstX & 1;
PBYTE pxlate = XLATEOBJ_pGetXlate555(pxlo);
if (pxlate == NULL)
{
WARNING("vConvertAndSaveBGRA: To4Failed to generate rgb333 xlate table\n");
return;
}
//
// make sure params are valid
//
if (cx == 0)
{
return;
}
//
// unaligned byte
//
if (iDst)
{
BYTE DstByte = *pjDst;
ALPHAPIX pixIn;
pixIn.ul = *pulSrc;
pixIn.ul = XLATEOBJ_BGR32ToPalSurf(pxlo,pxlate,pixIn.ul);
DstByte = (DstByte & 0xf0) | (BYTE)pixIn.ul;
*pjDst = DstByte;
pjDst++;
pulSrc++;
cx--;
}
//
// aligned whole bytes
//
while (cx >= 2)
{
BYTE DstByte;
ALPHAPIX pixIn;
pixIn.ul = *pulSrc;
pixIn.ul = XLATEOBJ_BGR32ToPalSurf(pxlo,pxlate,pixIn.ul);
DstByte = (BYTE)(pixIn.ul << 4);
pixIn.ul = *(pulSrc+1);
pixIn.ul = XLATEOBJ_BGR32ToPalSurf(pxlo,pxlate,pixIn.ul);
DstByte |= (BYTE)(pixIn.ul);
*pjDst = DstByte;
pjDst++;
pulSrc += 2;
cx -= 2;
}
//
// unaligned end
//
if (cx)
{
BYTE DstByte = *pjDst;
ALPHAPIX pixIn;
pixIn.ul = *pulSrc;
pixIn.ul = XLATEOBJ_BGR32ToPalSurf(pxlo,pxlate,pixIn.ul);
DstByte = (DstByte & 0x0f) | (BYTE)(pixIn.ul << 4);
*pjDst = DstByte;
}
}
/**************************************************************************\
* vConvertAndSaveBGRATo8
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vConvertAndSaveBGRATo8(
PBYTE pDst,
PULONG pulSrc,
LONG cx,
LONG DstX,
XLATEOBJ *pxlo,
XEPALOBJ ppalDst,
XEPALOBJ ppalDstDC
)
{
PBYTE pxlate = XLATEOBJ_pGetXlate555(pxlo);
if (pxlate == NULL)
{
WARNING("vConvertAndSaveBGRATo8: Failed to generate rgb333 xlate table\n");
return;
}
PBYTE pjDst = (PBYTE)pDst + DstX;
PBYTE pjEnd = pjDst + cx;
while (pjDst != pjEnd)
{
ALPHAPIX pixIn;
pixIn.ul = *pulSrc;
pixIn.ul = XLATEOBJ_BGR32ToPalSurf(pxlo,pxlate,pixIn.ul);
*pjDst = (BYTE)pixIn.ul;
pulSrc++;
pjDst++;
}
}
/**************************************************************************\
* vConvertAndSaveBGRAToRGB16_565
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vConvertAndSaveBGRAToRGB16_565(
PBYTE pjDst,
PULONG pulSrc,
LONG cx,
LONG DstX,
XLATEOBJ *pxlo,
XEPALOBJ ppalDst,
XEPALOBJ ppalDstDC
)
{
PUSHORT pusDst = (PUSHORT)pjDst + DstX;
PUSHORT pusEnd = pusDst + cx;
while (pusDst != pusEnd)
{
ALPHAPIX pixIn;
ALPHAPIX pixOut;
pixIn.ul = *pulSrc;
pixOut.ul = ((pixIn.pix.r & 0xf8) << 8) |
((pixIn.pix.g & 0xfc) << 3) |
((pixIn.pix.b & 0xf8) >> 3);
*pusDst = (USHORT)pixOut.ul;
pulSrc++;
pusDst++;
}
}
/**************************************************************************\
* vConvertAndSaveBGRAToRGB16_555
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vConvertAndSaveBGRAToRGB16_555(
PBYTE pjDst,
PULONG pulSrc,
LONG cx,
LONG DstX,
XLATEOBJ *pxlo,
XEPALOBJ ppalDst,
XEPALOBJ ppalDstDC
)
{
PUSHORT pusDst = (PUSHORT)pjDst + DstX;
PUSHORT pusEnd = pusDst + cx;
while (pusDst != pusEnd)
{
ALPHAPIX pixIn;
ALPHAPIX pixOut;
pixIn.ul = *pulSrc;
pixOut.ul = ((pixIn.pix.r & 0xf8) << 7) |
((pixIn.pix.g & 0xf8) << 2) |
((pixIn.pix.b & 0xf8) >> 3);
*pusDst = (USHORT)pixOut.ul;
pulSrc++;
pusDst++;
}
}
/**************************************************************************\
* vConvertAndSaveBGRATo16Bitfields
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vConvertAndSaveBGRAToRGB16Bitfields(
PBYTE pjDst,
PULONG pulSrc,
LONG cx,
LONG DstX,
XLATEOBJ *pxlo,
XEPALOBJ ppalDst,
XEPALOBJ ppalDstDC
)
{
PUSHORT pusDst = (PUSHORT)pjDst + DstX;
PUSHORT pusEnd = pusDst + cx;
while (pusDst != pusEnd)
{
ALPHAPIX pixIn;
ALPHAPIX pixOut;
pixIn.ul = *pulSrc;
pixOut.ul = (((XLATE *)pxlo)->ulTranslate(pixIn.ul));
*pusDst = (USHORT)pixOut.ul;
pulSrc++;
pusDst++;
}
}
/**************************************************************************\
* vConvertAndSaveBGRAToRGB24
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vConvertAndSaveBGRAToRGB24(
PBYTE pDst,
PULONG pulSrc,
LONG cx,
LONG DstX,
XLATEOBJ *pxlo,
XEPALOBJ ppalDst,
XEPALOBJ ppalDstDC
)
{
PBYTE pjDst = (PBYTE)pDst + (3 * DstX);
PBYTE pjEnd = pjDst + (3 * cx);
while (pjDst != pjEnd)
{
ALPHAPIX pixIn;
pixIn.ul = *pulSrc;
*pjDst = pixIn.pix.r;
*(pjDst+1) = pixIn.pix.g;
*(pjDst+2) = pixIn.pix.b;
pulSrc++;
pjDst+=3;
}
}
/**************************************************************************\
* vConvertAndSaveBGRAToBGR24
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 5/4/2000 bhouse
*
\**************************************************************************/
VOID
vConvertAndSaveBGRAToBGR24(
PBYTE pDst,
PULONG pulSrc,
LONG cx,
LONG DstX,
XLATEOBJ *pxlo,
XEPALOBJ ppalDst,
XEPALOBJ ppalDstDC
)
{
PBYTE pjDst = (PBYTE)pDst + (3 * DstX);
PBYTE pjEnd = pjDst + (3 * cx);
while (pjDst != pjEnd)
{
ALPHAPIX pixIn;
pixIn.ul = *pulSrc;
*pjDst = pixIn.pix.b;
*(pjDst+1) = pixIn.pix.g;
*(pjDst+2) = pixIn.pix.r;
pulSrc++;
pjDst+=3;
}
}
/**************************************************************************\
* vConvertAndSaveBGRATo32Bitfields
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vConvertAndSaveBGRATo32Bitfields(
PBYTE pjDst,
PULONG pulSrc,
LONG cx,
LONG DstX,
XLATEOBJ *pxlo,
XEPALOBJ ppalDst,
XEPALOBJ ppalDstDC
)
{
PULONG pulDst = (PULONG)pjDst + DstX;
PULONG pulEnd = pulDst + cx;
while (pulDst != pulEnd)
{
ALPHAPIX pixIn;
ALPHAPIX pixOut;
pixIn.ul = *pulSrc;
pixOut.ul = (((XLATE *)pxlo)->ulTranslate(pixIn.ul));
*pulDst = pixOut.ul;
pulSrc++;
pulDst++;
}
}
/**************************************************************************\
* vConvertAndSaveBGRAToRGB32
*
*
* Arguments:
*
*
*
* Return Value:
*
*
*
* History:
*
* 1/22/1997 Mark Enstrom [marke]
*
\**************************************************************************/
VOID
vConvertAndSaveBGRAToRGB32(
PBYTE pjDst,
PULONG pulSrc,
LONG cx,
LONG DstX,
XLATEOBJ *pxlo,
XEPALOBJ ppalDst,
XEPALOBJ ppalDstDC
)
{
PULONG pulDst = (PULONG)pjDst + DstX;
PULONG pulEnd = pulDst + cx;
while (pulDst != pulEnd)
{
ALPHAPIX pixIn;
ALPHAPIX pixOut;
pixIn.ul = *pulSrc;
pixOut.pix.r = pixIn.pix.b;
pixOut.pix.g = pixIn.pix.g;
pixOut.pix.b = pixIn.pix.r;
pixOut.pix.a = 0;
*pulDst = pixOut.ul;
pulSrc++;
pulDst++;
}
}