reactos/win32ss/gdi/diblib/BitBlt_SRCCOPY.c

75 lines
1.9 KiB
C

#include "DibLib.h"
VOID
FASTCALL
Dib_BitBlt_SRCCOPY_EqSurf(PBLTDATA pBltData)
{
ULONG cLines, cjWidth;
PBYTE pjDestBase = pBltData->siDst.pjBase;
PBYTE pjSrcBase = pBltData->siSrc.pjBase;
/* Calculate the width in bytes */
cjWidth = pBltData->ulWidth * pBltData->siDst.jBpp / 8;
/* Loop all lines */
cLines = pBltData->ulHeight;
while (cLines--)
{
memcpy(pjDestBase, pjSrcBase, cjWidth);
pjDestBase += pBltData->siDst.cjAdvanceY;
pjSrcBase += pBltData->siSrc.cjAdvanceY;
}
}
#define Dib_BitBlt_SRCCOPY_S8_D8_EqSurf Dib_BitBlt_SRCCOPY_EqSurf
#define Dib_BitBlt_SRCCOPY_S16_D16_EqSurf Dib_BitBlt_SRCCOPY_EqSurf
#define Dib_BitBlt_SRCCOPY_S24_D24_EqSurf Dib_BitBlt_SRCCOPY_EqSurf
/* special movsd optimization on x86 */
#if defined(_M_IX86) || defined(_M_AMD64)
VOID
FASTCALL
Dib_BitBlt_SRCCOPY_S32_D32_EqSurf(PBLTDATA pBltData)
{
ULONG cLines, cRows = pBltData->ulWidth;
PBYTE pjDestBase = pBltData->siDst.pjBase;
PBYTE pjSrcBase = pBltData->siSrc.pjBase;
/* Loop all lines */
cLines = pBltData->ulHeight;
while (cLines--)
{
__movsd((PULONG)pjDestBase, (PULONG)pjSrcBase, cRows);
pjDestBase += pBltData->siDst.cjAdvanceY;
pjSrcBase += pBltData->siSrc.cjAdvanceY;
}
}
#define Dib_BitBlt_SRCCOPY_S32_D32_EqSurf_manual 1
#else
#define Dib_BitBlt_SRCCOPY_S32_D32_EqSurf Dib_BitBlt_SRCCOPY_EqSurf
#endif
/* This definition will be checked against in DibLib_BitBlt.h
for all "redirected" functions */
#define Dib_BitBlt_SRCCOPY_EqSurf_manual 1
#define __USES_SOURCE 1
#define __USES_PATTERN 0
#define __USES_DEST 0
#define __USES_MASK 0
#define __FUNCTIONNAME BitBlt_SRCCOPY
#define _DibDoRop(pBltData, M, D, S, P) ROP_SRCCOPY(D,S,P)
#include "DibLib_AllSrcBPP.h"
VOID
FASTCALL
Dib_BitBlt_SRCCOPY(PBLTDATA pBltData)
{
gapfnBitBlt_SRCCOPY[pBltData->siDst.iFormat][pBltData->siSrc.iFormat](pBltData);
}