mac-rom/QuickDraw/Pictures.a
Elliot Nunn 9c249dafab Reverse 68k Color QuickDraw
The ROM now round-trips with QuickDraw mostly built from source.
(~30% of the ROM is now built from source.)
2017-12-26 09:52:55 +08:00

4851 lines
165 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;
; File: Pictures.a
;
; Contains: QuickDraw picture support
;
; Copyright: © 1981-1993 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM4> 9/12/93 SAM Changed all instances of _Translate24to32 to _rTranslate24to32
; so they can conditionalized out of the build.
; <SM3> 6/11/92 stb <sm 6/9/92>stb Synched with QDciPatchROM.a; added comments to
; StdOpcodeProc, NewOpenPicture, OpenPicture, ClosePicture,
; DrawPicture, XTXFONT, TXRATIO, AddFontToTbl, LineLayout,
; GlyphState, BITSOP, tryBands, PutPicVerb, UpdatePat, DONEW,
; NEWPP, PutPicPixPat, PutDirectPMData.
; <SM2> 4/15/92 RB Rolled in patch to DrawPicture from QuickDrawPatches.a. Save and
; restore global info so DrawPicture is reentrant. Do not draw
; purged Picture Handles and mark Handles non purgeable before
; doing the DrawPicture. This fixes bugs in balloon help while
; printing, and a bug in ResEdit while printing in the background.
; <43> 10/2/91 DTY Conditionalise last change for TheFuture.
; <42> 10/1/91 KON Bail on picture playback if StdGetPic an AbortPicPlayBackErr.
; <41> 7/10/91 JSM Remove obsolete SysVers conditional.
; <40> 4/12/91 stb dty, no bug number: remove ### MPW Shell - Execution É
; <39> 4/10/91 KON mrr, gbm,csd: Calculate numer and denom to 32-bits, and then
; shift to make it fit in 15-bits if necessary. This fixes the
; problem where text was not scaling uniformly in pictures.
; <38> 4/9/91 KON csd: When reducing a picture, text would not reduce properly
; since both numer and denom are small and the divide underflows.
; The fix is not to reduce numer/denom if the picture is being
; scaled down.
; <37> 4/5/91 KON csd, BRC#85913: When putting a PixPat to a picture, PutPMData is
; called which trashes register A1. With this fix, A1 is saved and
; restored across the call to PutPMData.
; <36> 3/23/91 KON csd, WRKSHT#SAH-QD-58: ReduceD3D4 would hang because MapRatio
; would return a zero result. I removed calls to MapRatio (since
; ReduceD3D4 does the same work) and changed ReduceD3D4 so it
; won't hang.
; <35> 3/22/91 KON CSD, WRKSHT#7P-WA-054: Large text does not draw correctly since
; fromRect scaled by numer/denom can overflow a word.
; <34> 3/20/91 KON gbm, WRKSHT#SAH-QD-053: StdOpCodeProc sets the denom of a
; picture created with OpenCPicture. This is a problem since
; DrawPicture reduced numer/denom, and blasting denom to a large
; value makes the fraction invalid. Now numer/denom are reduced
; only after the header has been processed.
; <33> 3/13/91 JT Added the glyph state opcode support to picture drawing under
; new QuickDraw. This opcode records the state of the Font Manager
; and TrueType so text will be drawn the same on picture playback
; as it was during picture recording. Code checked by KON and BAL.
; BRC numbers 82651 and 79185. Worksheet number KON-022.
; <32> 2/27/91 KON DTY BRC #82863: Some large text does not print in pictures
; because numer and denom overflow. Here I reduce the scale factor
; (the ratio of the rectangle sides) before scaling numer and
; denom. This prevents the overflow.
; <31> 2/4/91 KON DDG: BRC# unknown: PutPicPixPat should call PutDirectPMData for
; direct pixpats.
; <30> 1/14/91 KON Reduce Numer and Denom by GCD when drawing a picture. These
; overflow on higher DPI devices. [CEL]
; <29> 12/13/90 KON If color table in picture is NIL, check for signature. If it
; exists, throw the color table away. [smc]
; <28> 12/3/90 KON Color Table in pictures, take three. If color table is NIL,
; still read it from the picture but then throw it away. [smc]
; <27> 10/30/90 KON If color table is nil, don't load it from the picture! [SMC]
; <26> 9/21/90 KON Fix problems with saving CPictures in old ports.
; <25> 9/7/90 KON Check for WideOpen before doing a mapRgn is moved to mapRgn
; itself, so removed code here.
; <24> 8/28/90 KON PutDirectPMData for pack type 1 was trashing rowbytes if
; rowbytes was larger than a byte.
; <23> 8/24/90 PKE (per JT) Use new Script Mgr line layout values in GrafGlobals
; instead of soon-to-be-obsolete values in Script Mgr globals. Use
; new names picQdChExtra and picQdRunSlop instead of picSMgrChar
; and picSMgrSlop.
; <22> 8/24/90 KON Change error on draw picture abort from -145 to
; noMemForPictPlayback defined in ColorEqu.a.
; <21> 8/2/90 gbm rid this file of vile warnings
; <20> 7/24/90 gbm get rid of ridiculous branch
; <19> 6/29/90 KON Change order in which picSmgrChar and picSMgrSlop are inited to
; match the new ordering in the picSave record in ColorEqu.a.
; <18> 6/27/90 KON Always clear the script manager state information in a picture
; save record.
; <17> 5/16/90 KON Fix OpenCPicture so heights >= 910 don't cause problems.
; <16> 5/2/90 JT Grappled with the BBS comment mechanism. No real changes to the
; source.
; <15> 5/2/90 JT Can't rely on the GetWord and GetLong routines to not trash
; the registers.
; <14> 4/24/90 JT Fixed an error in the line-layout picture opcode stuff.
; Waiting on the new smgrSlop field in the Script Manager
; globals.
; <13> 4/24/90 JT Moved all previous changes for the Script Manager under the
; SCRIPT_CHAR_EXTRA flag so they can be turned off on a whim.
; <12> 4/23/90 JT Added Script Manager conditional flag and include files.
; <11> 4/23/90 JT Save the Script Manager line-layout state, clear it out, and
; restore it around the picture drawing stuff.
; <10> 4/23/90 JT Clear picSMgrChar and picSMgrSlop in picture state record when
; opening a new picture.
; <9> 2/15/90 BAL Changed getpictable to force a unique seed for clut id's greater
; than 256.
; <8> 2/6/90 KON Fixed the 24 byte picture header created by OpenPicture. It was
; writing out an unitialized data chunk.
; <7> 2/2/90 BAL Made PutDirectPMData and PutPMData access the source in 32-bit
; addressing mode.
; <6> 1/28/90 KON Fixed picFrame calculation in DrawCPicture.
; <5> 1/18/90 KON Fix bug in StdOpCodeProc so it handles header version -2
; correctly.
; <4> 1/16/90 KON Always abort OpenPicture if a 1.5K NewHandle request fails.
; <3> 1/15/90 BAL Fixed bug in close picture which orphaned the the font name list
; handle when picture was in an old port.
; <1+> 1/3/90 BAL Fixed bug in interpretation of new pict2 header.
; <2.4> 12/5/89 KON Check for version -2 pict in hdr correctly.
; <2.3> 11/27/89 KON Check for version -2 pict in addition to checking for a PICT2 in
; the StdOpcode proc.
; <2.2> 11/19/89 BAL Moved resolution scaling into StdOpcode proc instead of
; DrawPicture.
; <2.1> 11/16/89 BAL Altered DrawPicture to scale new variable resolution picts to
; actual size.
; <2.0> 11/16/89 BAL Reworked OpenCPicture to support variable resolution pictures.
; <1.9> 11/15/89 KON Pulled GetPMData and associated routines into separate file
; which which is included both here and in the B&W Quickdraw
; patches.
; <1.8> 11/8/89 BAL Fixed bug in pixpat expansion (or lack thereof) which caused
; problems on other than the mainscreen.
; <1.7> 11/1/89 BAL Altered OpenPicture to allocate fontList and larger picSave
; handles. Added fontMapping handle to DrawPicture stack frame.
; Re-instantiate font names at draw time by building tbl in
; playState during picItem1.
; <¥1.6> 7/14/89 BAL For Aurora: Final CQD
; <1.5> 6/30/89 BAL Take advantage of temporary memory during picture playback Flush
; grafPort state at picComment time.
; <¥1.4> 5/29/89 BAL Blasting in 32-Bit QuickDraw version 1.0 Final
; 2/22/89 BAL Dispose pixPats before doing a penPat,bkPat,or fillPat in CPort.
; 12/11/88 BAL Changed getPicTable to use a unique CTSeed for non standard
; CLUTS
; 6/17/88 BAL Added support for direct pixmaps: GetDirectPMData,
; PutDirectPMData, GetBigPicData, PutBigPicData Altered:
; GetPMData, GetPMD, PicItem1, BitsOp Changed DrawPicture to lock
; the Pict handle before drawing
; 1/9/88 BAL Changed OpenPicture to not carry derefenced handle across call
; to NewPixPat.
; <C992> 1/9/88 BAL Fixed bitsop to convert pixmap to bitmap in place when bitsproc
; ­ stdBits.
; <C946> 11/7/87 BAL Rolled in patch for new pictures in old grafports. Also provided
; for banding of pixmaps when low on memory.
; 5/26/87 EHB Rolled in patch for old pictures in new grafports.
; <C287> 2/19/87 EHB Added fix to bitsop for drawpicture of bitmaps bug.
; 1/21/87 EHB Fixed old bug: in BitsOp, MaskRgn wasn't getting mapped to dst
; Fixed bug in MapPt Fixed bug in CheckPic (Trashed stack when
; recording old pic w/cGrafPort Initialize and playBack charExtra,
; hiliteMode, opColor
; 6/23/86 EHB Allocate and initialize color patterns in OpenPicture. Dispose
; color patterns in ClosePicture.
; 6/22/86 EHB If NPIC, then record RGB colors. If NPIC, then record color
; patterns.
; 6/21/86 EHB Added picVersion field to PicSave record to identify NPIC
; (output). If NPIC, then pad data to word boundaries before
; opcodes. If NPIC, then put word opcodes.
; 6/21/86 EHB Added playVersion to playState record to identify NPIC (input).
; If NPIC, then skip to word boundaries before reading opcodes. If
; NPIC, then get word opcodes.
; 6/5/86 EHB Mask off flag bits from references to rowBytes
; 5/2/86 EHB Added routine MapRatio to fix scaling problem in DrawPicture.
; (If drawPicture within picture definition draws text, then
; subsequent drawString in picture definition didn't scale).
; 5/2/86 EHB Call MapRatio from TxRatio
; 4/11/86 EHB GetHndl was locking handle instead of unlocking it.
;
BLANKS ON
STRING ASIS
IF (&TYPE('SCRIPT_CHAR_EXTRA') = 'UNDEFINED') THEN
IF forROM THEN
SCRIPT_CHAR_EXTRA EQU 0
ELSE
SCRIPT_CHAR_EXTRA EQU 1
ENDIF
ENDIF
IF (&TYPE('hasGlyphState') = 'UNDEFINED') THEN
IF forROM THEN
hasGlyphState EQU 0
ELSE
hasGlyphState EQU 1
ENDIF
ENDIF
StdComment PROC EXPORT
IMPORT DPutPicOp,PutPicWord,PutPicData
;------------------------------------------------------------------
;
; PROCEDURE StdComment(kind,dataSize: INTEGER; dataHandle: Handle);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 8
KIND EQU PARAMSIZE+8-2 ;WORD
DATASIZE EQU KIND-2 ;WORD
DATAHANDLE EQU DATASIZE-4 ;LONG, HANDLE
LINK A6,#0 ;NO LOCAL VARS
MOVEM.L D6-D7,-(SP) ;SAVE REGS
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
TST.L PICSAVE(A0) ;ARE WE SAVING FOR THEPIC ?
BEQ.S DONE ;NO, QUIT
MOVE KIND(A6),D6 ;YES, GET KIND
MOVE DATASIZE(A6),D7 ;IS DATASIZE > 0 ?
BGT.S LONG ;YES, USE LONG FORMAT
; DATASIZE 0, USE SHORT FORMAT
MOVE #opShortComment,D0 ;GET SHORT COMMENT OPCODE
JSR DPutPicOp ;PUT SHORT COMMENT OPCODE
MOVE D6,-(SP)
JSR PutPicWord ;PUT KIND
BRA.S DONE
; DATASIZE > 0, USE LONG FORMAT
LONG MOVE #opLongComment,D0 ;GET LONG COMMENT OPCODE
JSR DPutPicOp ;PUT LONG COMMENT OPCODE
MOVE D6,-(SP)
JSR PutPicWord ;PUT KIND
MOVE D7,-(SP)
JSR PutPicWord ;PUT DATASIZE
MOVE.L DATAHANDLE(A6),A0 ;GET DATA HANDLE
_HLOCK ;LOCK IT
MOVE.L (A0),-(SP) ;PUSH DATAPTR
MOVE D7,-(SP) ;PUSH BYTECOUNT
JSR PutPicData ;PUT DATA TO THEPIC
MOVE.L DATAHANDLE(A6),A0 ;GET DATA HANDLE
_HUnlock ;UNLOCK IT <11Apr86 EHB>
DONE MOVEM.L (SP)+,D6-D7 ;RESTORE REGS
UNLINK PARAMSIZE,'STDCOMME'
StdGetPic FUNC EXPORT
;------------------------------------------------------------------
;
; PROCEDURE StdGetPic(dataPtr: QDPtr; byteCount: INTEGER);
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE (SP)+,D1 ;POP BYTECOUNT
MOVE.L (SP)+,A1 ;POP DATAPTR
MOVE.L A0,-(SP) ;PUSH RETURN ADDR
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L PLAYINDEX(A0),D0 ;GET PLAYINDEX
MOVE.L PLAYPIC(A0),A0 ;GET PLAY PICHANDLE
MOVE.L (A0),A0 ;DE-REFERENCE IT
ADD.L D0,A0 ;ADD PLAYINDEX
BRA.S START ;GO TO LOOP START
NXTBYTE MOVE.B (A0)+,(A1)+ ;COPY ONE BYTE
START DBRA D1,NXTBYTE ;LOOP FOR ALL BYTES
RTS ;AND RETURN
StdPutPic PROC EXPORT
;------------------------------------------------------------------
;
; PROCEDURE StdPutPic(dataPtr: QDPtr; byteCount: INTEGER);
;
; Append some picture bytes to a growing handle.
;
PARAMSIZE EQU 6
SRCPTR EQU PARAMSIZE+8-4 ;LONG
BYTECOUNT EQU SRCPTR-2 ;WORD
LINK A6,#0 ;NO LOCALS
MOVEM.L D7/A3-A4,-(SP) ;SAVE REGS
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A4),A4 ;GET CURRENT GRAFPORT
TST.L PICSAVE(A4) ;ARE WE SAVING FOR A PICTURE ?
BEQ.S GOHOME ;NO, QUIT
MOVE.L PICSAVE(A4),A4 ;YES, GET PICSAVE HANDLE
MOVE.L (A4),A1 ;DE-REFERENCE PICSAVE HANDLE
MOVE.L PICINDEX(A1),D7 ;GET CURRENT SIZE
BEQ.S GOHOME ;QUIT IF PICTURE IS ALREADY DEAD
MOVE.L THEPIC(A1),A3 ;GET THEPIC HANDLE
MOVE BYTECOUNT(A6),D0 ;GET BYTES REQUESTED
EXT.L D0 ;MAKE BYTECOUNT LONG
ADD.L D7,D0 ;CALCULATE NEW SIZE
MOVE.L D0,PICINDEX(A1) ;UPDATE PICINDEX
MOVE.L (A3),A0 ;DE-REFERENCE THEPIC
MOVE.W D0,PICSIZE(A0) ;PICSIZE := LO WORD OF PICINDEX
CMP.L PICMAX(A1),D0 ;IS NEW SIZE > PICMAX ?
BLE.S SIZEOK ;NO, CONTINUE
;
; time to grow the picture in chunks of at least 512 bytes
;
ADD.L #512,D0 ;GROW PIC IN CHUNKS
MOVE.L D0,PICMAX(A1) ;UPDATE NEW PICMAX
MOVE.L A3,A0 ;GET THEPIC HANDLE
_SetHandleSize ;MAKE IT BIGGER
MOVE.L (A4),A1 ;RE-DEREFERENCE PICSAVE HANDLE
BEQ.S SIZEOK ;CONTINUE IF NO ERROR
;
; Failed to grow picture, so we will trim handle down to 10 bytes,
; clear PicIndex, and set picSize to -1, PicFrame to (0,0,0,0).
;
CLR.L PICINDEX(A1) ;CLEAR PICINDEX AS DEAD FLAG
MOVE.L #10,D0 ;BYTECOUNT = 10
MOVE.L A3,A0 ;GET THEPIC HANDLE
_SetHandleSize ;SHRINK PICTURE TO 10 BYTES
MOVE.L (A3),A0 ;DE-REFERENCE PICHANDLE
MOVE #-1,(A0)+ ;STUFF picSize = -1
CLR.L (A0)+ ;stuff picFrame = (0,0,0,0)
CLR.L (A0)+ ;all 8 bytes of picFrame
BRA.S GOHOME ;AND QUIT
;
; now copy the data bytes into the picture:
;
SIZEOK MOVE.L THEPIC(A1),A1 ;GET THEPIC HANDLE
MOVE.L (A1),A1 ;DE-REFERENCE PICHANDLE
ADD.L D7,A1 ;ADD OLDSIZE FOR DSTPTR
MOVE.L SRCPTR(A6),A0 ;GET SRCPTR
MOVE BYTECOUNT(A6),D0 ;GET BYTECOUNT
BRA.S START ;GO TO LOOP START
NXTBYTE MOVE.B (A0)+,(A1)+ ;COPY A BYTE
START DBRA D0,NXTBYTE ;LOOP ALL BYTES
GOHOME MOVEM.L (SP)+,D7/A3-A4 ;RESTORE REGS
UNLINK PARAMSIZE,'STDPUTPI'
;Êas seen in QDciPatchROM.a <sm 6/9/92>stb
StdOpcodeProc PROC EXPORT
IMPORT GetLong,GetPicdata
;--------------------------------------------
;
; OFFSETS WITHIN A PICTURE PLAY STATE RECORD:
;
THERECT EQU 0 ;RECT
PENLOC EQU THERECT+8 ;POINT
TEXTLOC EQU PENLOC+4 ;POINT
OVALSIZES EQU TEXTLOC+4 ;POINT
FROMRECT EQU OVALSIZES+4 ;RECT
TORECT EQU FROMRECT+8 ;RECT
NUMER EQU TORECT+8 ;POINT
DENOM EQU NUMER+4 ;POINT
THECLIP EQU DENOM+4 ;RGNHANDLE
USERCLIP EQU THECLIP+4 ;RGNHANDLE
PLAYVERSION EQU USERCLIP+4 ;PICTURE VERSION
TXHFRAC EQU PLAYVERSION+2 ;FRACTIONAL TEXT POSITION
NEWHFRAC EQU TXHFRAC+2 ;UPDATED FRACTION RECIEVED
TEMPPIXPAT EQU NEWHFRAC+2 ;PIXPAT FOR PLAYING NEW PICS IN OLD PORTS
FontMappingTbl EQU TEMPPIXPAT+4 ;Handle to array of old,new font id pairs
PSreserve1 EQU FontMappingTbl+4 ;reserved
PSreserve2 EQU PSreserve1+4 ;reserved
PLAYREC EQU PSreserve2+4 ;TOTAL SIZE
;------------------------------------------------------
;
; New offsets in a PICT2 header record:
;
hdrVersion EQU 0 ;Word (=-2)
hdrReserved EQU hdrVersion+2 ;Word
hdrHRes EQU hdrReserved+2 ;Fixed
hdrVRes EQU hdrHRes+4 ;Fixed
hdrSrcRect EQU hdrVRes+4 ;Rect
hdrReserved2 EQU hdrSrcRect+8 ;Long
picHdrSize EQU hdrReserved2+4 ;size of a PICT2 header record
;------------------------------------------------------------------
;
; PROCEDURE StdOpcode(fromRect,toRect: Rect; opcode,version: INTEGER);
;
; GETS CALLED FOR OPCODE VALUES $0100-$FFFF
;
; OPCODE: $0100-$01FF 2 BYTES DATA
; $0200-$02FF 4 BYTES DATA
; ...
; $7F00-$7FFF 254 BYTES DATA
; $8000-$80FF 0 BYTES DATA
; $8100-$FFFF 4 BYTES SIZE + SIZE BYTES DATA
;
; THIS PROCEDURE READS THE OPCODE'S DATA AND IGNORES IT
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 12
pFROMRECT EQU PARAMSIZE+8-4 ;LONG
pTORECT EQU pFROMRECT-4 ;LONG
OPCODE EQU pTORECT-2 ;WORD
VERSION EQU OPCODE-2 ;WORD
LINK A6,#0 ;NO LOCAL VARS
MOVEM.L D6/D7,-(SP) ;SAVE WORK REGISTERS
MOVE.L #256,D6 ;GET USEFUL NUMBER
SUB.L D6,SP ;ALLOCATE STACK BUFFER
MOVE OPCODE(A6),D0 ;GET THE OPCODE
BMI.S GETSIZE ;=>OP CONTAINS SIZE
LSR #8,D0 ;GET SIZE/2 IN LOW NIBBLE
ADD D0,D0 ;CALC SIZE
EXT.L D0 ;MAKE IT LONG
BRA.S SHARE ;=>USE COMMON CODE
GETSIZE AND #$7F00,D0 ;MASK THE OPCODE
BEQ.S DONE ;=>NO DATA BYTES
JSR GETLONG ;READ IN SIZE
SHARE MOVE.L D0,D7 ;SAVE WHOLE SIZE
NXTCHNK MOVE D6,D0 ;ASSUME SIZE >= 256
CMP.L D6,D7 ;IS SIZE >= 256?
BGE.S SIZEOK ;=>YES, SKIP 256 BYTES
MOVE D7,D0 ;ELSE SKIP REMAINING BYTES
SIZEOK MOVE.L SP,-(SP) ;PUSH BUFFER POINTER
MOVE D0,-(SP) ;PUSH BYTECOUNT
if TheFuture then ; DonÕt put into a specific system version <43>
cmp.w #AbortPicPlayBackErr,qdErr ;abort if our special error <42>
beq.s Done
endif ; <43>
JSR GETPICDATA ;READ DATA INTO BUFFER
SUB.L D6,D7 ;SUBTRACT BUFSIZE FROM COUNT
BGT.S NXTCHNK ;=>GO SKIP NEXT CHUNK
;Slimey hack assumes that StdOpCodeProc is called with a pointer to the fromRect inside
;the active playstate record for the pict. Fortunately, this is the case. Otherwise, the
;"illegal" altering of Denom and FromRect would not affect the picture playback.
;If this opcode were in the midst of a picture (or we supported more than one per pict)
;then we would also have to remap the pensize and potentially the cliprgn as well.
cmp.w #ngHeaderOp,OPCODE(a6) ;pict2 header opcode? <18Jan90 KON>
bne.s done ;not a pict2 header opcode <18Jan90 KON>
cmp.w #$fffe,(sp) ;is it version -2 header? <18Jan90 KON>
bne.s done ;<27nov89 KON> <18Jan90 KON>
move.l pFromRect(a6),a1 ;point to playstate's FromRect
lea hdrSrcRect(sp),a0 ;point to sourceRect stored in header record
MOVE RIGHT(A0),D0
SUB LEFT(A0),D0 ;CALC SRC WIDTH
MOVE D0,DENOM+H-FromRect(A1) ;DENOM.H := SRC WIDTH
MOVE BOTTOM(A0),D0
SUB TOP(A0),D0 ;CALC SRC HEIGHT
MOVE D0,DENOM+V-FromRect(A1) ;DENOM.V := SRC HEIGHT
MOVE.L (A0)+,(A1)+
MOVE.L (A0)+,(A1)+ ;FROMRECT := PICFRAME
DONE ADD.L D6,SP ;STRIP BUFFER
MOVEM.L (SP)+,D6/D7 ;RESTORE WORK REGISTERS
UNLINK PARAMSIZE,'STDPICPR'
PicComment PROC EXPORT
;------------------------------------------------------------------
;
; PROCEDURE PicComment(kind,dataSize: INTEGER; dataHandle: Handle;
;
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L GRAFPROCS(A0),D0 ;IS GRAFPROCS NIL ?
MOVE.L JStdComment,A0 ;get piece of trap table
BEQ.S USESTD ;YES, USE STDCOMMENT
MOVE.L D0,A0
MOVE.L COMMENTPROC(A0),A0 ;NO, GET PROC PTR
USESTD JMP (A0) ;AND JUMP TO IT
; as seen in QDciPatchROM.a at OpenCPicture <sm 6/9/92>stb
NewOpenPicture FUNC EXPORT
ENDPROC
;------------------------------------------------------
;
; Offsets in parameter block passed to OpenCPicture
;
ppSrcRect EQU 0 ;Rect
ppHRes EQU ppSrcRect+8 ;Fixed
ppVRes EQU ppHRes+4 ;Fixed
ppVersion EQU ppVRes+4 ;Word (=0)
ppReserved EQU ppVersion+2 ;Word
ppReserved2 EQU ppReserved+2 ;Long
PicParamSize EQU ppReserved2+4 ;size of a PICT2 header record
;------------------------------------------------------
;
; New offsets in a PICT2 header record:
;
hdrVersion EQU 0 ;Word (=-2)
hdrReserved EQU hdrVersion+2 ;Word
hdrHRes EQU hdrReserved+2 ;Fixed
hdrVRes EQU hdrHRes+4 ;Fixed
hdrSrcRect EQU hdrVRes+4 ;Rect
hdrReserved2 EQU hdrSrcRect+8 ;Long
picHdrSize EQU hdrReserved2+4 ;size of a PICT2 header record
OpenCPicture FUNC EXPORT
IMPORT OPShare
;------------------------------------------------------------------
;
; FUNCTION OpenCPicture(picFrame: Rect): cPicHandle;
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 4
RESULT EQU PARAMSIZE+8 ;LONG, PICHANDLE
params EQU RESULT-4 ;ptr to input params
SAVEVERSION EQU -2 ;PICTURE VERSION NUMBER
picHdrRec EQU SAVEVERSION-picHdrSize ;PICT2 header record
defaultFrame EQU picHdrRec-8 ;pic frame to be recorded in picture
VARSIZE EQU defaultFrame ;TOTAL BYTES OF LOCALS
LINK A6,#VARSIZE ;MAKE STACK FRAME
MOVE #npicVersion,SAVEVERSION(A6) ;SAVE VERSION NUMBER
;copy input parameters into pict 2 header record and compute picFrame
move.l params(a6),a0 ;point to input parameters
move.l ppSrcRect(a0),picHdrRec+hdrSrcRect(a6)
move.l ppSrcRect+bottom(a0),picHdrRec+hdrSrcRect+bottom(a6)
move.l ppHRes(a0),picHdrRec+hdrHRes(a6)
move.l ppVRes(a0),picHdrRec+hdrVRes(a6)
move.w ppVersion(a0),d0 ;orginal version?
bne.s @newversion
move.w #-2,picHdrRec+hdrVersion(a6)
clr.w picHdrRec+hdrReserved(a6)
clr.l picHdrRec+hdrReserved2(a6)
bra.s @computePicFrame
@newversion ;fill out additional fields
move.w d0,picHdrRec+hdrVersion(a6)
move.w ppReserved(a0),picHdrRec+hdrReserved(a6)
move.l ppReserved2(a0),picHdrRec+hdrReserved2(a6)
@computePicFrame
move.l picHdrRec+hdrSrcRect+top(a6),d0 ;get topLeft in d0
move.l picHdrRec+hdrSrcRect+bottom(a6),d1 ;get botRight in d1
move.l d0,defaultFrame+top(a6) ;set default new height
move.l d1,defaultFrame+bottom(a6) ;set default new width
sub.w d0,d1 ;get width in d1.w
move.w d1,d2 ;save width in d2.w
swap d0
swap d1
sub.w d0,d1 ;get height in d1.w
moveq #72,d0
mulu.w d0,d1 ;d1.L = height*72
move.l d1,a0 ;save height*72 in a0
mulu.w d0,d2 ;d2.L = width*72
swap d2
moveq #0,d1 ;extend d1 to long in copy: don't trash high word <KON>
move.w d2,d1
clr.w d2
move.l picHdrRec+hdrHRes(a6),d0
beq.s @skip
divu.l d0,d1:d2 ;d2.w = (width*72)/vRes
move.l picHdrRec+hdrVRes(a6),d0
beq.s @skip
clr.l defaultFrame+top(a6) ;force topLeft to be 0,0
move.w d2,defaultFrame+right(a6) ;right = new width
moveq #0,d2
move.l a0,d1 ;restore d1
swap d1
move.w d1,d2
clr.w d1
divu.l d0,d2:d1 ;d1.w = (height*72)/vRes
move.w d1,defaultFrame+bottom(a6) ;bottom = new height
@skip
JMP OPShare ;=>GO USE COMMON CODE
;Êas seen in QDciPatchROM.a <sm 6/9/92>stb
OpenPicture FUNC EXPORT
EXPORT OPSHARE
IMPORT HidePen,NewRgn,ClipRect,DPutPicOp,DPutPicByte,PUTPICWORD,PUTPICDATA
;------------------------------------------------------------------
;
; FUNCTION OpenPicture(picFrame: Rect): PicHandle;
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 4
RESULT EQU PARAMSIZE+8 ;LONG, PICHANDLE
params EQU RESULT-4 ;ptr to input params
SAVEVERSION EQU -2 ;PICTURE VERSION NUMBER
picHdrRec EQU SAVEVERSION-picHdrSize ;PICT2 header record
defaultFrame EQU picHdrRec-8 ;pic frame to be recorded in picture
VARSIZE EQU defaultFrame ;TOTAL BYTES OF LOCALS
LINK A6,#VARSIZE ;MAKE STACK FRAME
MOVE #pictVersion,SAVEVERSION(A6) ;SAVE VERSION NUMBER
move.l params(a6),a0 ;point to input rect
move.l (a0)+,defaultFrame(a6) ;copy topLeft
move.l (a0),defaultFrame+bottom(a6) ;copy botRight
lea picHdrRec+picHdrSize(a6),a1 ;point past end of hdr record
CLR.L -(a1) ;CLEAR RESERVED LONG
MOVE.L params(A6),A0 ;POINT TO BOUNDING RECT
MOVE.L BOTTOM(A0),D0 ;GET BOTTOM AS FIXED
CLR D0 ;CLEAR LOW WORD
MOVE.L D0,-(a1) ;PUSH FIXED BOTTTOM
MOVE.L RIGHT(A0),D0 ;GET RIGHT AS FIXED
CLR D0 ;CLEAR LOW WORD
MOVE.L D0,-(a1) ;PUSH FIXED RIGHT
MOVE.L TOP(A0),D0 ;GET TOP AS FIXED
CLR D0 ;CLEAR LOW WORD
MOVE.L D0,-(a1) ;PUSH FIXED TOP
MOVE.L LEFT(A0),D0 ;GET LEFT AS FIXED
CLR D0 ;CLEAR LOW WORD
MOVE.L D0,-(a1) ;PUSH FIXED LEFT
MOVEQ #-1,D0 ;GET -1 AS SIZE
MOVE.L D0,-(a1) ;PUSH LONG SIZE
OPShare MOVEM.L D3/A3-A4,-(SP) ;SAVE REGS
CLR.L RESULT(A6) ;INIT FCN RESULT TO NIL
; Abort OpenPicture if heap doesn't have at least 1500 bytes. <16Jan89 KON>
MOVE.L #1500,D0 ;GET BYTE COUNT
_NewHandle ;AT LEAST 1000 BYTES IN THE HEAP ?
BNE DONE ;NO, RETURN NIL AND QUIT
_DisposHandle ;YES, Discard test handle
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A4),A3 ;GET CURRENT GRAFPORT
TST.L PICSAVE(A3) ;ARE WE ALREADY SAVING ?
BNE DONE ;YES, RETURN NIL AND QUIT
_HidePen ;NO, TURN OFF DRAWING
; IF IT'S A NEW GRAFPORT, FORCE NEW PICTURE
TST PORTBITS+ROWBYTES(A3) ;IS IT A NEW GRAFPORT?
BPL.S @OLDGP ;=>NO, OLD GRAFPORT
MOVE #npicVersion,SAVEVERSION(A6) ;ELSE FORCE TO NEW PICTURE
; ALLOCATE PICSAVE RECORD
@OLDGP MOVE.L #npicSaveRec,D0 ;GET BYTE COUNT
_NewHandle ;ALLOCATE PICSAVE RECORD
MOVE.L A0,A4 ;GET RESULT HANDLE
MOVE.L A4,PICSAVE(A3) ;SAVE RESULT IN THEPORT
;
; ALLOCATE PICCLIPRGN (leave on stack for now)
;
CLR.L -(SP) ;MAKE ROOM FOR FCN RESULT
_NEWRGN ;ALLOCATE A NEW REGION
;
; ALLOCATE THEPIC PICHANDLE
;
MOVE.L #256,D0 ;BYTE COUNT = 256
_NewHandle ;ALLOCATE NEWHANDLE(256)
MOVE.L A0,A1 ;GET THEPIC HANDLE
MOVE.L A1,RESULT(A6) ;PUT HANDLE IN FCN RESULT
;
; NOW FILL THEPIC'S PICSIZE AND PICFRAME
;
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE HANDLE
MOVE.L A1,(A4)+ ;SAVE PICHANDLE IN THEPIC
MOVE.L (A1),A1 ;DE-REFERENCE PICHANDLE
MOVE #10,(A1)+ ;INSTALL PICSIZE = 10
lea defaultFrame(A6),A0 ;POINT TO PICFRAME
MOVE.L (A0)+,(A1)+ ;COPY RECT INTO PICTURE
MOVE.L (A0)+,(A1)+
;
; INIT STATE VARIABLES FOR PICTURE CAPTURE
;
MOVE.L #256,(A4)+ ;PICMAX := 256;
MOVE.L #10,(A4)+ ;PICINDEX := 10
MOVE.L (SP)+,(A4)+ ;INSTALL PICCLIPRGN
CLR.L (A4)+ ;PICBKPAT := WHITE
CLR.L (A4)+
CLR.L (A4)+ ;PICTXFONT = 0, PICTXFACE = []
MOVE #1,(A4)+ ;PICTXMODE := SRCCOPY
CLR (A4)+ ;PICTXSIZE := 0
CLR.L (A4)+ ;PICSPEXTRA := 0.0
MOVE.L #$00010001,D0 ;GET (1,1)
MOVE.L D0,(A4)+ ;PICTXNUMER := (1,1)
MOVE.L D0,(A4)+ ;PICTXDENOM := (1,1)
CLR.L (A4)+ ;PICTXLOC := (0,0)
CLR.L (A4)+ ;PICPNLOC := (0,0)
MOVE.L D0,(A4)+ ;PICPNSIZE := (1,1)
MOVE #8,(A4)+ ;PICPNMODE := PATCOPY
MOVEQ #-1,D0 ;GET SOME BLACK
MOVE.L D0,(A4)+ ;PICPNPAT := BLACK
MOVE.L D0,(A4)+
MOVE.L D0,(A4)+ ;PICFILLPAT := BLACK
MOVE.L D0,(A4)+
CLR.L (A4)+ ;PICTHERECT := (0,0,0,0)
CLR.L (A4)+
CLR.L (A4)+ ;PICOVSIZE := (0,0)
MOVE.L PORTRECT+TOPLEFT(A3),(A4)+ ;PICORIGIN := CURRENT ORIGIN
MOVE.L #blackColor,(A4)+ ;PICFGCOLOR := blackColor
MOVE.L #whiteColor,(A4)+ ;PICBKCOLOR := whiteColor
MOVE SAVEVERSION(A6),(A4)+ ;picVersion := version number
CLR.L (A4)+ ;picRGBFgCol := black
CLR (A4)+
MOVE.L D0,(A4)+ ;picRGBBkCol := white
MOVE D0,(A4)+
MOVE.L #$00008000,(A4)+ ;picChExtra := 0
;picLocHFrac := 1/2
CLR.L (A4)+ ;picRGBOpColor := black
CLR (A4)+
CLR.L (A4)+ ;picRGBHiColor := black
CLR (A4)+
; IF IT'S A NEW PICTURE in a cGrafPort, ALLOCATE THE PIXEL PATTERNS
CMP #pictVersion,SAVEVERSION(A6) ;is it a pict 1?
BEQ.S doFontList ;=>yes, skip new stuff
tst portBits+rowBytes(a3) ;is it a new picture in an old grafport? <18Sept90 KON>
bpl.s doFontList ;=>yes, skip new stuff <18Sept90 KON>
MOVEQ #2,D3 ;allocate 3 pixPats
NXTPP CLR.L -(SP) ;make room for function result
sub.l ([PicSave,a3]),a4 ;get offset into picSave record <<BAL 04Apr88>>
_NEWPIXPAT ;get a new pixPat
MOVE.L (SP)+,A0 ;get pixPat handle
add.l ([PicSave,a3]),a4 ;offset into record <<BAL 04Apr88>>
MOVE.L A0,(A4)+ ;save pixPat to picsave record
MOVE.L (A0),A0 ;point at pixPat
MOVE #oldPat,patType(A0) ;init to old pattern
DBRA D3,NXTPP ;=>repeat for all pixPats
;
; Allocate handle for fond id's we have seen so far
;
; Format of picFontList handle is:
; handle size [long]
; # of entries - 1 used [word]
; id1, id2, ... idn
FontListSize equ 50*2
doFontList
moveq #FontListSize+6,d0 ;initial size for 50 entries
_NewHandle
move.l picSave(a3),a1 ;get picSave handle
move.l (a1),a1
move.l a0,picFontList(a1) ;save picFontList handle in picSave record
beq.s @noHandle
move.l (a0),a0 ;point into fontList
moveq #FontListSize+6,d0 ;initial size for 50 entries
move.l d0,(a0)+
clr.l (a0) ; 1 entry, first entry = 0
@noHandle
;
; Clear picQdRunSlop and picQdChExtra
;
clr.l picQdChExtra(a1) ; set character extra state to 0.0 <23>
clr.l picQdRunSlop(a1) ; set run slop state to 0.0 <23>
; INIT GLYPH STATE TO INVALID
move.l #$80808080,picGlyphState(a1) ; set glyph state to invalid values
; PUT VERSION NUMBER TO PICTURE
MOVEQ #opVersion,D0 ;GET VERSION OPCODE
JSR DPutPicOp ;PUT TO PICTURE
MOVE SAVEVERSION(A6),D0 ;GET VERSION NUMBER
CMP #pictVersion,D0 ;IS IT AN OLD PICTURE?
BNE.S @NotPic ;=>NO, NOT AN OLD PICT
JSR DPUTPICBYTE ;IF OLD PUT BYTE TO PICTURE
BRA.S DONE ;AND RETURN
; IT'S A NEW PICTURE! PUT VERSION AS WORD, FOLLOW IT WITH HEADER OPCODE
@NotPic MOVE D0,-(SP) ;ELSE PUSH VERSION
JSR PUTPICWORD ;AND PUT ENTIRE WORD FOR NEW PICTURES
; HEADER EXTENSION = [OP] [SIZE] [BBOX] [RESERVED]
MOVE #ngHeaderOp,D0 ;GET HEADER OPCODE
JSR DPutPicOp ;PUT TO PICTURE
pea picHdrRec(a6) ;PUSH POINTER TO DATA
MOVE #24,-(SP) ;PUSH SIZE OF DATA
JSR PUTPICDATA ;AND BLAST IT TO THE PICTURE
DONE MOVEM.L (SP)+,D3/A3-A4 ;RESTORE REGS
UNLINK PARAMSIZE,'OPENPICT'
; as shown in QDciPatchROM.a with some lines in different places <sm 6/9/92>stb
ClosePicture PROC EXPORT
IMPORT PutPicOp,ShowPen
;------------------------------------------------------------------
;
; PROCEDURE ClosePicture;
;
MOVEM.L D6-D7/A3,-(SP) ;SAVE REGS
MOVE.L GRAFGLOBALS(A5),A3 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A3),A3 ;GET CURRENT GRAFPORT
MOVE.L PICSAVE(A3),D7 ;ARE WE SAVING A PICTURE ?
BEQ.S GOHOME ;NO, OOPS, EXIT
MOVE #opEndPic,-(SP) ;YES, PUSH ENDPIC OPCODE
JSR PutPicOp ;PUT TO THEPIC
MOVE.L D7,A0 ;GET HANDLE TO PICSAVE RECORD
MOVE.L (A0),A0 ;DE-REFERENCE IT
MOVE.L PICCLIPRGN(A0),D6 ;GET picClipRgn
MOVE.L PICINDEX(A0),D0 ;DID PICTURE OVERFLOW ?
BEQ.S OVERFLO ;YES, CONTINUE
MOVE.L THEPIC(A0),A0 ;NO, GET THEPIC HANDLE
_SetHandleSize ;AND TRIM TO FINAL SIZE
OVERFLO MOVE.L D6,A0 ;GET PICCLIPRGN
_DisposHandle ;DISCARD IT
; IF IT'S A NEW PICTURE DISPOSE OF THE PIXEL PATTERNS
tst portBits+rowBytes(a3) ;is it in an old grafport? <18Sept90 KON>
bpl.s nopp ;=>yes, skip new stuff <18Sept90 KON>
;ciClosePictureEntry ;(from QDciPatchROM.a)
MOVE.L D7,A0 ;GET PICSAVE HANDLE
MOVE.L (A0),A0 ;POINT TO PICSAVE RECORD
; CMP #pictVersion,picVersion(A0) ;IS IT An old PICT? <18Sept90 KON>
; BEQ.S NOPP ;=>YES, NO PIXPATS TO DISPOSE <18Sept90 KON>
LEA picFillPP(A0),A0 ;POINT TO FIRST OF 3 PIXPAT HANDLES
MOVE.L (A0)+,-(SP) ;PUSH FILLPIXPAT HANDLE
MOVE.L (A0)+,-(SP) ;PUSH PNPIXPAT HANDLE
MOVE.L (A0)+,-(SP) ;PUSH BKPIXPAT HANDLE
_DisposPixPat ;DISPOSE BKPIXPAT PIXPAT
_DisposPixPat ;DISPOSE PNPIXPAT PIXPAT
_DisposPixPat ;DISPOSE FILLPIXPAT PIXPAT
NOPP
MOVE.L D7,A0 ;GET PICSAVE HANDLE
MOVE.L (A0),A0 ;POINT TO PICSAVE RECORD
move.l picFontList(a0),a0 ;get fontList handle
_DisposHandle
;cinopp ;(from QDciPatchROM.a)
MOVE.L D7,A0 ;GET PICSAVE HANDLE
_DisposHandle ;DISCARD THE PICSAVE RECORD
CLR.L PICSAVE(A3) ;RESET PICSAVE TO NIL
_SHOWPEN ;RESTORE DRAWING
GOHOME MOVEM.L (SP)+,D6-D7/A3 ;RESTORE REGS
RTS ;AND RETURN
KillPicture PROC EXPORT
;---------------------------------------------------
;
; PROCEDURE KillPicture(myPicture: PicHandle);
;
MOVE.L (SP)+,A1 ;pop return addr
MOVE.L (SP)+,A0 ;pop handle
_DisposHandle ;discard it
JMP (A1) ;and return
DrawPicture PROC EXPORT
IMPORT PicItem1,NewRgn,InitColorStuff,ReduceD3D4
;------------------------------------------------------------------
;
; PROCEDURE DrawPicture(myPicture: PicHandle; dstRect: Rect);
;
; Includes fixes to:
; - perform font name/ID binding on picture playback
; - handle the line-layout state on picture playback for the Script Manager.
;--------------------------------------------
;
; OFFSETS WITHIN A PICTURE PLAY STATE RECORD:
;
THERECT EQU 0 ;RECT
PENLOC EQU THERECT+8 ;POINT
TEXTLOC EQU PENLOC+4 ;POINT
OVALSIZES EQU TEXTLOC+4 ;POINT
FROMRECT EQU OVALSIZES+4 ;RECT
TORECT EQU FROMRECT+8 ;RECT
NUMER EQU TORECT+8 ;POINT
DENOM EQU NUMER+4 ;POINT
THECLIP EQU DENOM+4 ;RGNHANDLE
USERCLIP EQU THECLIP+4 ;RGNHANDLE
PLAYVERSION EQU USERCLIP+4 ;PICTURE VERSION
TXHFRAC EQU PLAYVERSION+2 ;FRACTIONAL TEXT POSITION
NEWHFRAC EQU TXHFRAC+2 ;UPDATED FRACTION RECIEVED
TEMPPIXPAT EQU NEWHFRAC+2 ;PIXPAT FOR PLAYING NEW PICS IN OLD PORTS
FontMappingTbl EQU TEMPPIXPAT+4 ;Handle to array of old,new font id pairs
PSreserve1 EQU FontMappingTbl+4 ;reserved
PSreserve2 EQU PSreserve1+4 ;reserved
PLAYREC EQU PSreserve2+4 ;TOTAL SIZE
;
; A6 OFFSETS OF PARAMS AND LOCALS AFTER LINK:
;
PARAMSIZE EQU 8
MYPICTURE EQU PARAMSIZE+8-4 ;LONG, PICHANDLE
DSTRECT EQU MYPICTURE-4 ;LONG, ADDR OF RECT
PLAYSTATE EQU -PLAYREC ;PICTURE PLAY STATE RECORD
SAVEPORT EQU PLAYSTATE-PORTREC ;GRAFPORT RECORD
saveQdRunSlop equ savePort-4 ;Fixed <23>
saveQdChExtra equ saveQdRunSlop-4 ;Fixed <23>
saveOutline equ saveQdChExtra-1 ;Byte
savePreserve equ saveOutline-1 ;Byte
saveFractional equ savePreserve-1 ;Byte
saveUnscaled equ saveFractional-1 ;Byte
SavePatAlign EQU saveUnscaled-4 ; <SM2> rb
SavePlayPic EQU SavePatAlign-4 ; <SM2> rb
SavePlayIndex equ SavePlayPic-4 ; <SM2> rb
SaveHandleState equ SavePlayIndex-2 ; <SM2> rb
VARSIZE EQU SaveHandleState ;TOTAL BYTES OF LOCALS <SM2> rb
LINK A6,#VARSIZE ;ALLOCATE LOCALS
MOVEM.L D3-D7/A2-A4,-(SP) ;SAVE REGISTERS
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A4),A3 ;POINT TO CURRENT GRAFPORT
MOVE.L MYPICTURE(A6),D0 ;IS PICHANDLE NIL ? <SM2> rb
BEQ GOHOME ;YES, QUIT
MOVE.L D0,A0 ; put handle in a0 <SM2> rb
MOVE.L (A0),D0 ; has the handle been purged ? <SM2> rb
BEQ GOHOME ; if so, then skip drawing picture <SM2> rb
; remember some state so we can go re-entrant
_HGetState ; get the handle's state <SM2> rb
MOVE.B D0,SaveHandleState(A6) ; and save it, so it can be restored <SM2> rb
_HNoPurge ; make picture handle unpurgeable <SM2> rb
MOVE.L PATALIGN(A4),SavePatAlign(A6) ; save this baby... <SM2> rb
MOVE.L PLAYPIC(A4),SavePlayPic(A6) ; and his baby brother <SM2> rb
MOVE.L PLAYINDEX(A4),SavePlayIndex(A6) ; and his big sister <SM2> rb
;--------------------------------------------------
;
; SET UP NUMER AND QUIT IF DSTRECT WIDTH OR HEIGHT IS <= 0
; COPY DSTRECT INTO TORECT
;
MOVE.L DSTRECT(A6),A0 ;POINT TO DSTRECT
MOVE RIGHT(A0),D0
SUB LEFT(A0),D0 ;CALC DST WIDTH
BLE GOHOME ;QUIT IF WIDTH <= 0
MOVE D0,PLAYSTATE+NUMER+H(A6) ;NUMER.H := DST WIDTH
MOVE BOTTOM(A0),D0
SUB TOP(A0),D0 ;CALC DST HEIGHT
BLE GOHOME ;QUIT IF HEIGHT <= 0
MOVE D0,PLAYSTATE+NUMER+V(A6) ;NUMER.V := DST HEIGHT
LEA PLAYSTATE+TORECT(A6),A1
MOVE.L (A0)+,(A1)+
MOVE.L (A0)+,(A1)+ ;TORECT := DSTRECT
;--------------------------------------------------
;
; SET UP DENOM AND QUIT IF PICFRAME WIDTH OR HEIGHT IS <= 0
; COPY PICFRAME INTO FROMRECT.
;
MOVE.L MYPICTURE(A6),A0 ;GET PICHANDLE
MOVE.L (A0),A0 ;DE-REFERENCE IT
;if PICT 2 and header version = -2, use source rect instead of picFrame.
;<<<Moved to StdOpcodeProc to support spooling>>>
; cmp.l #$001102ff,picData(a0) ;PICT 2 ?
; bne.s @notPic2
; cmp.l #$0c00fffe,picData+4(a0) ;hdr version -2 ?
; bne.s @notPic2
; lea picData+4+2+hdrSrcRect(a0),a0 ;point to srcRect
; bra.s @share
@notPic2
LEA PICFRAME(A0),A0 ;POINT TO PICTURE FRAME
@share
MOVE RIGHT(A0),D0
SUB LEFT(A0),D0 ;CALC SRC WIDTH
BLE GOHOME ;QUIT IF WIDTH <= 0
MOVE D0,PLAYSTATE+DENOM+H(A6) ;DENOM.H := SRC WIDTH
MOVE BOTTOM(A0),D0
SUB TOP(A0),D0 ;CALC SRC HEIGHT
BLE GOHOME ;QUIT IF HEIGHT <= 0
MOVE D0,PLAYSTATE+DENOM+V(A6) ;DENOM.V := SRC HEIGHT
;
; Divide Numer and Denom for width and height by GCD to prevent overflow.
; <KON 7/1/91>
;
; CAN'T DO THIS HERE SINCE STDOPCODEPROC CLOBBERS DENOM WITH THE RECTANGLE FROM
; THE HEADER. <KON 20MAR91>
;
; move.l PLAYSTATE+NUMER(A6),d3 ;reduce both high and low words of d3...
; move.l PLAYSTATE+denom(A6),d4 ;...and d4 by GCD
; jsr ReduceD3D4
; move.l d3,PLAYSTATE+NUMER(A6) ;save results
; move.l d4,PLAYSTATE+denom(A6)
;
; End <KON 7/1/91>
;
LEA PLAYSTATE+FROMRECT(A6),A1 ;POINT TO FROMRECT
MOVE.L (A0)+,(A1)+
MOVE.L (A0)+,(A1)+ ;FROMRECT := PICFRAME
;---------------------------------------------------
;
; PRESERVE THE CURRENT GRAFPORT IN SAVEPORT
;
MOVE.L A3,A0 ;SRC = THEPORT
LEA SAVEPORT(A6),A1 ;DST = SAVEPORT
MOVEQ #PORTREC/2-1,D0 ;INIT DBRA COUNT
SAVELP MOVE.W (A0)+,(A1)+ ;COPY A WORD
DBRA D0,SAVELP ;LOOP ENTIRE PORT
;---------------------------------------------------
;
; PRESERVE AND INIT THE CURRENT LINE-LAYOUT STATE
;
IF SCRIPT_CHAR_EXTRA THEN
move.l grafGlobals(a5),a0 ; load quickDraw globals. <23>
move.l qdChExtra(a0),saveQdChExtra(a6) ; save run slop amount. <23>
move.l qdRunSlop(a0),saveQdRunSlop(a6) ; save character extra amount. <23>
clr.l qdChExtra(a0) ; clear run slop amount. <23>
clr.l qdRunSlop(a0) ; clear character extra amount. <23>
ENDIF
;---------------------------------------------------
;
; PRESERVE THE INITIAL GLYPH RENDERING STATE
;
IF hasGlyphState THEN
btst.b #splinePreferred,HiliteMode ; bit flag set in HiliteMode?
sne.b saveOutline(a6) ; yes, set outline preferred flag
btst.b #preserveGlyph,HiliteMode ; bit flag set in HiliteMode?
sne.b savePreserve(a6) ; yes, set preserve glyph flag
move.b FractEnable,saveFractional(a6) ; save fractional widths flag
move.b FScaleDisable,saveUnscaled(a6) ; save scale disable flag
ENDIF
;----------------------------------------
;
; INIT GLOBAL VARS:
;
CLR.L PATALIGN(A4) ;PATALIGN := (0,0)
MOVE.L MYPICTURE(A6),PLAYPIC(A4) ;SAVE PICTURE FOR STDGETPIC
MOVE.L #PICDATA,PLAYINDEX(A4) ;INIT INDEX TO FIRST OPCODE
;----------------------------------------
;
; INIT PLAY STATE RECORD:
;
LEA PLAYSTATE(A6),A0
CLR.L (A0)+ ;THERECT := (0,0,0,0)
CLR.L (A0)+
CLR.L (A0)+ ;PENLOC := (0,0)
CLR.L (A0)+ ;TEXTLOC := (0,0)
CLR.L (A0)+ ;OVALSIZES := (0,0)
;FROMRECT SET UP
;TORECT SET UP
;NUMER SET UP
;DENOM SET UP
MOVE.L CLIPRGN(A3),PLAYSTATE+USERCLIP(A6) ;SAVE USER CLIPRGN
CLR.L -(SP)
_NEWRGN
MOVE.L (SP)+,PLAYSTATE+THECLIP(A6) ;ALLOCATE THECLIP
MOVE #$8000,D0 ;INITIALIZE FRACTIONAL PARTS
MOVE D0,PLAYSTATE+TXHFRAC(A6) ;TXHFRAC = 1/2
MOVE D0,PLAYSTATE+NEWHFRAC(A6) ;NEW FRACTION = 1/2
;
; Allocate handle for mapping of fond id's we have seen so far
;
; Format of FontMappingTbl handle is:
; handle size [long]
; # of entries - 1 used [word]
; oldID1,newID1 ... oldIDn,newIDn
FontMapSize equ 25*4
doFontList
moveq #FontMapSize+6,d0 ;initial size for 50 entries
_NewHandle
move.l a0,PLAYSTATE+FontMappingTbl(a6) ;save picFontList handle in picSave record
beq.s @noHandle
move.l (a0),a0 ;point into fontList
moveq #FontMapSize+6,d0 ;initial size for 25 entries
move.l d0,(a0)+
move.w #-1,(a0) ; 0 entries
; clr.l (a0)+ ; 1 entry, first oldID = 0
; clr.w (a0) ; first newID = 0
@noHandle
;--------------------------------------------------------
;
; INIT MOST FIELDS OF THEPORT
;
CLR.L -(SP)
_NEWRGN
MOVE.L (SP)+,CLIPRGN(A3) ;ALLOCATE TEMP CLIPRGN
LEA BKPAT(A3),A0 ;POINT TO BKPAT
CLR.L (A0)+ ;BKPAT := WHITE
CLR.L (A0)+
MOVEQ #-1,D0 ;GET SOME BLACK
MOVE.L D0,(A0)+ ;fillPat := BLACK
MOVE.L D0,(A0)+
CLR.L (A0)+ ;PNLOC := (0,0)
MOVE.L #$00010001,D1
MOVE.L D1,(A0)+ ;pnSize := (1,1)
MOVE #8,(A0)+ ;pnMode := patCopy
MOVE.L D0,(A0)+ ;pnPat := black
MOVE.L D0,(A0)+
ADD #2,A0 ;skip over pnVis
CLR.L (A0)+ ;txFont, txFace := 0
MOVE #1,(A0)+ ;txMode := srcOr
CLR (A0)+ ;txSize := 0;
CLR.L (A0)+ ;spExtra := 0.0;
MOVE.L #blackColor,(A0)+ ;FGCOLOR := blackColor
MOVE.L #whiteColor,(A0)+ ;BKCOLOR := whiteColor
;LEAVE COLRBIT ALONE
;LEAVE PATSTRETCH ALONE
;LEAVE PICSAVE ALONE
;LEAVE RGNSAVE ALONE
;LEAVE POLYSAVE ALONE
;LEAVE GRAFPROCS ALONE
;--------------------------------------------------
;
PEA PNSIZE(A3) ;Scale initial pensize <BAL/CSD 02Apr89>
PEA FROMRECT+PLAYSTATE(A6) ;so that 1,1 lines scale
PEA TORECT+PLAYSTATE(A6)
_SCALEPT ;SCALE PNSIZE
;--------------------------------------------------
;
; IF IT'S A NEW GRAFPORT, SET UP NEW FIELDS IN GRAFPORT.
;
TST PORTBITS+ROWBYTES(A3) ;IS IT A NEW GRAFPORT?
BMI.S @NEWPIC ;=>YES, INSTALL NEW FIELDS
; IF OLD GRAFPORT, ALLOCATE A PIXPAT TO READ INTO
CLR.L -(SP) ;MAKE ROOM FOR FUNCTION RESULT
_NEWPIXPAT ;ALLOCATE A PIXPAT
MOVE.L (SP)+,PLAYSTATE+TEMPPIXPAT(A6) ;SAVE IN PLAYSTATE RECORD
BRA.S DRAWPIC ;AND SKIP NEW GRAFPORT STUFF
; INVALIDATE PIXPAT FIELDS SO THEY GET NEW PIXPATS INSTALLED
@NEWPIC CLR.L BKPIXPAT(A3) ;ONE IS THE BACKGROUND PATTERN
CLR.L PNPIXPAT(A3) ;ONE IS THE PEN PATTERN
CLR.L FILLPIXPAT(A3) ;AND ONE IS THE FILL PATTERN
MOVE.L A3,-(SP) ;PUSH GRAFPORT
JSR INITCOLORSTUFF ;AND INITIALIZE PATTERNS AND COLORS
;---------------------------------------------------
;
; NOW DRAW THE PICTURE:
; REPEAT UNTIL NOT PicItem1(playState);
;
DRAWPIC MOVE #PICTVERSION,PLAYSTATE+PLAYVERSION(A6) ;DEFAULT TO OLD PICTURE
MOVE.L MYPICTURE(A6),A0 ;GET PICTURE HANDLE <16Jun88 BAL>
_HGETSTATE ;GET AND SAVE STATE <16Jun88 BAL>
MOVE D0,-(SP) ; <16Jun88 BAL>
_HLOCK ;LOCK IT DOWN <16Jun88 BAL>
MORE
if TheFuture then ; Build for the future <43>
cmp.w #AbortPicPlayBackErr,qdErr ;abort if special error <42>
beq.s Done ; <42>
endif
CLR.B -(SP) ;MAKE ROOM FOR FCN RESULT
PEA PLAYSTATE(A6) ;PUSH ADDR OF PLAYSTATE
_PicItem1 ;DRAW ONE PICTURE ITEM
MOVE.B (SP)+,D0 ;POP BOOLEAN RESULT
BNE.S MORE ;LOOP TILL FALSE
;-----------------------------------------------------
;
; DISCARD HANDLES AND RESTORE GRAFPORT STATE
;
DONE MOVE.L MYPICTURE(A6),A0 ;GET PICTURE HANDLE <16Jun88 BAL>
MOVE (SP)+,D0 ;GET SAVED STATE <16Jun88 BAL>
_HSETSTATE ;RESTORE STATE <16Jun88 BAL>
MOVE.L PLAYSTATE+THECLIP(A6),A0 ;GET THECLIP RGNHANDLE
_DisposHandle ;DISCARD IT
MOVE.L PLAYSTATE+FontMappingTbl(A6),A0 ;get the fontID association table
_DisposHandle ;DISCARD IT
TST PORTBITS+ROWBYTES(A3) ;IS IT A NEW PORT?
BMI.S @NEWPORT ;=>YES, DISPOSE PIXPATS
MOVE.L PLAYSTATE+TEMPPIXPAT(A6),-(SP) ;ELSE PUSH TEMP PIXPAT
_DISPOSPIXPAT ;AND DISCARD IT
BRA.S DONE1 ;=>DISPOSE COMMON STUFF
@NEWPORT MOVE.L BKPIXPAT(A3),-(SP) ;PUSH THE BACKGROUND PATTERN
_DISPOSPIXPAT ;AND DISCARD IT
MOVE.L PNPIXPAT(A3),-(SP) ;PUSH THE PEN PATTERN
_DISPOSPIXPAT ;AND DISCARD IT
MOVE.L FILLPIXPAT(A3),-(SP) ;PUSH THE FILL PATTERN
_DISPOSPIXPAT ;AND DISCARD IT
DONE1 MOVE.L CLIPRGN(A3),A0 ;GET TEMPCLIP
_DisposHandle ;DISCARD IT
LEA SAVEPORT(A6),A0 ;SRC = SAVEPORT
MOVEQ #PORTREC/2-1,D0 ;INIT DBRA COUNT
DONELP MOVE.W (A0)+,(A3)+ ;COPY A WORD INTO THEPORT
DBRA D0,DONELP ;LOOP ENTIRE PORT
;---------------------------------------------------
;
; RESTORE THE GLYPH RENDERING STATE
;
IF hasGlyphState THEN
move.b saveOutline(a6),-(sp) ; push saved outline preferred flag
_SetOutlinePreferred ; restore saved outline preferred
move.b savePreserve(a6),-(sp) ; push saved preserve glyph flag
_SetPreserveGlyph ; restore saved preserve glyph
move.b saveFractional(a6),-(sp) ; push saved fractional widths flag
_SetFractEnable ; restore saved fractional widths
move.b saveUnscaled(a6),-(sp) ; push saved scale disable flag
_SetFScaleDisable ; restore saved scale disable
ENDIF
;---------------------------------------------------
;
; RESTORE THE LINE-LAYOUT STATE
;
IF SCRIPT_CHAR_EXTRA THEN
move.l grafGlobals(a5),a0 ; load quickDraw globals. <23>
move.l saveQdChExtra(a6),qdChExtra(a0) ; restore character extra amount. <23>
move.l saveQdRunSlop(a6),qdRunSlop(a0) ; restore run slop amount. <23>
ENDIF
;---------------------------------------------------
;
; RESTORE GLOBAL VARS AND QUIT
;
MOVE.L SavePatAlign(A6),PATALIGN(A4) ; Restore PATALIGN <SM2> rb
MOVE.L SavePlayPic(A6),PLAYPIC(A4) ; Restore PLAYPIC <SM2> rb
MOVE.L SavePlayIndex(A6),PLAYINDEX(A4) ; And PLAYINDEX <SM2> rb
MOVE.B SavehandleState(A6),D0 ; get saved pic handle state <SM2> rb
MOVE.L MyPicture(A6),A0 ; get pic handle in a0 again <SM2> rb
_HSetState ; and restore the handle's properties <SM2> rb
GOHOME MOVEM.L (SP)+,D3-D7/A2-A4 ;RESTORE REGISTERS
UNLINK PARAMSIZE,'DRAWPICT'
PicItem1 FUNC EXPORT
IF (&TYPE('PATCHMAC2') = 'UNDEFINED') THEN
IMPORT GetPicData,ScalePt,MapPt,MapRect,MapRgn,MapPoly,GetUByte,GetWord,GetLong
IMPORT NewRgn,CopyRgn,SectRgn,UnpackBits,MapRatio,GetPicPixPat,GETPICTABLE,GETPMDATA
IMPORT MAPFIXPT, RNewHandle,ReduceD3D4
ELSE
SetFillPat EQU $4081ef16
MapRatio EQU $4082122c
RNewHandle EQU $4081e436
GetPicData EQU $408207C2
GetUByte EQU $40820790
GetWord EQU $408207A2
GetLong EQU $408207B2
GetPicPixPat EQU $40820BFE
GETPICTABLE EQU $40820B38
MAPFIXPT EQU $408211BE
ENDIF
;------------------------------------------------------------------
;
; FUNCTION PicItem1(VAR playState: PicPlayRec): BOOLEAN;
;
; Draws one picture item, updating playState and thePort.
; Returns FALSE when an endPic opCode is encountered.
; The only state modified other than thePort and playState is patAlign.
;
; When reading from an NPIC, skips to word boundary before fetching
; word-long opcode.
;--------------------------------------------
;
; OFFSETS WITHIN A PICTURE PLAY STATE RECORD:
;
THERECT EQU 0 ;RECT
PENLOC EQU THERECT+8 ;POINT
TEXTLOC EQU PENLOC+4 ;POINT
OVALSIZES EQU TEXTLOC+4 ;POINT
FROMRECT EQU OVALSIZES+4 ;RECT
TORECT EQU FROMRECT+8 ;RECT
NUMER EQU TORECT+8 ;POINT
DENOM EQU NUMER+4 ;POINT
THECLIP EQU DENOM+4 ;RGNHANDLE
USERCLIP EQU THECLIP+4 ;RGNHANDLE
PLAYVERSION EQU USERCLIP+4 ;PICTURE VERSION
TXHFRAC EQU PLAYVERSION+2 ;FRACTIONAL TEXT POSITION
NEWHFRAC EQU TXHFRAC+2 ;UPDATED FRACTION RECIEVED
TEMPPIXPAT EQU NEWHFRAC+2 ;PIXPAT FOR PLAYING NEW PICS IN OLD PORTS
FontMappingTbl EQU TEMPPIXPAT+4 ;Handle to array of old,new font id pairs
PSreserve1 EQU FontMappingTbl+4 ;reserved
PSreserve2 EQU PSreserve1+4 ;reserved
PLAYREC EQU PSreserve2+4 ;TOTAL SIZE
;
; params:
;
PARAMSIZE EQU 4
RESULT EQU PARAMSIZE+8 ;BOOLEAN
PLAYSTATE EQU RESULT-4 ;LONG, PICHANDLE
;
; locals:
;
HANDLE1 EQU -4 ;HANDLE
HANDLE2 EQU HANDLE1-4 ;HANDLE
TmpHANDLE1 EQU HANDLE2-4 ;temporary memory handle <1.5> BAL
DSTRECT EQU TmpHANDLE1-8 ;RECT (MUST BE BEFORE SRCRECT)
SRCRECT EQU DSTRECT-8 ;RECT (MUST FOLLOW DSTRECT)
SRCPIX EQU SRCRECT-PMREC ;PIXMAP
SRCBITS EQU SRCPIX-BITMAPREC ;BITMAP
SAMEFLAG EQU SRCBITS-2 ;BOOLEAN
NEWPT EQU SAMEFLAG-4 ;LONG
TXDATA EQU NEWPT-256 ;UP TO 256 CHARACTERS,
;ALSO USED FOR PACKBUF !!!
SRCPTR EQU TXDATA-4 ;LONG
DSTPTR EQU SRCPTR-4 ;LONG
SAVEDSP EQU DSTPTR-4 ;LONG
VARSIZE EQU SAVEDSP ;TOTAL BYTES OF LOCALS
LINK A6,#VARSIZE ;ALLOCATE LOCALS
MOVEM.L D3-D7/A2-A4,-(SP) ;SAVE REGISTERS
MOVE.L SP,SAVEDSP(A6) ;REMEMBER STACK FOR ABORT
clr.l tmpHandle1(a6) ;don't dispose it again
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A4),A3 ;POINT TO CURRENT GRAFPORT
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
; GET PICTURE OPCODE AND CHECK FOR END OF PICTURE.
CLR.B RESULT(A6) ;ASSUME END OF PICTURE
BSR GetPicOp ;READ OPCODE INTO D0
MOVE D0,D7 ;PUT IT IN D7
if TheFuture then ; Build for the future <43>
cmp.w #AbortPicPlayBackErr,qdErr ;abort if our special error
beq DONE
endif ; <43>
CMP #opEndPic,D7 ;IS THIS THE ENDPIC OPCODE ?
BEQ DONE ;=>YES, ALL DONE
BLO.S GoodOp ;=>GOOD OPCODE, CONTINUE
; IT'S AN OPCODE THAT WE DON'T KNOW HOW TO HANDLE. CALL THE OPCODE PROC.
MOVE.L GRAFPROCS(A3),D0 ;ARE THERE GRAFPROCS?
MOVE.L JStdOpcode,A0 ;ASSUME THERE AREN'T
BEQ.S USESTD ;=>THERE AREN'T, USE STD RTN
TST PORTBITS+ROWBYTES(A3) ;IS IT AN OLD GRAFPORT?
BPL.S USESTD ;=>YES, USE STD RTN
MOVE.L D0,A0 ;ELSE POINT TO GRAFPROCS
MOVE.L OpcodeProc(A0),A0 ;GET THE OPCODE PROCESSING RTN
USESTD PEA FROMRECT(A2) ;PUSH SRC RECT
PEA TORECT(A2) ;PUSH DST RECT
MOVE D7,-(SP) ;PUSH OPCODE
MOVE PLAYVERSION(A2),-(SP) ;PUSH VERSION
JSR (A0) ;CALL PROC
MOVE.B #1,RESULT(A6) ;FLAG NOT END OF PICTURE
BRA DONE ;=>DONE WITH THIS OPCODE
GoodOp MOVE.B #1,RESULT(A6) ;NOT END OF PICTURE
; CHECK FOR PARAM OPCODES $00..$1F
CMP #$20,D7 ;IS IT A PARAM OPCODE ?
BLO.S PARAMOP ;YES, GO TO IT
; GET LO AND HI NIBBLES OF OPCODE, AND CASE ON HI NIBBLE (NOUN).
MOVE.B D7,D0 ;COPY OPCODE
AND #$F0,D0 ;MASK FOR HI NIBBLE
BTST #3,D7 ;IS OPCODE BIT 3 SET ?
SNE SAMEFLAG(A6) ;REMEMBER IN SAMEFLAG
AND #$7,D7 ;GET VERB FROM LO NIBBLE
LSR #3,D0 ;DOUBLE HI NIBBLE FOR INDEX
MOVE NOUNJMP(D0),D0 ;GET JUMP OFFSET
JMP NOUNJMP(D0) ;TAKE CASE JUMP
NOUNJMP DC.W DONE-NOUNJMP ;NEVER TAKEN
DC.W DONE-NOUNJMP ;NEVER TAKEN
DC.W TXLNOP-NOUNJMP
DC.W RECTOP-NOUNJMP
DC.W RRECTOP-NOUNJMP
DC.W OVALOP-NOUNJMP
DC.W ARCOP-NOUNJMP
DC.W POLYOP-NOUNJMP
DC.W RGNOP-NOUNJMP
DC.W BITSOP-NOUNJMP
DC.W COMMOP-NOUNJMP
DC.W DONE-NOUNJMP ;OPCODE WITH NO DATA
DC.W DONE-NOUNJMP ;OPCODE WITH NO DATA
DC.W IGNORESHORT-NOUNJMP ;IGNORE WORD LENGTH, DATA
DC.W IGNORELONG-NOUNJMP ;IGNORE LONG LENGTH, DATA
DC.W IGNORELONG-NOUNJMP ;IGNORE LONG LENGTH, DATA
;---------------------------------------------------
;
; OPCODES $00..$1F DO NO DRAWING, THEY JUST SET PARAMETERS.
;
PARAMOP AND #$1F,D7 ;GET LO 5 BITS OF OPCODE
ADD D7,D7 ;DOUBLE PARAM FOR CASE INDEX
MOVE PARMJMP(D7),D0 ;GET CASE JUMP OFFSET
JMP PARMJMP(D0) ;TAKE CASE JUMP
PARMJMP DC.W DONE-PARMJMP ;OPCODE 0 IS PURPOSELY A NOP
DC.W XCLIP-PARMJMP ;OPCODE $01
DC.W XBKPAT-PARMJMP ;OPCODE $02
DC.W XTXFONT-PARMJMP ;OPCODE $03
DC.W XTXFACE-PARMJMP ;OPCODE $04
DC.W XTXMODE-PARMJMP ;OPCODE $05
DC.W XSPXTRA-PARMJMP ;OPCODE $06
DC.W XPNSIZE-PARMJMP ;OPCODE $07
DC.W XPNMODE-PARMJMP ;OPCODE $08
DC.W XPNPAT-PARMJMP ;OPCODE $09
DC.W XFILLPAT-PARMJMP ;OPCODE $0A
DC.W XOVSIZE-PARMJMP ;OPCODE $0B
DC.W XORIGIN-PARMJMP ;OPCODE $0C
DC.W XTXSIZE-PARMJMP ;OPCODE $0D
DC.W XFGCOL-PARMJMP ;OPCODE $0E
DC.W XBKCOL-PARMJMP ;OPCODE $0F
DC.W TXRATIO-PARMJMP ;OPCODE $10
DC.W VERSION-PARMJMP ;OPCODE $11
DC.W XBkPixPat-PARMJMP ;OPCODE $12
DC.W XPnPixPat-PARMJMP ;OPCODE $13
DC.W XFillPixPat-PARMJMP ;OPCODE $14
DC.W XPnLocHFrac-PARMJMP ;OPCODE $15
DC.W XChExtra-PARMJMP ;OPCODE $16
DC.W DONE-PARMJMP ;OPCODE $17
DC.W DONE-PARMJMP ;OPCODE $18 (opIFore)
DC.W DONE-PARMJMP ;OPCODE $19 (opIBack)
DC.W XRGBFGCOL-PARMJMP ;OPCODE $1A
DC.W XRGBBKCOL-PARMJMP ;OPCODE $1B
DC.W xHiliteMode-PARMJMP ;OPCODE $1C
DC.W xHiliteColor-PARMJMP ;OPCODE $1D
DC.W xDefHilite-PARMJMP ;OPCODE $1E
DC.W xOpColor-PARMJMP ;OPCODE $1F
XCLIP BSR GETHNDL ;COPY RGN INTO HANDLE1
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L HANDLE1(A6),-(SP) ;PUSH HANDLE1
MOVE.L THECLIP(A2),-(SP) ;PUSH PLAYSTATE THECLIP
XCLIP2 _COPYRGN ;COPY HANDLE1 INTO THECLIP
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L HANDLE1(A6),-(SP) ;PUSH HANDLE1 TEMP
PEA FROMRECT(A2) ;PUSH FROMRECT
PEA TORECT(A2) ;PUSH TORECT
_MAPRGN ;MAP RGN INTO DST COORDS
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L HANDLE1(A6),-(SP) ;PUSH MAPPED RGN
MOVE.L USERCLIP(A2),-(SP) ;PUSH ORIGINAL CLIP
MOVE.L CLIPRGN(A3),-(SP) ;PUSH DST = THEPORT^.CLIPRGN
_SECTRGN ;PUT INTERSECT INTO CLIPRGN
BRA KILL1 ;DISCARD HANDLE1 AND QUIT
GET8 MOVEQ #8,D6 ;BYTECOUNT = 8
BRA GETDONE ;COPY 8 BYTES AND QUIT
GET4 MOVEQ #4,D6 ;BYTECOUNT = 4
BRA GETDONE ;COPY 4 BYTES AND QUIT
GET2 MOVEQ #2,D6 ;BYTECOUNT = 2
BRA GETDONE ;COPY 2 BYTES AND QUIT
xDispPixPat
TST PORTBITS+ROWBYTES(A3) ;IS IT A NEW PORT? <22Feb89 BAL>
BMI.S @NEWPORT ;yes, dispose PixPat <22Feb89 BAL>
rts ;no, pattern ok <22Feb89 BAL>
@NEWPORT move.l a0,-(sp) ;push PixPat handle <22Feb89 BAL>
_DISPOSPIXPAT ;discard it <22Feb89 BAL>
rts ; <22Feb89 BAL>
xPatSetup
MOVE.L (SP)+,A0 ;get return address <26May87 EHB>
MOVEQ #8,D0 ;get useful number <26May87 EHB>
SUB D0,SP ;make room for pattern <26May87 EHB>
MOVE.L SP,-(SP) ;push address of pattern <26May87 EHB>
MOVE.L (SP),-(SP) ;push address of pattern <26May87 EHB>
MOVE D0,-(SP) ;push byte count <26May87 EHB>
MOVE.L A0,-(SP) ;push return address <26May87 EHB>
JMP GetPicData ;fetch pattern and return <26May87 EHB>
XBKPAT MOVE.L BkPixPat(A3),a0 ;get BKPIXPAT HANDLE <22Feb89 BAL>
BSR.S xDispPixPat ;Dispose current pixpat if necc.<22Feb89 BAL>
BSR.S xPatSetup ;get pattern and push it <26May87 EHB>
_BackPat ;set background pattern <26May87 EHB>
SHARE ADDQ #8,SP ;strip pattern <26May87 EHB>
Finis MOVE.B #1,RESULT(A6) ;not end of picture <26May87 EHB>
BRA Done ;done with opcode <26May87 EHB>
XPnPat MOVE.L PnPixPat(A3),a0 ;get PNPIXPAT HANDLE <22Feb89 BAL>
BSR.S xDispPixPat ;Dispose current pixpat if necc.<22Feb89 BAL>
BSR.S xPatSetup ;get pattern and push <26May87 EHB>
_PenPat ;set pen pattern <26May87 EHB>
BRA.S SHARE ;and use common code <26May87 EHB>
XFillPat MOVE.L FillPixPat(A3),a0 ;get FILLPIXPAT HANDLE <22Feb89 BAL>
BSR.S xDispPixPat ;Dispose current pixpat if necc.<22Feb89 BAL>
BSR.S xPatSetup ;get pattern and push <26May87 EHB>
MOVEQ #0,D0 ;say it's an old pattern <26May87 EHB>
JSR SetFillPat ;and set fill pattern <26May87 EHB>
BRA.S SHARE ;and use common code <26May87 EHB>
XFgCol JSR GetLong ;read desired fg <26May87 EHB>
MOVE.L D0,-(SP) ;push color <26May87 EHB>
_ForeColor ;and set it <26May87 EHB>
BRA.S Finis ;and return <26May87 EHB>
XBkCol JSR GetLong ;read desired bk <26May87 EHB>
MOVE.L D0,-(SP) ;push color <26May87 EHB>
_BackColor ;and set it <26May87 EHB>
BRA.S Finis ;and return <26May87 EHB>
;Êas seen in QDciPatchROM.a at DoTxFontOpCode <sm 6/9/92>stb
XTXFONT LEA TXFONT(A3),A3
bsr getword ;get the old font ID in d0
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L FontMappingTbl(A2),d1 ;get the fontID association table
beq.s @doit ;just use ID as is
move.l d1,a0
move.l (a0),a0
addq #4,a0 ;point to zero based entry count
move.w (a0)+,d1 ;pick up entry count (could be -1)
bmi.s @doit ;no mapping entries
;entries: oldID,newID word pairs
@1 cmp.w (a0),d0 ;entry for this ID?
addq #4,a0 ;bump to next pair
dbeq d1,@1 ;look until the end or we find it
bne.s @doit ;not found: so don't map
move.w -2(a0),d0 ;found: so use new ID
@doit move.w d0,(a3) ;install the font id in the port
BRA Done ;
XTXFACE LEA TXFACE(A3),A3
MOVEQ #1,D6
BRA GETDONE ;GET TXFACE
XTXMODE PEA TXMODE(A3)
BRA GETMODE ;GET TXMODE
XTXSIZE LEA TXSIZE(A3),A3
BRA GET2 ;GET TXSIZE
XSPXTRA LEA SPEXTRA(A3),A3
BRA GET4 ;GET fixed point SPACE EXTRA
XPNSIZE JSR GETLONG ;GET PNSIZE
MOVE.L D0,PNSIZE(A3) ;INSTALL INTO THEPORT
PEA PNSIZE(A3)
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
PEA FROMRECT(A2)
PEA TORECT(A2)
_SCALEPT ;SCALE PNSIZE
BRA DONE
;Êas seen in QDciPatchROM.a at DoTxRatioOpCode <sm 6/9/92>stb
TXRATIO MOVE.L PLAYSTATE(A6),A3 ;POINT TO PLAYSTATE RECORD
JSR GETLONG ;GET TEXT NUMER
MOVE.L D0,NUMER(A3) ;INSTALL INTO PLAYSTATE
JSR GETLONG ;GET TEXT DENOM
MOVE.L D0,DENOM(A3) ;INSTALL INTO PLAYSTATE
;
; Calculate new numer/denom to 32-bits using ConcatRatio.
;
move.w numer+v(a3),d3
move.w toRect+bottom(a3),d4
sub.w toRect+top(a3),d4 ;get height of toRect
swap d3
swap d4
move.w denom+v(a3),d3
move.w fromRect+bottom(a3),d4
sub.w fromRect+top(a3),d4 ;get height of fromRect
bsr ConcatRatio
move.w d3,denom+v(a3)
swap d3
move.w d3,numer+v(a3)
move.w numer+h(a3),d3
move.w toRect+right(a3),d4
sub.w toRect+left(a3),d4 ;get width of toRect
swap d3
swap d4
move.w denom+h(a3),d3
move.w fromRect+right(a3),d4
sub.w fromRect+left(a3),d4 ;get width of fromRect
bsr ConcatRatio
move.w d3,denom+h(a3)
swap d3
move.w d3,numer+h(a3)
bra done
ConcatRatio
;
; takes two 16-bit numer/denom pairs and returns a 16-bit numer/denom
; D3 = numer/denom
; D4 = ToRect/FromRect
;
; Returns answer in D3
;
move.w d3,d0
mulu.w d4,d0 ;has 32-bit denom
swap d3
swap d4
mulu.w d4,d3 ;has 32-bit numer
;
; Need to convert 32-bit ratio (in d3/d0) into 16-bit ratio in d3
;
move.l d0,d1
or.l d3,d1 ;number of bits to mask in high word
bra.s @FifteenBitsYet
;
; shift until we're clear.
;
@loop
lsr.l #1,d3 ;
lsr.l #1,d0
lsr.l #1,d1
@FifteenBitsYet
move.l d1,d4 ;ratio fit in 15 bits?
and.l #$FFFF8000,d4
bne.s @loop ;nope, loop again
swap d3
move.w d0,d3
rts
VERSION JSR GETUBYTE ;GET VERSION NUMBER BYTE
CMP #PICTVERSION,D0 ;IS IT A PICT?
BEQ.S @PUTIT ;=>YES, SAVE VERSION
MOVE D0,D6 ;ELSE SAVE HIGH BYTE OF VERSION
LSL #8,D6 ;AND GET INTO HIGH BYTE OF WORD
JSR GETUBYTE ;GET LOW BYTE OF VERSION
MOVE.B D0,D6 ;AND GET INTO LOW BYTE OF WORD
MOVE D6,D0 ;AND GET VERSION IN D0
@PUTIT MOVE.L PLAYSTATE(A6),A3 ;POINT TO PLAYSTATE RECORD
MOVE D0,PLAYVERSION(A3) ;INSTALL VERSION INTO PLAYSTATE
BRA DONE ;AND RETURN
XPNMODE PEA PNMODE(A3) ;SAVE ADDRESS OF FIELD
GETMODE JSR GETWORD ;GET PNMODE INTO D0
TST PORTBITS+ROWBYTES(A3) ;IS IT A NEW GRAFPORT?
BMI.S @MODEOK ;=>YES, ANY MODE WILL DO
TST.L GRAFPROCS(A3) ;HAS THE APP INSTALLED ITS OWN GRAFPROCS?
BEQ.S @MODEOK ;=>NO, WE CAN HANDLE ALL MODES
BTST #5,D0 ;AN ARITHMETIC MODE?
BEQ.S @MODEOK ;=>NO, MODE IS FINE
AND #$07,D0 ;ELSE STRIP MODE TO BOTTOM 3 BITS
MOVE.B ARITHMODE(D0),D0 ;AND REMAP IT
@MODEOK MOVE.L (SP)+,A0 ;GET FIELD ADDRESS
MOVE D0,(A0) ;AND INSTALL IN PORT
BRA DONE ;AND RETURN
ARITHMODE ;avg addPin addOver subPin trans max subOver min
DC.B srcCopy, srcBic, srcXor, srcOr, srcOr, srcBic, srcXor, srcOr
XOVSIZE JSR GETLONG ;GET OVAL SIZE
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L D0,OVALSIZES(A2)
PEA OVALSIZES(A2)
PEA FROMRECT(A2)
PEA TORECT(A2)
_SCALEPT ;SCALE OVAL SIZE
BRA DONE
;-----------------------------------------------------
;
; CHANGE ORIGIN: ADD DH AND DV TO FROMRECT, ADJUST PATALIGN,
; THEN RE-MAP THECLIP
;
XORIGIN JSR GETLONG ;GET DH,DV
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
ADD D0,FROMRECT+TOP(A2) ;ADD DV TO FROMRECT
ADD D0,FROMRECT+BOTTOM(A2)
ADD D0,PATALIGN+V(A4) ;AND TO PATALIGN
SWAP D0 ;GET DH IN LO WORD
ADD D0,FROMRECT+LEFT(A2) ;ADD DH TO FROMRECT
ADD D0,FROMRECT+RIGHT(A2)
ADD D0,PATALIGN+H(A4) ;AND TO PATALIGN
;
; RE-COMPUTE MAPPED CLIPRGN FROM UNMAPPED THECLIP
;
MOVE.L THECLIP(A2),-(SP) ;PUSH THECLIP
CLR.L -(SP) ;ROOM FOR FCN RESULT
_NEWRGN ;ALLOCATE A TEMP RGN
MOVE.L (SP),HANDLE1(A6) ;PUT IN HANDLE1
BRA.S XCLIP2 ;COPY, MAP, SECT, AND DISCARD
;---------------------------------------------------
;
; NEW CQD OPCODES THAT JUST SET PARAMETERS
XRGBFGCOL JSR GETLONG ;GET R,G
MOVE.L D0,D6 ;SAVE R,G
JSR GETWORD ;GET B
MOVE D0,-(SP) ;PUT B ON STACK
MOVE.L D6,-(SP) ;PUT R,G ON STACK
MOVE.L SP,-(SP) ;POINT TO RGB
_RGBForeColor ;SET THE COLOR
ADDQ #6,SP ;STRIP RGB
BRA DONE ;AND RETURN
XRGBBKCOL JSR GETLONG ;GET R,G
MOVE.L D0,D6 ;SAVE R,G
JSR GETWORD ;GET B
MOVE D0,-(SP) ;PUT B ON STACK
MOVE.L D6,-(SP) ;PUT R,G ON STACK
MOVE.L SP,-(SP) ;POINT TO RGB
_RGBBackColor ;SET THE COLOR
ADDQ #6,SP ;STRIP RGB
BRA DONE ;AND RETURN
XBkPixPat PEA BKPAT(A3) ;POINT TO BACKPAT
MOVE.L BkPixPat(A3),-(SP) ;PUSH BKPIXPAT HANDLE
BRA.S XPIXPAT ;=>USE COMMON CODE
XPnPixPat PEA PNPAT(A3) ;POINT TO PENPAT
MOVE.L PnPixPat(A3),-(SP) ;PUSH PNPIXPAT HANDLE
BRA.S XPIXPAT ;=>USE COMMON CODE
XFillPixPat PEA FILLPAT(A3) ;POINT TO FILLPAT
MOVE.L FillPixPat(A3),-(SP) ;PUSH FILLPIXPAT HANDLE
XPixPat JSR GetPicPixPat ;GET THE PATTERN
BRA DONE ;=>AND RETURN
XPnLocHFrac JSR GetWord ;GET FRACTION INTO D0
TST PORTBITS+ROWBYTES(A3) ;IS IT A NEW GRAFPORT?
BPL.S GODONE ;=>NO, JUST RETURN
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE D0,NEWHFRAC(A2) ;SAVE NEW HORIZONTAL FRACTION
GODONE BRA DONE ;=>AND RETURN
XCHEXTRA JSR GETWORD ;READ WORD INTO D0
TST PORTBITS+ROWBYTES(A3) ;IS IT A NEW GRAFPORT?
BPL.S GODONE ;=>NO, JUST RETURN
MOVE D0,CHEXTRA(A3) ;ELSE RECORD INTO CHEXTRA FIELD
BRA DONE ;AND RETURN
XHiliteMode BCLR #hiliteBit,HiliteMode ;ENABLE HILITING
BRA DONE ;AND RETURN
; HILITE COLOR CHANGED, SAVE NEW VALUE INTO GRAFVARS
XHiliteColor JSR GETLONG ;GET R,G
MOVE.L D0,D6 ;SAVE R,G
JSR GETWORD ;GET B
TST PORTBITS+ROWBYTES(A3) ;IS IT A NEW GRAFPORT?
BPL.S @DONE ;=>NO, DO NOTHING
MOVE.L GRAFVARS(A3),A0 ;GET HANDLE TO GRAFVARS
MOVE.L (A0),A0 ;POINT TO GRAFVARS
MOVE.L D6,RGBHiliteColor(A0) ;SAVE R,G
MOVE D0,RGBHiliteColor+blue(A0) ;SAVE B
@DONE BRA DONE ;AND RETURN
; HILITE COLOR CHANGED TO DEFAULT, COPY HILITE FROM LOW-MEM TO GRAFVARS
XDefHilite TST PORTBITS+ROWBYTES(A3) ;IS IT A NEW GRAFPORT?
BPL.S @DONE ;=>NO, DO NOTHING
MOVE.L GRAFVARS(A3),A0 ;GET HANDLE TO GRAFVARS
MOVE.L (A0),A0 ;POINT TO GRAFVARS
MOVE.L HiliteRGB,RGBHiliteColor(A0) ;COPY R,G
MOVE HiliteRGB+blue,RGBHiliteColor+blue(A0) ;COPY B
@DONE BRA DONE ;AND RETURN
; OP COLOR CHANGED, SAVE NEW VALUE INTO GRAFVARS
XOpColor JSR GETLONG ;GET R,G
MOVE.L D0,D6 ;SAVE R,G
JSR GETWORD ;GET B
TST PORTBITS+ROWBYTES(A3) ;IS IT A NEW GRAFPORT?
BPL.S @DONE ;=>NO, DO NOTHING
MOVE.L GRAFVARS(A3),A0 ;GET HANDLE TO GRAFVARS
MOVE.L (A0),A0 ;POINT TO GRAFVARS
MOVE.L D6,RGBOpColor(A0) ;SAVE R,G
MOVE D0,RGBOpColor+blue(A0) ;SAVE B
@DONE BRA DONE ;AND RETURN
;---------------------------------------------------
;
; ROUTINES FOR IGNORING DATA
;
; READ THE LENGTH FOLLOWED BY THAT NUMBER OF BYTES
;
CHKSAME TST.B SAMEFLAG(A6) ;USE SAME STRUCTURE?
BEQ.S GOIGCOUNT ;=>NO, USE COUNT IN D0
MOVE.L D1,D0 ;ELSE GET SIZE FOR SAME
BRA.S GOIGCOUNT ;=>IGNORE SPECIFIED NUMBER OF BYTES
IGNORELONG JSR GETLONG ;GET A LONG OF LENGTH
BRA.S GOIGCOUNT ;AND IGNORE THAT MUCH DATA
IGNORESHORT JSR GETWORD ;GET A WORD OF LENGTH
SWAP D0 ;GET HIGH WORD
CLR D0 ;CLEAR IT OUT
SWAP D0 ;SO WE HAVE A LONG LENGTH
GOIGCOUNT BSR.S IGCOUNT ;IGNORE BYTES IN D0
BRA DONE ;AND RETURN
IGCOUNT MOVEM.L D6/D7,-(SP) ;SAVE WORK REGISTERS
MOVE.L #256,D6 ;GET USEFUL NUMBER
SUB.L D6,SP ;ALLOCATE STACK BUFFER
MOVE.L D0,D7 ;SAVE WHOLE SIZE
BEQ.S IGDONE ;=>NO DATA, JUST RETURN
NXTCHNK MOVE D6,D0 ;ASSUME SIZE >= 256
CMP.L D6,D7 ;IS SIZE >= 256?
BGE.S IGSIZEOK ;=>YES, SKIP 256 BYTES
MOVE D7,D0 ;ELSE SKIP REMAINING BYTES
IGSIZEOK MOVE.L SP,-(SP) ;PUSH BUFFER POINTER
MOVE D0,-(SP) ;PUSH BYTECOUNT
JSR GETPICDATA ;READ DATA INTO BUFFER
SUB.L D6,D7 ;SUBTRACT BUFSIZE FROM COUNT
BGT.S NXTCHNK ;=>GO SKIP NEXT CHUNK
IGDONE ADD.L D6,SP ;STRIP BUFFER
MOVEM.L (SP)+,D6/D7 ;RESTORE WORK REGISTERS
RTS ;AND RETURN
;---------------------------------------------------
;
; DRAWING OPCODES: $20 - $FE
;
;---------------------------------------------------
;
; TEXT OR LINE OPCODES:
;
; LINE: 20, PNLOC(pt), NEWPT(pt)
; LINEFROM: 21, NEWPT(pt)
; SHORT LINE: 22, PNLOC(pt), DH(byte), DV(byte)
; SHORTLNFROM: 23, DH(byte), DV(byte)
;
; TEXT: 28,29,2A,2B,2C
;
TXLNOP TST.B SAMEFLAG(A6) ;IS THIS A TEXT OPCODE ?
BNE TEXTOP ;YES, DO IT
CMP #3,D7 ;IS OPCODE VALID?
BGT.S IGNORESHORT ;=>NO, IGNORE SHORT DATA
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L PENLOC(A2),D0 ;NO, GET PREVIOUS LINE ENDPOINT
ROR #1,D7 ;IS LO NIBBLE ODD ? (BIT 0)
BCS.S LNFROM ;YES, DRAW LINE FROM PREV
JSR GETLONG ;NO, GET NEW STARTPT
LNFROM MOVE.L D0,PNLOC(A3) ;COPY STARTPT INTO THEPORT
MOVE.L D0,NEWPT(A6) ;SAVE FOR SHORT DH,DV BELOW
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
PEA PNLOC(A3)
PEA FROMRECT(A2)
PEA TORECT(A2)
_MAPPT ;MAP STARTPT
ROR #1,D7 ;IS OPCODE BIT 1 SET ?
BCS.S SHORTLN ;YES, USE SHORT DH,DV FORM
JSR GETLONG ;NO, GET NEWPT
MOVE.L D0,NEWPT(A6) ;PUT IN TEMP
BRA.S LNOK ;AND CONTINUE
SHORTLN BSR GETSBYTE ;GET A SIGNED BYTE
ADD.W D0,NEWPT+H(A6) ;ADD TO STARTPT.H
BSR GETSBYTE ;GET A SIGNED BYTE
ADD.W D0,NEWPT+V(A6) ;ADD TO STARTPT.V
LNOK MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L NEWPT(A6),PENLOC(A2) ;REMEMBER NEWPT FOR NEXT TIME
PEA NEWPT(A6) ;PUSH ADDRESS OF NEWPT
PEA FROMRECT(A2)
PEA TORECT(A2)
_MAPPT ;MAP NEWPT
MOVE.L NEWPT(A6),-(SP) ;PUSH NEWPT PARAM FOR LINEPROC
MOVE.L JStdLine,A0 ;get piece of trap table
MOVE.L GRAFPROCS(A3),D0 ;IS GRAFPROCS NIL ?
BEQ.S @1 ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L LINEPROC(A0),A0 ;NO, GET PROCPTR
@1 BRA CALL0 ;CALL PROC AND QUIT
;---------------------------------------------------
;
; LONG TEXT: 28, txLoc(pt), count(0..255), text
; DH TEXT: 29, dh(0..255), count(0..255), text
; DV TEXT: 2A, dv(0..255), count(0..255), text
; DHDV TEXT: 2B, dh(0..255), dv(0,..255), count(0..255), text
;
; Font ID/Name: 2C, data size (word), fond ID, fond name (pstr)
; Line layout: 2D, data size (word), character extra (fixed), run slop (fixed)
; Glyph state: 2E, data size (word), ouline preferred (byte), preserve glyph (byte),
; fractional widths (byte), scaling disabled (byte)
;
; IF SOMEONE HAS JAMMED THE FRACTIONAL POSITION, GRAB IT HERE FOR ALL OLD OPCODES
; AND ALWAYS RESET TO 1/2.
TEXTOP
IF hasGlyphState THEN
cmp #6,d7 ; glyph state opcode?
beq GlyphState ; yes, glyph state information
ENDIF
IF SCRIPT_CHAR_EXTRA THEN
cmp #5,d7 ;line-layout opcode?
beq LineLayout ;yes -> line-layout information.
ENDIF
CMP #4,D7 ;IS OPCODE VALID?
BGT IGNORESHORT ;=>NO, IGNORE SHORT DATA
BEQ AddFontToTbl ;bind name to new ID
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE NEWHFRAC(A2),TXHFRAC(A2) ;ELSE COPY NEW FRACTIONAL POSITION
MOVE #$8000,NEWHFRAC(A2) ;AND CLEAR TO 1/2
AND #3,D7 ;IS THIS A LONGTEXT OPCODE ?
BEQ.S LONGTXT ;YES, USE LONG FORMAT
ROR #1,D7 ;DO WE NEED DH ? (BIT 0)
BCC.S DHOK ;NO, CONTINUE
JSR GETUBYTE ;GET DH 0..255
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
ADD D0,TEXTLOC+H(A2) ;BUMP TEXTLOC.H
DHOK ROR #1,D7 ;DO WE NEED DV ? (BIT 1)
BCC.S TEXTOP2 ;NO, CONTINUE
JSR GETUBYTE ;GET DV 0..255
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
ADD D0,TEXTLOC+V(A2) ;BUMP TEXTLOC.V
BRA.S TEXTOP2 ;SHARE CODE
LONGTXT JSR GETLONG ;GET TXLOC, UNMAPPED
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L D0,TEXTLOC(A2) ;SAVE IN TEXTLOC
TEXTOP2 JSR GETUBYTE ;GET TEXT LENGTH 0..255
MOVE D0,D6 ;SAVE LENGTH IN D6
PEA TXDATA(A6) ;PUSH ADDR OF TEXT BUF
MOVE D6,-(SP) ;PUSH BYTECOUNT
JSR GetPicData ;GET THE TEXT
MOVE.L TEXTLOC(A2),PNLOC(A3) ;COPY TEXTLOC INTO PNLOC
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
CMP #PICTVERSION,PLAYVERSION(A2) ;OLD PICTURE?
BEQ.S OLDMAP ;=>YES, DO SAME AS BEFORE
TST PORTBITS+ROWBYTES(A3) ;IS IT AN OLD GRAFPORT?
BPL.S OLDMAP ;=>YES, DO SAME AS BEFORE
; NEW PICTURE, NEW GRAFPORT: MAP FIXED PEN POSITION TO NEW COORDINATES
MOVE TXHFRAC(A2),-(SP) ;PUSH FRACTIONAL PART OF PT.H
MOVE TEXTLOC+H(A2),-(SP) ;PUSH INTEGER PART OF PT.H
MOVE #$8000,-(SP) ;SET FRACTIONAL PART OF PT.V TO 1/2
MOVE TEXTLOC+V(A2),-(SP) ;PUSH INTEGER PART OF PT.V
MOVE.L SP,-(SP) ;PUSH FIXPT
PEA FROMRECT(A2) ;PUSH SOURCE RECT
PEA TORECT(A2) ;PUSH DST RECT
JSR MAPFIXPT ;MAP THE FIXED POINT
MOVE (SP)+,PNLOC+V(A3) ;SET MAPPED PEN VERTICAL
MOVE (SP)+,D0 ;IGNORE FRACTIONAL PART
MOVE (SP)+,PNLOC+H(A3) ;SET MAPPED PEN HORIZONTAL
MOVE (SP)+,PNLOCHFRAC(A3) ;AND FIXED PART OF PEN HORIZONTAL
BRA.S NOMAP ;=>SKIP OLD MAPPING
OLDMAP PEA PNLOC(A3)
PEA FROMRECT(A2)
PEA TORECT(A2)
_MAPPT ;MAP PNLOC.V,PNLOC.H
NOMAP MOVE D6,-(SP) ;PUSH CHARACTER COUNT
PEA TXDATA(A6) ;PUSH ADDRESS OF TEXT
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L NUMER(A2),-(SP) ;PUSH NUMER
MOVE.L DENOM(A2),-(SP) ;PUSH DENOM
MOVE.L JStdText,A0 ;get piece of trap table
MOVE.L GRAFPROCS(A3),D0 ;IS GRAFPROCS NIL ?
BEQ.S @1 ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L TEXTPROC(A0),A0 ;NO, GET PROCPTR
@1 BRA CALL0 ;CALL PROC AND QUIT
; as seen in QDciPatchROM.a at DoFontIDOpCode <sm 6/9/92>stb
;
; At this point we have found a non-zero fond ID which we have not seen previously
; so we must add it to the FontMappingTbl handle. If the handle needs to be resized we do that
; here as well.
fontMapChunk equ 20*4
AddFontToTbl
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L FontMappingTbl(A2),d1 ;get the fontID association table
beq ignoreShort ;skip opcode data if no handle
move.l d1,a0
move.l (a0),a1 ;
moveq #0,d0 ;clear out high end
move.w 4(a1),d0 ;get amnt of handle in use
addq.w #1,d0 ;make 1 based
add.w d0,d0
add.w d0,d0 ;4 bytes per entry
addq.w #6,d0 ;hdr size
cmp.l (a1),d0 ;same as size of handle?
blt.s addFontID ;no need to grow list
add.w #fontMapChunk,d0 ;bump handleSize enough for 25 more fonts
move.l d0,(a1) ;save the new size
_SetHandleSize ;grow list
MOVE.L FontMappingTbl(A2),a0 ;get the fontID association table
move.l (a0),a1 ;get fontList handle
tst.w d0 ;did we get it?
beq.s addFontID ;yes, continue
sub.w #fontMapChunk,(a1) ;couldn't grow it.
bra ignoreShort ;skip name stuff
addFontID
move.l a0,a3 ;save fontMappingTbl handle in a3
JSR GetWord ;get word data length
subq #2,d0 ;get length of fond name (incl. length byte)
MOVE D0,D6 ;SAVE LENGTH IN D6
JSR GetWord ;get old fond ID
MOVE D0,D7 ;save fond ID in D7
PEA TXDATA(A6) ;PUSH ADDR OF TEXT BUF
MOVE D6,-(SP) ;PUSH BYTECOUNT
JSR GetPicData ;get the name pstring
PEA TXDATA(A6) ;PUSH ADDR OF font name
PEA NewPt(A6) ;PUSH ADDR OF var font id
_GetFNum ;find the appropriate id for this system
move.w NewPt(a6),d6 ;get new fond ID
beq.s fontDone ;not found, so don't add to table
cmp.w d6,d7 ;does old ID = new ID?
beq.s fontDone ;yes, don't add to table
move.l (a3),a1 ;fontID association table handle in A3
addq.w #4,a1 ;point to number of entries in use - 1
addq.w #1,(a1) ;bump the entry count
move.w (a1)+,d0 ;get new entry count and point to entry array
lea (a1,d0*4),a1 ;point to this 0ld,New pair
move.w d7,(a1)+ ;store old ID
move.w d6,(a1) ;store new ID
fontDone
bra Done
;
; Load the line-layout information from the picture and save it into the Script Manager
; globals. We also want to skip any extra data that follows so the opcode can hold more
; in future versions.
;
; as seen in QDciPatchROM.a at DoLayoutOpCode <sm 6/9/92>stb
IF SCRIPT_CHAR_EXTRA THEN
LineLayout
jsr GetWord ; get the data length.
move.w d0,-(sp) ; save this for later.
jsr GetLong ; get the character extra.
move.l grafGlobals(a5),a0 ; load quickDraw globals. <23>
move.l d0,qdChExtra(a0) ; restore character extra amount. <23>
jsr GetLong ; get the run slop.
move.l grafGlobals(a5),a0 ; load quickDraw globals. <23>
move.l d0,qdRunSlop(a0) ; restore run slop amount. <23>
clr.l d0 ; clear a long.
move.w (sp)+,d0 ; load original data length.
sub.l #8,d0 ; extra data included?
bgt GoIgCount ; yes -> ignore it for now.
bra Done ; finished with this opcode.
ENDIF
;
; Load the glyph state information from the picture and save it into the low memory
; globals. If the width tables are no longer valid then flag that condition by setting
; LastSpExtra to an invalid value. We also want to skip any extra data that follows so
; the opcode can hold more in future versions.
;
; as seen in QDciPatchROM.a at DoStateOpCode <sm 6/9/92>stb
IF hasGlyphState THEN
GlyphState
jsr GetWord ; get data length
move.w d0,-(sp) ; save this for later
jsr GetUByte ; get outline preferred flag
move.b d0,-(sp) ; push it on the stack
_SetOutlinePreferred ; set outline preferred state
jsr GetUByte ; get preserve glyph flag
move.b d0,-(sp) ; push it on the stack
_SetPreserveGlyph ; set preserve glyph state
jsr GetUByte ; get fractional widths flag
move.b d0,-(sp) ; push it on the stack
_SetFractEnable ; set fractional widths state
jsr GetUByte ; get scaling disabled flag
move.b d0,-(sp) ; push it on the stack
_SetFScaleDisable ; set scaling disabled state
clr.l d0 ; clear a long
move.w (sp)+,d0 ; load original data length
sub.l #4,d0 ; extra data included?
bgt GoIgCount ; yes, ignore it for now
bra Done ; finished with this opcode
ENDIF
;---------------------------------------------------
;
; Rect: OP, RECT
;
RECTOP CMP #4,D7 ;IS OPCODE VALID?
BLE ROK ;=>YES, CONTINUE
MOVEQ #8,D0 ;IF RECT, SKIP 8 BYTES
MOVEQ #0,D1 ;IF SAME, SKIP 0 BYTES
BRA CHKSAME ;=>CHECK SAMEFLAG AND IGNORE
ROK MOVE.B D7,-(SP) ;PUSH VERB
BSR GETRECT ;GET AND PUSH DSTRECT
MOVE.L JStdRect,A0 ;get piece of trap table
MOVE.L GRAFPROCS(A3),D0 ;IS GRAFPROCS NIL ?
BEQ.S @1 ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L RECTPROC(A0),A0 ;NO, GET PROCPTR
@1 BRA CALL0 ;CALL PROC AND QUIT
;---------------------------------------------------
;
; RRect: OP, RECT, OVALPT
;
RRECTOP CMP #4,D7 ;IS OPCODE VALID?
BLE RROK ;=>YES, CONTINUE
MOVEQ #8,D0 ;IF RECT, SKIP 8 BYTES
MOVEQ #0,D1 ;IF SAME, SKIP 0 BYTES
BRA CHKSAME ;=>CHECK SAMEFLAG AND IGNORE
RROK MOVE.B D7,-(SP) ;PUSH VERB
BSR GETRECT ;GET AND PUSH DSTRECT
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L OVALSIZES(A2),-(SP) ;PUSH OVHT,OVWD
MOVE.L JStdRRect,A0 ;get piece of trap table
MOVE.L GRAFPROCS(A3),D0 ;IS GRAFPROCS NIL ?
BEQ.S @1 ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L RRECTPROC(A0),A0 ;NO, GET PROCPTR
@1 BRA CALL0 ;CALL PROC AND QUIT
;---------------------------------------------------
;
; Oval: OP, RECT
;
OVALOP CMP #4,D7 ;IS OPCODE VALID?
BLE OVOK ;=>YES, CONTINUE
MOVEQ #8,D0 ;IF RECT, SKIP 8 BYTES
MOVEQ #0,D1 ;IF SAME, SKIP 0 BYTES
BRA CHKSAME ;=>CHECK SAMEFLAG AND IGNORE
OVOK MOVE.B D7,-(SP) ;PUSH VERB
BSR GETRECT ;GET AND PUSH DSTRECT
MOVE.L JStdOval,A0 ;get piece of trap table
MOVE.L GRAFPROCS(A3),D0 ;IS GRAFPROCS NIL ?
BEQ.S @1 ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L OVALPROC(A0),A0 ;NO, GET PROCPTR
@1 BRA CALL0 ;CALL PROC AND QUIT
;---------------------------------------------------
;
; Arc: OP, RECT, STARTANGLE, ARCANGLE
;
ARCOP CMP #4,D7 ;IS OPCODE VALID?
BLE ARCOK ;=>YES, CONTINUE
MOVEQ #12,D0 ;IF NOT SAME, SKIP 12 BYTES
MOVEQ #4,D1 ;IF SAME, SKIP 5 BYTES
BRA CHKSAME ;=>CHECK SAMEFLAG AND IGNORE
ARCOK MOVE.B D7,-(SP) ;PUSH VERB
BSR GETRECT ;GET AND PUSH DSTRECT
JSR GETWORD ;GET STARTANGLE
MOVE D0,-(SP) ;PUSH STARTANGLE
JSR GETWORD ;GET ARCANGLE
MOVE D0,-(SP) ;PUSH ARCANGLE
MOVE.L JStdArc,A0 ;get piece of trap table
MOVE.L GRAFPROCS(A3),D0 ;IS GRAFPROCS NIL ?
BEQ.S @1 ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L ARCPROC(A0),A0 ;NO, GET PROCPTR
@1 BRA CALL0 ;CALL PROC AND QUIT
;---------------------------------------------------
;
; Poly: OP, POLY
;
; THE SAME POLY OPCODES WERE NEVER PARSED, SO FOR COMPATIBILITY I'LL DO OLD WAY
POLYOP CMP #4,D7 ;IS OPCODE VALID?
BLE POLYOK ;=>YES, CONTINUE
TST.B SAMEFLAG(A6) ;IS IT THE SAME POLY?
BNE.S @DONE ;=>YES, NO DATA
BSR GETHNDL ;ELSE READ IN THE POLYGON
@DONE BRA DONE ;AND RETURN
POLYOK BSR GETHNDL ;COPY POLY INTO HANDLE1
MOVE.L HANDLE1(A6),-(SP) ;PUSH POLYHANDLE
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
PEA FROMRECT(A2) ;PUSH FROMRECT
PEA TORECT(A2) ;PUSH TORECT
_MAPPOLY ;MAP POLY INTO DST COORDS
MOVE.B D7,-(SP) ;PUSH VERB
MOVE.L HANDLE1(A6),-(SP) ;PUSH POLYHANDLE
MOVE.L JStdPoly,A0 ;get piece of trap table
MOVE.L GRAFPROCS(A3),D0 ;IS GRAFPROCS NIL ?
BEQ.S @1 ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L POLYPROC(A0),A0 ;NO, GET PROCPTR
@1 BRA CALL1 ;CALL PROC AND QUIT
;---------------------------------------------------
;
; Rgn: OP, RGN
;
RGNOP CMP #4,D7 ;IS OPCODE VALID?
BLE RGNOK ;=>YES, CONTINUE
TST.B SAMEFLAG(A6) ;IS IT THE SAME RGN?
BNE.S @DONE ;=>YES, NO DATA
BSR GETHNDL ;ELSE READ IN THE RGN
@DONE BRA DONE ;AND RETURN
RGNOK BSR GETHNDL ;COPY RGN INTO HANDLE1
MOVE.L HANDLE1(A6),-(SP) ;PUSH RGN
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
PEA FROMRECT(A2) ;PUSH FROMRECT
PEA TORECT(A2) ;PUSH TORECT
_MAPRGN ;MAP RGN INTO DSTRECT COORDS
MOVE.B D7,-(SP) ;PUSH VERB
MOVE.L HANDLE1(A6),-(SP) ;PUSH RGN
MOVE.L JStdRgn,A0 ;get piece of trap table
MOVE.L GRAFPROCS(A3),D0 ;IS GRAFPROCS NIL ?
BEQ.S @1 ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L RGNPROC(A0),A0 ;NO, GET PROCPTR
@1 BRA CALL1 ;CALL PROC, DISCARD AND QUIT
;--------------------------------------------------------------------------
;
; Quantities in brackets only read if high bit of rowbytes is set.
;
; BitsRect: 90, ROWBYTES, BOUNDS, [REST OF PIXMAP, COLORTABLE],
; SRCRECT, DSTRECT, MODE, BITDATA
;
; BitsRgn: 91, ROWBYTES, BOUNDS, [REST OF PIXMAP, COLORTABLE],
; SRCRECT, DSTRECT, MODE, MASKRGN, BITDATA
;
; PackBitsRect:98, ROWBYTES, BOUNDS, [REST OF PIXMAP, COLORTABLE],
; SRCRECT, DSTRECT, MODE, compressed BITDATA
;
; PackBitsRgn: 99, ROWBYTES, BOUNDS, [REST OF PIXMAP, COLORTABLE],
; SRCRECT, DSTRECT, MODE, MASKRGN, compressed BITDATA
;
; DirectBitsRect:9A, boguslong, ROWBYTES, BOUNDS, [REST OF PIXMAP], CLUT OPTIONAL, <16Jun88 BAL>
; SRCRECT, DSTRECT, MODE, BITDATA
;
; DirectBitsRgn: 9B, boguslong, ROWBYTES, BOUNDS, [REST OF PIXMAP], CLUT OPTIONAL, <16Jun88 BAL>
; SRCRECT, DSTRECT, MODE, MASKRGN, BITDATA
;
; FIRST GET THE BITMAP/PIXMAP FROM THE PICTURE
; from QDciPatchROM.a verbatim (mostly) <sm 6/9/92>stb
BITSOP CMP #3,D7 ;CHECK OPCODE <16Jun88 BAL>
BGT IGNORESHORT ;=>READ WORD LENGTH + DATA
CMP #1,D7 ;IS IT INDEXED <16Jun88 BAL>
BLE.S @IND ;YES DON'T SKIP BOGUS LONG <16Jun88 BAL>
JSR GETLONG ;GET BOGUS LONG FROM PICTURE <16Jun88 BAL>
@IND JSR GETWORD ;GET ROWBYTES FROM PICTURE
MOVE D0,SRCPIX+ROWBYTES(A6) ;SAVE ROWBYTES
MOVEQ #BITMAPREC-6,D1 ;GET SIZE OF BITMAP
MOVE D0,D6 ;IS IT A BITMAP OR A PIXMAP?
BPL.S BITSOP1 ;=>IT'S A BITMAP
MOVEQ #PMREC-6,D1 ;GET SIZE OF PIXMAP
BITSOP1 PEA SRCPIX+BOUNDS(A6) ;PUSH ADDR OF SRCPIX.BOUNDS
MOVE D1,-(SP) ;PUSH BYTECOUNT
JSR GETPICDATA ;GET BITMAP/PIXMAP
; if ADDRMODEFLAG then ; <BAL 11Dec88>
clr.w SRCPIX+pmVersion(A6) ; assume 24 bit addressing
; endif
; IF IT'S A PIXMAP, THEN ALLOCATE A COLOR TABLE AND GET IT FROM THE PICTURE
TST D6 ;IS IT A PIXMAP?
BPL.S BITSOP2 ;=>NO, DON'T GET TABLE
move.l srcpix+pmTable(a6),d6 ;Get color table from record <28> <KON 28NOV90>
clr.l srcPix+PMTable(a6) ;assume no clut <12Jul88 BAL>
BTST #1,D7 ;IS IT DIRECT DATA? <16Jun88 BAL>
bne.s BITSOP2 ;yes, no CLUT <12Jul88 BAL>
@GETLUT MOVEQ #CTREC,D0 ;GET SIZE OF COLOR TABLE
JSR RNEWHANDLE ;GET A HANDLE FOR IT
MOVE.L A0,SRCPIX+PMTABLE(A6) ;SAVE COLOR TABLE HANDLE
MOVE.L A0,-(SP) ;PUSH COLOR TABLE HANDLE
JSR GETPICTABLE ;READ COLOR TABLE INTO HANDLE
tst.l d6 ;was color table NIL?
bne.s BitsOp2 ;no, continue
;
; Color table was NIL on record. If it's a dummy CTable, throw it away. Value field
; of $4B4F in value field of 0th entry signals dummy table.
;
move.l srcPix+pmTable(a6),a0
move.l (a0),a2 ;get ptr to color table
cmp.w #cTabSignature,ctTable(a2) ;signature there?
bne.s BITSOP2 ;no, then skip
_DisposHandle ;yes, throw ctable away
clr.l srcPix+pmTable(a6)
BITSOP2 PEA SRCRECT(A6) ;PUSH ADDR OF SRCRECT
MOVE #16,-(SP) ;PUSH BYTECOUNT = 16
JSR GetPicData ;GET SRCRECT,DSTRECT
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
PEA DSTRECT(A6)
PEA FROMRECT(A2)
PEA TORECT(A2)
_MAPRECT ;MAP DSTRECT
PEA SRCPIX(A6) ;PUSH SRCPIX
PEA SRCRECT(A6) ;PUSH ADDR OF SRCRECT
PEA DSTRECT(A6) ;PUSH ADDR OF DSTRECT
JSR GETWORD ;GET MODE
MOVE D0,-(SP) ;PUSH MODE
CLR.L -(SP) ;ASSUME MASKRGN = NIL
BTST #0,D7 ;IS MASKRGN USED ? <16Jun88 BAL>
BEQ.S NOTRGN ;=> YES, USE NIL RGN
USERGN BSR GETHNDL ;GET MASKRGN INTO HANDLE1
MOVE.L HANDLE1(A6),-(SP) ;PUSH MASKRGN
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
PEA FROMRECT(A2) ;PUSH FROMRECT
PEA TORECT(A2) ;PUSH TORECT
_MAPRGN ;MAP RGN INTO DSTRECT COORDS
MOVE.L HANDLE1(A6),(SP) ;PASS MASKRGN
MOVE.L HANDLE1(A6),HANDLE2(A6) ;AND REMEMBER MASKRGN IN HANDLE2
NOTRGN MOVE SRCPIX+BOUNDS+BOTTOM(A6),D6 ;GET SRCPIX.BOTTOM
SUB SRCPIX+BOUNDS+TOP(A6),D6 ;CALC HEIGHT
MOVE D6,D5 ;COPY HEIGHT
MOVE SRCPIX+ROWBYTES(A6),D0 ;GET BITMAP/PIXMAP ROWBYTES
AND #nuRBMask,D0 ;CLEAR FLAG BITS
MULU D0,D5 ;CALC BITMAP SIZE
; If the memory request fails, go image a band at a time <C946>
MOVE.L D5,D0 ;GET BYTECOUNT
_NewHandle ;ALLOCATE BITS HANDLE
BNE tryBands ;=> error, try a band at a time <C946>
MEMOK MOVE.L A0,HANDLE1(A6) ;REMEMBER IN HANDLE1
_HLock ;LOCK HANDLE1
gotTmpMem
PEA SRCPIX(A6) ;PUSH PIXMAP
MOVE.L A0,-(SP) ;PUSH HANDLE
JSR GETPMDATA ;AND READ IN PIXMAP DATA
if TheFuture then ; Build only for TheFuture <43>
cmp.w #AbortPicPlayBackErr,qdErr ;abort if our special error <42>
beq BADBITS
endif ; <43>
DOBITS MOVE.L HANDLE1(A6),A0 ;GET HANDLE1
MOVE.L (A0),SRCPIX+BASEADDR(A6) ;FILL IN BASEADDR
MOVE.L JStdBits,A0 ;ASSUME GRAFPROCS NOT INSTALLED
MOVE.L GRAFPROCS(A3),D0 ;ARE GRAFPROCS NIL?
BEQ.S BITSOK ;YES, USE STD PROC
EXG A0,D0 ;much more convenient <C946>
CMP.L BitsProc(A0),D0 ;has it been replaced? <C946>
BEQ.S @NOTOLD ;=>no, use std proc <BAL/CSD 09Jul88><C946>
; IF ITS AN OLD GRAFPORT AND GRAFPROCS ARE INSTALLED, THEN COPY THE IMAGE TO AN
; OFFSCREEN BITMAP BEFORE CALLING THE GRAFPROC
TST SRCPIX+ROWBYTES(A6) ;IS SRC A PIXMAP? <C827>
BPL.S @NOTOLD ;=>NO, DON'T NEED TO COPY IT <C827>
TST PORTBITS+ROWBYTES(A3) ;IS IT AN OLD PORT?
BMI.S @NOTOLD ;=>NO, NEW GRAFPORT
LEA SRCPIX+ROWBYTES(A6),A0 ;POINT TO PIXMAP ROWBYTES
MOVEQ #0,D0 ;CLEAR HIGH WORD
MOVE (A0)+,D0 ;GET ROWBYTES
AND #nuRBMask,D0 ;MASK FLAG BITS
LSL.L #3,D0 ;CONVERT BYTES TO BITS
DIVU SRCPIX+PIXELSIZE(A6),D0 ;GET ROWBITS FOR ONE-BIT COPY
ADD #15,D0 ;ROUND TO NEAREST WORD BOUNDARY
LSR.L #4,D0 ;DIV BY 16 (WORD BOUNDARY)
BEQ.S BADBITS ;=>TOO NARROW!
ADD D0,D0 ;HERE'S THE REAL ROWBYTES
LEA SRCBITS+ROWBYTES(A6),A1 ;POINT TO BITMAP BOUNDS
MOVE D0,(A1)+ ;COPY ROWBYTES
MOVE.L (A0)+,(A1)+ ;COPY BOUNDS
MOVE.L (A0)+,(A1)+ ;INTO OUR BITMAP
; <C992>
MOVE.L SRCPIX+BASEADDR(A6),SRCBITS+BASEADDR(A6) ;AND POINT TO BITS <C992>
; <C992>
PEA SRCPIX(A6) ;POINT TO SRC
PEA SRCBITS(A6) ;POINT TO DST
PEA SRCPIX+BOUNDS(A6) ;POINT TO SRCRECT
MOVE.L (SP),-(SP) ;POINT TO DSTRECT
MOVE #SRCCOPY,-(SP) ;PUSH MODE
CLR.L -(SP) ;NO MASK REGION
_COPYBITS ;PIXMAP -> BITMAP
LEA SRCBITS(A6),A0 ;POINT TO BITMAP
MOVE.L A0,14(SP) ;REPLACE PIXMAP WITH BITMAP
MOVE.L GRAFPROCS(A3),A0 ;GET GRAFPROCS BACK <C946>
@NOTOLD MOVE.L BITSPROC(A0),A0 ;NO, GET PROCPTR <C946>
BITSOK JSR (A0) ;CALL BITSPROC
BADBITS ;MOVE.L HANDLE1(A6),A0 ;GET HANDLE1
;_HUnlock ;UNLOCK THE DATABITS
TST SRCPIX+ROWBYTES(A6) ;IS IT A PIXMAP?
BPL.S DOKILL ;=>NO, DON'T DISPOSE COLOR TABLE
MOVE.L SRCPIX+PMTABLE(A6),D0 ;ELSE GET COLOR TABLE HANDLE <16Jun88 BAL>
BEQ.S DOKILL ;DIRECT DATA, NO CLUT <16Jun88 BAL>
MOVE.L D0,A0 ; <16Jun88 BAL>
_DISPOSHANDLE ;AND DISPOSE OF IT
DOKILL BTST #0,D7 ;IS MASKRGN USED ? <16Jun88 BAL>
BEQ KILL1 ;NO, DISCARD ONLY DATABITS
BRA KILL2 ;DISCARD MASKRGN & DATABITS
; as seen in QDciPatchROM.a <sm 6/9/92>stb
tryBands ; Here Begins <C946> 07Nov87 BAL
;--------------------------------------------------------------------------
;
; The NewHandle for the whole pixmap has failed so lets try a divide and conquer:
;
; d5 = byte count of entire pixmap
; d6 = pixmap height
; d7 = maskrgn flag (word)
;
; Now the stack looks as follows:
;
; srcPix 14(sp) \
; srcRect 10(sp) \
; dstRect 6(sp) > parameters to stdBits call
; mode 4(sp) /
; maskRgn <- TOS /
;
move.l d5,d0 ;ask for the whole banana
_NewTempBuffer ;returns a0=handle, d0=size
move.l a0,tmpHandle1(a6) ;store handle for later
move.l a0,Handle1(a6) ;in case we decide to use it
move.l d0,d4 ;remember tmp buffer size in d4
cmp.l d5,d0 ;did we get it all?
bge gotTmpMem ;yes, go take non-banded case
MOVE SRCPIX+ROWBYTES(A6),D5 ;GET BITMAP/PIXMAP ROWBYTES
AND #nuRBMask,D5 ;CLEAR FLAG BITS
ext.l d5 ;get size of one scanline in d5
_PurgeSpace ;determine available contiguous memory (in a0)
move.l a0,d3 ;get largest block size
cmp.l d3,d4 ;is the temp memory block larger?
ble.s @useAppHeap ;no, use app heap instead
move.l d4,d3 ;use temp memory block
divu.l d5,d3 ;d3 is number of scanlines in each band
bne.s @gotMem ;if more than zero scanlines then doit
bra abort ;else abort
@useAppHeap
move.l tmpHandle1(a6),a0 ;get the temp buffer handle
_DisposeTempBuffer ;release it
clr.l tmpHandle1(a6) ;don't dispose it again
divu.l d5,d3 ;d3 is number of scanlines to allocate
beq abort ;sorry, no space
move.l d5,d0 ;get bytes per scanline
mulu.l d3,d0 ;compute handle size
_NewHandle ;allocate the space
bne abort ;couldn't get it -> abort (hard to believe!)
move.l a0,handle1(a6) ;save handle for later
_HLock ;lock it down
@gotMem
move srcPix+bounds+bottom(a6),d6 ;save srcPix.bounds.bottom in d6
move.w srcPix+Bounds+top(a6),d0 ;get srcpix top
add d3,d0 ;compute srcpix bottom = srcpix top+srcBandHght;
move.w d0,srcPix+Bounds+bottom(a6) ;set srcPix bottom
move.w srcRect+top(a6),d0 ;get srcRect top
add d3,d0 ;compute srcRect bottom = srcRect top+srcBandHght;
move.w d0,srcRect+bottom(a6) ;set srcRect bottom
move.w dstRect+bottom(a6),d5 ;save dstRect bottom in d5
move d5,d4 ;copy dstRect.bottom
sub.w dstRect+top(a6),d4 ;d4 is dstRect height
clr.l -(SP) ;make room for fcn result
move d4,-(SP) ;dstRect height
move d6,-(SP) ;srcRect.bottom
move.w srcPix+Bounds+top(a6),d0 ;get srcpix top
sub d0,(sp) ;srcRect height
_FixRatio ;calc vert scale ratio
move.l (SP)+,d0 ;D6 is dst scanlines per src scanline
move.l d0,d4 ;copy in d4
mulu.l d3,d4 ;d4 is dstBandHght
move.w dstRect+top(a6),d2 ;get dstRect.top
swap d2 ;convert to fixed point
clr.w d2 ;
add.l d4,d2 ;compute dstRect bottom = dstRect.top+dstBandHght;
swap d2 ;truncate
move.w d2,dstRect+bottom(a6) ;set dstRect bottom
swap d2 ;back to fixed
;
; Register useage from here on:
;
; D0,D1 scratch A0,A1 scratch
; D2 dstRect.bottom (Fixed) A2 preserves d2 across proc calls
; D3 src band height A3 ThePort
; D4 dst band height (Fixed) A4 StdBits proc
; D5 original dstRect.bottom
; D6 original srcRect.bottom
; D7 maskRgn flag (word),
; bit #31 -> compress data to 1 bit/pixel for bottle necks
;
MOVE.L HANDLE1(A6),A0 ;GET HANDLE1
MOVE.L (A0),SRCPIX+BASEADDR(A6) ;FILL IN BASEADDR
MOVE.L JStdBits,A4 ;ASSUME GRAFPROCS NOT INSTALLED
bclr.l #31,d7 ;clear sign bit of d7.l -> don't make bitmap
MOVE.L GRAFPROCS(A3),d0 ;ARE GRAFPROCS NIL?
beq.s nxtBand ;no bottle neck procs so skip copy to 1-bit
move.l d0,a0 ;point to grafProcs
move.l bitsProc(a0),d0 ;get installed proc
cmp.l a4,d0 ;bitsProc replaced?
beq.s nxtBand ;=>no, skip copy to 1-bit
move.l d0,a4 ;replace stdbits with user's bottle neck proc
; IF ITS AN OLD GRAFPORT AND GRAFPROCS ARE INSTALLED, THEN COPY THE IMAGE TO AN
; OFFSCREEN BITMAP BEFORE CALLING THE GRAFPROC
TST SRCPIX+ROWBYTES(A6) ;IS SRC A PIXMAP?
BPL.S nxtBand ;=>NO, DON'T NEED TO COPY IT
TST PORTBITS+ROWBYTES(A3) ;IS IT AN OLD PORT?
BMI.S nxtBand ;=>NO, NEW GRAFPORT
;
; Construct a bitmap that tracks the srcPix map and shares its baseAddr
;
bset.l #31,d7 ;set flag -> make 1-bit deep bitmap bands
LEA SRCPIX+ROWBYTES(A6),A0 ;POINT TO PIXMAP ROWBYTES
MOVEQ #0,D0 ;CLEAR HIGH WORD
MOVE (A0)+,D0 ;GET ROWBYTES
AND #nuRBMask,D0 ;MASK FLAG BITS
LSL.L #3,D0 ;CONVERT BYTES TO BITS
DIVU SRCPIX+PIXELSIZE(A6),D0 ;GET ROWBITS FOR ONE-BIT COPY
ADD #15,D0 ;ROUND TO NEAREST WORD BOUNDARY
LSR.L #4,D0 ;DIV BY 16 (WORD BOUNDARY)
BEQ BADBITS ;=>TOO NARROW!
ADD D0,D0 ;HERE'S THE REAL ROWBYTES
LEA SRCBITS+ROWBYTES(A6),A1 ;POINT TO BITMAP BOUNDS
MOVE D0,(A1)+ ;COPY ROWBYTES
MOVE.L (A0)+,(A1)+ ;COPY BOUNDS
MOVE.L (A0)+,(A1)+ ;INTO OUR BITMAP
MOVE.L SRCPIX+BaseAddr(A6),SRCBITS+BASEADDR(A6) ;share bits with pixmap
LEA SRCBITS(A6),A0 ;POINT TO BITMAP
MOVE.L A0,14(SP) ;REPLACE PIXMAP WITH BITMAP (params to stdbits)
; Now unpack a full band of the data into srcPix, optionally compress it to a bitmap,
; and then make the stdBits call. Next, advance the src and dest rects and loop for
; all full bands.
;
; Assumes we need more than one band since original newHandle failed.
nxtBand
PEA SRCPIX(A6) ;PUSH PIXMAP
MOVE.L HANDLE1(A6),-(SP) ;PUSH HANDLE
move.l d2,a2 ;preserve d2
JSR GETPMDATA ;AND READ IN PIXMAP DATA
if TheFuture then ; Build for the Future only <43>
cmp.w #AbortPicPlayBackErr,qdErr ;abort if our special error <42>
beq BADBITS ; <42>
endif ; <43>
TST.L d7 ;convert to 1 bit deep?
BPL.S @1 ;no, skip copybits
PEA SRCPIX(A6) ;POINT TO SRC
PEA SRCBITS(A6) ;POINT TO DST
PEA SRCPIX+BOUNDS(A6) ;POINT TO SRCRECT
MOVE.L (SP),-(SP) ;POINT TO DSTRECT
MOVE #SRCCOPY,-(SP) ;PUSH MODE
CLR.L -(SP) ;NO MASK REGION
_COPYBITS ;PIXMAP -> BITMAP (converted in place)
@1 move.l 14(sp),-(sp) ;duplicate srcPix/srcBits
move.l 14(sp),-(sp) ;duplicate srcRect
move.l 14(sp),-(sp) ;duplicate dstRect
move.w 16(sp),-(sp) ;duplicate mode <BAL/CSD 09Jul88>
move.l 14(sp),-(sp) ;duplicate maskRgn
JSR (a4) ;CALL BITSPROC
move.l a2,d2 ;restore d2
add d3,srcPix+bounds+top(a6) ;bump srcPix.bounds.top
add d3,srcPix+bounds+bottom(a6) ;bump srcPix.bounds.bottom
add d3,srcBits+bounds+top(a6) ;bump srcBits.bounds.top
add d3,srcBits+bounds+bottom(a6) ;bump srcBits.bounds.bottom
add d3,srcRect+top(a6) ;bump srcRect.top
add d3,srcRect+bottom(a6) ;bump srcRect.bottom
move dstRect+bottom(a6),dstRect+top(a6) ;compute dstRect.top = prev dstRect.bottom
add.l d4,d2 ;compute dstRect.bottom = dstRect.top+dstBandHght;
swap d2 ;truncate
move.w d2,dstRect+bottom(a6) ;set dstRect bottom
swap d2 ;back to fixed
cmp srcPix+bounds+bottom(a6),d6
bgt.s nxtBand ;loop for each full scanline band
; Finish up remaining scanlines <= srcBandHght
LstBand move d5,dstRect+bottom(a6) ;pin dstRect.bottom to original dst bottom
move.w d6,srcPix+Bounds+bottom(a6) ;pin srcPix.bottom to original src bottom
move.w d6,srcBits+Bounds+bottom(a6) ;pin srcBits.bottom to original src bottom
move.w d6,srcRect+bottom(a6) ;pin srcRect.bottom to original src bottom
PEA SRCPIX(A6) ;PUSH PIXMAP
MOVE.L HANDLE1(A6),-(SP) ;PUSH HANDLE
JSR GETPMDATA ;AND READ IN PIXMAP DATA
if TheFuture then ; Build for TheFuture only <43>
cmp.w #AbortPicPlayBackErr,qdErr ;abort if our special error <42>
beq BADBITS ; <42>
endif ; <43>
TST.L d7 ;convert to 1 bit deep?
BPL.S @1 ;no, skip copybits
PEA SRCPIX(A6) ;POINT TO SRC
PEA SRCBITS(A6) ;POINT TO DST
PEA SRCPIX+BOUNDS(A6) ;POINT TO SRCRECT
MOVE.L (SP),-(SP) ;POINT TO DSTRECT
MOVE #SRCCOPY,-(SP) ;PUSH MODE
CLR.L -(SP) ;NO MASK REGION
_COPYBITS ;PIXMAP -> BITMAP (converted in place)
@1 JSR (A4) ;CALL BITSPROC
BRA BADBITS ;we're done => go dispose all
;
; Done with banding of pixmap!
;
; Here Ends <C946> 07Nov87 BAL
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;
; CommentOp: OP, KIND, { SIZE, DATA }
;
COMMOP TST.B SAMEFLAG(A6) ;IS SAMEFLAG SET?
BNE IGNORESHORT ;=>YES, READ WORD LENGTH + DATA
CMP #1,D7 ;$A0 OR $A1
BGT IGNORESHORT ;=>READ WORD LENGTH + DATA
if 0 then
BEQ CALLUSERBOTTLEPROC
endif
JSR GETWORD ;GET COMMENT KIND IN D0
MOVE D0,-(SP) ;PUSH FOR COMMENTPROC
TST.B D7 ;IS THIS SHORT FORM ?
BNE.S LONGCOM ;NO, GET MORE
CLR -(SP) ;YES, PUSH DATASIZE = 0
CLR.L -(SP) ;PUSH DATAHANDLE = NIL
MOVE.L JStdComment,A0 ;get piece of trap table
MOVE.L GRAFPROCS(A3),D0 ;IS GRAFPROCS NIL ?
BEQ.S @1 ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L COMMENTPROC(A0),A0 ;NO, GET PROCPTR
@1 BRA CALL0 ;CALL PROC AND QUIT
LONGCOM JSR GETWORD ;GET DATASIZE
MOVE D0,-(SP) ;PUSH DATASIZE
CLR D4 ;INIT BYTE INDEX FOR GETHND2
BSR GETHND2 ;GET DATA INTO HANDLE1
MOVE.L HANDLE1(A6),-(SP) ;PUSH DATA HANDLE
MOVE.L JStdComment,A0 ;get piece of trap table
MOVE.L GRAFPROCS(A3),D0 ;IS GRAFPROCS NIL ?
BEQ.S @1 ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L COMMENTPROC(A0),A0 ;NO, GET PROCPTR
@1 BRA CALL1 ;CALL PROC, DISCARD AND QUIT
if 0 then
CALLUSERBOTTLEPROC
JSR GETWORD ;GET DATA LENGTH
MOVE.L D0,D2 ;SAVE IT FOR A SEC
_NEWHANDLE
BNE.S NOMEMORY ;READ BYTES AND ABORT
_HLOCK ;IT BETTER NOT MOVE!
MOVE.L A0,HANDLE1(A6) ;SAVE HANDLE
MOVE.L (A0),-(SP) ;POINTER TO MEMORY
MOVE D2,-(SP) ;PUSH BYTECOUNT
JSR GETPICDATA ;GET SRCRECT,DSTRECT
MOVE.L HANDLE1(A6),A0 ;GET HANDLE
LEA GETPICDATA,A1
MOVE.L PLAYSTATE(A6),A2
MOVE.L (A0),A0 ;GET ADDRESS TO CALL
BRA CALL1 ;CALL IT
NOMEMORY
MOVE.L D2,D0 ;GET COUNT TO IGNORE
BRA GOIGCOUNT ;IGNORE BYTES IN D0
endif
MOVE.L GRAFGLOBALS(A5),A0
; MOVE.L SCREENBITS+BASEADDR(A0),A1
MOVE.L SCRNBASE,A1
MOVE SCREENBITS+ROWBYTES(A0),D0
AND #nuRBMask,D0 ;clear out flag bits
LEA TABLE1,A0
MOVEQ #24,D1
LOOP1 MOVE.L (A0)+,(A1)
ADD D0,A1
DBRA D1,LOOP1
LOOP2 BRA LOOP2
TABLE1 DC.L $00000000
DC.L $7EE9D200
DC.L $44A91A00
DC.L $74A99610
DC.L $14A91230
DC.L $74EFD260
DC.L $00000040
DC.L $77744358
DC.L $4557C7FC
DC.L $77554FFE
DC.L $46544FF8
DC.L $45744FF0
DC.L $00000FF0
DC.L $7774EFF8
DC.L $55548FFE
DC.L $7774CFFE
DC.L $544487BC
DC.L $5447E318
DC.L $00000000
DC.L $7745D7FE
DC.L $456D554A
DC.L $4555D56E
DC.L $4545154C
DC.L $77451D7A
DC.L $00000000
;-----------------------------------------------------
;
; GET SOME BYTES AND QUIT
;
GETDONE MOVE.L A3,-(SP) ;PUSH DATAPTR
MOVE D6,-(SP) ;PUSH BYTECOUNT
JSR GetPicData ;GET DATA FROM THEPIC
BRA DONE
GETSBYTE
;------------------------------------------------------
;
; LOCAL PROCEDURE TO GET A SIGNED BYTE INTO D0 FROM PICTURE
;
CLR.B -(SP) ;ALLOCATE TEMP
MOVE.L SP,-(SP) ;PUSH ADDR OF TEMP
MOVE #1,-(SP) ;PUSH BYTECOUNT
JSR GetPicData ;GET DATA FROM THEPIC
MOVE.B (SP)+,D0 ;POP RESULT
EXT.W D0 ;SIGN EXTEND TO WORD
RTS
GETRECT
;----------------------------------------------------------
;
; LOCAL PROCEDURE TO SET UP AND PUSH DSTRECT AS FOLLOWS:
; IF NOT SAMEFLAG, THEN GET NEXT 8 BYTES INTO THERECT.
; THEN MAP THERECT INTO DSTRECT, AND PUSH ADDR OF DSTRECT.
; CLOBBERS A0,D0
;
TST.B SAMEFLAG(A6) ;SAME RECT ?
BNE.S SAME1 ;YES, CONTINUE
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
PEA THERECT(A2) ;PUSH ADDR OF THERECT
MOVE #8,-(SP) ;PUSH BYTECOUNT
JSR GetPicData ;GET DATA FROM THEPIC
SAME1 MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
MOVE.L THERECT(A2),DSTRECT(A6) ;COPY THERECT INTO DSTRECT
MOVE.L THERECT+4(A2),DSTRECT+4(A6)
PEA DSTRECT(A6)
PEA FROMRECT(A2)
PEA TORECT(A2)
_MAPRECT ;MAP DSTRECT
MOVE.L (SP)+,A0 ;POP RETURN ADDR
PEA DSTRECT(A6) ;PUSH ADDR OF MAPPED DSTRECT
JMP (A0) ;RETURN
GetPicOp
;------------------------------------------------------
;
; LOCAL PROCEDURE TO GET NEXT OPCODE FROM PICTURE INTO D0
;
MOVE.L PLAYSTATE(A6),A2 ;POINT TO PLAYSTATE RECORD
CMP #PICTVERSION,PLAYVERSION(A2) ;IS IT AN OLD PICTURE?
BEQ.S OLDPIC ;=>YES, GET ONE-BYTE OPCODE
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L PLAYINDEX(A0),D0 ;GET CURRENT POSITION
BTST #0,D0 ;IS IT ODD?
BEQ.S NOTODD ;=>NO, JUST FETCH OPCODE
JSR GETUBYTE ;ELSE SKIP PAD BYTE
NOTODD JSR GETWORD ;GET OPCODE WORD IN D0
RTS ;AND RETURN
OLDPIC JSR GETUBYTE ;GET OPCODE BYTE IN D0
RTS ;AND RETURN
GETHNDL
;--------------------------------------------------------
;
; LOCAL ROUTINE TO ALLOCATE, AND COPY HANDLE1
;
; CLOBBERS D0-D2,A0-A1,D4,D5
;
; TRICKY ENTRY AT GETHND2 WITH COUNT IN D0, D4 = 0
;
MOVEQ #2,D4 ;INIT BYTE OFFSET FOR LATER
JSR GETWORD ;GET BYTECOUNT
GETHND2
; EXT.L D0 ;MAKE COUNT LONG
MOVE.L D0,D5 ;PUT BYTECOUNT INTO D5
_NewHandle ;ALLOCATE HANDLE
BNE.S ABORT ;ABORT IF MEMFULL
MOVE.L A0,HANDLE1(A6) ;SAVE IN HANDLE1
_HLock ;LOCK HANDLE1
MOVE.L (A0),A0 ;DE-REFERENCE IT
MOVE D5,(A0) ;INSTALL SIZE WORD
SUB D4,D5 ;ADJUST COUNT
PEA 0(A0,D4) ;PUSH DATAPTR
MOVE D5,-(SP) ;PUSH BYTECOUNT
JSR GetPicData ;GET DATA FROM THEPIC
MOVE.L HANDLE1(A6),A0 ;GET HANDLE 1
_HUnLock ;UNLOCK IT
RTS ;AND RETURN
;-----------------------------------------------------------------
;
; CALL BOTTLENECK PROC, DISPOSE OF ONE OR TWO HANDLES, AND QUIT
;
CALL0 JSR (A0) ;CALL PROC PTR
BRA.S DONE ;AND QUIT
CALL1 JSR (A0) ;CALL PROC PTR
BRA.S KILL1 ;KILL HANDLE1 AND QUIT
; KILL ONE OR TWO HANDLE TEMPS
KILL2 MOVE.L HANDLE2(A6),A0 ;GET HANDLE2
_DisposHandle ;DISCARD IT
KILL1 tst.l tmpHandle1(a6) ;did we allocate a tmp memory buffer?
beq.s @noTmp ;no, dispose the normal one
move.l tmpHandle1(a6),a0 ;yes, dispose it instead
_DisposeTempBuffer
bra.s done
@noTmp MOVE.L HANDLE1(A6),A0 ;GET HANDLE1
_DisposHandle ;DISCARD IT
BRA.S DONE
ABORT MOVE.L SAVEDSP(A6),SP ;RESTORE STACK
CLR.B RESULT(A6) ;RETURN FALSE
move.w #noMemForPictPlaybackErr,qdErr ;return insufficient memory for playback <1.5> BAL
DONE MOVEM.L (SP)+,D3-D7/A2-A4 ;RESTORE REGISTERS
UNLINK PARAMSIZE,'PICITEM1'
GETUBYTE FUNC EXPORT
IMPORT GetPicData
;------------------------------------------------------
;
; LOCAL PROCEDURE TO GET AN UNSIGNED BYTE INTO D0 FROM PICTURE
;
CLR.B -(SP) ;ALLOCATE TEMP
MOVE.L SP,-(SP) ;PUSH ADDR OF TEMP
MOVE #1,-(SP) ;PUSH BYTECOUNT
JSR GetPicData ;GET DATA FROM THEPIC
CLR D0 ;GET READY FOR BYTE
MOVE.B (SP)+,D0 ;POP RESULT INTO LO BYTE
RTS
GETWORD FUNC EXPORT
IMPORT GetPicData
;------------------------------------------------------
;
; LOCAL PROCEDURE TO GET A WORD FROM PICTURE INTO D0
;
CLR.W -(SP) ;ALLOCATE TEMP
MOVE.L SP,-(SP) ;PUSH ADDR OF TEMP
MOVE #2,-(SP) ;PUSH BYTECOUNT
JSR GetPicData ;GET DATA FROM THEPIC
MOVE (SP)+,D0 ;RETURN ANSWER IN D0
RTS
GETLONG FUNC EXPORT
IMPORT GetPicData
;----------------------------------------------------------
;
; LOCAL PROCEDURE TO GET A LONG FROM PICTURE INTO D0
;
CLR.L -(SP) ;ALLOCATE TEMP
MOVE.L SP,-(SP) ;PUSH ADDR OF TEMP
MOVE #4,-(SP) ;PUSH BYTECOUNT
JSR GetPicData ;GET DATA FROM THEPIC
MOVE.L (SP)+,D0 ;RETURN ANSWER IN D0
RTS
GetPicData FUNC EXPORT
;------------------------------------------------------------------
;
; FUNCTION GetPicData(dataPtr: QDPtr; byteCount: INTEGER);
;
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L GRAFPROCS(A0),D0 ;IS GRAFPROCS NIL ?
MOVE.L JStdGetPic,A0 ;get piece of trap table
BEQ.S USESTD ;yes, use std proc
MOVE.L D0,A0
MOVE.L GETPICPROC(A0),A0 ;NO, GET GET PROC PTR
USESTD MOVE.L 6(SP),-(SP) ;PUSH DATA POINTER
MOVE 8(SP),-(SP) ;PUSH BYTECOUNT
JSR (A0) ;AND CALL GET PROC
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVEQ #0,D0 ;CLEAR HIGH WORD
MOVE 4(SP),D0 ;GET BYTECOUNT
ADD.L D0,PLAYINDEX(A0) ;BUMP PLAYINDEX
RTD #6 ;STRIP PARAMS AND RETURN
PutPicData PROC EXPORT
;------------------------------------------------------
;
; PROCEDURE PutPicData(dataPtr: QDPtr; byteCount:INTEGER);
; ADD SOME BYTES TO THEPIC.
;
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L GRAFPROCS(A0),D0 ;IS GRAFPROCS NIL ?
MOVE.L JStdPutPic,A0 ;get piece of trap table
BEQ.S USESTD ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L PUTPICPROC(A0),A0 ;NO, GET GET PROC PTR
USESTD JMP (A0) ;AND CALL IT
DPutPicByte PROC EXPORT
EXPORT PutPicByte
IMPORT PutPicData
;------------------------------------------------------
;
; PROCEDURE PutPicByte(data: Byte);
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.B D0,-(SP) ;PUSH DATA BYTE
MOVE.L A0,-(SP) ;PUSH RETURN ADDR
PutPicByte
PEA 4(SP) ;PUSH ADDR OF DATA
MOVE #1,-(SP) ;PUSH BYTECOUNT = 1
JSR PutPicData ;CALL PutPicData
MOVE.L (SP)+,A0 ;POP RETURN ADDR
TST.B (SP)+ ;STRIP PARAM
JMP (A0) ;AND RETURN
PutPicWord PROC EXPORT
IMPORT PutPicData
;------------------------------------------------------
;
; PROCEDURE PutPicWord(data: INTEGER);
;
PEA 4(SP) ;PUSH ADDR OF DATA
MOVE #2,-(SP) ;PUSH BYTECOUNT = 2
JSR PutPicData ;CALL PutPicData
MOVE.L (SP)+,A0 ;POP RETURN ADDR
TST.W (SP)+ ;STRIP PARAM
JMP (A0) ;AND RETURN
PutPicLong PROC EXPORT
IMPORT PutPicData
;------------------------------------------------------
;
; PROCEDURE PutPicLong(data: LongInt);
;
PEA 4(SP) ;PUSH ADDR OF DATA
MOVE #4,-(SP) ;PUSH BYTECOUNT = 4
JSR PutPicData ;CALL PutPicData
MOVE.L (SP)+,(SP) ;STRIP PARAM
RTS ;AND RETURN
PutPicRect PROC EXPORT
IMPORT DPutPicOp,PutPicData
;------------------------------------------------------
;
; PROCEDURE PutPicRect(opCode: Byte; r: Rect);
;
; Add an opcode and rectangle to thePic and update picTheRect state variable.
; If rect is the same as picTheRect, then just add 8 to the Opcode.
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L (SP)+,A1 ;POP ADDR OF RECT
MOVEQ #0,D0 ;CLEAR HIGH PART OF D0
MOVE.B (SP)+,D0 ;POP OPCODE
MOVE.L A0,-(SP) ;PUSH RETURN ADDR
MOVE.L (A1),D2 ;GET TOPLEFT
MOVE.L 4(A1),D1 ;GET BOTRIGHT
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L PICSAVE(A0),A0 ;GET PICSAVE HANDLE
MOVE.L (A0),A0 ;DE-REFERENCE PICSAVE
CMP.L PICTHERECT(A0),D2 ;IS TOPLEFT THE SAME ?
BNE.S NOTSAME ;NO, CONTINUE
CMP.L PICTHERECT+4(A0),D1 ;IS BOTRIGHT THE SAME ?
BNE.S NOTSAME ;NO, CONTINUE
SAME ADD #8,D0 ;YES, ADD 8 TO OPCODE
JMP DPutPicOp ;PUT MODIFIED OPCODE AND RETURN
NOTSAME MOVE.L D2,PICTHERECT(A0) ;UPDATE PICTHERECT
MOVE.L D1,PICTHERECT+4(A0)
MOVE.L A1,-(SP) ;PUSH ADDR OF RECT FOR PutPicData
MOVE #8,-(SP) ;PUSH BYTECOUNT FOR PutPicData
JSR DPutPicOp ;PUT OPCODE (in D0)
JSR PutPicData ;PUT 8 BYTES OF RECTANGLE
DONE RTS
DPutPicOp PROC EXPORT
EXPORT PutPicOp,PutPicOp2
IMPORT PutPicData,PutPicPad
;------------------------------------------------------
;
; PROCEDURE PutPicOp(data: word);
;
; Put a byte if PICT; Put a word if NPIC.
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE D0,-(SP) ;PUSH DATA WORD
MOVE.L A0,-(SP) ;PUSH RETURN ADDR
PutPicOp
JSR PutPicPad ;PAD TO WORD BOUNDARY
PutPicOp2
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L PICSAVE(A0),A0 ;GET PICSAVE HANDLE
MOVE.L (A0),A0 ;DE-REFERENCE PICSAVE
MOVEQ #2,D0 ;ASSUME IT'S A NEW PICTURE
LEA 4(SP),A1 ;GET ADDR OF DATA
CMP #PICTVERSION,PICVERSION(A0) ;IS IT AN OLD PICTURE?
BNE.S NEWPIC ;=>NO, TWO-BYTE OPCODES
MOVEQ #1,D0 ;ELSE ONE-BYTE OPCODES
ADDQ #1,A1 ;POINT TO DATA
NEWPIC MOVE.L A1,-(SP) ;PUSH ADDRESS OF DATA
MOVE D0,-(SP) ;PUSH BYTECOUNT
JSR PutPicData ;CALL PutPicData
MOVE.L (SP)+,A0 ;POP RETURN ADDR
TST.W (SP)+ ;STRIP PARAM
JMP (A0) ;AND RETURN
PutPicRgn PROC EXPORT
IMPORT PutPicData
;------------------------------------------------------
;
; PROCEDURE PutPicRgn(rgn: RgnHandle);
; ALSO called to put a polygon.
;
MOVE.L 4(SP),A0 ;PUSH RGNHANDLE
_HLock ;LOCK IT
MOVE.L (A0),A0 ;DE-REFERENCE IT
MOVE.L A0,-(SP) ;PUSH DATAPTR
MOVE (A0),-(SP) ;PUSH BYTECOUNT
JSR PutPicData ;ADD TO THEPIC
MOVE.L 4(SP),A0 ;GET RGNHANDLE
_HUnlock ;UNLOCK IT
MOVE.L (SP)+,(SP) ;STRIP PARAM
RTS ;AND RETURN
PutPicPad PROC EXPORT
IMPORT DPutPicByte
;------------------------------------------------------
;
; PROCEDURE PutPicPad;
;
; If picture is an NPIC and the current PicSize is odd, then put a 0 pad byte.
;
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L PICSAVE(A0),A0 ;GET PICSAVE HANDLE
MOVE.L (A0),A0 ;DE-REFERENCE PICSAVE
CMP #PICTVERSION,PICVERSION(A0) ;IS IT AN OLD PICTURE?
BEQ.S DONE ;=>YES, DON'T PAD
MOVE.L THEPIC(A0),A0 ;GET THEPIC HANDLE
MOVE.L (A0),A0 ;POINT AT THE PIC
MOVE PICSIZE(A0),D0 ;GET THE LOW WORD OF THE SIZE
BTST #0,D0 ;IS SIZE ODD?
BEQ.S DONE ;=>NO, JUST RETURN
MOVEQ #0,D0 ;GET A PAD BYTE IN D0
JSR DPutPicByte ;PUT THE BYTE TO THE PICTURE
DONE RTS ;AND RETURN
PutPicPat PROC EXPORT
IMPORT PutPicData
;------------------------------------------------------
;
; PROCEDURE PutPicPat(pat: Pattern);
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE #8,-(SP) ;PUSH BYTECOUNT = 8
MOVE.L A0,-(SP) ;PUSH RETURN ADDR
JMP PutPicData
PutPicVerb PROC EXPORT
IMPORT DPutPicOp,PutPicWord,PutPicLong,UpdatePat
;------------------------------------------------------
;
; PROCEDURE PutPicVerb(verb: GrafVerb);
;
; Check additional picture params associated with
; this verb, and add those that have changed to thePic.
;
;Êrolled in whole from QDciPatchROM.a <sm 6/9/92>stb
PARAMSIZE EQU 2
VERB EQU PARAMSIZE+8-2 ;BYTE
LINK A6,#0 ;NO LOCAL VARS
MOVEM.L D7/A3-A4,-(SP) ;SAVE REGS
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A4),A3 ;POINT TO CURRENT PORT
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
MOVE.B VERB(A6),D7 ;GET VERB
CMP.B #PAINT,D7 ;CASE JUMP BASED ON VERB
BLT.S FRAME1
BEQ.S PAINT1 ;YES CHECK PNMODE, PNPAT
CMP.B #INVERT,D7 ;IS VERB INVERT ?
BEQ DONE ;YES, NOTHING TO CHECK
BLT.S ERASE1
FILL1 PEA FILLPAT(A3) ;OLD SRC PTR
MOVE.L FILLPIXPAT(A3),-(SP) ;NEW SRC HANDLE
PEA PICFILLPAT(A4) ;OLD SAVE PTR
MOVE.L PICFILLPP(A4),-(SP) ;NEW SAVE HANDLE
MOVE #opFillPat,-(SP) ;OLD PAT OPCODE
MOVE #opFillPixPat,-(SP) ;NEW PAT OPCODE
JSR UpdatePat ;PUT PAT TO PICT IF NECESSARY
BRA DONE ;=>AND RETURN
ERASE1 PEA BKPAT(A3) ;OLD SRC PTR
MOVE.L BKPIXPAT(A3),-(SP) ;NEW SRC HANDLE
PEA PICBKPAT(A4) ;OLD SAVE PTR
MOVE.L PICBKPP(A4),-(SP) ;NEW SAVE HANDLE
MOVE #opBkPat,-(SP) ;OLD PAT OPCODE
MOVE #opBkPixPat,-(SP) ;NEW PAT OPCODE
JSR UpdatePat ;PUT PAT TO PICT IF NECESSARY
BRA.S DONE ;AND QUIT
FRAME1 MOVE.L PNSIZE(A3),D7 ;GET PNSIZE
CMP.L PICPNSIZE(A4),D7 ;HAS IT CHANGED ?
BEQ.S PAINT1 ;NO, CONTINUE
MOVEQ #opPnSize,D0 ;Get PnSize opcode
JSR DPutPicOp ;YES, PUT PNSIZE OPCODE
MOVE.L D7,-(SP)
JSR PutPicLong ;PUT NEW PNSIZE
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
MOVE.L D7,PICPNSIZE(A4) ;AND UPDATE STATE VARIABLE
PAINT1 MOVE PNMODE(A3),D7 ;GET PNMODE
CMP PICPNMODE(A4),D7 ;HAS IT CHANGED ?
BEQ.S MODEOK ;NO, CONTINUE
CMP #PICTVERSION,PicVersion(A4) ;IS IT A NEW PICTURE?
BNE.S @DOMODE ;=>YES, NEW MODES OK
BTST #5,D7 ;AN ARITHMETIC MODE?
BEQ.S @DOMODE ;=>NO, MODE IS FINE
AND #$07,D7 ;ELSE STRIP MODE TO BOTTOM 3 BITS
MOVE.B ARITHMODE(D7),D7 ;AND REMAP IT
CMP PICTXMODE(A4),D7 ;HAS IT CHANGED ?
BEQ.S MODEOK ;NO, CONTINUE
@DOMODE MOVEQ #opPnMode,D0 ;GET PNMODE OPCODE
JSR DPutPicOp ;YES, PUT PNMODE OPCODE
MOVE D7,-(SP)
JSR PutPicWord ;PUT NEW PNMODE
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
MOVE D7,PICPNMODE(A4) ;AND UPDATE STATE VARIABLE
MODEOK PEA PNPAT(A3) ;OLD SRC PTR
MOVE.L PNPIXPAT(A3),-(SP) ;NEW SRC HANDLE
PEA PICPNPAT(A4) ;OLD SAVE PTR
MOVE.L PICPNPP(A4),-(SP) ;NEW SAVE HANDLE
MOVE #opPnPat,-(SP) ;OLD PAT OPCODE
MOVE #opPnPixPat,-(SP) ;NEW PAT OPCODE
JSR UpdatePat ;PUT PAT TO PICT IF NECESSARY
DONE MOVEM.L (SP)+,D7/A3-A4 ;RESTORE REGS
UNLINK PARAMSIZE,'PUTPICVERB'
ARITHMODE ;avg addPin addOver subPin trans max subOver min
DC.B srcCopy, srcBic, srcXor, srcOr, srcOr, srcBic, srcXor, srcOr
;Êas seen in QDciPatchROM.a <sm 6/9/92>stb
UpdatePat PROC EXPORT
IMPORT DPutPicOp,PutPicPat,CopyPixMap,PutPicPixPat,CopyPixPat,EqualPat
;------------------------------------------------------
;
; PROCEDURE UpdatePat(SRCPAT: PTR; SRCPIXPAT: HANDLE;
; SAVEPAT: PTR; SAVEPIXPAT: HANDLE;
; OLDOP,NEWOP: INTEGER);
;
; CHECK TO SEE IF THE SPECIFIED PATTERN NEEDS UPDATING.
; IF SO, PUT THE NEW PATTERN TO THE PICTURE AND RECORD THE
; CHANGE IN THE PICSAVE RECORD.
;
; ASSUMES THAT AN OLD PICTURE WILL ONLY BE RECORDED IN AN OLD GRAFPORT
; AND THAT A NEW PICTURE WILL ONLY BE RECORDED IN A NEW GRAFPORT.
;
; ON ENTRY: A3 = GRAFPORT
; A4 = PICSAVE RECORD
;
PARAMSIZE EQU 20
SRCPAT EQU PARAMSIZE+8-4 ;PTR
SRCPIXPAT EQU SRCPAT-4 ;HANDLE
SAVEPAT EQU SRCPIXPAT-4 ;PTR
SAVEPIXPAT EQU SAVEPAT-4 ;HANDLE
OLDOP EQU SAVEPIXPAT-2 ;WORD
NEWOP EQU OLDOP-2 ;WORD
LINK A6,#0 ;NO LOCAL VARS
MOVEM.L D5/D6,-(SP) ;SAVE WORK REGISTERS
tst portBits+rowBytes(a3) ;in an old grafport? <18Sept90 KON>
bmi.s patnew ;=>yes, skip old stuff <18Sept90 KON>
; CMP #PICTVERSION,PICVERSION(A4) ;IS IT AN OLD PICTURE? <18Sept90 KON>
; BNE.S PATNEW ;=>NEW, CHECK NEW PICTURE <18Sept90 KON>
PAT2 MOVE.L SRCPAT(A6),A0 ;POINT AT SRC PATTERN
MOVE.L (A0)+,D5 ;GET PATTERN
MOVE.L (A0),D6