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.
779 lines
15 KiB
779 lines
15 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"
|
|
|
|
#if !(_WIN32_WINNT >= 0x500)
|
|
|
|
|
|
/******************************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,
|
|
PVOID pDibInfo
|
|
)
|
|
{
|
|
BYTE SrcByte;
|
|
LONG cxUnalignedStart = 7 & (8 - (SrcX & 7));
|
|
PULONG ppal = (PULONG)&((PDIBINFO)pDibInfo)->pbmi->bmiColors[0];
|
|
|
|
pSrcAddr = pSrcAddr + (SrcX >> 3);
|
|
|
|
cxUnalignedStart = MIN(SrcCx,cxUnalignedStart);
|
|
|
|
//
|
|
// unaligned start
|
|
//
|
|
|
|
if (cxUnalignedStart)
|
|
{
|
|
LONG iDst = 7 - (SrcX & 0x07);
|
|
SrcByte = *pSrcAddr;
|
|
pSrcAddr++;
|
|
|
|
while (cxUnalignedStart--)
|
|
{
|
|
ULONG ulSrc = ((SrcByte & (1 << iDst)) >> iDst);
|
|
|
|
ulSrc = ppal[ulSrc] | 0xFF000000;
|
|
*pulDstAddr = ulSrc;
|
|
|
|
pulDstAddr++;
|
|
SrcCx--;
|
|
iDst--;
|
|
}
|
|
}
|
|
|
|
//
|
|
// aligned whole bytes
|
|
//
|
|
|
|
while (SrcCx >= 8)
|
|
{
|
|
SrcCx -= 8;
|
|
|
|
SrcByte = *pSrcAddr;
|
|
|
|
*(pulDstAddr + 0) = (ppal[(SrcByte & 0x80) >> 7] | 0xff000000);
|
|
*(pulDstAddr + 1) = (ppal[(SrcByte & 0x40) >> 6] | 0xff000000);
|
|
*(pulDstAddr + 2) = (ppal[(SrcByte & 0x20) >> 5] | 0xff000000);
|
|
*(pulDstAddr + 3) = (ppal[(SrcByte & 0x10) >> 4] | 0xff000000);
|
|
*(pulDstAddr + 4) = (ppal[(SrcByte & 0x08) >> 3] | 0xff000000);
|
|
*(pulDstAddr + 5) = (ppal[(SrcByte & 0x04) >> 2] | 0xff000000);
|
|
*(pulDstAddr + 6) = (ppal[(SrcByte & 0x02) >> 1] | 0xff000000);
|
|
*(pulDstAddr + 7) = (ppal[(SrcByte & 0x01) >> 0] | 0xff000000);
|
|
|
|
pSrcAddr++;
|
|
pulDstAddr+=8;
|
|
}
|
|
|
|
//
|
|
// unaligned end
|
|
//
|
|
|
|
if (SrcCx)
|
|
{
|
|
BYTE SrcByte = *pSrcAddr;
|
|
LONG iDst = 7;
|
|
|
|
while (SrcCx)
|
|
{
|
|
ULONG ulSrc = ((SrcByte & (1 << iDst)) >> iDst);
|
|
|
|
ulSrc = ppal[ulSrc] | 0xff000000;
|
|
*pulDstAddr = ulSrc;
|
|
|
|
pulDstAddr++;
|
|
SrcCx--;
|
|
iDst--;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**************************************************************************\
|
|
* vLoadAndConvert4ToBGRA
|
|
*
|
|
*
|
|
* Arguments:
|
|
*
|
|
*
|
|
*
|
|
* Return Value:
|
|
*
|
|
*
|
|
*
|
|
* History:
|
|
*
|
|
* 1/22/1997 Mark Enstrom [marke]
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vLoadAndConvert4ToBGRA(
|
|
PULONG pulDstAddr,
|
|
PBYTE pSrcAddr,
|
|
LONG SrcX,
|
|
LONG SrcCx,
|
|
PVOID pDibInfo
|
|
)
|
|
{
|
|
BYTE SrcByte;
|
|
pSrcAddr = pSrcAddr + (SrcX >> 1);
|
|
LONG cxUnalignedStart = 1 & (2 - (SrcX & 1));
|
|
PULONG ppal = (PULONG)&((PDIBINFO)pDibInfo)->pbmi->bmiColors[0];
|
|
|
|
cxUnalignedStart = MIN(SrcCx,cxUnalignedStart);
|
|
|
|
//
|
|
// unaligned start
|
|
//
|
|
|
|
if (cxUnalignedStart)
|
|
{
|
|
SrcByte = *pSrcAddr;
|
|
*pulDstAddr = ppal[SrcByte & 0x0f] | 0xff000000;
|
|
pSrcAddr++;
|
|
pulDstAddr++;
|
|
SrcCx--;
|
|
}
|
|
|
|
//
|
|
// aligned whole bytes
|
|
//
|
|
|
|
while (SrcCx >= 2)
|
|
{
|
|
SrcCx -= 2;
|
|
|
|
SrcByte = *pSrcAddr;
|
|
|
|
*(pulDstAddr + 0) = ppal[(SrcByte >> 4) ] | 0xff000000;
|
|
*(pulDstAddr + 1) = ppal[(SrcByte & 0x0f)] | 0xff000000;
|
|
|
|
pSrcAddr++;
|
|
pulDstAddr+=2;
|
|
}
|
|
|
|
//
|
|
// unaligned end
|
|
//
|
|
|
|
if (SrcCx)
|
|
{
|
|
SrcByte = *pSrcAddr;
|
|
*pulDstAddr = ppal[SrcByte >> 4] | 0xff000000;
|
|
}
|
|
}
|
|
|
|
/**************************************************************************\
|
|
* vLoadAndConvert8ToBGRA
|
|
*
|
|
*
|
|
* Arguments:
|
|
*
|
|
*
|
|
*
|
|
* Return Value:
|
|
*
|
|
*
|
|
*
|
|
* History:
|
|
*
|
|
* 1/22/1997 Mark Enstrom [marke]
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vLoadAndConvert8ToBGRA(
|
|
PULONG pulDstAddr,
|
|
PBYTE pSrcAddr,
|
|
LONG SrcX,
|
|
LONG SrcCx,
|
|
PVOID pDibInfo
|
|
)
|
|
{
|
|
PBYTE pjSrc = pSrcAddr + SrcX;
|
|
PBYTE pjEnd = pjSrc + SrcCx;
|
|
|
|
PULONG ppal = (PULONG)&((PDIBINFO)pDibInfo)->pbmi->bmiColors[0];
|
|
|
|
while (pjSrc != pjEnd)
|
|
{
|
|
*pulDstAddr = ppal[*pjSrc] | 0xff000000;
|
|
|
|
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,
|
|
PVOID pDibInfo
|
|
)
|
|
{
|
|
PUSHORT pusSrc = (PUSHORT)pSrcAddr + SrcX;
|
|
PUSHORT pusEnd = pusSrc + SrcCx;
|
|
|
|
while (pusSrc != pusEnd)
|
|
{
|
|
ALPHAPIX pixIn;
|
|
ALPHAPIX pixOut;
|
|
|
|
pixIn.ul = *pusSrc;
|
|
|
|
pixOut.pix.r = (BYTE)((pixIn.ul & 0xf800) >> 8);
|
|
pixOut.pix.g = (BYTE)((pixIn.ul & 0x07e0) >> 3);
|
|
pixOut.pix.b = (BYTE)((pixIn.ul & 0x001f) << 3);
|
|
pixOut.pix.a = 0xff;
|
|
*pulDstAddr = pixOut.ul;
|
|
|
|
pusSrc++;
|
|
pulDstAddr++;
|
|
}
|
|
}
|
|
|
|
/**************************************************************************\
|
|
* vLoadAndConvertRGB16_555ToBGRA
|
|
*
|
|
*
|
|
* Arguments:
|
|
*
|
|
*
|
|
*
|
|
* Return Value:
|
|
*
|
|
*
|
|
*
|
|
* History:
|
|
*
|
|
* 1/22/1997 Mark Enstrom [marke]
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vLoadAndConvertRGB16_555ToBGRA(
|
|
PULONG pulDstAddr,
|
|
PBYTE pSrcAddr,
|
|
LONG SrcX,
|
|
LONG SrcCx,
|
|
PVOID pDibInfo
|
|
)
|
|
{
|
|
PUSHORT pusSrc = (PUSHORT)pSrcAddr + SrcX;
|
|
PUSHORT pusEnd = pusSrc + SrcCx;
|
|
while (pusSrc != pusEnd)
|
|
{
|
|
ALPHAPIX pixIn;
|
|
ALPHAPIX pixOut;
|
|
|
|
pixIn.ul = *pusSrc;
|
|
|
|
pixOut.pix.r = (BYTE)((pixIn.ul & 0x7c00) >> 7);
|
|
pixOut.pix.g = (BYTE)((pixIn.ul & 0x03e0) >> 2);
|
|
pixOut.pix.b = (BYTE)((pixIn.ul & 0x001f) << 3);
|
|
|
|
pixOut.pix.a = 0xff;
|
|
|
|
*pulDstAddr = pixOut.ul;
|
|
|
|
pusSrc++;
|
|
pulDstAddr++;
|
|
}
|
|
}
|
|
|
|
/**************************************************************************\
|
|
* vLoadAndConvert16BitfieldsToBGRA
|
|
*
|
|
*
|
|
* Arguments:
|
|
*
|
|
*
|
|
*
|
|
* Return Value:
|
|
*
|
|
*
|
|
*
|
|
* History:
|
|
*
|
|
* 1/22/1997 Mark Enstrom [marke]
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vLoadAndConvert16BitfieldsToBGRA(
|
|
PULONG pulDstAddr,
|
|
PBYTE pSrcAddr,
|
|
LONG SrcX,
|
|
LONG SrcCx,
|
|
PVOID pDibInfo
|
|
)
|
|
{
|
|
PUSHORT pusSrc = (PUSHORT)pSrcAddr + SrcX;
|
|
PUSHORT pusEnd = pusSrc + SrcCx;
|
|
while (pusSrc != pusEnd)
|
|
{
|
|
ULONG ulTmp;
|
|
|
|
ulTmp = *pusSrc;
|
|
|
|
//ulTmp = ppal.ulBitfieldToRGB(ulTmp);
|
|
|
|
ulTmp |= 0xff000000;
|
|
|
|
*pulDstAddr = ulTmp;
|
|
|
|
pusSrc++;
|
|
pulDstAddr++;
|
|
}
|
|
}
|
|
|
|
/**************************************************************************\
|
|
* vLoadAndConvertRGB24ToBGRA
|
|
*
|
|
*
|
|
* Arguments:
|
|
*
|
|
*
|
|
*
|
|
* Return Value:
|
|
*
|
|
*
|
|
*
|
|
* History:
|
|
*
|
|
* 1/22/1997 Mark Enstrom [marke]
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vLoadAndConvertRGB24ToBGRA(
|
|
PULONG pulDstAddr,
|
|
PBYTE pSrcAddr,
|
|
LONG SrcX,
|
|
LONG SrcCx,
|
|
PVOID pDibInfo
|
|
)
|
|
{
|
|
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,
|
|
PVOID pDibInfo
|
|
)
|
|
{
|
|
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 = pixIn.pix.a;
|
|
|
|
*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,
|
|
PVOID pDibInfo
|
|
)
|
|
{
|
|
PULONG pulSrc = (PULONG)pSrcAddr + SrcX;
|
|
PULONG pulEnd = pulSrc + SrcCx;
|
|
|
|
while (pulSrc != pulEnd)
|
|
{
|
|
ULONG ulTmp;
|
|
|
|
ulTmp = *pulSrc;
|
|
|
|
//ulTmp = ppal.ulBitfieldToRGB(ulTmp);
|
|
|
|
*pulDstAddr = ulTmp;
|
|
|
|
pulSrc++;
|
|
pulDstAddr++;
|
|
}
|
|
}
|
|
|
|
//
|
|
//
|
|
// STORE ROUTINES
|
|
// convert BGRA to RGB332, look up in table
|
|
//
|
|
|
|
//#define PALETTE_MATCH(pixIn,ppalInfo) \
|
|
//{ \
|
|
// pixIn.ul = ppalInfo->pxlate332[ \
|
|
// ((pixIn.pix.r & 0xe0)) | \
|
|
// ((pixIn.pix.g & 0xe0) >> 3) | \
|
|
// ((pixIn.pix.b & 0xc0) >> 6)]; \
|
|
//} \
|
|
|
|
/**************************************************************************\
|
|
* vConvertAndSaveBGRATo8
|
|
*
|
|
*
|
|
* Arguments:
|
|
*
|
|
*
|
|
*
|
|
* Return Value:
|
|
*
|
|
*
|
|
*
|
|
* History:
|
|
*
|
|
* 1/22/1997 Mark Enstrom [marke]
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vConvertAndSaveBGRAToDest(
|
|
PBYTE pDst,
|
|
PULONG pulSrc,
|
|
LONG cx,
|
|
LONG DstX,
|
|
LONG y,
|
|
PVOID pvdibInfoDst,
|
|
PBYTE pWriteMask,
|
|
HDC hdc32
|
|
)
|
|
{
|
|
PDIBINFO pDibInfo = (PDIBINFO)pvdibInfoDst;
|
|
|
|
BitBlt(pDibInfo->hdc,
|
|
pDibInfo->rclBoundsTrim.left,
|
|
pDibInfo->rclBoundsTrim.top + y,
|
|
pDibInfo->rclBoundsTrim.right - pDibInfo->rclBoundsTrim.left,
|
|
1,
|
|
hdc32,
|
|
0,
|
|
0,
|
|
SRCCOPY);
|
|
}
|
|
|
|
/**************************************************************************\
|
|
* vConvertAndSaveBGRAToRGB16_565
|
|
*
|
|
*
|
|
* Arguments:
|
|
*
|
|
*
|
|
*
|
|
* Return Value:
|
|
*
|
|
*
|
|
*
|
|
* History:
|
|
*
|
|
* 1/22/1997 Mark Enstrom [marke]
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vConvertAndSaveBGRAToRGB16_565(
|
|
PBYTE pjDst,
|
|
PULONG pulSrc,
|
|
LONG cx,
|
|
LONG DstX,
|
|
LONG y,
|
|
PVOID pvdibInfoDst,
|
|
PBYTE pWriteMask,
|
|
HDC hdc32
|
|
)
|
|
{
|
|
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,
|
|
LONG y,
|
|
PVOID pvdibInfoDst,
|
|
PBYTE pWriteMask,
|
|
HDC hdc32
|
|
)
|
|
{
|
|
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++;
|
|
}
|
|
}
|
|
|
|
/**************************************************************************\
|
|
* vConvertAndSaveBGRAToRGB24
|
|
*
|
|
*
|
|
* Arguments:
|
|
*
|
|
*
|
|
*
|
|
* Return Value:
|
|
*
|
|
*
|
|
*
|
|
* History:
|
|
*
|
|
* 1/22/1997 Mark Enstrom [marke]
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vConvertAndSaveBGRAToRGB24(
|
|
PBYTE pDst,
|
|
PULONG pulSrc,
|
|
LONG cx,
|
|
LONG DstX,
|
|
LONG y,
|
|
PVOID pvdibInfoDst,
|
|
PBYTE pWriteMask,
|
|
HDC hdc32
|
|
)
|
|
{
|
|
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;
|
|
}
|
|
}
|
|
|
|
/**************************************************************************\
|
|
* vConvertAndSaveBGRAToRGB32
|
|
*
|
|
*
|
|
* Arguments:
|
|
*
|
|
*
|
|
*
|
|
* Return Value:
|
|
*
|
|
*
|
|
*
|
|
* History:
|
|
*
|
|
* 1/22/1997 Mark Enstrom [marke]
|
|
*
|
|
\**************************************************************************/
|
|
|
|
VOID
|
|
vConvertAndSaveBGRAToRGB32(
|
|
PBYTE pjDst,
|
|
PULONG pulSrc,
|
|
LONG cx,
|
|
LONG DstX,
|
|
LONG y,
|
|
PVOID pvdibInfoDst,
|
|
PBYTE pWriteMask,
|
|
HDC hdc32
|
|
)
|
|
{
|
|
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++;
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|