home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-10-25 | 39.7 KB | 1,751 lines | [TEXT/KAHL] |
- ///--------------------------------------------------------------------------------------
- // 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-independant BlitPixie
- ///--------------------------------------------------------------------------------------
-
-
- #ifndef __BLITPIXIE__
- #include "BlitPixie.h"
- #endif
-
- #ifndef __SWCOMMON__
- #include "SWCommonHeaders.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
-
-
- #define CLIP_RECT(r, r1, r2, interlaced) \
- /* clip off the top so we don't write into random memory */ \
- if (r2.top < r.top) { \
- r1.top += r.top - r2.top; \
- r2.top = r.top; \
- } \
- /* clip off the bottom */ \
- if (r2.bottom > r.bottom) { \
- r2.bottom = r.bottom; \
- } \
- /* clip off the left */ \
- if (r2.left < r.left) { \
- r1.left += r.left - r2.left; \
- r2.left = r.left; \
- } \
- /* clip off the right */ \
- if (r2.right > r.right) { \
- r2.right = r.right; \
- } \
- if (interlaced) { \
- /* If first line is not on an even number, then skip it. */ \
- if ((r2.top - r.top) & 1) { \
- r1.top++; \
- r2.top++; \
- } \
- } \
- /* Make sure height is valid */ \
- if (r2.bottom <= r2.top) \
- return; \
- /* Make sure width is valid */ \
- if (r2.right <= r2.left) \
- return;
-
- 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};
-
- #define BPL(f1, f2, b1, b2) \
- if ((*f1->framePort->portPixMap)->pixelSize != (*f2->framePort->portPixMap)->pixelSize) \
- return; \
- b1 = bpla[(*f1->framePort->portPixMap)->pixelSize - 1]; \
- b2 = 5 - b1;
-
- #if !__MWERKS__
- #define Num(x) #(x)
- #else
- #define Num(x) %(x)
- #endif
-
-
- extern char gSWmmuMode;
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieRectDrawProc
- ///--------------------------------------------------------------------------------------
- SW_FUNC void BlitPixieAllBitRectDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect)
- {
- Rect srcBlitRect = *srcRect;
- Rect dstBlitRect = *dstRect;
- unsigned long numBytesPerRow;
- SInt8 mmuMode;
- short b1, b2;
-
- CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect, false);
- BPL(srcFrameP, dstFrameP, b1, b2);
- if (gSWmmuMode != true32b)
- {
- mmuMode = true32b;
- SwapMMUMode(&mmuMode);
- }
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * 4;
-
- BlitPixieAllBit(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * 4)),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * 4)),
- dstBlitRect.bottom - dstBlitRect.top,
- numBytesPerRow,
- srcFrameP->frameRowBytes - numBytesPerRow,
- dstFrameP->frameRowBytes - numBytesPerRow,
- (srcBlitRect.left << b2) & 0x1F,
- (((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F);
- if (gSWmmuMode != true32b)
- {
- SwapMMUMode(&mmuMode);
- }
- }
-
- ///--------------------------------------------------------------------------------------
- // 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;
- SInt8 mmuMode;
- short b1, b2;
-
- CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect, true);
- 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;
- if (gSWmmuMode != true32b) {
- mmuMode = true32b;
- SwapMMUMode(&mmuMode);
- }
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * 4;
- BlitPixieAllBit(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * 4)),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * 4)),
- numRowsToCopy,
- numBytesPerRow,
- (srcFrameP->frameRowBytes << 1) - numBytesPerRow,
- (dstFrameP->frameRowBytes << 1) - numBytesPerRow,
- (srcBlitRect.left << b2) & 0x1F,
- (((dstFrameP->worldRectOffset + dstBlitRect.left) << b2) & 0x1F),
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F);
- if (gSWmmuMode != true32b) {
- SwapMMUMode(&mmuMode);
- }
- }
-
- ///--------------------------------------------------------------------------------------
- // 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;
- SInt8 mmuMode;
- short b1, b2;
-
- CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect, false);
- BPL(srcFrameP, dstFrameP, b1, b2);
- if (gSWmmuMode != true32b)
- {
- mmuMode = true32b;
- SwapMMUMode(&mmuMode);
- }
- srcBaseOffset =
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * 4);
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * 4;
-
- if ( (*srcFrameP->framePort->portPixMap)->pixelSize < 16 )
- {
- BlitPixieAllBitMask(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- srcBaseOffset),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * 4)),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- dstBlitRect.bottom - dstBlitRect.top,
- numBytesPerRow,
- srcFrameP->frameRowBytes - numBytesPerRow,
- dstFrameP->frameRowBytes - numBytesPerRow,
- (srcBlitRect.left << b2) & 0x1F,
- (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) * 4)),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- dstBlitRect.bottom - dstBlitRect.top,
- numBytesPerRow,
- srcFrameP->frameRowBytes - numBytesPerRow,
- dstFrameP->frameRowBytes - numBytesPerRow,
- (srcBlitRect.left << b2) & 0x1F,
- (dstBlitRect.left << b2) & 0x1F,
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F);
- }
- if (gSWmmuMode != true32b) {
- SwapMMUMode(&mmuMode);
- }
- }
-
- ///--------------------------------------------------------------------------------------
- // 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;
- SInt8 mmuMode;
- short b1, b2;
-
- CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect, false);
- BPL(srcFrameP, dstFrameP, b1, b2);
- if (gSWmmuMode != true32b)
- {
- mmuMode = true32b;
- SwapMMUMode(&mmuMode);
- }
- srcBaseOffset =
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * 4);
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * 4;
- BlitPixieAllBitPartialMask(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- srcBaseOffset),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * 4)),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- dstBlitRect.bottom - dstBlitRect.top,
- numBytesPerRow,
- srcFrameP->frameRowBytes - numBytesPerRow,
- dstFrameP->frameRowBytes - numBytesPerRow,
- (srcBlitRect.left << b2) & 0x1F,
- (dstBlitRect.left << b2) & 0x1F,
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F);
- if (gSWmmuMode != true32b) {
- SwapMMUMode(&mmuMode);
- }
- }
-
- ///--------------------------------------------------------------------------------------
- // 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;
- SInt8 mmuMode;
- short b1, b2;
-
- CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect, true);
- 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;
- if (gSWmmuMode != true32b) {
- mmuMode = true32b;
- SwapMMUMode(&mmuMode);
- }
- srcBaseOffset =
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * 4);
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * 4;
-
- if ( (*srcFrameP->framePort->portPixMap)->pixelSize < 16 )
- {
- BlitPixieAllBitMask(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- srcBaseOffset),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * 4)),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- numRowsToCopy,
- numBytesPerRow,
- (srcFrameP->frameRowBytes << 1) - numBytesPerRow,
- (dstFrameP->frameRowBytes << 1) - numBytesPerRow,
- (srcBlitRect.left << b2) & 0x1F,
- (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) * 4)),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- numRowsToCopy,
- numBytesPerRow,
- (srcFrameP->frameRowBytes << 1) - numBytesPerRow,
- (dstFrameP->frameRowBytes << 1) - numBytesPerRow,
- (srcBlitRect.left << b2) & 0x1F,
- (dstBlitRect.left << b2) & 0x1F,
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F);
- }
- if (gSWmmuMode != true32b) {
- SwapMMUMode(&mmuMode);
- }
- }
-
- ///--------------------------------------------------------------------------------------
- // 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;
- SInt8 mmuMode;
- short b1, b2;
-
- CLIP_RECT(dstFrameP->frameRect, srcBlitRect, dstBlitRect, true);
- 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;
- if (gSWmmuMode != true32b) {
- mmuMode = true32b;
- SwapMMUMode(&mmuMode);
- }
- srcBaseOffset =
- (srcFrameP->scanLinePtrArray[srcBlitRect.top - srcFrameP->frameRect.top]) +
- ((srcBlitRect.left >> b1) * 4);
- numBytesPerRow =
- ((dstBlitRect.right - dstBlitRect.left) >> b1) * 4;
- BlitPixieAllBitPartialMask(
- (PixelChunkPtr)(srcFrameP->frameBaseAddr +
- srcBaseOffset),
- (PixelChunkPtr)(dstFrameP->frameBaseAddr +
- (dstFrameP->scanLinePtrArray[dstBlitRect.top]) +
- ((dstBlitRect.left >> b1) * 4)),
- (PixelChunkPtr)(srcFrameP->maskBaseAddr +
- srcBaseOffset),
- numRowsToCopy,
- numBytesPerRow,
- (srcFrameP->frameRowBytes << 1) - numBytesPerRow,
- (dstFrameP->frameRowBytes << 1) - numBytesPerRow,
- (srcBlitRect.left << b2) & 0x1F,
- (dstBlitRect.left << b2) & 0x1F,
- ((dstBlitRect.right - dstBlitRect.left) << b2) & 0x1F);
- if (gSWmmuMode != true32b) {
- SwapMMUMode(&mmuMode);
- }
- }
-
- #if !XSW_USE_C
-
- #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
-