home *** CD-ROM | disk | FTP | other *** search
- /* marquee.c */
- #include "marquee.h"
-
- typedef struct MarqueeRec {
- struct MarqueeRec *fNext;
- int fType;
- Rect fFromRect, fToRect;
- BitMap fBits;
- int fOffset;
- int fLeftMaximum;
- long fDelayTimer;
- WindowPtr fMarqueePort;
- } MarqueeRec,*MarqueePtr;
-
- QHdr gMarqueeQueue;
-
- BitMap StringToBitMap (Str255 s, int h, int v, int descent);
-
- /***************************/
- BitMap StringToBitMap (Str255 s, int h, int v, int descent)
- {
- GrafPtr saved;
- GrafPort newPort;
- Rect r;
-
- GetPort(&saved);
- OpenPort(&newPort);
- SetRect(&r,0,0,h,v);
- BlockMove( &r, &newPort.portRect, sizeof(Rect));
-
- RectRgn(newPort.visRgn, &r);
- RectRgn(newPort.clipRgn, &r);
- newPort.portBits.rowBytes = ((h + 15) / 16) * 2;
- newPort.portBits.baseAddr = NewPtr( v * newPort.portBits.rowBytes );
- BlockMove(&r,&newPort.portBits.bounds, sizeof(Rect));
-
- EraseRect(&r);
- MoveTo(0, v - descent);
- TextFont(saved->txFont);
- TextFace(saved->txFace);
- TextSize(saved->txSize);
- DrawString(s);
-
- SetPort(saved);
- return newPort.portBits;
- }
- /***************************/
- void MarqueeInit()
- {
- gMarqueeQueue.qFlags = 0;
- gMarqueeQueue.qHead = NIL;
- gMarqueeQueue.qTail = NIL;
- }
- /***************************/
- void MarqueeIdle( void )
- {
- MarqueePtr thisRec;
-
- thisRec = (MarqueePtr) gMarqueeQueue.qHead;
- for ( ; thisRec != NIL; thisRec = thisRec->fNext )
- if ( thisRec->fOffset != 0 && TickCount() > thisRec->fDelayTimer)
- {
- thisRec->fDelayTimer = TickCount() + 1;
-
- CopyBits( &thisRec->fBits, &thisRec->fMarqueePort->portBits,&thisRec->fFromRect, &thisRec->fToRect, srcCopy,NIL);
-
- if (thisRec->fFromRect.left + thisRec->fOffset < 0 || thisRec->fFromRect.left + thisRec->fOffset > thisRec->fLeftMaximum)
- {
- thisRec->fOffset = -thisRec->fOffset;
- thisRec->fDelayTimer = TickCount() + 40;
- }
- else
- OffsetRect(&thisRec->fFromRect, thisRec->fOffset, 0);
- }
- }
- /***************************/
- void MarqueeDisplay (Str255 s, int displayWidth)
- {
- int sWidth, dH, lineHeight;
- Point curLoc;
- FontInfo fontstuff;
- MarqueePtr newRec;
-
- sWidth = StringWidth(s);
- if (sWidth < displayWidth)
- {
- Move( -(sWidth / 2), 0);
- DrawString(s);
- }
- else
- {
- newRec = (MarqueePtr) (NewPtrClear( sizeof(MarqueeRec) + 4) + 4);
-
- GetFontInfo(&fontstuff);
- lineHeight = fontstuff.ascent + fontstuff.descent + fontstuff.leading;
- newRec->fBits = StringToBitMap(s, sWidth, lineHeight, fontstuff.descent);
-
- SetRect(&newRec->fFromRect, 0, 0, displayWidth, lineHeight);
- BlockMove(&newRec->fFromRect,&newRec->fToRect, sizeof(Rect));
- GetPen(&curLoc);
- OffsetRect(&newRec->fToRect, curLoc.h - displayWidth / 2, curLoc.v - fontstuff.ascent);
- InsetRect(&newRec->fToRect, -2, -2);
- FrameRect(&newRec->fToRect);
- InsetRect(&newRec->fToRect, 2, 2);
- newRec->fLeftMaximum = sWidth - displayWidth;
- newRec->fOffset = 1;
- newRec->fDelayTimer = TickCount() + 1;
- GetPort(&newRec->fMarqueePort);
-
- Enqueue( (QElemPtr) newRec, &gMarqueeQueue );
- }
- }
-