|
|
#include "precomp.hxx"
void Blt16to16_NoBlend_NoTrans_Hcopy_SRCCOPY_Vcopy( WORD* pwSrcScanLine, int iSrcScanStride, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows) { WORD *pwSrcPixel, *pwDstPixel, *pwEndDstPixel, *pwEndDstScanLine;
// set up pointer to next dst scanline beyond last
pwEndDstScanLine = pwDstScanLine + iNumDstRows * iDstScanStride;
while (pwDstScanLine != pwEndDstScanLine) {
// set up pointers to the first pixels
// on src and dst scanlines, and next
// pixel after last on dst scanline
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine; pwEndDstPixel = pwDstPixel + iNumDstCols;
// copy scanline one pixel at a time
while (pwDstPixel != pwEndDstPixel) { *pwDstPixel++ = *pwSrcPixel++; }
// advance to next scanline
pwSrcScanLine += iSrcScanStride; pwDstScanLine += iDstScanStride; } }
void Blt16to16_NoBlend_NoTrans_Hcopy_SRCCOPY_NoVcopy( WORD* pwSrcScanLine, int iSrcScanStride, int iNumSrcRows, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows) { WORD *pwSrcPixel, *pwDstPixel, *pwEndDstPixel; int iVertError = 0, iVertAdvanceError, iSrcScanAdvance; // compute advance and error terms for stepping
// vertically through the src bitmap
if (iNumSrcRows < iNumDstRows) { iSrcScanAdvance = 0; iVertAdvanceError = iNumSrcRows; } else { iSrcScanAdvance = iSrcScanStride * (iNumSrcRows / iNumDstRows); iVertAdvanceError = iNumSrcRows % iNumDstRows; }
for (int i = 0; i < iNumDstRows; i++) {
// set up pointers to first pixels on src and dst
// scanlines, and next pixel after last on dst
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine; pwEndDstPixel = pwDstPixel + iNumDstCols;
// copy scanline one pixel at a time
while (pwDstPixel != pwEndDstPixel) { *pwDstPixel++ = *pwSrcPixel++; }
// advance to next scanline
pwSrcScanLine += iSrcScanAdvance; pwDstScanLine += iDstScanStride;
// update and check vertical stepping error,
// adjust src scanline pointer if necessary
iVertError += iVertAdvanceError; if (iVertError >= iNumDstRows) { pwSrcScanLine += iSrcScanStride; iVertError -= iNumDstRows; } } }
void Blt16to16_NoBlend_NoTrans_NoHcopy_SRCCOPY( WORD* pwSrcScanLine, int iSrcScanStride, int iNumSrcCols, int iNumSrcRows, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, int iHorizMirror) { WORD *pwSrcPixel, *pwDstPixel; int iVertError = 0, iVertAdvanceError, iSrcScanAdvance, iHorizError, iHorizAdvanceError, iSrcPixelAdvance; // compute advance and error terms for stepping
// vertically through the src bitmap
if (iNumSrcRows < iNumDstRows) { iSrcScanAdvance = 0; iVertAdvanceError = iNumSrcRows; } else { iSrcScanAdvance = iSrcScanStride * (iNumSrcRows / iNumDstRows); iVertAdvanceError = iNumSrcRows % iNumDstRows; }
// compute advance and error terms for stepping
// horizontally through src bitmap
if (iNumSrcCols < iNumDstCols) { iSrcPixelAdvance = 0; iHorizAdvanceError = iNumSrcCols; } else { iSrcPixelAdvance = iNumSrcCols / iNumDstCols; iHorizAdvanceError = iNumSrcCols % iNumDstCols; }
for (int i = 0; i < iNumDstRows; i++) {
// set pointers to the beginning of src and dst scanlines,
// clear horizontal stepping error accumulator
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine; iHorizError = 0;
for (int j = 0; j < iNumDstCols; j++) {
// copy a pixel
*pwDstPixel = *pwSrcPixel;
// advance to next pixel
pwSrcPixel += iSrcPixelAdvance; pwDstPixel += iHorizMirror;
// update and check horizontal stepping error,
// adjust src pixel pointer if necessary
iHorizError += iHorizAdvanceError; if (iHorizError >= iNumDstCols) { pwSrcPixel++; iHorizError -= iNumDstCols; } }
// advance to next scanline
pwSrcScanLine += iSrcScanAdvance; pwDstScanLine += iDstScanStride;
// update and check vertical stepping error,
// adjust src scanline pointer if necessary
iVertError += iVertAdvanceError; if (iVertError >= iNumDstRows) { pwSrcScanLine += iSrcScanStride; iVertError -= iNumDstRows; } } }
void Blt16to16_NoBlend_Trans_Hcopy_SRCCOPY( WORD* pwSrcScanLine, int iSrcScanStride, int iNumSrcRows, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, WORD wTransparentColor) { WORD *pwSrcPixel, *pwDstPixel; int iVertError = 0, iVertAdvanceError, iSrcScanAdvance; // compute advance and error terms for stepping
// vertically through the src bitmap
if (iNumSrcRows < iNumDstRows) { iSrcScanAdvance = 0; iVertAdvanceError = iNumSrcRows; } else { iSrcScanAdvance = iSrcScanStride * (iNumSrcRows / iNumDstRows); iVertAdvanceError = iNumSrcRows % iNumDstRows; }
for (int i = 0; i < iNumDstRows; i++) {
// set pointers to beginning of src and dest scanlines
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine;
for (int j = 0; j < iNumDstCols; j++) { // only copy pixel if it's not transparent
if (*pwSrcPixel != wTransparentColor) { *pwDstPixel = *pwSrcPixel; } pwSrcPixel++; pwDstPixel++; }
// advance to next scanline
pwSrcScanLine += iSrcScanAdvance; pwDstScanLine += iDstScanStride;
// update and check vertical stepping error,
// adjust src scanline pointer if necessary
iVertError += iVertAdvanceError; if (iVertError >= iNumDstRows) { pwSrcScanLine += iSrcScanStride; iVertError -= iNumDstRows; } } }
void Blt16to16_NoBlend_Trans_NoHcopy_SRCCOPY( WORD* pwSrcScanLine, int iSrcScanStride, int iNumSrcCols, int iNumSrcRows, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, int iHorizMirror, WORD wTransparentColor) { WORD *pwSrcPixel, *pwDstPixel; int iVertError = 0, iVertAdvanceError, iSrcScanAdvance, iHorizError, iHorizAdvanceError, iSrcPixelAdvance; // compute advance and error terms for stepping
// vertically through the src bitmap
if (iNumSrcRows < iNumDstRows) { iSrcScanAdvance = 0; iVertAdvanceError = iNumSrcRows; } else { iSrcScanAdvance = iSrcScanStride * (iNumSrcRows / iNumDstRows); iVertAdvanceError = iNumSrcRows % iNumDstRows; }
// compute advance and error terms for stepping
// horizontally through src bitmap
if (iNumSrcCols < iNumDstCols) { iSrcPixelAdvance = 0; iHorizAdvanceError = iNumSrcCols; } else { iSrcPixelAdvance = iNumSrcCols / iNumDstCols; iHorizAdvanceError = iNumSrcCols % iNumDstCols; }
for (int i = 0; i < iNumDstRows; i++) {
// set pointers to the beginning of src and dst scanlines,
// clear horizontal stepping error accumulator
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine; iHorizError = 0;
for (int j = 0; j < iNumDstCols; j++) {
// only copy pixel if it's not transparent
if (*pwSrcPixel != wTransparentColor) { *pwDstPixel = *pwSrcPixel; }
// advance to next pixel
pwSrcPixel += iSrcPixelAdvance; pwDstPixel += iHorizMirror;
// update and check horizontal stepping error,
// adjust src pixel pointer if necessary
iHorizError += iHorizAdvanceError; if (iHorizError >= iNumDstCols) { pwSrcPixel++; iHorizError -= iNumDstCols; } }
// advance to next scanline
pwSrcScanLine += iSrcScanAdvance; pwDstScanLine += iDstScanStride;
// update and check vertical stepping error,
// adjust src scanline pointer if necessary
iVertError += iVertAdvanceError; if (iVertError >= iNumDstRows) { pwSrcScanLine += iSrcScanStride; iVertError -= iNumDstRows; } } } #ifndef DDRAW
void Blt16to16_Blend_NoTrans_Hcopy_SRCCOPY( WORD* pwSrcScanLine, int iSrcScanStride, int iNumSrcRows, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, ALPHAREF arAlpha) { WORD *pwSrcPixel, *pwDstPixel, *pwEndDstPixel; int iVertError = 0, iVertAdvanceError, iSrcScanAdvance; UINT uiAlpha = (UINT)ALPHAFROMDWORD(arAlpha), uiAlphaComp = 256 - uiAlpha; // compute advance and error terms for stepping
// vertically through the src bitmap
if (iNumSrcRows < iNumDstRows) { iSrcScanAdvance = 0; iVertAdvanceError = iNumSrcRows; } else { iSrcScanAdvance = iSrcScanStride * (iNumSrcRows / iNumDstRows); iVertAdvanceError = iNumSrcRows % iNumDstRows; }
for (int i = 0; i < iNumDstRows; i++) {
// set up pointers to first pixels on src and dst
// scanlines, and next pixel after last on dst
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine; pwEndDstPixel = pwDstPixel + iNumDstCols;
// copy scanline one pixel at a time
while (pwDstPixel != pwEndDstPixel) { *pwDstPixel++ = BLIT_BLEND16(*pwSrcPixel,*pwDstPixel, uiAlpha,uiAlphaComp); pwSrcPixel++; }
// advance to next scanline
pwSrcScanLine += iSrcScanAdvance; pwDstScanLine += iDstScanStride;
// update and check vertical stepping error,
// adjust src scanline pointer if necessary
iVertError += iVertAdvanceError; if (iVertError >= iNumDstRows) { pwSrcScanLine += iSrcScanStride; iVertError -= iNumDstRows; } } }
void Blt16to16_Blend_NoTrans_NoHcopy_SRCCOPY( WORD* pwSrcScanLine, int iSrcScanStride, int iNumSrcCols, int iNumSrcRows, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, int iHorizMirror, ALPHAREF arAlpha) { WORD *pwSrcPixel, *pwDstPixel; int iVertError = 0, iVertAdvanceError, iSrcScanAdvance, iHorizError, iHorizAdvanceError, iSrcPixelAdvance; UINT uiAlpha = (UINT)ALPHAFROMDWORD(arAlpha), uiAlphaComp = 256 - uiAlpha; // compute advance and error terms for stepping
// vertically through the src bitmap
if (iNumSrcRows < iNumDstRows) { iSrcScanAdvance = 0; iVertAdvanceError = iNumSrcRows; } else { iSrcScanAdvance = iSrcScanStride * (iNumSrcRows / iNumDstRows); iVertAdvanceError = iNumSrcRows % iNumDstRows; }
// compute advance and error terms for stepping
// horizontally through src bitmap
if (iNumSrcCols < iNumDstCols) { iSrcPixelAdvance = 0; iHorizAdvanceError = iNumSrcCols; } else { iSrcPixelAdvance = iNumSrcCols / iNumDstCols; iHorizAdvanceError = iNumSrcCols % iNumDstCols; }
for (int i = 0; i < iNumDstRows; i++) {
// set pointers to the beginning of src and dst scanlines,
// clear horizontal stepping error accumulator
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine; iHorizError = 0;
for (int j = 0; j < iNumDstCols; j++) {
// copy a pixel
*pwDstPixel = BLIT_BLEND16(*pwSrcPixel,*pwDstPixel, uiAlpha,uiAlphaComp);
// advance to next pixel
pwSrcPixel += iSrcPixelAdvance; pwDstPixel += iHorizMirror;
// update and check horizontal stepping error,
// adjust src pixel pointer if necessary
iHorizError += iHorizAdvanceError; if (iHorizError >= iNumDstCols) { pwSrcPixel++; iHorizError -= iNumDstCols; } }
// advance to next scanline
pwSrcScanLine += iSrcScanAdvance; pwDstScanLine += iDstScanStride;
// update and check vertical stepping error,
// adjust src scanline pointer if necessary
iVertError += iVertAdvanceError; if (iVertError >= iNumDstRows) { pwSrcScanLine += iSrcScanStride; iVertError -= iNumDstRows; } } }
void Blt16to16_Blend_Trans_Hcopy_SRCCOPY( WORD* pwSrcScanLine, int iSrcScanStride, int iNumSrcRows, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, WORD wTransparentColor, ALPHAREF arAlpha) { WORD *pwSrcPixel, *pwDstPixel; int iVertError = 0, iVertAdvanceError, iSrcScanAdvance; UINT uiAlpha = (UINT)ALPHAFROMDWORD(arAlpha), uiAlphaComp = 256 - uiAlpha; // compute advance and error terms for stepping
// vertically through the src bitmap
if (iNumSrcRows < iNumDstRows) { iSrcScanAdvance = 0; iVertAdvanceError = iNumSrcRows; } else { iSrcScanAdvance = iSrcScanStride * (iNumSrcRows / iNumDstRows); iVertAdvanceError = iNumSrcRows % iNumDstRows; }
for (int i = 0; i < iNumDstRows; i++) {
// set pointers to beginning of src and dest scanlines
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine;
for (int j = 0; j < iNumDstCols; j++) { // only copy pixel if it's not transparent
if (*pwSrcPixel != wTransparentColor) { *pwDstPixel = BLIT_BLEND16(*pwSrcPixel,*pwDstPixel, uiAlpha,uiAlphaComp); } pwSrcPixel++; pwDstPixel++; }
// advance to next scanline
pwSrcScanLine += iSrcScanAdvance; pwDstScanLine += iDstScanStride;
// update and check vertical stepping error,
// adjust src scanline pointer if necessary
iVertError += iVertAdvanceError; if (iVertError >= iNumDstRows) { pwSrcScanLine += iSrcScanStride; iVertError -= iNumDstRows; } } }
void Blt16to16_Blend_Trans_NoHcopy_SRCCOPY( WORD* pwSrcScanLine, int iSrcScanStride, int iNumSrcCols, int iNumSrcRows, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, int iHorizMirror, WORD wTransparentColor, ALPHAREF arAlpha) { WORD *pwSrcPixel, *pwDstPixel; int iVertError = 0, iVertAdvanceError, iSrcScanAdvance, iHorizError, iHorizAdvanceError, iSrcPixelAdvance; UINT uiAlpha = (UINT)ALPHAFROMDWORD(arAlpha), uiAlphaComp = 256 - uiAlpha; // compute advance and error terms for stepping
// vertically through the src bitmap
if (iNumSrcRows < iNumDstRows) { iSrcScanAdvance = 0; iVertAdvanceError = iNumSrcRows; } else { iSrcScanAdvance = iSrcScanStride * (iNumSrcRows / iNumDstRows); iVertAdvanceError = iNumSrcRows % iNumDstRows; }
// compute advance and error terms for stepping
// horizontally through src bitmap
if (iNumSrcCols < iNumDstCols) { iSrcPixelAdvance = 0; iHorizAdvanceError = iNumSrcCols; } else { iSrcPixelAdvance = iNumSrcCols / iNumDstCols; iHorizAdvanceError = iNumSrcCols % iNumDstCols; }
for (int i = 0; i < iNumDstRows; i++) {
// set pointers to the beginning of src and dst scanlines,
// clear horizontal stepping error accumulator
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine; iHorizError = 0;
for (int j = 0; j < iNumDstCols; j++) {
// only copy pixel if it's not transparent
if (*pwSrcPixel != wTransparentColor) { *pwDstPixel = BLIT_BLEND16(*pwSrcPixel,*pwDstPixel, uiAlpha,uiAlphaComp); }
// advance to next pixel
pwSrcPixel += iSrcPixelAdvance; pwDstPixel += iHorizMirror;
// update and check horizontal stepping error,
// adjust src pixel pointer if necessary
iHorizError += iHorizAdvanceError; if (iHorizError >= iNumDstCols) { pwSrcPixel++; iHorizError -= iNumDstCols; } }
// advance to next scanline
pwSrcScanLine += iSrcScanAdvance; pwDstScanLine += iDstScanStride;
// update and check vertical stepping error,
// adjust src scanline pointer if necessary
iVertError += iVertAdvanceError; if (iVertError >= iNumDstRows) { pwSrcScanLine += iSrcScanStride; iVertError -= iNumDstRows; } } } #endif
//
// The following blits are included with the 16bpp blits because they are
// entensions of them. The only difference between these blits and the
// regular 16bpp blits is that these blits only use an 8bpp palette index
// for the transparent color. The rest of the blit is exactly the same.
//
void Blt08Ato08A_NoBlend_Trans_Hcopy_SRCCOPY( WORD* pwSrcScanLine, int iSrcScanStride, int iNumSrcRows, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, BYTE bTransparentColor) { WORD *pwSrcPixel, *pwDstPixel; int iVertError = 0, iVertAdvanceError, iSrcScanAdvance; // compute advance and error terms for stepping
// vertically through the src bitmap
if (iNumSrcRows < iNumDstRows) { iSrcScanAdvance = 0; iVertAdvanceError = iNumSrcRows; } else { iSrcScanAdvance = iSrcScanStride * (iNumSrcRows / iNumDstRows); iVertAdvanceError = iNumSrcRows % iNumDstRows; }
for (int i = 0; i < iNumDstRows; i++) {
// set pointers to beginning of src and dest scanlines
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine;
for (int j = 0; j < iNumDstCols; j++) { // only copy pixel if it's not transparent
if ((BYTE)*pwSrcPixel != bTransparentColor) { *pwDstPixel = *pwSrcPixel; } pwSrcPixel++; pwDstPixel++; }
// advance to next scanline
pwSrcScanLine += iSrcScanAdvance; pwDstScanLine += iDstScanStride;
// update and check vertical stepping error,
// adjust src scanline pointer if necessary
iVertError += iVertAdvanceError; if (iVertError >= iNumDstRows) { pwSrcScanLine += iSrcScanStride; iVertError -= iNumDstRows; } } }
void Blt08Ato08A_NoBlend_Trans_NoHcopy_SRCCOPY( WORD* pwSrcScanLine, int iSrcScanStride, int iNumSrcCols, int iNumSrcRows, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, int iHorizMirror, BYTE bTransparentColor) { WORD *pwSrcPixel, *pwDstPixel; int iVertError = 0, iVertAdvanceError, iSrcScanAdvance, iHorizError, iHorizAdvanceError, iSrcPixelAdvance; // compute advance and error terms for stepping
// vertically through the src bitmap
if (iNumSrcRows < iNumDstRows) { iSrcScanAdvance = 0; iVertAdvanceError = iNumSrcRows; } else { iSrcScanAdvance = iSrcScanStride * (iNumSrcRows / iNumDstRows); iVertAdvanceError = iNumSrcRows % iNumDstRows; }
// compute advance and error terms for stepping
// horizontally through src bitmap
if (iNumSrcCols < iNumDstCols) { iSrcPixelAdvance = 0; iHorizAdvanceError = iNumSrcCols; } else { iSrcPixelAdvance = iNumSrcCols / iNumDstCols; iHorizAdvanceError = iNumSrcCols % iNumDstCols; }
for (int i = 0; i < iNumDstRows; i++) {
// set pointers to the beginning of src and dst scanlines,
// clear horizontal stepping error accumulator
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine; iHorizError = 0;
for (int j = 0; j < iNumDstCols; j++) {
// only copy pixel if it's not transparent
if ((BYTE)*pwSrcPixel != bTransparentColor) { *pwDstPixel = *pwSrcPixel; }
// advance to next pixel
pwSrcPixel += iSrcPixelAdvance; pwDstPixel += iHorizMirror;
// update and check horizontal stepping error,
// adjust src pixel pointer if necessary
iHorizError += iHorizAdvanceError; if (iHorizError >= iNumDstCols) { pwSrcPixel++; iHorizError -= iNumDstCols; } }
// advance to next scanline
pwSrcScanLine += iSrcScanAdvance; pwDstScanLine += iDstScanStride;
// update and check vertical stepping error,
// adjust src scanline pointer if necessary
iVertError += iVertAdvanceError; if (iVertError >= iNumDstRows) { pwSrcScanLine += iSrcScanStride; iVertError -= iNumDstRows; } } }
///////////////////////////////////////////////////////////////////////
//
// Private Blt16to16_LeftToRight_BottomToTop_SRCOPY -
// BitBlit from source bitmap to destination bitmap (where these
// bitmaps overlap) by walking both the source and destination
// from left to right and bottom to top
//
// Parameters:
// pSrcScanLine Pointer to the first Source scan line
// iSrcScanStride The Source scan stride
// pDstScanLine Pointer to the first Destination scan line
// iDstScanStride The Destination scan stride
// iNumDstCols Number of destination columns
// iNumDstRows Number of destination rows
//
// Return Value:
// NO_ERROR or E_* value as specified in the .H file.
//
///////////////////////////////////////////////////////////////////////
void Blt16to16_LeftToRight_BottomToTop_SRCCOPY(WORD* pwSrcScanLine, int iSrcScanStride, WORD* pwDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows) { WORD *pwSrcPixel, *pwDstPixel, *pwEndDstPixel;
for (int i = 0; i < iNumDstRows; i++) {
// set up pointers to the first pixels
// on src and dst scanlines, and next
// pixel after last on dst scanline
pwSrcPixel = pwSrcScanLine; pwDstPixel = pwDstScanLine; pwEndDstPixel = pwDstPixel + iNumDstCols;
// copy scanline one pixel at a time
while (pwDstPixel != pwEndDstPixel) { *pwDstPixel++ = *pwSrcPixel++; }
// advance to next scanline
pwSrcScanLine -= iSrcScanStride; pwDstScanLine -= iDstScanStride; } }
///////////////////////////////////////////////////////////////////////
//
// Private Blt16to16_RightToLeft_TopToBottom_SRCOPY -
// BitBlit from source bitmap to destination bitmap (where these
// bitmaps overlap) by walking both the source and destination
// from right to left and top to bottom
//
// Parameters:
// pSrcScanLine Pointer to the first Source scan line
// iSrcScanStride The Source scan stride
// pDstScanLine Pointer to the first Destination scan line
// iDstScanStride The Destination scan stride
// iNumDstCols Number of destination columns
// iNumDstRows Number of destination rows
//
// Return Value:
// NO_ERROR or E_* value as specified in the .H file.
//
///////////////////////////////////////////////////////////////////////
void Blt16to16_RightToLeft_TopToBottom_SRCCOPY(WORD* pSrcScanLine, int iSrcScanStride, WORD* pDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows) { WORD *pSrcPixel, *pDstPixel; for (int i = 0; i < iNumDstRows; i++) {
// set pointers to beginning of src and dest scanlines
pSrcPixel = pSrcScanLine; pDstPixel = pDstScanLine;
for (int j = 0; j < iNumDstCols; j++) *pDstPixel-- = *pSrcPixel--;
// advance to next scanline
pSrcScanLine += iSrcScanStride; pDstScanLine += iDstScanStride;
} }
///////////////////////////////////////////////////////////////////////
//
// Private Blt16to16_LeftToRight_BottomToTop_Trans_SRCCOPY -
// BitBlit using a transparent color index from source bitmap to
// destination bitmap (where these bitmaps overlap) by walking
// both the source and destination from left to right and bottom
// to top
//
// Parameters:
// pSrcScanLine Pointer to the first Source scan line
// iSrcScanStride The Source scan stride
// pDstScanLine Pointer to the first Destination scan line
// iDstScanStride The Destination scan stride
// iNumDstCols Number of destination columns
// iNumDstRows Number of destination rows
// bTransparentIndex Palette Index of the transparent color
//
// Return Value:
// NO_ERROR or E_* value as specified in the .H file.
//
///////////////////////////////////////////////////////////////////////
void Blt16to16_LeftToRight_BottomToTop_Trans_SRCCOPY(WORD* pSrcScanLine, int iSrcScanStride, WORD* pDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, WORD wTransparentIndex) { WORD *pSrcPixel, *pDstPixel; for (int i = 0; i < iNumDstRows; i++) {
// set pointers to beginning of src and dest scanlines
pSrcPixel = pSrcScanLine; pDstPixel = pDstScanLine;
for (int j = 0; j < iNumDstCols; j++) { // only copy pixel if it's not transparent
if (*pSrcPixel != wTransparentIndex) { *pDstPixel = *pSrcPixel; } pSrcPixel++; pDstPixel++; }
// advance to next scanline
pSrcScanLine -= iSrcScanStride; pDstScanLine -= iDstScanStride;
} }
///////////////////////////////////////////////////////////////////////
//
// Private Blt16to16_RightToLeft_TopToBottom_Trans_SRCOPY -
// BitBlit using a transparent color index from source bitmap to
// destination bitmap (where these bitmaps overlap) by walking
// both the source and destination from right to left and top
// to bottom
//
// Parameters:
// pSrcScanLine Pointer to the first Source scan line
// iSrcScanStride The Source scan stride
// pDstScanLine Pointer to the first Destination scan line
// iDstScanStride The Destination scan stride
// iNumDstCols Number of destination columns
// iNumDstRows Number of destination rows
// bTransparentIndex Palette Index of the transparent color
//
// Return Value:
// NO_ERROR or E_* value as specified in the .H file.
//
///////////////////////////////////////////////////////////////////////
void Blt16to16_RightToLeft_TopToBottom_Trans_SRCCOPY(WORD* pSrcScanLine, int iSrcScanStride, WORD* pDstScanLine, int iDstScanStride, int iNumDstCols, int iNumDstRows, WORD wTransparentIndex) { WORD *pSrcPixel, *pDstPixel; for (int i = 0; i < iNumDstRows; i++) {
// set pointers to beginning of src and dest scanlines
pSrcPixel = pSrcScanLine; pDstPixel = pDstScanLine;
for (int j = 0; j < iNumDstCols; j++) { // only copy pixel if it's not transparent
if (*pSrcPixel != wTransparentIndex) { *pDstPixel = *pSrcPixel; } pSrcPixel--; pDstPixel--; }
// advance to next scanline
pSrcScanLine += iSrcScanStride; pDstScanLine += iDstScanStride;
} }
|