home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacFormat 1999 Spring
/
macformat-077.iso
/
Shareware Plus
/
Development
/
SpriteWorld 2.2
/
SpriteWorld files
/
Sources
/
BlitPixieAllBit.c
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
NeXTSTEP
RISC OS/Acorn
UTF-8
Wrap
Text File
|
1999-01-14
|
50.0 KB
|
2,078 lines
|
[
TEXT/CWIE
]
///--------------------------------------------------------------------------------------
// BlitPixieAllBit.c
//
// By Christofer Åkersten (chris@basesoft.se)
//
// Ideas and code snippets from
// Tony Myles, Ben Sharpe, Brigham Stevens, Sean Callahan, and Joe Britt
//
// Description: Implementation of a depth-independent BlitPixie
//
//
// Simple PPC Version by Brian Roddy. Note PPC version only deals properly with 8-bit
// color or higher. Lower bit depths will work but will be misaligned. This is because
// lower depth blitters require a bunch of bit shifting and aligning which I'm too
// lazy to write. Besides, PPC handles 8-bit fast enough that you probably won't
// need to use less than 256 colors.
//
// Anders Björklund cleaned up the mess that Brian left :-)
// It has the same limits as above, though.
//
///--------------------------------------------------------------------------------------
#ifndef __BLITPIXIE__
#include "BlitPixie.h"
#endif
#ifndef __SWCOMMON__
#include "SWCommonHeaders.h"
#endif
#ifndef __SPRITEWORLDUTILS__
#include "SpriteWorldUtils.h"
#endif
#ifndef __TOOLUTILS__
#include <ToolUtils.h>
#endif
#ifndef __OSUTILS__
#include <OSUtils.h>
#endif
#ifndef __QUICKDRAW__
#include <Quickdraw.h>
#endif
#ifndef __QDOFFSCREEN__
#include <QDOffscreen.h>
#endif
#ifndef __SPRITEFRAME__
#include "SpriteFrame.h"
#endif
const short bpla[] = {
5,
4,
0, 3,
0, 0, 0, 2,
0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//BITSHIFT PER LONGWORD
#define BPL(f1, f2, b1, b2) \
{ \
int pixelSize = (*f1->framePort->portPixMap)->pixelSize; \
if (pixelSize != (*f2->framePort->portPixMap)->pixelSize) \
return; \
b1 = bpla[pixelSize - 1]; \
b2 = 5 - b1; \
}
// i.e:
// Depth=1 b1=5 b2=0 (32 pixels per long, 1 bit per pixel)
// Depth=2 b1=4 b2=1 (16 pixels per long, 2 bits per pixel)
// Depth=4 b1=3 b2=2 (8 pixels per long, 4 bits per pixel)
// Depth=8 b1=2 b2=3 (4 pixels per long, 8 bits per pixel)
// Depth=16 b1=1 b2=4 (2 pixels per long, 16 bits per pixel)
// Depth=32 b1=0 b2=5 (1 pixel per long, 32 bits per pixel)
// generic all-bit routine:
//void BlitPixieAllBit(
// PixelPtr srcPixelP, start of first pixel (aligned left to longword boundary)
// PixelPtr dstPixelP,
// long rowsToCopy, number of rows
// long numBytesPerRow, number of bytes per row, always a multiple of four
// unsigned long srcRowStride, offset from end of line to next row / rowbytes on PPC
// unsigned long dstRowStride,
// unsigned long srcExtraStart, bits to copy/shift before longs (maximum 31 bits)
// unsigned long dstExtraStart,
// unsigned long dstExtraEnd); bits to copy/shift after longs
extern SInt8 gSWmmuMode;
///--------------------------------------------------------------------------------------
// BlitPixieRectDrawProc
///--------------------------------------------------------------------------------------
SW_FUNC void BlitPixieAllBitRectDrawProc(
FramePtr srcFrameP,
FramePtr dstFrameP,
Rect* srcRect,
Rect* dstRect)
{
Rect srcBlitRect = *srcRect;
Rect dstBlitRect = *dstRect;
unsigned long numBytesPerRow;
short b1, b2;
SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
BP_CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
BPL(srcFrameP, dstFrameP, b1, b2);
START_32_BIT_MODE
numBytesPerRow =
((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
BlitPixieAllBit(
(PixelChunkPtr)(srcFrameP->frameBaseAddr +
(srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
((srcBlitRect.left >> b1) * sizeof(long))),
(PixelChunkPtr)(dstFrameP->frameBaseAddr +
(dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
((dstBlitRect.left >> b1) * sizeof(long))),
dstBlitRect.bottom - dstBlitRect.top,
numBytesPerRow,
#if SW_PPC
srcFrameP->frameRowBytes,
dstFrameP->frameRowBytes,
#else
srcFrameP->frameRowBytes - numBytesPerRow,
dstFrameP->frameRowBytes - numBytesPerRow,
#endif
(srcBlitRect.left << b2) & 0x1F,
((dstFrameP->worldRectOffset << b2) & 0x1F) + ((dstBlitRect.left << b2) & 0x1F),
((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
);
END_32_BIT_MODE
}
///--------------------------------------------------------------------------------------
// BPAllBitInterlacedRectDrawProc
///--------------------------------------------------------------------------------------
SW_FUNC void BPAllBitInterlacedRectDrawProc(
FramePtr srcFrameP,
FramePtr dstFrameP,
Rect* srcRect,
Rect* dstRect)
{
Rect srcBlitRect = *srcRect;
Rect dstBlitRect = *dstRect;
unsigned long numBytesPerRow;
unsigned long numRowsToCopy;
short b1, b2;
SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
BP_CLIP_RECT_INTERLACED(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
BPL(srcFrameP, dstFrameP, b1, b2);
// Is destBlitRect height an even number?
numRowsToCopy = dstBlitRect.bottom - dstBlitRect.top;
numRowsToCopy = (numRowsToCopy >> 1) + (numRowsToCopy & 1);
if (numRowsToCopy < 1)
return;
START_32_BIT_MODE
numBytesPerRow =
((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
BlitPixieAllBit(
(PixelChunkPtr)(srcFrameP->frameBaseAddr +
(srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
((srcBlitRect.left >> b1) * sizeof(long))),
(PixelChunkPtr)(dstFrameP->frameBaseAddr +
(dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
((dstBlitRect.left >> b1) * sizeof(long))),
numRowsToCopy,
numBytesPerRow,
#if SW_PPC
(srcFrameP->frameRowBytes << 1),
(dstFrameP->frameRowBytes << 1),
#else
(srcFrameP->frameRowBytes << 1) - numBytesPerRow,
(dstFrameP->frameRowBytes << 1) - numBytesPerRow,
#endif
(srcBlitRect.left << b2) & 0x1F,
((dstFrameP->worldRectOffset << b2) & 0x1F) + ((dstBlitRect.left << b2) & 0x1F),
((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
);
END_32_BIT_MODE
}
///--------------------------------------------------------------------------------------
// BlitPixieAllBitMaskDrawProc
///--------------------------------------------------------------------------------------
SW_FUNC void BlitPixieAllBitMaskDrawProc(
FramePtr srcFrameP,
FramePtr dstFrameP,
Rect *srcRect,
Rect *dstRect)
{
Rect dstBlitRect = *dstRect;
Rect srcBlitRect = *srcRect;
unsigned long numBytesPerRow;
unsigned long srcBaseOffset;
short b1, b2;
SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
SW_ASSERT(srcFrameP->maskPort != NULL);
BP_CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
BPL(srcFrameP, dstFrameP, b1, b2);
START_32_BIT_MODE
srcBaseOffset =
(srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
((srcBlitRect.left >> b1) * sizeof(long));
numBytesPerRow =
((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
if ( (*srcFrameP->framePort->portPixMap)->pixelSize < 16 )
{
BlitPixieAllBitMask(
(PixelChunkPtr)(srcFrameP->frameBaseAddr +
srcBaseOffset),
(PixelChunkPtr)(dstFrameP->frameBaseAddr +
(dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
((dstBlitRect.left >> b1) * sizeof(long))),
(PixelChunkPtr)(srcFrameP->maskBaseAddr +
srcBaseOffset),
dstBlitRect.bottom - dstBlitRect.top,
numBytesPerRow,
#if SW_PPC
srcFrameP->frameRowBytes,
dstFrameP->frameRowBytes,
#else
srcFrameP->frameRowBytes - numBytesPerRow,
dstFrameP->frameRowBytes - numBytesPerRow,
#endif
(srcBlitRect.left << b2) & 0x1F,
(((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
);
}
else
{
BlitPixieAllBitPartialMask(
(PixelChunkPtr)(srcFrameP->frameBaseAddr +
srcBaseOffset),
(PixelChunkPtr)(dstFrameP->frameBaseAddr +
(dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
((dstBlitRect.left >> b1) * sizeof(long))),
(PixelChunkPtr)(srcFrameP->maskBaseAddr +
srcBaseOffset),
dstBlitRect.bottom - dstBlitRect.top,
numBytesPerRow,
#if SW_PPC
srcFrameP->frameRowBytes,
dstFrameP->frameRowBytes,
#else
srcFrameP->frameRowBytes - numBytesPerRow,
dstFrameP->frameRowBytes - numBytesPerRow,
#endif
(srcBlitRect.left << b2) & 0x1F,
(((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
);
}
END_32_BIT_MODE
}
///--------------------------------------------------------------------------------------
// BlitPixieAllBitPartialMaskDrawProc
///--------------------------------------------------------------------------------------
SW_FUNC void BlitPixieAllBitPartialMaskDrawProc(
FramePtr srcFrameP,
FramePtr dstFrameP,
Rect *srcRect,
Rect *dstRect)
{
Rect dstBlitRect = *dstRect;
Rect srcBlitRect = *srcRect;
unsigned long numBytesPerRow;
unsigned long srcBaseOffset;
short b1, b2;
SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
SW_ASSERT(srcFrameP->maskPort != NULL);
BP_CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
BPL(srcFrameP, dstFrameP, b1, b2);
START_32_BIT_MODE
srcBaseOffset =
(srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
((srcBlitRect.left >> b1) * sizeof(long));
numBytesPerRow =
((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
BlitPixieAllBitPartialMask(
(PixelChunkPtr)(srcFrameP->frameBaseAddr +
srcBaseOffset),
(PixelChunkPtr)(dstFrameP->frameBaseAddr +
(dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
((dstBlitRect.left >> b1) * sizeof(long))),
(PixelChunkPtr)(srcFrameP->maskBaseAddr +
srcBaseOffset),
dstBlitRect.bottom - dstBlitRect.top,
numBytesPerRow,
#if SW_PPC
srcFrameP->frameRowBytes,
dstFrameP->frameRowBytes,
#else
srcFrameP->frameRowBytes - numBytesPerRow,
dstFrameP->frameRowBytes - numBytesPerRow,
#endif
(srcBlitRect.left << b2) & 0x1F,
(((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
);
END_32_BIT_MODE
}
///--------------------------------------------------------------------------------------
// BPAllBitInterlacedMaskDrawProc
///--------------------------------------------------------------------------------------
SW_FUNC void BPAllBitInterlacedMaskDrawProc(
FramePtr srcFrameP,
FramePtr dstFrameP,
Rect* srcRect,
Rect* dstRect)
{
Rect srcBlitRect = *srcRect;
Rect dstBlitRect = *dstRect;
unsigned long numBytesPerRow;
unsigned long numRowsToCopy;
unsigned long srcBaseOffset;
short b1, b2;
SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
SW_ASSERT(srcFrameP->maskPort != NULL);
BP_CLIP_RECT_INTERLACED(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
BPL(srcFrameP, dstFrameP, b1, b2);
// Is destBlitRect height an even number?
numRowsToCopy = dstBlitRect.bottom - dstBlitRect.top;
numRowsToCopy = (numRowsToCopy >> 1) + (numRowsToCopy & 1);
if (numRowsToCopy < 1)
return;
START_32_BIT_MODE
srcBaseOffset =
(srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
((srcBlitRect.left >> b1) * sizeof(long));
numBytesPerRow =
((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
if ( (*srcFrameP->framePort->portPixMap)->pixelSize < 16 )
{
BlitPixieAllBitMask(
(PixelChunkPtr)(srcFrameP->frameBaseAddr +
srcBaseOffset),
(PixelChunkPtr)(dstFrameP->frameBaseAddr +
(dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
((dstBlitRect.left >> b1) * sizeof(long))),
(PixelChunkPtr)(srcFrameP->maskBaseAddr +
srcBaseOffset),
numRowsToCopy,
numBytesPerRow,
#if SW_PPC
(srcFrameP->frameRowBytes << 1),
(dstFrameP->frameRowBytes << 1),
#else
(srcFrameP->frameRowBytes << 1) - numBytesPerRow,
(dstFrameP->frameRowBytes << 1) - numBytesPerRow,
#endif
(srcBlitRect.left << b2) & 0x1F,
(((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
);
}
else
{
BlitPixieAllBitPartialMask(
(PixelChunkPtr)(srcFrameP->frameBaseAddr +
srcBaseOffset),
(PixelChunkPtr)(dstFrameP->frameBaseAddr +
(dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
((dstBlitRect.left >> b1) * sizeof(long))),
(PixelChunkPtr)(srcFrameP->maskBaseAddr +
srcBaseOffset),
numRowsToCopy,
numBytesPerRow,
#if SW_PPC
(srcFrameP->frameRowBytes << 1),
(dstFrameP->frameRowBytes << 1),
#else
(srcFrameP->frameRowBytes << 1) - numBytesPerRow,
(dstFrameP->frameRowBytes << 1) - numBytesPerRow,
#endif
(srcBlitRect.left << b2) & 0x1F,
(((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
);
}
END_32_BIT_MODE
}
///--------------------------------------------------------------------------------------
// BPAllBitInterlacedPartialMaskDrawProc
///--------------------------------------------------------------------------------------
SW_FUNC void BPAllBitInterlacedPartialMaskDrawProc(
FramePtr srcFrameP,
FramePtr dstFrameP,
Rect* srcRect,
Rect* dstRect)
{
Rect srcBlitRect = *srcRect;
Rect dstBlitRect = *dstRect;
unsigned long numBytesPerRow;
unsigned long numRowsToCopy;
unsigned long srcBaseOffset;
short b1, b2;
SW_ASSERT(srcFrameP->isFrameLocked && dstFrameP->isFrameLocked);
SW_ASSERT(srcFrameP->maskPort != NULL);
BP_CLIP_RECT_INTERLACED(dstFrameP->frameRect, srcBlitRect, dstBlitRect);
BPL(srcFrameP, dstFrameP, b1, b2);
// Is destBlitRect height an even number?
numRowsToCopy = dstBlitRect.bottom - dstBlitRect.top;
numRowsToCopy = (numRowsToCopy >> 1) + (numRowsToCopy & 1);
if (numRowsToCopy < 1)
return;
START_32_BIT_MODE
srcBaseOffset =
(srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
((srcBlitRect.left >> b1) * sizeof(long));
numBytesPerRow =
((dstBlitRect.right - dstBlitRect.left) >> b1) * sizeof(long);
BlitPixieAllBitPartialMask(
(PixelChunkPtr)(srcFrameP->frameBaseAddr +
srcBaseOffset),
(PixelChunkPtr)(dstFrameP->frameBaseAddr +
(dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
((dstBlitRect.left >> b1) * sizeof(long))),
(PixelChunkPtr)(srcFrameP->maskBaseAddr +
srcBaseOffset),
numRowsToCopy,
numBytesPerRow,
#if SW_PPC
(srcFrameP->frameRowBytes << 1),
(dstFrameP->frameRowBytes << 1),
#else
(srcFrameP->frameRowBytes << 1) - numBytesPerRow,
(dstFrameP->frameRowBytes << 1) - numBytesPerRow,
#endif
(srcBlitRect.left << b2) & 0x1F,
(((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F
);
END_32_BIT_MODE
}
#pragma mark -
#pragma mark *** PowerPC:
#if SW_PPC
// Power PC Blitters
// Note we do no bit aligniment, so we only handle 8-bit or higher color.
// Lower color will work but will misalign copying of the sprites.
// To write one that works, you need to use the srcExtraStart and dstExtraStart
// to figure out how many bits you need to shift the source and the destination
// before you copy the bits. Then use dstExtraEnd to figure out how many extra
// bits you need to copy at the end.
///--------------------------------------------------------------------------------------
// BlitPixieAllBit
///--------------------------------------------------------------------------------------
// Since this blit routine just does straight copying and requires no boolean operations,
// we can make use of the floating point registers on the Power PC. This means we
// can blit a double, 8 bytes at a time, rather than a long. This makes the blitter
// faster. We could speed this up even more by unrolling the loop for big blits,
// but it would make the code much less readable.
// Unfortunately, this function reqires that the src and dest pointers be 4-byte
// aligned for doubles to be used or else alignment has to be done in hardware on the
// PPC601 (still faster) or in software (argh) on the PPC604 which will probably be
// slower though I haven't tested it yet.
void BlitPixieAllBit(
register PixelPtr srcPixelPTemp,
register PixelPtr dstPixelPTemp,
unsigned long rowsToCopy,
unsigned long numBytesPerRow,
register unsigned long srcOffset,
register unsigned long dstOffset,
register unsigned long srcExtraStart,
register unsigned long dstExtraStart,
register unsigned long dstExtraEnd)
{
if ((srcExtraStart & 16) != 0)
((unsigned short *) srcPixelPTemp)++;
if ((srcExtraStart & 8) != 0)
((unsigned char *) srcPixelPTemp)++;
if ((dstExtraStart & 8) != 0)
((unsigned char *) dstPixelPTemp)++;
if ((dstExtraStart & 16) != 0)
((unsigned short *) dstPixelPTemp)++;
if (((unsigned long)srcPixelPTemp & 3) || ((unsigned long)dstPixelPTemp & 3)) {
register long index;
register PixelChunkPtr srcPixelP = srcPixelPTemp;
register PixelChunkPtr dstPixelP = dstPixelPTemp;
register PixelChunkPtr startSrcPixelP;
register PixelChunkPtr startDstPixelP;
startSrcPixelP = srcPixelP;
startDstPixelP = dstPixelP;
while (rowsToCopy--)
{
register int fourblits = (numBytesPerRow >> 2);
srcPixelP = startSrcPixelP;
dstPixelP = startDstPixelP;
for (index = 0; index < fourblits; index++)
{
register unsigned long temp1;
temp1 = srcPixelP[index];
dstPixelP[index] = temp1;
}
srcPixelP += fourblits;
dstPixelP += fourblits;
if ((dstExtraEnd & 16) != 0)
*((unsigned short *) dstPixelP)++ = *((unsigned short *) srcPixelP)++;
if ((dstExtraEnd & 8) != 0)
*((unsigned char *)dstPixelP)++ = *((unsigned char *)srcPixelP)++;
// bump to next row
(char *)startSrcPixelP += srcOffset;
(char *)startDstPixelP += dstOffset;
}
} else {
register long index;
register double *startSrcPixelP;
register double *startDstPixelP;
register double *srcPixelP = (double *)srcPixelPTemp;
register double *dstPixelP = (double *)dstPixelPTemp;
startSrcPixelP = srcPixelP;
startDstPixelP = dstPixelP;
while (rowsToCopy--)
{
register int eightblits = (numBytesPerRow >> 3);
srcPixelP = startSrcPixelP;
dstPixelP = startDstPixelP;
for (index = 0; index < eightblits; index++)
{
dstPixelP[index] = srcPixelP[index];
}
srcPixelP += eightblits;
dstPixelP += eightblits;
if (numBytesPerRow & 0x4)
*((unsigned long *) dstPixelP)++ = *((unsigned long *) srcPixelP)++;
if ((dstExtraEnd & 16) != 0)
*((unsigned short *) dstPixelP)++ = *((unsigned short *) srcPixelP)++;
if ((dstExtraEnd & 8) != 0)
*((unsigned char *)dstPixelP)++ = *((unsigned char *)srcPixelP)++;
// bump to next row
(char *)startSrcPixelP += srcOffset;
(char *)startDstPixelP += dstOffset;
}
}
}
///--------------------------------------------------------------------------------------
// BlitPixieAllBitMask
///--------------------------------------------------------------------------------------
void BlitPixieAllBitMask(
register PixelPtr srcPixelP,
register PixelPtr dstPixelP,
register PixelPtr maskPixelP,
unsigned long rowsToCopy,
unsigned long numBytesPerRow,
register unsigned long srcRowStride,
register unsigned long dstRowStride,
register unsigned long srcExtraStart,
register unsigned long dstExtraStart,
register unsigned long dstExtraEnd)
{
long index;
PixelPtr startSrcPixelP = srcPixelP;
PixelPtr startDstPixelP = dstPixelP;
PixelPtr startMaskPixelP = maskPixelP;
if ((srcExtraStart & 16) != 0)
{
((unsigned short *) startSrcPixelP)++;
((unsigned short *) startMaskPixelP)++;
}
if ((srcExtraStart & 8) != 0)
{
((unsigned char *) startSrcPixelP)++;
((unsigned char *) startMaskPixelP)++;
}
if ((dstExtraStart & 8) != 0)
((unsigned char *) startDstPixelP)++;
if ((dstExtraStart & 16) != 0)
((unsigned short *) startDstPixelP)++;
while (rowsToCopy--)
{
register fourblits = (numBytesPerRow >> 2);
srcPixelP = startSrcPixelP;
dstPixelP = startDstPixelP;
maskPixelP = startMaskPixelP;
for (index = 0; index < fourblits; index++)
{
dstPixelP[index] = dstPixelP[index] & maskPixelP[index] | srcPixelP[index];
}
srcPixelP += fourblits;
dstPixelP += fourblits;
maskPixelP += fourblits;
if ((dstExtraEnd & 16) != 0)
{
register unsigned short temp1;
temp1 = (*((unsigned short *) dstPixelP)) & (*((unsigned short *) maskPixelP)++) |
*((unsigned short *) srcPixelP)++;
(*((unsigned short *) dstPixelP)++) = temp1;
}
if ((dstExtraEnd & 8) != 0)
{
register unsigned char temp1;
temp1 = (*((unsigned char *) dstPixelP)) & (*((unsigned char *) maskPixelP)++) |
*((unsigned char *) srcPixelP)++;
(*((unsigned char *) dstPixelP)++) = temp1;
}
// bump to next row
startSrcPixelP = (PixelPtr)(((char*)startSrcPixelP) + srcRowStride);
startDstPixelP = (PixelPtr)(((char*)startDstPixelP) + dstRowStride);
startMaskPixelP = (PixelPtr)(((char*)startMaskPixelP) + srcRowStride);
}
}
///--------------------------------------------------------------------------------------
// BlitPixieAllBitPartialMask
///--------------------------------------------------------------------------------------
void BlitPixieAllBitPartialMask(
register PixelPtr srcPixelP,
register PixelPtr dstPixelP,
register PixelPtr maskPixelP,
unsigned long rowsToCopy,
unsigned long numBytesPerRow,
register unsigned long srcRowStride,
register unsigned long dstRowStride,
register unsigned long srcExtraStart,
register unsigned long dstExtraStart,
register unsigned long dstExtraEnd)
{
long index;
PixelPtr startSrcPixelP = srcPixelP;
PixelPtr startDstPixelP = dstPixelP;
PixelPtr startMaskPixelP = maskPixelP;
if ((srcExtraStart & 16) != 0)
{
((unsigned short *) startSrcPixelP)++;
((unsigned short *) startMaskPixelP)++;
}
if ((srcExtraStart & 8) != 0)
{
((unsigned char *) startSrcPixelP)++;
((unsigned char *) startMaskPixelP)++;
}
if ((dstExtraStart & 8) != 0)
((unsigned char *) startDstPixelP)++;
if ((dstExtraStart & 16) != 0)
((unsigned short *) startDstPixelP)++;
while (rowsToCopy--)
{
register fourblits = (numBytesPerRow >> 2);
srcPixelP = startSrcPixelP;
dstPixelP = startDstPixelP;
maskPixelP = startMaskPixelP;
for (index = 0; index < fourblits; index++)
{
dstPixelP[index] = dstPixelP[index] & maskPixelP[index] |
( (~maskPixelP[index] )& srcPixelP[index]);
}
srcPixelP += fourblits;
dstPixelP += fourblits;
maskPixelP += fourblits;
if ((dstExtraEnd & 16) != 0)
{
register unsigned short temp1;
temp1 = (*((unsigned short *) dstPixelP)) & (*((unsigned short *) maskPixelP)) |
(~(*((unsigned short *) maskPixelP)++) &
*((unsigned short *) srcPixelP)++);
(*((unsigned short *) dstPixelP)++) = temp1;
}
if ((dstExtraEnd & 8) != 0)
{
register unsigned char temp1;
temp1 = (*((unsigned char *) dstPixelP)) & (*((unsigned char *) maskPixelP)) |
(~(*((unsigned char *) maskPixelP)++) &
*((unsigned char *) srcPixelP)++);
(*((unsigned char *) dstPixelP)++) = temp1;
}
// bump to next row
startSrcPixelP = (PixelPtr)(((char*)startSrcPixelP) + srcRowStride);
startDstPixelP = (PixelPtr)(((char*)startDstPixelP) + dstRowStride);
startMaskPixelP = (PixelPtr)(((char*)startMaskPixelP) + srcRowStride);
}
}
#pragma mark *** 680X0:
#else /* #if SW_PPC */
#if !__MWERKS__
#define Num(x) #(x)
#else
#define Num(x) %(x)
#endif
#define srcExtraStartTemp srcExtraStart
#define dstExtraStartTemp dstExtraStart
#define dstExtraEndTemp dstExtraEnd
#define dstRowStrideTemp dstRowStride
#define UNROLL(start, end) \
move.l d1, d0; \
lsr.l Num(4), d1; \
moveq Num(0x0F), d2; \
and.l d2, d0; \
\
lea end, a0; \
lea start, a1; \
sub.l a0, a1; \
move.l a1, d2; \
asr.l Num(4), d2; \
mulu.l d2, d0; \
add.l d0, a0;
#define REPEAT(instr) \
instr; \
instr; \
instr; \
instr; \
instr; \
instr; \
instr; \
instr; \
instr; \
instr; \
instr; \
instr; \
instr; \
instr; \
instr; \
instr;
///--------------------------------------------------------------------------------------
// BlitPixieAllBit
///--------------------------------------------------------------------------------------
SW_ASM_FUNC void BlitPixieAllBit(
register PixelPtr srcPixelP,
register PixelPtr dstPixelP,
unsigned long rowsToCopy,
unsigned long numBytesPerRow,
register unsigned long srcRowStride,
register unsigned long dstRowStride,
register unsigned long srcExtraStart,
register unsigned long dstExtraStart,
register unsigned long dstExtraEnd)
{
SW_ASM_BEGIN
#if __MWERKS__
fralloc +
#endif
move.l numBytesPerRow, d1
lsr.l Num(2), d1
beq @VeryNarrow
tst.l srcExtraStart
bne @SrcExtraStart
tst.l dstExtraStart
bne @DstExtraStart
@NoExtraStart:
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@DstExtraStart:
move.l dstExtraStart, d0
and.l Num(0x07), d0
beq @ADstExtraStart
tst.l dstExtraEnd
beq @EvenOdd
bra @EvenOddExtra
@ADstExtraStart:
move.l dstExtraStart, d0
lsr.l Num(3), d0
add.l d0, dstPixelP
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@SrcExtraStart:
tst.l dstExtraStart
bne @SrcDstExtraStart
@NoDstExtraStart:
move.l srcExtraStart, d0
and.l Num(0x07), d0
beq @ASrcExtraStart
tst.l dstExtraEnd
beq @OddEven
bra @OddEvenExtra
@ASrcExtraStart:
move.l srcExtraStart, d0
lsr.l Num(3), d0
add.l d0, srcPixelP
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@SrcDstExtraStart:
move.l srcExtraStart, d0
and.l Num(0x07), d0
beq @ASrcDstExtraStart
move.l dstExtraStart, d0
and.l Num(0x07), d0
beq @ADstSrcExtraStart
tst.l dstExtraEnd
beq @OddOdd
bra @OddOddExtra
@ASrcDstExtraStart:
move.l dstExtraStart, d0
and.l Num(0x07), d0
beq @AASrcDstExtraStart
move.l srcExtraStart, d0
lsr.l Num(3), d0
add.l d0, srcPixelP
tst.l dstExtraEnd
beq @EvenOdd
bra @EvenOddExtra
@ADstSrcExtraStart:
move.l dstExtraStart, d0
lsr.l Num(3), d0
add.l d0, dstPixelP
tst.l dstExtraEnd
beq @OddEven
bra @OddEvenExtra
@AASrcDstExtraStart:
move.l srcExtraStart, d0
lsr.l Num(3), d0
add.l d0, srcPixelP
move.l dstExtraStart, d0
lsr.l Num(3), d0
add.l d0, dstPixelP
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@EvenEven:
// START Even -> Even
UNROLL(@EE_ColLoop, @EE_ColLoop_End)
move.l rowsToCopy, d2
@EE_RowLoop:
move.l d1, d0
jmp (a0)
@EE_ColLoop:
// BLIT
#define BLIT \
move.l (srcPixelP)+, (dstPixelP)+;
REPEAT(BLIT)
#undef BLIT
@EE_ColLoop_End:
subq.l Num(1), d0
bpl @EE_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
subq.l Num(1), d2
bgt @EE_RowLoop
// STOP
bra @Done
@EvenEvenExtra:
// START Even -> Even + Extra
UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
move.l rowsToCopy, d2
@EEE_RowLoop:
move.l d1, d0
jmp (a0)
@EEE_ColLoop:
// BLIT
#define BLIT \
move.l (srcPixelP)+, (dstPixelP)+;
REPEAT(BLIT)
#undef BLIT
@EEE_ColLoop_End:
subq.l Num(1), d0
bpl @EEE_ColLoop
// BLIT EXTRA
bfextu (srcPixelP){0:dstExtraEnd}, d0
bfins d0, (dstPixelP){0:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
subq.l Num(1), d2
bgt @EEE_RowLoop
// STOP
bra @Done
@EvenOdd:
// START Even -> Odd
UNROLL(@EO_ColLoop, @EO_ColLoop_End)
move.l rowsToCopy, d2
@EO_RowLoop:
move.l d1, d0
jmp (a0)
@EO_ColLoop:
// BLIT
#define BLIT \
move.l (srcPixelP)+, srcExtraStartTemp; \
bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), dstPixelP;
REPEAT(BLIT)
#undef BLIT
@EO_ColLoop_End:
subq.l Num(1), d0
bpl @EO_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
subq.l Num(1), d2
bgt @EO_RowLoop
// STOP
bra @Done
@EvenOddExtra:
// START Even -> Odd + Extra
UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
move.l rowsToCopy, d2
@EOE_RowLoop:
move.l d1, d0
jmp (a0)
@EOE_ColLoop:
// BLIT
#define BLIT \
move.l (srcPixelP)+, srcExtraStartTemp; \
bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), dstPixelP;
REPEAT(BLIT)
#undef BLIT
@EOE_ColLoop_End:
subq.l Num(1), d0
bpl @EOE_ColLoop
//BLIT EXTRA
bfextu (srcPixelP){0:dstExtraEnd}, srcExtraStartTemp
bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
subq.l Num(1), d2
bgt @EOE_RowLoop
// STOP
bra @Done
@OddEven:
// START Odd -> Even
UNROLL(@OE_ColLoop, @OE_ColLoop_End)
move.l rowsToCopy, d2
@OE_RowLoop:
move.l d1, d0
jmp (a0)
@OE_ColLoop:
// BLIT
#define BLIT \
bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
move.l dstExtraStartTemp, (dstPixelP)+; \
addq.l Num(4), srcPixelP;
REPEAT(BLIT)
#undef BLIT
@OE_ColLoop_End:
subq.l Num(1), d0
bpl @OE_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
subq.l Num(1), d2
bgt @OE_RowLoop
// STOP
bra @Done
@OddEvenExtra:
// START Odd -> Even + Extra
UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
move.l rowsToCopy, d2
@OEE_RowLoop:
move.l d1, d0
jmp (a0)
@OEE_ColLoop:
// BLIT
#define BLIT \
bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
move.l dstExtraStartTemp, (dstPixelP)+; \
addq.l Num(4), srcPixelP;
REPEAT(BLIT)
#undef BLIT
@OEE_ColLoop_End:
subq.l Num(1), d0
bpl @OEE_ColLoop
// BLIT EXTRA
bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, dstExtraStartTemp
bfins dstExtraStartTemp, (dstPixelP){0:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
subq.l Num(1), d2
bgt @OEE_RowLoop
// STOP
bra @Done
@OddOdd:
// START Odd -> Odd
UNROLL(@OO_ColLoop, @OO_ColLoop_End)
move.l rowsToCopy, d2
@OO_RowLoop:
move.l d1, d0
jmp (a0)
@OO_ColLoop:
// BLIT
#define BLIT \
bfextu (srcPixelP){srcExtraStart:0}, dstExtraEndTemp; \
bfins dstExtraEndTemp, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), srcPixelP; \
addq.l Num(4), dstPixelP;
REPEAT(BLIT)
#undef BLIT
@OO_ColLoop_End:
subq.l Num(1), d0
bpl @OO_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
subq.l Num(1), d2
bgt @OO_RowLoop
// STOP
bra @Done
@OddOddExtra:
// START Odd -> Odd + Extra
UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
@OOE_RowLoop:
move.l d1, d0
jmp (a0)
@OOE_ColLoop:
// BLIT
#define BLIT \
bfextu (srcPixelP){srcExtraStart:0}, d2; \
bfins d2, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), srcPixelP; \
addq.l Num(4), dstPixelP;
REPEAT(BLIT)
#undef BLIT
@OOE_ColLoop_End:
subq.l Num(1), d0
bpl @OOE_ColLoop
// BLIT EXTRA
bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d2
bfins d2, (dstPixelP){dstExtraStart:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
subq.l Num(1), rowsToCopy
bgt @OOE_RowLoop
// STOP
bra @Done
@VeryNarrow:
// START Very Narrow
move.l rowsToCopy, d2
@VN_RowLoop:
// BLIT
bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
subq.l Num(1), d2
bgt @VN_RowLoop
// STOP
@Done:
#if __MWERKS__
frfree
#endif
SW_ASM_END
}
///--------------------------------------------------------------------------------------
// BlitPixieAllBitMask
///--------------------------------------------------------------------------------------
SW_ASM_FUNC void BlitPixieAllBitMask(
register PixelPtr srcPixelP,
register PixelPtr dstPixelP,
register PixelPtr maskPixelP,
unsigned long rowsToCopy,
unsigned long numBytesPerRow,
register unsigned long srcRowStride,
register unsigned long dstRowStride,
register unsigned long srcExtraStart,
register unsigned long dstExtraStart,
register unsigned long dstExtraEnd)
{
SW_ASM_BEGIN
#if __MWERKS__
fralloc +
#endif
move.l numBytesPerRow, d1
lsr.l Num(2), d1
beq @VeryNarrow
tst.l srcExtraStart
bne @SrcExtraStart
tst.l dstExtraStart
bne @DstExtraStart
@NoExtraStart:
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@DstExtraStart:
move.l dstExtraStart, d0
and.l Num(0x07), d0
beq @ADstExtraStart
tst.l dstExtraEnd
beq @EvenOdd
bra @EvenOddExtra
@ADstExtraStart:
move.l dstExtraStart, d0
lsr.l Num(3), d0
add.l d0, dstPixelP
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@SrcExtraStart:
tst.l dstExtraStart
bne @SrcDstExtraStart
@NoDstExtraStart:
move.l srcExtraStart, d0
and.l Num(0x07), d0
beq @ASrcExtraStart
tst.l dstExtraEnd
beq @OddEven
bra @OddEvenExtra
@ASrcExtraStart:
move.l srcExtraStart, d0
lsr.l Num(3), d0
add.l d0, srcPixelP
add.l d0, maskPixelP
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@SrcDstExtraStart:
move.l srcExtraStart, d0
and.l Num(0x07), d0
beq @ASrcDstExtraStart
move.l dstExtraStart, d0
and.l Num(0x07), d0
beq @ADstSrcExtraStart
tst.l dstExtraEnd
beq @OddOdd
bra @OddOddExtra
@ASrcDstExtraStart:
move.l dstExtraStart, d0
and.l Num(0x07), d0
beq @AASrcDstExtraStart
move.l srcExtraStart, d0
lsr.l Num(3), d0
add.l d0, srcPixelP
add.l d0, maskPixelP
tst.l dstExtraEnd
beq @EvenOdd
bra @EvenOddExtra
@ADstSrcExtraStart:
move.l dstExtraStart, d0
lsr.l Num(3), d0
add.l d0, dstPixelP
tst.l dstExtraEnd
beq @OddEven
bra @OddEvenExtra
@AASrcDstExtraStart:
move.l srcExtraStart, d0
lsr.l Num(3), d0
add.l d0, srcPixelP
add.l d0, maskPixelP
move.l dstExtraStart, d0
lsr.l Num(3), d0
add.l d0, dstPixelP
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@EvenEven:
// START Even -> Even
UNROLL(@EE_ColLoop, @EE_ColLoop_End)
move.l rowsToCopy, d2
@EE_RowLoop:
move.l d1, d0
jmp (a0)
@EE_ColLoop:
// BLIT
#define BLIT \
move.l (dstPixelP), dstExtraEndTemp; \
and.l (maskPixelP)+, dstExtraEndTemp; \
or.l (srcPixelP)+, dstExtraEndTemp; \
move.l dstExtraEndTemp, (dstPixelP)+;
REPEAT(BLIT)
#undef BLIT
@EE_ColLoop_End:
subq.l Num(1), d0
bpl @EE_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @EE_RowLoop
// STOP
bra @Done
@EvenEvenExtra:
// START Even -> Even + Extra
UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
move.l rowsToCopy, d2
@EEE_RowLoop:
move.l d1, d0
jmp (a0)
@EEE_ColLoop:
// BLIT
#define BLIT \
move.l (dstPixelP), srcExtraStartTemp; \
and.l (maskPixelP)+, srcExtraStartTemp; \
or.l (srcPixelP)+, srcExtraStartTemp; \
move.l srcExtraStartTemp, (dstPixelP)+;
REPEAT(BLIT)
#undef BLIT
@EEE_ColLoop_End:
subq.l Num(1), d0
bpl @EEE_ColLoop
// BLIT EXTRA
bfextu (dstPixelP){0:dstExtraEnd}, srcExtraStartTemp
bfextu (maskPixelP){0:dstExtraEnd}, dstExtraStartTemp
and.l dstExtraStartTemp, srcExtraStartTemp
bfextu (srcPixelP){0:dstExtraEnd}, dstExtraStartTemp
or.l dstExtraStartTemp, srcExtraStartTemp
bfins srcExtraStartTemp, (dstPixelP){0:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @EEE_RowLoop
// STOP
bra @Done
@EvenOdd:
// START Even -> Odd
UNROLL(@EO_ColLoop, @EO_ColLoop_End)
move.l rowsToCopy, d2
@EO_RowLoop:
move.l d1, d0
jmp (a0)
@EO_ColLoop:
// BLIT
#define BLIT \
bfextu (dstPixelP){dstExtraStart:0}, srcExtraStartTemp; \
and.l (maskPixelP)+, srcExtraStartTemp; \
or.l (srcPixelP)+, srcExtraStartTemp; \
bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), dstPixelP;
REPEAT(BLIT)
#undef BLIT
@EO_ColLoop_End:
subq.l Num(1), d0
bpl @EO_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @EO_RowLoop
// STOP
bra @Done
@EvenOddExtra:
// START Even -> Odd + Extra
UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
move.l rowsToCopy, d2
@EOE_RowLoop:
move.l d1, d0
jmp (a0)
@EOE_ColLoop:
// BLIT
#define BLIT \
bfextu (dstPixelP){dstExtraStart:0}, srcExtraStartTemp; \
and.l (maskPixelP)+, srcExtraStartTemp; \
or.l (srcPixelP)+, srcExtraStartTemp; \
bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), dstPixelP;
REPEAT(BLIT)
#undef BLIT
@EOE_ColLoop_End:
subq.l Num(1), d0
bpl @EOE_ColLoop
//BLIT EXTRA
bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, srcExtraStartTemp
bfextu (maskPixelP){0:dstExtraEnd}, d0
and.l d0, srcExtraStartTemp
bfextu (srcPixelP){0:dstExtraEnd}, d0
or.l d0, srcExtraStartTemp
bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @EOE_RowLoop
// STOP
bra @Done
@OddEven:
// START Odd -> Even
UNROLL(@OE_ColLoop, @OE_ColLoop_End)
move.l rowsToCopy, d2
@OE_RowLoop:
move.l d1, d0
jmp (a0)
@OE_ColLoop:
// BLIT
#define BLIT \
bfextu (maskPixelP){srcExtraStart:0}, dstExtraStartTemp; \
and.l dstExtraStartTemp, (dstPixelP); \
bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
or.l dstExtraStartTemp, (dstPixelP)+; \
addq.l Num(4), srcPixelP; \
addq.l Num(4), maskPixelP;
REPEAT(BLIT)
#undef BLIT
@OE_ColLoop_End:
subq.l Num(1), d0
bpl @OE_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @OE_RowLoop
// STOP
bra @Done
@OddEvenExtra:
// START Odd -> Even + Extra
UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
move.l rowsToCopy, d2
@OEE_RowLoop:
move.l d1, d0
jmp (a0)
@OEE_ColLoop:
// BLIT
#define BLIT \
bfextu (maskPixelP){srcExtraStart:0}, dstExtraStartTemp; \
and.l dstExtraStartTemp, (dstPixelP); \
bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
or.l dstExtraStartTemp, (dstPixelP)+; \
addq.l Num(4), srcPixelP; \
addq.l Num(4), maskPixelP;
REPEAT(BLIT)
#undef BLIT
@OEE_ColLoop_End:
subq.l Num(1), d0
bpl @OEE_ColLoop
// BLIT EXTRA
bfextu (dstPixelP){0:dstExtraEnd}, d0
bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, dstExtraStartTemp
and.l dstExtraStartTemp, d0
bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, dstExtraStartTemp
or.l dstExtraStartTemp, d0
bfins d0, (dstPixelP){0:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @OEE_RowLoop
// STOP
bra @Done
@OddOdd:
// START Odd -> Odd
UNROLL(@OO_ColLoop, @OO_ColLoop_End)
@OO_RowLoop:
move.l d1, d0
jmp (a0)
@OO_ColLoop:
// BLIT
#define BLIT \
bfextu (dstPixelP){dstExtraStart:0}, dstExtraEndTemp; \
bfextu (maskPixelP){srcExtraStart:0}, d2; \
and.l d2, dstExtraEndTemp; \
bfextu (srcPixelP){srcExtraStart:0}, d2; \
or.l d2, dstExtraEndTemp; \
bfins dstExtraEndTemp, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), srcPixelP; \
addq.l Num(4), dstPixelP; \
addq.l Num(4), maskPixelP;
REPEAT(BLIT)
#undef BLIT
@OO_ColLoop_End:
subq.l Num(1), d0
bpl @OO_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), rowsToCopy
bgt @OO_RowLoop
// STOP
bra @Done
@OddOddExtra:
// START Odd -> Odd + Extra
UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
move.l d1, numBytesPerRow
@OOE_RowLoop:
move.l numBytesPerRow, d0
jmp (a0)
@OOE_ColLoop:
// BLIT
#define BLIT \
bfextu (dstPixelP){dstExtraStart:0}, d1; \
bfextu (maskPixelP){srcExtraStart:0}, d2; \
and.l d2, d1; \
bfextu (srcPixelP){srcExtraStart:0}, d2; \
or.l d2, d1; \
bfins d1, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), srcPixelP; \
addq.l Num(4), dstPixelP; \
addq.l Num(4), maskPixelP;
REPEAT(BLIT)
#undef BLIT
@OOE_ColLoop_End:
subq.l Num(1), d0
bpl @OOE_ColLoop
// BLIT EXTRA
bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d0
bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
and.l d2, d0
bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d2
or.l d2, d0
bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), rowsToCopy
bgt @OOE_RowLoop
// STOP
bra @Done
@VeryNarrow:
// START Very Narrow
move.l rowsToCopy, d2
@VN_RowLoop:
// BLIT
bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d0
bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d1
and.l d1, d0
bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d1
or.l d1, d0
bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @VN_RowLoop
// STOP
@Done:
#if __MWERKS__
frfree
#endif
SW_ASM_END
}
///--------------------------------------------------------------------------------------
// BlitPixieAllBitPartialMask
///--------------------------------------------------------------------------------------
SW_ASM_FUNC void BlitPixieAllBitPartialMask(
register PixelPtr srcPixelP,
register PixelPtr dstPixelP,
register PixelPtr maskPixelP,
unsigned long rowsToCopy,
unsigned long numBytesPerRow,
register unsigned long srcRowStride,
register unsigned long dstRowStride,
register unsigned long srcExtraStart,
register unsigned long dstExtraStart,
register unsigned long dstExtraEnd)
{
SW_ASM_BEGIN
#if __MWERKS__
fralloc +
#endif
move.l numBytesPerRow, d1
lsr.l Num(2), d1
beq @VeryNarrow
tst.l srcExtraStart
bne @SrcExtraStart
tst.l dstExtraStart
bne @DstExtraStart
@NoExtraStart:
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@DstExtraStart:
move.l dstExtraStart, d0
and.l Num(0x07), d0
beq @ADstExtraStart
tst.l dstExtraEnd
beq @EvenOdd
bra @EvenOddExtra
@ADstExtraStart:
move.l dstExtraStart, d0
lsr.l Num(3), d0
add.l d0, dstPixelP
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@SrcExtraStart:
tst.l dstExtraStart
bne @SrcDstExtraStart
@NoDstExtraStart:
move.l srcExtraStart, d0
and.l Num(0x07), d0
beq @ASrcExtraStart
tst.l dstExtraEnd
beq @OddEven
bra @OddEvenExtra
@ASrcExtraStart:
move.l srcExtraStart, d0
lsr.l Num(3), d0
add.l d0, srcPixelP
add.l d0, maskPixelP
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@SrcDstExtraStart:
move.l srcExtraStart, d0
and.l Num(0x07), d0
beq @ASrcDstExtraStart
move.l dstExtraStart, d0
and.l Num(0x07), d0
beq @ADstSrcExtraStart
tst.l dstExtraEnd
beq @OddOdd
bra @OddOddExtra
@ASrcDstExtraStart:
move.l dstExtraStart, d0
and.l Num(0x07), d0
beq @AASrcDstExtraStart
move.l srcExtraStart, d0
lsr.l Num(3), d0
add.l d0, srcPixelP
add.l d0, maskPixelP
tst.l dstExtraEnd
beq @EvenOdd
bra @EvenOddExtra
@ADstSrcExtraStart:
move.l dstExtraStart, d0
lsr.l Num(3), d0
add.l d0, dstPixelP
tst.l dstExtraEnd
beq @OddEven
bra @OddEvenExtra
@AASrcDstExtraStart:
move.l srcExtraStart, d0
lsr.l Num(3), d0
add.l d0, srcPixelP
add.l d0, maskPixelP
move.l dstExtraStart, d0
lsr.l Num(3), d0
add.l d0, dstPixelP
tst.l dstExtraEnd
beq @EvenEven
bra @EvenEvenExtra
@EvenEven:
// START Even -> Even
UNROLL(@EE_ColLoop, @EE_ColLoop_End)
move.l rowsToCopy, d2
@EE_RowLoop:
move.l d1, d0
jmp (a0)
@EE_ColLoop:
// BLIT
#define BLIT \
move.l (maskPixelP)+, dstExtraEndTemp; \
and.l dstExtraEndTemp, (dstPixelP); \
not.l dstExtraEndTemp; \
and.l (srcPixelP)+, dstExtraEndTemp; \
or.l dstExtraEndTemp, (dstPixelP)+;
REPEAT(BLIT)
#undef BLIT
@EE_ColLoop_End:
subq.l Num(1), d0
bpl @EE_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @EE_RowLoop
// STOP
bra @Done
@EvenEvenExtra:
// START Even -> Even + Extra
UNROLL(@EEE_ColLoop, @EEE_ColLoop_End)
move.l rowsToCopy, d2
@EEE_RowLoop:
move.l d1, d0
jmp (a0)
@EEE_ColLoop:
// BLIT
#define BLIT \
move.l (maskPixelP)+, srcExtraStartTemp; \
and.l srcExtraStartTemp, (dstPixelP); \
not.l srcExtraStartTemp; \
and.l (srcPixelP)+, srcExtraStartTemp; \
or.l srcExtraStartTemp, (dstPixelP)+;
REPEAT(BLIT)
#undef BLIT
@EEE_ColLoop_End:
subq.l Num(1), d0
bpl @EEE_ColLoop
// BLIT EXTRA
bfextu (srcPixelP){0:dstExtraEnd}, d0
bfextu (dstPixelP){0:dstExtraEnd}, srcExtraStartTemp
bfextu (maskPixelP){0:dstExtraEnd}, dstExtraStartTemp
and.l dstExtraStartTemp, srcExtraStartTemp
not.l dstExtraStartTemp
and.l dstExtraStartTemp, d0
or.l srcExtraStartTemp, d0
bfins d0, (dstPixelP){0:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @EEE_RowLoop
// STOP
bra @Done
@EvenOdd:
// START Even -> Odd
UNROLL(@EO_ColLoop, @EO_ColLoop_End)
move.l rowsToCopy, d2
@EO_RowLoop:
move.l d1, d0
jmp (a0)
@EO_ColLoop:
// BLIT
#define BLIT \
move.l (maskPixelP)+, dstExtraEndTemp; \
bfextu (dstPixelP){dstExtraStart:0}, srcExtraStartTemp; \
and.l dstExtraEndTemp, srcExtraStartTemp; \
not.l dstExtraEndTemp; \
and.l (srcPixelP)+, dstExtraEndTemp; \
or.l dstExtraEndTemp, srcExtraStartTemp; \
bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), dstPixelP;
REPEAT(BLIT)
#undef BLIT
@EO_ColLoop_End:
subq.l Num(1), d0
bpl @EO_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @EO_RowLoop
// STOP
bra @Done
@EvenOddExtra:
// START Even -> Odd + Extra
UNROLL(@EOE_ColLoop, @EOE_ColLoop_End)
// move.l rowsToCopy, d2
@EOE_RowLoop:
move.l d1, d0
jmp (a0)
@EOE_ColLoop:
// BLIT
#define BLIT \
move.l (maskPixelP)+, d2; \
bfextu (dstPixelP){dstExtraStart:0}, srcExtraStartTemp; \
and.l d2, srcExtraStartTemp; \
not.l d2; \
and.l (srcPixelP)+, d2; \
or.l d2, srcExtraStartTemp; \
bfins srcExtraStartTemp, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), dstPixelP;
REPEAT(BLIT)
#undef BLIT
@EOE_ColLoop_End:
subq.l Num(1), d0
bpl @EOE_ColLoop
//BLIT EXTRA
bfextu (srcPixelP){0:dstExtraEnd}, d0
bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, srcExtraStartTemp
bfextu (maskPixelP){0:dstExtraEnd}, d2
and.l d2, srcExtraStartTemp
not.l d2
and.l d2, d0
or.l srcExtraStartTemp, d0
bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), rowsToCopy
bgt @EOE_RowLoop
// STOP
bra @Done
@OddEven:
// START Odd -> Even
UNROLL(@OE_ColLoop, @OE_ColLoop_End)
move.l rowsToCopy, d2
@OE_RowLoop:
move.l d1, d0
jmp (a0)
@OE_ColLoop:
// BLIT
#define BLIT \
bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
bfextu (maskPixelP){srcExtraStart:0}, dstExtraEndTemp; \
and.l dstExtraEndTemp, (dstPixelP); \
not.l dstExtraEndTemp; \
and.l dstExtraEndTemp, dstExtraStartTemp; \
or.l dstExtraStartTemp, (dstPixelP)+; \
addq.l Num(4), srcPixelP; \
addq.l Num(4), maskPixelP;
REPEAT(BLIT)
#undef BLIT
@OE_ColLoop_End:
subq.l Num(1), d0
bpl @OE_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), d2
bgt @OE_RowLoop
// STOP
bra @Done
@OddEvenExtra:
// START Odd -> Even + Extra
UNROLL(@OEE_ColLoop, @OEE_ColLoop_End)
@OEE_RowLoop:
move.l d1, d0
jmp (a0)
@OEE_ColLoop:
// BLIT
#define BLIT \
bfextu (srcPixelP){srcExtraStart:0}, dstExtraStartTemp; \
bfextu (maskPixelP){srcExtraStart:0}, d2; \
and.l d2, (dstPixelP); \
not.l d2; \
and.l d2, dstExtraStartTemp; \
or.l dstExtraStartTemp, (dstPixelP)+; \
addq.l Num(4), srcPixelP; \
addq.l Num(4), maskPixelP;
REPEAT(BLIT)
#undef BLIT
@OEE_ColLoop_End:
subq.l Num(1), d0
bpl @OEE_ColLoop
// BLIT EXTRA
bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
bfextu (dstPixelP){0:dstExtraEnd}, dstExtraStartTemp
bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
and.l d2, dstExtraStartTemp
not.l d2
and.l d2, d0
or.l dstExtraStartTemp, d0
bfins d0, (dstPixelP){0:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), rowsToCopy
bgt @OEE_RowLoop
// STOP
bra @Done
@OddOdd:
// START Odd -> Odd
UNROLL(@OO_ColLoop, @OO_ColLoop_End)
move.l d1, numBytesPerRow
@OO_RowLoop:
move.l numBytesPerRow, d0
jmp (a0)
@OO_ColLoop:
// BLIT
#define BLIT \
bfextu (srcPixelP){srcExtraStart:0}, d1; \
bfextu (dstPixelP){dstExtraStart:0}, dstExtraEndTemp; \
bfextu (maskPixelP){srcExtraStart:0}, d2; \
and.l d2, dstExtraEndTemp; \
not.l d2; \
and.l d2, d1; \
or.l dstExtraEndTemp, d1; \
bfins d1, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), srcPixelP; \
addq.l Num(4), dstPixelP; \
addq.l Num(4), maskPixelP;
REPEAT(BLIT)
#undef BLIT
@OO_ColLoop_End:
subq.l Num(1), d0
bpl @OO_ColLoop
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), rowsToCopy
bgt @OO_RowLoop
// STOP
bra @Done
@OddOddExtra:
// START Odd -> Odd + Extra
UNROLL(@OOE_ColLoop, @OOE_ColLoop_End)
move.l d1, numBytesPerRow
move.l dstRowStride, -(sp)
@OOE_RowLoop:
move.l numBytesPerRow, d0
jmp (a0)
@OOE_ColLoop:
// BLIT
#define BLIT \
bfextu (srcPixelP){srcExtraStart:0}, dstRowStrideTemp; \
bfextu (dstPixelP){dstExtraStart:0}, d1; \
bfextu (maskPixelP){srcExtraStart:0}, d2; \
and.l d2, d1; \
not.l d2; \
and.l d2, dstRowStrideTemp; \
or.l d1, dstRowStrideTemp; \
bfins dstRowStrideTemp, (dstPixelP){dstExtraStart:0}; \
addq.l Num(4), srcPixelP; \
addq.l Num(4), dstPixelP; \
addq.l Num(4), maskPixelP;
REPEAT(BLIT)
#undef BLIT
@OOE_ColLoop_End:
subq.l Num(1), d0
bpl @OOE_ColLoop
// BLIT EXTRA
bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d1
bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
and.l d2, d1
not.l d2
and.l d2, d0
or.l d1, d0
bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l (sp), dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), rowsToCopy
bgt @OOE_RowLoop
addq.l Num(4), sp
// STOP
bra @Done
@VeryNarrow:
// START Very Narrow
@VN_RowLoop:
// BLIT
bfextu (srcPixelP){srcExtraStart:dstExtraEnd}, d0
bfextu (dstPixelP){dstExtraStart:dstExtraEnd}, d1
bfextu (maskPixelP){srcExtraStart:dstExtraEnd}, d2
and.l d2, d1
not.l d2
and.l d2, d0
or.l d1, d0
bfins d0, (dstPixelP){dstExtraStart:dstExtraEnd}
adda.l srcRowStride, srcPixelP
adda.l dstRowStride, dstPixelP
adda.l srcRowStride, maskPixelP
subq.l Num(1), rowsToCopy
bgt @VN_RowLoop
// STOP
@Done:
#if __MWERKS__
frfree
#endif
SW_ASM_END
}
#endif /* #if SW_PPC */