home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-06-20 | 7.9 KB | 372 lines | [TEXT/CWIE] |
- #include <Timer.h>
- #include <QDOffscreen.h>
- #include <A4Stuff.h>
- #include "Drawing.h"
-
- #define kAnimTime 95 // Ironic, isn't it?
-
- typedef void (*BlitProcPtr)(void);
-
- static void BlitImage1(void);
- static void BlitImage2(void);
- static void BlitImage4(void);
- static void BlitImage8(void);
- static void BlitImage16(void);
- static void BlitImage32(void);
-
- static void DrawFrame(void);
-
- static TMTask drawTask;
- static Handle pict8 = nil, pict4 = nil, pict1 = nil;
- static Rect srcRect, destRect;
- static GWorldPtr srcWorld = nil;
- static PixMapHandle destPMH = nil;
- static Ptr srcPMBaseAddr;
- static short curBitDepth, srcRight;
- static long pictBytesToCopy, pictBytesPerRow;
- static BlitProcPtr blitter = nil;
-
- OSErr InitDraw(short pictID) // resource id of system pict file
- {
- drawTask.tmAddr = (TimerUPP) DrawFrame;
- drawTask.tmWakeUp = 0;
-
- if ((pict8 == nil) && (pict4 == nil) && (pict1 == nil))
- {
- if (pict8 == nil)
- {
- pict8 = Get1Resource('PICT', 128);
- if (pict8 != nil)
- {
- HNoPurge(pict8);
- DetachResource(pict8);
- }
- }
-
- if (pict4 == nil)
- {
- pict4 = Get1Resource('PICT', 129);
- if (pict4 != nil)
- {
- HNoPurge(pict4);
- DetachResource(pict4);
- }
- }
-
- if (pict1 == nil)
- {
- pict1 = Get1Resource('PICT', 130);
- if (pict1 != nil)
- {
- HNoPurge(pict1);
- DetachResource(pict1);
- }
- }
-
- if ((pict8 == nil) || (pict4 == nil) || (pict1 == nil))
- return resNotFound;
- }
-
- return noErr;
- }
-
- void DoneDraw(void) // done once at last init windows (performs cleanup)
- {
- RmvTime((QElemPtr) &drawTask); // make sure that this is stopped!
-
- if (pict1 != nil)
- DisposeHandle(pict1);
- pict1 = nil;
-
- if (pict4 != nil)
- DisposeHandle(pict4);
- pict4 = nil;
-
- if (pict8 != nil)
- DisposeHandle(pict8);
- pict8 = nil;
- }
-
- void StartDraw(Rect *dest, PixMapHandle pixMap) // dest rect and pixmap handle
- {
- GWorldPtr saveGWorld;
- GDHandle saveGDHand;
- PicHandle thePict;
- Rect pictRect;
- THz cZone;
- short vShift = 0;
-
- StopDraw();
-
- destPMH = pixMap;
- curBitDepth = (**pixMap).pixelSize;
-
- switch (curBitDepth)
- {
- case 1:
- case 2:
- thePict = (PicHandle) pict1;
- vShift = 45;
- break;
- case 4:
- thePict = (PicHandle) pict4;
- vShift = 45;
- break;
- case 8:
- case 16:
- case 32:
- thePict = (PicHandle) pict8;
- vShift = 45;
- break;
- default:
- return;
- }
-
- destRect = *dest;
- destRect.bottom = destRect.top
- + ((**thePict).picFrame.bottom - (**thePict).picFrame.top);
- destRect.right = destRect.left + 117;
- OffsetRect(&destRect,
- ((dest->right - dest->left) - (destRect.right - destRect.left)) >> 1,
- vShift);
-
- pictRect = (**thePict).picFrame;
-
- if ((pictRect.top != 0) || (pictRect.left != 0))
- OffsetRect(&pictRect, -pictRect.left, -pictRect.top);
-
- switch (curBitDepth)
- {
- case 1:
- blitter = BlitImage1;
- pictBytesToCopy = (destRect.right - destRect.left) >> 3;
- break;
- case 2:
- blitter = BlitImage2;
- pictBytesToCopy = (destRect.right - destRect.left) >> 2;
- break;
- case 4:
- blitter = BlitImage4;
- pictBytesToCopy = (destRect.right - destRect.left) >> 1;
- break;
- case 8:
- blitter = BlitImage8;
- pictBytesToCopy = (destRect.right - destRect.left);
- break;
- case 16:
- blitter = BlitImage16;
- pictBytesToCopy = (destRect.right - destRect.left) << 1;
- break;
- case 32:
- blitter = BlitImage32;
- pictBytesToCopy = (destRect.right - destRect.left) << 2;
- break;
- }
-
- srcRect = pictRect;
- srcRight = pictRect.right;
- srcRect.right = pictRect.left + 117;
- OffsetRect(&srcRect, srcRect.right, 0); // start with frame 2
-
- cZone = GetZone();
- SetZone(SystemZone());
-
- GetGWorld(&saveGWorld, &saveGDHand);
-
- if (NewGWorld(&srcWorld, curBitDepth, &pictRect, nil, nil, keepLocal) == noErr)
- {
- PixMapHandle pmh = GetGWorldPixMap(srcWorld);
-
- LockPixels(pmh);
-
- srcPMBaseAddr = GetPixBaseAddr(pmh);
- pictBytesPerRow = 0x00003FFF & (**pmh).rowBytes;
-
- SetGWorld(srcWorld, nil);
-
- EraseRect(&pictRect);
-
- DrawPicture(thePict, &pictRect);
-
- InsXTime((QElemPtr) &drawTask); // insert the time manager task
- PrimeTime((QElemPtr) &drawTask, kAnimTime);
- }
-
- SetGWorld(saveGWorld, saveGDHand);
-
- SetZone(cZone);
-
- return;
- }
-
- void StopDraw(void) // called to stop animation
- {
- THz cZone;
-
- RmvTime((QElemPtr) &drawTask); // stop the time manager task
-
- if (srcWorld != nil)
- {
- cZone = GetZone();
- SetZone(SystemZone());
-
- UnlockPixels(GetGWorldPixMap(srcWorld));
-
- DisposeGWorld(srcWorld);
-
- srcWorld = nil;
- blitter = nil;
- curBitDepth = 0;
-
- SetZone(cZone);
- }
- }
-
- static void DrawFrame(void)
- {
- long oldA4 = SetCurrentA4();
-
- if (*blitter != nil)
- (*blitter)();
-
- PrimeTime((QElemPtr) &drawTask, kAnimTime);
-
- SetA4(oldA4);
- }
-
- static void BlitImage(Ptr srcAddress, Ptr destAddress, long bytesPerRow)
- {
- register short rowsLeft = destRect.bottom - destRect.top;
- Ptr srcAddr = srcAddress;
- Ptr destAddr = destAddress;
- register Ptr s;
- register Ptr d;
-
- if (((0x00000003 & (long) srcAddr) == 0)
- && ((0x00000003 & (long) destAddr) == 0)) // both are long-aligned
- {
- while (rowsLeft--)
- {
- register long toCopy = pictBytesToCopy >> 2; // copy long-word at a time
-
- d = destAddr;
- s = srcAddr;
-
- while (toCopy--)
- *((long*) d)++ = *((long*) s)++;
-
- destAddr += bytesPerRow;
- srcAddr += pictBytesPerRow;
- }
- }
- else if (((0x00000001 & (long) srcAddr) == 0)
- && ((0x00000001 & (long) destAddr) == 0)) // both are word-aligned
- {
- while (rowsLeft--)
- {
- register long toCopy = pictBytesToCopy >> 1; // copy word at a time
-
- d = destAddr;
- s = srcAddr;
-
- while (toCopy--)
- *((short*) d)++ = *((short*) s)++;
-
- destAddr += bytesPerRow;
- srcAddr += pictBytesPerRow;
- }
- }
- else // at least one is byte-aligned
- {
- while (rowsLeft--)
- {
- register long toCopy = pictBytesToCopy; // copy byte at a time
-
- d = destAddr;
- s = srcAddr;
-
- while (toCopy--)
- *((Byte*) d)++ = *((Byte*) s)++;
-
- destAddr += bytesPerRow;
- srcAddr += pictBytesPerRow;
- }
- }
-
- rowsLeft = srcRect.right - srcRect.left;
- srcRect.right += rowsLeft;
- srcRect.left += rowsLeft;
-
- if (srcRect.left >= srcRight)
- {
- srcRect.left = 0;
- srcRect.right = rowsLeft;
- }
- }
-
- static void BlitImage1(void)
- {
- Ptr baseAddr = (**destPMH).baseAddr;
- Ptr srcAddr = srcPMBaseAddr + ((long) srcRect.left >> 3);
- long rowBytes = 0x00003FFF & (**destPMH).rowBytes;
-
- baseAddr += ((long) destRect.top * rowBytes) + ((long) destRect.left >> 3);
-
- BlitImage(srcAddr, baseAddr, rowBytes);
- }
-
- static void BlitImage2(void)
- {
- Ptr baseAddr = (**destPMH).baseAddr;
- Ptr srcAddr = srcPMBaseAddr + ((long) srcRect.left >> 2);
- long rowBytes = 0x00003FFF & (**destPMH).rowBytes;
-
- baseAddr += ((long) destRect.top * rowBytes) + ((long) destRect.left >> 2);
-
- BlitImage(srcAddr, baseAddr, rowBytes);
- }
-
- static void BlitImage4(void)
- {
- Ptr baseAddr = (**destPMH).baseAddr;
- Ptr srcAddr = srcPMBaseAddr + ((long) srcRect.left >> 1);
- long rowBytes = 0x00003FFF & (**destPMH).rowBytes;
-
- baseAddr += (destRect.top * rowBytes) + (destRect.left >> 1);
-
- BlitImage(srcAddr, baseAddr, rowBytes);
- }
-
- static void BlitImage8(void)
- {
- Ptr baseAddr = (**destPMH).baseAddr;
- Ptr srcAddr = srcPMBaseAddr + (long) srcRect.left;
- long rowBytes = 0x00003FFF & (**destPMH).rowBytes;
-
- baseAddr += ((long) destRect.top * rowBytes) + (long) destRect.left;
-
- BlitImage(srcAddr, baseAddr, rowBytes);
- }
-
- static void BlitImage16(void)
- {
- Ptr baseAddr = (**destPMH).baseAddr;
- Ptr srcAddr = srcPMBaseAddr + ((long) srcRect.left << 1);
- long rowBytes = 0x00003FFF & (**destPMH).rowBytes;
-
- baseAddr += ((long) destRect.top * rowBytes) + ((long) destRect.left << 1);
-
- BlitImage(srcAddr, baseAddr, rowBytes);
- }
-
- static void BlitImage32(void)
- {
- Ptr baseAddr = (**destPMH).baseAddr;
- Ptr srcAddr = srcPMBaseAddr + ((long) srcRect.left << 2);
- long rowBytes = 0x00003FFF & (**destPMH).rowBytes;
-
- baseAddr += ((long) destRect.top * rowBytes) + ((long) destRect.left << 2);
-
- BlitImage(srcAddr, baseAddr, rowBytes);
- }
-