mac-rom/QuickDraw/Rects.a
Elliot Nunn 4325cdcc78 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 09:52:23 +08:00

1037 lines
32 KiB
Plaintext

;
; File: Rects.a
;
; Contains: Procedures for operating on rectangles.
;
; Copyright: © 1981-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM3> 9/15/92 RB Removed 1st call to GetStreamMode in PushVerb. #1041577 Shannon
; Holland: PushVerb calls GetStreamMode to extract the alpha bits,
; later on DrawRect calls GetStreamMode again and the alpha mode
; is not set anymore, so the alpha channel is ignored by
; QuickDraw. This "patch" roll-in was not nessesary.
; <SM2> 6/11/92 stb <sm 6/9/92>stb Synch with QDciPatchROM.a; added comments to
; StdRect, PushVerb. Added _GetStreamMode calls to PushVerb.
; <5> 8/22/91 JSM DonÕt use FALSE as a label.
; <4> 11/26/90 SMC Fixed validation of penmode on calls to stretchbits. With BAL.
; <3> 10/31/90 SMC Fixed alpha channel bugs with BAL.
; <2> 7/24/90 gbm fix a couple of bogoid definitions
; <¥1.4> 5/29/89 BAL Blasting in 32-Bit QuickDraw version 1.0 Final
; 1/8/89 BAL Vectorized CheckPic
; 6/4/87 CRC fixed more hilite bugs; set patMode even if user forgets to
; 1/3/87 CRC fixed hilite bugs; state was restored even when not saved
; 10/9/86 EHB Added mask parameters to stretchbits calls
; 9/5/86 EHB Added FillCRect
; 8/16/86 EHB Modified fillRect to work with color grafports
; 7/16/86 EHB Modified pushVerb to work with color grafports
; 7/8/86 EHB Reverted to PatXOR
; 7/7/86 EHB In PushVerb, use notSrcCopy to invert instead of PatXOR, Black
; for inverting colors (called by INVERT RECT,RRECT,OVAL,POLY,RGN)
; 6/18/86 EHB Call StretchBits instead of RgnBlt
;
BLANKS ON
STRING ASIS
;-----------------------------------------------------------
;
;
; **** ***** *** ***** ***
; * * * * * * * *
; * * * * * *
; **** *** * * ***
; * * * * * *
; * * * * * * * *
; * * ***** *** * ***
;
;
;
; Procedures for operating on rectangles.
;
;---------------------------------------------------------------
StdRect PROC EXPORT
IMPORT PutPicVerb,PutPicRect
IMPORT PutRect,FrmRect,PushVerb,DrawRect,StdDevLoop
;---------------------------------------------------------------
;
; PROCEDURE StdRect(verb: GrafVerb; r: Rect);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
; includes fix from QDciPatchROM.a <sm 6/9/92>stb
PARAMSIZE EQU 6
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
RECT EQU VERB-4 ;LONG, ADDR OF RECT
VARSIZE EQU 0 ;TOTAL SIZE OF LOCALS
LINK A6,#VARSIZE ;NO LOCALS
MOVEM.L D7/A3-A4,-(SP) ;SAVE REGS
MOVE.B VERB(A6),D7 ;GET VERB
_CheckPic ;SET UP A4,A3 AND CHECK PICSAVE
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
MOVE.B D7,-(SP) ;PUSH VERB
JSR PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
MOVEQ #$30,D0 ;GET RECTNOUN IN HI NIBBLE
ADD D7,D0 ;PUT VERB IN LO NIBBLE
MOVE.B D0,-(SP) ;PUSH OPCODE
MOVE.L RECT(A6),-(SP) ;PUSH ADDR OF RECT
JSR PutPicRect ;PUT OPCODE AND RECTANGLE
; CALL STANDARD LOOP TO DRAW TO ALL DEVICES
NOTPIC PEA StdDraw ;PUSH ADDRESS OF DRAW ROUTINE
PEA GetRect ;PUSH ADDRESS OF RECT ROUTINE
_StdDevLoop ;DRAW TO ALL DEVICES
GOHOME MOVEM.L (SP)+,D7/A3-A4 ;RESTORE REGS
UNLINK PARAMSIZE,'STDRECT '
;---------------------------------------------------------------
;
; PROCEDURE GetRect(VAR theRect: rect);
;
; RETURN THE OBJECT'S RECTANGLE
;
GetRect MOVE.L (SP)+,D0 ;GET RETURN ADDRESS
MOVE.L (SP)+,A1 ;GET DST RECT
MOVE.L RECT(A6),A0 ;GET SRC RECT
MOVE.L (A0)+,(A1)+ ;SET TOPLEFT
MOVE.L (A0),(A1) ;SET BOTRIGHT
MOVE.L D0,A0 ;GET RETURN ADDRESS
JMP (A0) ;AND RETURN
;---------------------------------------------------------------
;
; PROCEDURE StdDraw;
;
; DRAW THE OBJECT
;
StdDraw MOVE.L RECT(A6),-(SP) ;PUSH RECT FOR FrmRect or DrawRect
TST.B D7 ;IS VERB FRAME ?
BNE.S NOTFR ;NO, CONTINUE
TST.L RGNSAVE(A3) ;YES, IS RGNSAVE TRUE ?
BEQ.S NOTRGN ;NO, CONTINUE
MOVE.L RECT(A6),-(SP) ;YES, PUSH ADDR OF RECT
MOVE.L RGNBUF(A4),-(SP) ;PUSH RGNBUF
PEA RGNINDEX(A4) ;PUSH VAR RGNINDEX
PEA RGNMAX(A4) ;PUSH VAR RGNMAX
JSR PutRect ;ADD A RECT TO THERGN
NOTRGN JSR FrmRect ;FrmRect(rect)
BRA.S DONESD
NOTFR _PushVerb ;PUSH MODE AND PATTERN
JSR DRAWRECT ;DrawRect(rect,mode,pat);
DONESD RTS
StdDevLoop PROC EXPORT
IMPORT PortToMap,PINIT
;---------------------------------------------------------------
;
; PROCEDURE StdDevLoop(DrawProc, RectProc);
;
; On Entry: A3: GrafPort
; A6: Caller's stack frame
;
; Trashes: D0-D2/A0-A1
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 8
DrawProc EQU PARAMSIZE+8-4 ;routine to do drawing
RectangleProc EQU DrawProc-4 ;routine to calc rect
UserStack EQU 0 ;user's stack frame
RECT1 EQU -8 ;USER RECT
CURDEV EQU RECT1-4 ;CURRENT DEVICE IN CHAIN
DRAWDONE EQU CURDEV-2 ;FLAG SET WHEN DRAWING DONE
SAVEPNLOC EQU DRAWDONE-4 ;SAVE COPY OF PNLOC
LASTSEED EQU SAVEPNLOC-4 ;LAST COLOR TABLE SEED
SAVEFG EQU LASTSEED-4 ;ORIGINAL FG COLOR
SAVEBK EQU SAVEFG-4 ;ORIGINAL BK COLOR
PORTPIX EQU SAVEBK-4 ;SAVE THE PORTPIXMAP
saveHilite EQU portPix-2 ;saved hilite mode flag
savePnHFrac EQU saveHilite-2 ;saved pen fraction
VARSIZE EQU savePnHFrac ;TOTAL SIZE OF LOCALS
LINK A6,#VARSIZE ;ALLOCATE STACK FRAME
CLR.L CURDEV(A6) ;ASSUME NOT DRAWING TO SCREEN
; IF THERE IS ONLY ONE SCREEN DEVICE, SKIP LOOP STUFF
MOVE.L DEVICELIST,A0 ;GET FIRST DEVICE
MOVE.L (A0),A0 ;POINT AT IT
TST.L GDNEXTGD(A0) ;IS THERE A SECOND DEVICE?
BEQ NOTSCRN ;=>NO, JUST DRAW ONCE
; IF DRAWING IS TO THE SCREEN, THEN ATTEMPT TO DRAW TO EACH SCREEN DEVICE
CLR DRAWDONE(A6) ;SAY NO DRAWING DONE
MOVE.L A3,A0 ;GET PORT IN A0
_PORTTOMAP ;GET BIT/PIXMAP IN A0
MOVE.L A0,PORTPIX(A6) ;SAVE POINTER TO PORT PIXMAP
MOVE.L BASEADDR(A0),D0 ;GET BASEADDR OF THEPORT
MOVE.L MAINDEVICE,A0 ;GET THE PRIMARY SCREEN DEVICE
MOVE.L (A0),A1 ;POINT TO DEVICE
MOVE.L GDPMAP(A1),A1 ;GET HANDLE TO PIXMAP
MOVE.L (A1),A1 ;POINT TO PIXMAP
CMP.L BASEADDR(A1),D0 ;SAME AS THESCREEN?
BNE NOTSCRN ;=>NOT GOING TO THE SCREEN
; IF WE ARE GOING TO SCREEN, SAVE OFF STATE INFO
MOVE.B HiliteMode,saveHilite(A6) ;save the hilite state
MOVE.L PNLOC(A3),SAVEPNLOC(A6) ;SAVE THE PEN LOCATION
MOVE pnLocHFrac(A3),savePnHFrac(A6) ;save the fraction (if a new port)
MOVE.L SRCDEVICE,-(SP) ;SAVE THE SOURCE DEVICE
MOVE.L THEGDEVICE,-(SP) ;SAVE THE GRAFDEVICE
MOVE.L POLYSAVE(A3),-(SP) ;SAVE POLYSAVE
MOVE.L RGNSAVE(A3),-(SP) ;SAVE RGNSAVE
MOVE.L PMTABLE(A1),A0 ;GET COLOR TABLE HANDLE
MOVE.L (A0),A0 ;POINT TO COLOR TABLE
MOVE.L CTSEED(A0),LASTSEED(A6) ;SAVE LAST COLOR TABLE SEED
MOVE.L FGCOLOR(A3),SAVEFG(A6) ;SAVE FG COLOR
MOVE.L BKCOLOR(A3),SAVEBK(A6) ;SAVE BK COLOR
; CALL CALLER TO RETURN OBJECT'S RECTANGLE
MOVE.L A6,-(SP) ;SAVE OUR STACK FRAME
MOVE.L RECTANGLEPROC(A6),A0 ;GET THE RECT PROC
PEA RECT1(A6) ;PUSH USER RECT
MOVE.L USERSTACK(A6),A6 ;GET USER'S STACK
JSR (A0) ;GetRect(VAR theRect: Rect);
MOVE.L (SP)+,A6 ;RESTORE OUR STACK FRAME
; CONVERT OBJECT'S RECT TO GLOBAL COORDINATES
LEA RECT1(A6),A0 ;POINT TO RECT
MOVE.L PORTPIX(A6),A1 ;POINT TO PORT PIXMAP
MOVE.L BOUNDS(A1),D0 ;GET TOPLEFT
MOVE.L D0,D1 ;LEAVE LEFT IN D0
SWAP D1 ;AND TOP IN D1
SUB D1,(A0)+ ;OFFSET TOP
BVC.S @0 ;=>NO OVERFLOW
_PINIT ;ELSE PIN VALUE
@0 SUB D0,(A0)+ ;OFFSET LEFT
BVC.S @1 ;=>NO OVERFLOW
_PINIT ;ELSE PIN VALUE
@1 SUB D1,(A0)+ ;OFFSET BOTTOM
BVC.S @2 ;=>NO OVERFLOW
_PINIT ;ELSE PIN VALUE
@2 SUB D0,(A0)+ ;OFFSET RIGHT
BVC.S @3 ;=>NO OVERFLOW
_PINIT ;ELSE PIN VALUE
@3
; FOR EACH DEVICE DRAW OBJECT IF IT INTERSECTS WITH DEVICE
MOVE.L DEVICELIST,A0 ;GET THE FIRST DEVICE IN THE LIST
DONEXT MOVE.L (A0),A1 ;POINT TO DEVICE
TST GDFLAGS(A1) ;IS IT AN ACTIVE DEVICE?
BPL NXTDEV1 ;=> NO, SKIP IT
MOVE.L A0,THEGDEVICE ;SET CURRENT DST DEVICE
MOVE.L A0,SRCDEVICE ;SET CURRENT SRC DEVICE (for stretchBits)
MOVE.L A0,CURDEV(A6) ;SAVE CURRENT DEVICE
; DOES THE OBJECT INTERSECT WITH THE DEVICE?
LEA GDRECT(A1),A0 ;POINT TO DEVICE'S RECT
LEA RECT1(A6),A1 ;POINT TO USER'S RECT
MOVE.L (A1)+,D0 ;TOPLEFT IN DO
MOVE.L (A1)+,D1 ;BOTRIGHT IN D1
SWAP D1 ;GET BOTTOM
CMP (A0)+,D1 ;IS RECT1.BOTTOM <= GDRECT.TOP ?
BLE NXTDEV ;=>YES, CHECK NEXT DEVICE
SWAP D1 ;GET RIGHT
CMP (A0)+,D1 ;IS RECT1.RIGHT <= GDRECT.LEFT ?
BLE NXTDEV ;=>YES, CHECK NEXT DEVICE
SWAP D0 ;GET RECT1.TOP
CMP (A0)+,D0 ;IS RECT1.TOP >= GDRECT.BOTTOM ?
BGE NXTDEV ;=>YES, CHECK NEXT DEVICE
SWAP D0 ;GET RECT1.LEFT
CMP (A0)+,D0 ;IS RECT1.LEFT >= GDRECT.RIGHT ?
BGE NXTDEV ;=>YES, CHECK NEXT DEVICE
; YES, DRAW THE OBJECT ON THAT DEVICE
; IF THE DEVICE'S COLOR TABLE IS DIFFERENT, FIX UP FG AND BK COLORS
MOVE.B saveHilite(A6),HiliteMode ;RESTORE HILITE FLAGS
MOVE.L SAVEPNLOC(A6),PNLOC(A3) ;RESTORE THE PNLOC BEFORE DRAWING
TST PORTBITS+ROWBYTES(A3) ;NEW PORT?
BPL NOTSCRN ;IF NOT, SKIP NEW PORT STUFF
MOVE savePnHFrac(A6),pnLocHFrac(A3) ;ELSE RESTORE THE PEN FRACTION
MOVE.L THEGDEVICE,A0 ;GET THE DEVICE
MOVE.L (A0),A0 ;POINT AT IT
MOVE.L GDPMAP(A0),A0 ;GET PIXMAP
MOVE.L (A0),A0 ;POINT AT IT
MOVE.L PMTABLE(A0),A0 ;GET COLOR TABLE
MOVE.L (A0),A0 ;POINT AT IT
MOVE.L CTSEED(A0),D0 ;GET SEED
CMP.L LASTSEED(A6),D0 ;SAME AS CURRENT SEED?
BEQ.S NOTSCRN ;=>YES, COLORS ARE OK
MOVE.L D0,LASTSEED(A6) ;UPDATE SEED
SUBQ #6,SP ;MAKE ROOM FOR A COLOR RECORD
CLR.L -(SP) ;CLEAR INDEX, FLAGS WORDS
; This is a patch rolled in <6Jun87 EHB>
; The idea here is that to keep the index field in the grafPort valid, we must
; check to see whether we should use palette manager or not.
MOVE.L GrafVars(A3),D0 ;get the grafVars handle
BEQ.S @NoPlt ;=>none there
MOVE.L D0,A0 ;get grafVars handle
MOVE.L (A0),A0 ;point at grafVars
TST.L PmFgColor(A0) ;is there a palette?
BEQ.S @NoPlt ;=>no, continue
MOVE PmFlags(A0),D2 ;else get flags
MOVE PmBkIndex(A0),2(SP) ;save bk index
BTST #PmBkBit,D2 ;bk set by palette mgr?
SNE (SP) ;if so set flag
BTST #PmFgBit,D2 ;fg set by palette mgr?
BEQ.S @NoPlt ;=>no, continue
MOVE PmFgIndex(A0),-(SP) ;else push last index
_PmForeColor ;and set that color
BRA.S @NoPlt1 ;=>no, do old way
@NoPlt PEA 4(SP) ;POINT AT RECORD FOR RGBFC
MOVE.L (SP),-(SP) ;AND AGAIN FOR GETFC
_GETFORECOLOR ;GET THE FOREGROUND COLOR
_RGBFORECOLOR ;SET THE FOREGROUND COLOR
@NoPlt1 TST.B (SP) ;bk set by palette mgr?
BEQ.S @NoPlt2 ;=>no, do old way
MOVE 2(SP),-(SP) ;else push bk index
_PmBackColor ;and set that color
BRA.S @BkDone ;=>done setting colors
@NoPlt2 PEA 4(SP) ;POINT AT RECORD
MOVE.L (SP),-(SP) ;AND AGAIN FOR GETFC
_GETBACKCOLOR ;GET THE BACKGROUND COLOR
_RGBBACKCOLOR ;SET THE BACKGROUND COLOR
@BkDone ADD #10,SP ;STRIP THE RECORD
NOTSCRN MOVE.L DRAWPROC(A6),A0 ;GET CALLER'S DRAW PROC
MOVE.L A6,-(SP) ;SAVE OUR STACK FRAME
MOVE.L USERSTACK(A6),A6 ;GET USER'S STACK
JSR (A0) ;DRAW TO ONE DEVICE
MOVE.L (SP)+,A6 ;RESTORE OUR STACK FRAME
ST DRAWDONE(A6) ;SAY DRAWING DONE
; IF THERE ARE MORE SCREEN DEVICES, DRAW TO THEM
MOVE.L CURDEV(A6),D0 ;GET CURRENT DEVICE
BEQ.S GOHOME ;=>NO MORE TO DO, RETURN
CLR.L RGNSAVE(A3) ;ONLY RECORD REGIONS ONCE
CLR.L POLYSAVE(A3) ;ONLY RECORD POLYS ONCE
NXTDEV MOVE.L CURDEV(A6),A0 ;GET CURRENTDEVICE
MOVE.L (A0),A1 ;AND POINT TO IT
NXTDEV1 MOVE.L GDNEXTGD(A1),D0 ;GET HANDLE TO NEXT DEVICE
MOVE.L D0,A0 ;AND GET HANDLE IN A0
BNE.S DONEXT ;=>DO NEXT DEVICE
CLR.L CURDEV(A6) ;FLAG NO MORE DEVICES
DONE MOVE.L (SP)+,RGNSAVE(A3) ;RESTORE RGNSAVE
MOVE.L (SP)+,POLYSAVE(A3) ;RESTORE POLYSAVE
MOVE.L (SP)+,THEGDEVICE ;RESTORE THE GRAFDEVICE
MOVE.L (SP)+,SRCDEVICE ;RESTORE THE SRC DEVICE
MOVE.L SAVEFG(A6),FGCOLOR(A3) ;RESTORE FG COLOR
MOVE.L SAVEBK(A6),BKCOLOR(A3) ;RESTORE BK COLOR
TST DRAWDONE(A6) ;WAS DRAWING DONE?
BEQ.S NOTSCRN ;=>NO, DRAW ONCE AND GOHOME
GOHOME BSET #HILITEBIT,HILITEMODE ;TURN OFF HILITING
UNLINK PARAMSIZE,'STDDEVLO'
PINIT PROC EXPORT
;----------------------------------------------------------
;
; CALLED IF OVERFLOW. PINS -2(A0) JUST BELOW OVERFLOW VALUE
;
TST -2(A0) ;DID VALUE GO NEGATIVE?
BPL.S SETNEG ;=>NO, SET TO NEGATIVE
MOVE #$7FFE,-2(A0) ;ELSE PIN TO LARGE POSITIVE NUMBER
RTS
SETNEG MOVE #$8002,-2(A0) ;ELSE PIN TO LARGE NEGATIVE NUMBER
RTS
PushVerb PROC EXPORT
IMPORT SETFILLPAT
;----------------------------------------------------------
;
; PUSH A MODE AND A PATTERN, BASED ON VERB
; ENTER WITH VERB IN D7, GRAFGLOBALS IN A4, THEPORT IN A3.
;
; CLOBBERS A0-A1/D0/D2
;
; frame: pnMode, pnPat
; paint: pnMode, pnPat
; erase: patCopy, bkPat
; invert: notSrcCopy, noPat
; fill: patCopy, fillPat
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR <sm 6/9/92>stb <SM3> rb
MOVE #8,-(SP) ;PUSH MODE = PATCOPY (IE. DEFAULT)
CMP.B #1,D7 ;CASE ON VERB
BLE.S PAINT1 ; <SM3> rb, removed GetStreamMode code
CMP.B #3,D7
BLT.S ERASE1
BEQ.S INVERT1
FILL1 LEA FILLPAT(A3),A1 ;ASSUME IT'S AN OLD PORT
TST PORTBITS+ROWBYTES(A3) ;IS IT A COLOR GRAFPORT
BPL.S OLDPORT ;=>NO, JUST PUSH PAT
USEPPAT LEA FILLPIXPAT(A3),A1 ;ELSE GET POINTER TO FILLPAT
OLDPORT MOVE.L A1,-(SP) ;PUSH PAT := FILLPAT
JMP (A0) ;RETURN TO CALLER
ERASE1 PEA BKPAT(A3) ;PUSH PAT = BKPAT
JMP (A0) ;RETURN TO CALLER
INVERT1
ADD.W #2,(SP) ;ADJUST, PUSH MODE = PATXOR
LEA BLACK(A4),A1 ;ASSUME PAT = BLACK
TST PORTBITS+ROWBYTES(A3) ;IS IT A COLOR PORT?
BPL.S OLDPORT ;=>NO, USE BLACK PATTERN
MOVE.L A0,-(SP) ;SAVE RETURN ADDRESS
MOVE.L A1,-(SP) ;PUSH PAT
MOVEQ #0,D0 ;FLAG = FILLRECT
_SETFILLPAT ;AND SET THE FILL PATTERN TO IT
MOVE.L (SP)+,A0 ;RESTORE RETURN ADDRESS
BRA.S USEPPAT ;AND RETURN POINTER TO FILLPIXPAT
PAINT1 MOVE PNMODE(A3),D0 ;get the pen mode <SM3> rb <removed GetStreamMode>
; as seen in QDciPatchROM.a <sm 6/9/92>stb
OR D0,(SP) ;push mode, but leave the pattern bit set <SM3> rb
PEA PNPAT(A3) ;PUSH PAT = PNPAT
JMP (A0) ;RETURN TO CALLER <SM3> rb
FillRect PROC EXPORT
EXPORT FILLCRECT
EXPORT CallRect,FrameRect,PaintRect,EraseRect,InvertRect
IMPORT SetFillPat
;----------------------------------------------------------
;
; PROCEDURE FillRect(r: Rect; pat: Pattern);
;
MOVEQ #0,D0 ;FLAG = FILLRECT
BRA.S SHARE ; => USE COMMON CODE
;----------------------------------------------------------
;
; PROCEDURE FillCRect(r: Rect; PPH: PixPatHandle);
;
FILLCRECT MOVEQ #1,D0 ;FLAG = FILLCRECT
SHARE MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L (SP)+,A1 ;POP ADDR OF PATTERN
MOVE.L A0,-(SP) ;PUT RETURN ADDR BACK
MOVE.L A1,-(SP) ;PUSH ADDR OF PATTERN
_SETFILLPAT ;FILLPAT := PAT
MOVEQ #FILL,D0 ;VERB = FILL
BRA.S CallRect ;SHARE COMMON CODE
;----------------------------------------------------------
;
; PROCEDURE FrameRect(r: Rect);
;
FrameRect
MOVEQ #FRAME,D0 ;VERB = FRAME
BRA.S CallRect ;SHARE COMMON CODE
;----------------------------------------------------------
;
; PROCEDURE PaintRect(r: Rect);
;
PaintRect
MOVEQ #PAINT,D0 ;VERB = PAINT
BRA.S CallRect ;SHARE COMMON CODE
;----------------------------------------------------------
;
; PROCEDURE EraseRect(r: Rect);
;
EraseRect
MOVEQ #ERASE,D0 ;VERB = ERASE
BRA.S CallRect ;SHARE COMMON CODE
;----------------------------------------------------------
;
; PROCEDURE InvertRect(r: Rect);
;
InvertRect
MOVEQ #INVERT,D0 ;VERB = INVERT
; BRA.S CallRect ;SHARE COMMON CODE
;---------------------------------------------------------------
;
; PROCEDURE CallRect(r: Rect);
;
; code shared by FrameRect, PaintRect, EraseRect, InvertRect, and FillRect.
; enter with verb in D0.
;
CallRect
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L (SP)+,A1 ;POP ADDR OF RECT
MOVE.B D0,-(SP) ;PUSH VERB
MOVE.L A1,-(SP) ;PUSH ADDR OF RECT
MOVE.L A0,-(SP) ;RESTORE RETURN ADDR
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO LISAGRAF GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L GRAFPROCS(A0),D0 ;IS GRAFPROCS NIL ?
MOVE.L JStdRect,A0 ;get piece of trap table
BEQ.S USESTD ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L RECTPROC(A0),A0 ;NO, GET PROC PTR
USESTD JMP (A0) ;GO TO IT
DrawRect PROC EXPORT
IMPORT STRETCHBITS
;----------------------------------------------------------
;
; PROCEDURE DrawRect(r: Rect; mode: INTEGER; pat: Pattern);
;
; Rectangle is given in local coordinates.
;
; A6 OFFSETS OF PARAMS AND LOCALS AFTER LINK:
;
PARAMSIZE EQU 10 ;TOTAL BYTES OF PARAMS
DSTRECT EQU PARAMSIZE+8-4 ;LONG, ADDR OF RECT
MODE EQU DSTRECT-2 ;WORD
PAT EQU MODE-4 ;LONG, ADDR OF PAT
LINK A6,#0 ;NO LOCAL VARS
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO LISAGRAF GLOBALS
MOVE.L THEPORT(A0),A1 ;GET CURRENT GRAFPORT
MOVE.L WIDEOPEN(A0),D2 ;PUSH WIDE OPEN
TST PNVIS(A1) ;IS PNVIS >= 0 ?
BLT.S GOHOME ;NO, QUIT
PEA PORTBITS(A1) ;PUSH SRCBITS = DSTBITS
CLR.L -(SP) ;NO MASKBITS
PEA PORTBITS(A1) ;PUSH DSTBITS
MOVE.L DSTRECT(A6),-(SP) ;PUSH SRCRECT = DSTRECT
CLR.L -(SP) ;NO MASKRECT
MOVE.L DSTRECT(A6),-(SP) ;PUSH DSTRECT
MOVE MODE(A6),D1 ;PUSH MODE
OR #$8,D1 ;set the pattern bit in case the user forgot to
_GetStreamMode ;strip mode
MOVE.W D1,-(SP) ;save stripped mode
MOVE.L PAT(A6),-(SP) ;PUSH ADDR OF PATTERN
MOVE.L CLIPRGN(A1),-(SP) ;PUSH CLIPRGN
MOVE.L VISRGN(A1),-(SP) ;PUSH VISRGN
MOVE.L D2,-(SP) ;PUSH WIDE OPEN
CLR -(SP) ;pass multicolor flag false
_STRETCHBITS ;CALL STRETCHBITS
GOHOME UNLINK PARAMSIZE,'DRAWRECT'
FrmRect PROC EXPORT
IMPORT STRETCHBITS
;----------------------------------------------------------
;
; PROCEDURE FrmRect(r: Rect);
; Draws an outline inside a rect.
;
; A6 OFFSETS OF PARAMETERS AND LOCALS AFTER LINK:
;
DSTRECT EQU 8 ;LONG, ADDR OF RECT
H1 EQU -2 ;WORD
H2 EQU H1-2 ;WORD
H3 EQU H2-2 ;WORD
H4 EQU H3-4 ;WORD
V1 EQU H4-2 ;WORD
V2 EQU V1-2 ;WORD
V3 EQU V2-2 ;WORD
V4 EQU V3-4 ;WORD
TMPRECT EQU V4-8 ;RECT
VARSIZE EQU TMPRECT ;TOTAL SIZE OF LOCALS
LINK A6,#VARSIZE ;SET UP STACK FRAME
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO LISAGRAF GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
TST PNVIS(A0) ;IS PNVIS NEGATIVE ?
BLT GOHOME ;YES, DON'T DRAW AT ALL
MOVE.L DSTRECT(A6),A1 ;POINT TO INPUT RECT
MOVE.L (A1)+,TMPRECT+TOPLEFT(A6) ;COPY INPUT RECT
MOVE.L (A1)+,TMPRECT+BOTRIGHT(A6)
;
; Now set up h1,h2,h3,h4 and v1,v2,v3,v4
;
LEA TMPRECT(A6),A1 ;POINT TO COPIED RECT
MOVE PNSIZE+H(A0),D2 ;GET PEN WIDTH
MOVE LEFT(A1),D0
MOVE D0,H1(A6) ;H1:=LEFT
ADD D2,D0
MOVE D0,H2(A6) ;H2:=LEFT+PENWIDTH
MOVE RIGHT(A1),D1
MOVE D1,H4(A6) ;H4:=RIGHT
SUB D2,D1
MOVE D1,H3(A6) ;H3:=RIGHT-PENWIDTH
CMP D1,D0 ;IS H2 >= H3 ?
BGE.S @1 ;YES, FILL IT IN SOLID
MOVE PNSIZE+V(A0),D2 ;GET PEN HEIGHT
MOVE TOP(A1),D0
MOVE D0,V1(A6) ;V1:=TOP
ADD D2,D0
MOVE D0,V2(A6) ;V2:=TOP+PENHEIGHT
MOVE BOTTOM(A1),D1
MOVE D1,V4(A6) ;V4:=BOTTOM
SUB D2,D1
MOVE D1,V3(A6) ;V3:=BOTTOM-PENHEIGHT
CMP D1,D0 ;IS V2 >= V3 ?
BGE.S @1 ;YES, FILL IT IN SOLID
;
; PEN IS NOT SO BIG AS TO FILL IN SOLID. BREAK RECT INTO 4 EDGES.
;
MOVE H1(A6),TMPRECT+LEFT(A6)
MOVE H3(A6),TMPRECT+RIGHT(A6)
MOVE V1(A6),TMPRECT+TOP(A6)
MOVE V2(A6),TMPRECT+BOTTOM(A6)
BSR.S DORECT ;PAINT TOP EDGE
MOVE H3(A6),TMPRECT+LEFT(A6)
MOVE H4(A6),TMPRECT+RIGHT(A6)
MOVE V3(A6),TMPRECT+BOTTOM(A6)
BSR.S DORECT ;PAINT RIGHT EDGE
MOVE H2(A6),TMPRECT+LEFT(A6)
MOVE V3(A6),TMPRECT+TOP(A6)
MOVE V4(A6),TMPRECT+BOTTOM(A6)
BSR.S DORECT ;PAINT BOTTOM EDGE
MOVE H1(A6),TMPRECT+LEFT(A6)
MOVE H2(A6),TMPRECT+RIGHT(A6)
MOVE V2(A6),TMPRECT+TOP(A6)
@1 BRA.S FILLED ;PAINT LEFT EDGE
;--------------------------------------------------------
;
; LOCAL ROUTINE TO PAINT TMPRECT, GIVEN IN LOCAL COORDS
;
DORECT MOVE.B HiliteMode,-(SP) ;preserve hilite state for each side
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO LISAGRAF GLOBALS
MOVE.L THEPORT(A0),A1 ;POINT TO CURRENT GRAFPORT
MOVE.L WIDEOPEN(A0),D2 ;PUSH WIDE OPEN
PEA PORTBITS(A1) ;PUSH SRCBITS = DSTBITS
CLR.L -(SP) ;NO MASKBITS
PEA PORTBITS(A1) ;PUSH DSTBITS
PEA TMPRECT(A6) ;PUSH SRCRECT = DSTRECT
CLR.L -(SP) ;NO MASKRECT
PEA TMPRECT(A6) ;PUSH DSTRECT, LOCAL COORDS
MOVE PNMODE(A1),D1 ;PUSH PEN MODE
OR #$8,D1 ;set the pattern bit in case the user forgot to
_GetStreamMode ;strip mode
MOVE.W D1,-(SP) ;save stripped mode
PEA PNPAT(A1) ;PUSH ADDR OF PEN PATTERN
MOVE.L CLIPRGN(A1),-(SP) ;PUSH CLIPRGN
MOVE.L VISRGN(A1),-(SP) ;PUSH VISRGN
MOVE.L D2,-(SP) ;PUSH WIDE OPEN
CLR -(SP) ;pass multicolor flag false
_STRETCHBITS ;CALL STRETCHBITS
MOVE.B (SP)+,HiliteMode ;restore hilite state for each side
RTS
FILLED BSR DORECT ;FILL TMPRECT SOLID
BSET #hiliteBit,HiliteMode ;reset hilite flag
GOHOME UNLINK 4,'FRMRECT '
SetRect PROC EXPORT
;----------------------------------------------------------
;
; PROCEDURE SetRect(VAR r: Rect; left,top,right,bottom: INTEGER);
; { assign 4 integers into a rectangle }
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L (SP)+,D1 ;POP BOTRIGHT POINT
MOVE.L (SP)+,D0 ;POP TOPLEFT POINT
MOVE.L (SP)+,A1 ;POP ADDR OF RECT
MOVE.L D0,(A1)+ ;INSTALL TOPLEFT
MOVE.L D1,(A1)+ ;INSTALL BOTRIGHT
JMP (A0) ;RETURN
EqualRect FUNC EXPORT
;----------------------------------------------------------
;
; FUNCTION EqualRect(rect1,rect2: Rect): BOOLEAN;
;
; CLOBBERS D0,A0,A1.
;
MOVE.L (SP)+,D0 ;POP RETURN ADDR
MOVE.L (SP)+,A1 ;POP ADDR OF RECT2
MOVE.L (SP)+,A0 ;POP ADDR OF RECT1
CMPM.L (A0)+,(A1)+ ;IS TOPLEFT SAME ?
BNE.S RETFALSE ;NO, RETURN FALSE
CMPM.L (A0)+,(A1)+ ;YES, IS BOTRIGHT SAME TOO ?
BNE.S RETFALSE ;NO, RETURN FALSE
MOVE.B #1,(SP) ;YES, RETURN TRUE
BRA.S DONE ;AND QUIT
RETFALSE CLR.B (SP) ;RETURN FALSE
DONE MOVE.L D0,-(SP) ;PUSH RETURN ADDR
RTS ;AND RETURN
EmptyRect FUNC EXPORT
;----------------------------------------------------------
;
; FUNCTION EmptyRect(r: Rect): BOOLEAN;
;
; CLOBBERS D0,D1,A0,A1.
;
MOVE.L (SP)+,A1 ;POP RETURN ADDR
MOVE.L (SP)+,A0 ;POP ADDR OF RECT
MOVE (A0)+,D0 ;GET TOP
MOVE (A0)+,D1 ;GET LEFT
CMP (A0)+,D0 ;IS TOP >= BOTTOM ?
BGE.S EMPTY ;YES, RETURN TRUE
CMP (A0)+,D1 ;IS LEFT >= RIGHT ?
BGE.S EMPTY ;YES, RETURN TRUE
CLR.B (SP) ;NOT EMPTY, RETURN FALSE
BRA.S DONE ;AND QUIT
EMPTY MOVE.B #1,(SP) ;RETURN TRUE
DONE JMP (A1) ;RETURN
OffsetRect PROC EXPORT
;----------------------------------------------------------
;
; PROCEDURE OffsetRect(VAR r: Rect; dh,dv: INTEGER);
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE (SP)+,D1 ;POP DV
MOVE (SP)+,D0 ;POP DH
MOVE.L (SP)+,A1 ;POP ADDR OF RECT
ADD D1,(A1)+ ;TOP:=TOP+DV
ADD D0,(A1)+ ;LEFT:=LEFT+DH
ADD D1,(A1)+ ;BOTTOM:=BOTTOM+DV
ADD D0,(A1)+ ;RIGHT:=RIGHT+DH
JMP (A0) ;RETURN
InsetRect PROC EXPORT
;----------------------------------------------------------
;
; PROCEDURE InsetRect(VAR r: Rect; dh,dv: INTEGER);
; { inset a rectangle on all 4 sides }
;
MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE (SP)+,D1 ;POP DV
MOVE (SP)+,D0 ;POP DH
MOVE.L (SP)+,A1 ;POP ADDR OF RECT
ADD D1,(A1)+ ;ADD DV TO TOP
ADD D0,(A1)+ ;ADD DH TO LEFT
SUB D1,(A1)+ ;SUBTRACT DV FROM BOTTOM
SUB D0,(A1)+ ;SUBTRACT DH FROM RIGHT
DONE JMP (A0) ;RETURN
SectRect FUNC EXPORT
EXPORT RSect
;---------------------------------------------------------
;
; FUNCTION SectRect(srcA,srcB: Rect; VAR dstC: Rect): BOOLEAN;
;
; Returns TRUE and intersection in dst,
; else FALSE and dst = 0,0,0,0.
; Dst may also be used as one of the inputs
;
;
; A6 OFFSETS OF PARAMETERS AFTER LINK:
;
PARAMSIZE EQU 12 ;SIZE OF PARAMETERS
RESULT EQU PARAMSIZE+8 ;BOOLEAN RESULT
SRCA EQU RESULT-4 ;LONG, ADDR OF RECTANGLE
SRCB EQU SRCA-4 ;LONG, ADDR OF RECTANGLE
DST EQU SRCB-4 ;LONG, ADDR OF RECTANGLE
LINK A6,#0 ;NO LOCAL VARS
MOVE.L SRCA(A6),-(SP) ;PUSH SRCA POINTER
MOVE.L SRCB(A6),-(SP) ;PUSH SRCB POINTER
MOVE #2,-(SP) ;PUSH NRECTS=2
MOVE.L DST(A6),-(SP) ;PUSH DST POINTER
BSR.S RSECT ;CALC INTERSECTION
SNE RESULT(A6) ;STORE BOOLEAN RESULT
NEG.B RESULT(A6) ;CONVERT $FF TO $01
NOTEMPTY UNLINK PARAMSIZE,'SECTRECT'
;---------------------------------------------------
;
; ASSEMBLY CALLABLE ROUTINE TO COMPUTE THE INTERSECTION OF
; ANY NUMBER OF RECTANGLES.
;
; INPUTS: PUSH ADDRESSES OF EACH INPUT RECTANGLE (LONGS)
; PUSH # OF RECTANGLES (WORD)
; PUSH ADDRESS OF OUTPUT RECTANGLE (LONG)
;
; RETURNS DST=(0,0,0,0) AND Z-FLAG SET IF NO INTERSECTION
;
; CLOBBERS: D0,A0
;
RSECT LINK A6,#0
MOVEM.L D1-D4/A1,-(SP) ;SAVE REGS
LEA 12(A6),A1 ;POINT TO NRECTS
MOVE (A1)+,D0 ;GET NRECTS COUNT
BLE.S EMPTY ;EMPTY IF NRECTS <= 0
MOVE.L (A1)+,A0 ;POINT TO FIRST RECT
MOVEM.W (A0)+,D1/D2/D3/D4 ;GET TOP, LEFT, BOT, RIGHT
SUB #1,D0 ;DECREMENT RECT COUNT
BRA.S RTOK ;CHECK THIS RECT AND LOOP
NEXTRECT MOVE.L (A1)+,A0 ;POINT TO NEXT RECT
CMP (A0)+,D1 ;IS TOP < NEXT TOP ?
BGE.S TOPOK ;NO, CONTINUE
MOVE -2(A0),D1 ;YES, TOP:=NEXT TOP
TOPOK CMP (A0)+,D2 ;IS LEFT < NEXT LEFT ?
BGE.S LEFTOK ;NO, CONTINUE
MOVE -2(A0),D2 ;YES, LEFT:=NEXT LEFT
LEFTOK CMP (A0)+,D3 ;IS BOTTOM > NEXT BOT ?
BLE.S BOTOK ;NO, CONTINUE
MOVE -2(A0),D3 ;YES, BOTTOM:=NEXT BOT
BOTOK CMP (A0)+,D4 ;IS RIGHT > NEXT RIGHT ?
BLE.S RTOK ;NO, CONTINUE
MOVE -2(A0),D4 ;YES, RIGHT:=NEXT RIGHT
RTOK CMP D1,D3 ;IS BOTTOM <= TOP ?
BLE.S EMPTY ;YES, EMPTY
CMP D2,D4 ;IS RIGHT <= LEFT ?
BLE.S EMPTY ;YES, EMPTY
DBRA D0,NEXTRECT ;LOOP FOR ALL RECTANGLES
BRA.S DONE
EMPTY CLR D1 ;ALL EMPTY RECTS ARE (0,0,0,0)
CLR D2
CLR D3
CLR D4
DONE MOVE.L 8(A6),A0 ;GET DST ADDR
MOVE D1,(A0)+ ;STORE DST TOP
MOVE D2,(A0)+ ;DST LEFT
MOVE D3,(A0)+ ;DST BOT
MOVE D4,(A0)+ ;DST RIGHT
MOVE 12(A6),D0 ;GET NRECTS COUNT AGAIN
LSL #2,D0 ;TIMES 4 BYTES PER RECTANGLE
ADD #6,D0 ;PLUS 6 BYTES FOR NRECTS AND DSTPTR
CMP D1,D3 ;SET Z-FLAG IF EMPTY RECT
MOVEM.L (SP)+,D1-D4/A1 ;RESTORE REGS
UNLK A6 ;RELEASE STATIC FRAME PTR
MOVE.L (SP)+,A0 ;POP RETURN ADDR
ADD D0,SP ;STRIP VARIABLE NUMBER OF PARAMS
JMP (A0) ;RETURN WITH Z-FLAG IF EMPTY
UnionRect PROC EXPORT
EXPORT Pt2Rect
;----------------------------------------------------------
;
; PROCEDURE UnionRect(* src1,src2: Rect; VAR dst: Rect *);
;
; { compute smallest rectangle containing both input rectangles }
; { works correctly even if one of the sources is the destination }
;
MOVE.L 12(SP),A0 ;GET ADDR OF SRC1
MOVE.L 8(SP),A1 ;GET ADDR OF SRC2
MOVE (A0)+,D0 ;TOP:=TOP1
CMP (A1)+,D0 ;IS TOP2 < TOP ?
BLE.S TOPOK ;NO, CONTINUE
MOVE -2(A1),D0 ;YES, TOP:=TOP2
TOPOK SWAP D0 ;PUT TOP IN HI WORD
MOVE (A0)+,D0 ;LEFT:=LEFT1
CMP (A1)+,D0 ;IS LEFT2 < LEFT ?
BLE.S LEFTOK ;NO, CONTINUE
MOVE -2(A1),D0 ;YES, LEFT:=LEFT2
LEFTOK MOVE (A0)+,D1 ;BOTTOM:=BOTTOM1
CMP (A1)+,D1 ;IS BOTTOM2 > BOTTOM ?
BGE.S BOTOK ;NO, CONTINUE
MOVE -2(A1),D1 ;YES, BOTTOM:=BOTTOM2
BOTOK SWAP D1 ;PUT BOTTOM IN HI WORD
MOVE (A0)+,D1 ;RIGHT:=RIGHT1
CMP (A1)+,D1 ;IS RIGHT2 > RIGHT1 ?
BGE.S RIGHTOK ;NO, CONTINUE
MOVE -2(A1),D1 ;YES, RIGHT:=RIGHT2
RIGHTOK MOVE.L 4(SP),A0 ;POINT TO DST RECT
MOVE.L D0,(A0)+ ;INSTALL TOPLEFT
MOVE.L D1,(A0)+ ;INSTALL BOTRIGHT
BRA.S SHARE ;STRIP 3 PARAMETERS AND RETURN
;----------------------------------------------------------
;
; PROCEDURE Pt2Rect(* pt1,pt2: Point; VAR dst: Rect *);
;
; { make a rectangle from two points }
;
Pt2Rect MOVE.L 4(SP),A0 ;POINT TO DST RECT
MOVE 14(SP),D0 ;GET H1
MOVE 10(SP),D1 ;GET H2
CMP D0,D1 ;IS H2 < H1 ?
BGE.S HOK ;NO, CONTINUE
EXG D0,D1 ;YES, SWAP THEM
HOK MOVE D0,LEFT(A0) ;INSTALL DST LEFT = MIN(H1,H2)
MOVE D1,RIGHT(A0) ;INSTALL DST RIGHT = MAX(H1,H2)
MOVE 12(SP),D0 ;GET V1
MOVE 8(SP),D1 ;GET V2
CMP D0,D1 ;IS V2 < V1 ?
BGE.S VOK ;NO, CONTINUE
EXG D0,D1 ;YES, SWAP THEM
VOK MOVE D0,TOP(A0) ;INSTALL DST TOP = MIN(V1,V2)
MOVE D1,BOTTOM(A0) ;INSTALL DST BOTTOM = MAX(V1,V2)
SHARE MOVE.L (SP)+,A0 ;POP RETURN ADDR
ADD #12,SP ;STRIP 3 PARAMETERS
JMP (A0) ;AND RETURN
PtInRect FUNC EXPORT
;------------------------------------------------------------
;
; FUNCTION PtInRect(pt: Point; r: Rect): BOOLEAN;
;
; Returns TRUE if point is within the rectangle.
;
; A6 OFFSETS OF PARAMETERS AFTER LINK:
;
PARAMSIZE EQU 8 ;SIZE OF PARAMETERS
RESULT EQU PARAMSIZE+8 ;A6 OFFSETS AFTER LINK
PT EQU RESULT-4 ;POINT, VALUE
R EQU PT-4 ;LONG, ADDR OF RECTANGLE
LINK A6,#0 ;NO LOCAL VARS
MOVE.L R(A6),A0 ;GET RECT PTR
MOVE PT+H(A6),D0 ;GET HORIZ COORD
MOVE PT+V(A6),D1 ;GET VERT COORD
CLR.B RESULT(A6) ;INIT BOOLEAN TO FALSE
CMP (A0)+,D1 ;IS PT.V < TOP ?
BLT.S RETFALSE ;YES, QUIT
CMP (A0)+,D0 ;IS PT.H < LEFT ?
BLT.S RETFALSE ;YES, QUIT
CMP (A0)+,D1 ;IS PT.V >= BOTTOM ?
BGE.S RETFALSE ;YES, QUIT
CMP (A0)+,D0 ;IS PT.H >= RIGHT ?
BGE.S RETFALSE ;YES, QUIT
ADDQ.B #1,RESULT(A6) ;RETURN BOOLEAN TRUE
RETFALSE UNLINK PARAMSIZE,'PTINRECT'
PutRect PROC EXPORT
IMPORT SetHSize
;----------------------------------------------------------------
;
; PROCEDURE PutRect(r: Rect; bufHandle: Handle; VAR index,size: INTEGER);
;
; Puts the four inversion points of a rectangle
;
; Clobbers D0,A0,A1
;
; A6 OFFSETS OF PARAMETERS AFTER LINK:
;
PARAMSIZE EQU 16 ;TOTAL SIZE OF PARAMETERS
RECT EQU PARAMSIZE+8-4 ;LONG, ADDR OF RECT
BUFHANDLE EQU RECT-4 ;LONG, HANDLE
INDEX EQU BUFHANDLE-4 ;LONG, ADDR OF INTEGER
SIZE EQU INDEX-4 ;LONG, ADDR OF INTEGER
LINK A6,#0 ;NO LOCAL VARIABLES
;------------------------------------------------------------
;
; IS THERE ROOM FOR FOUR NEW POINTS IN THE POINT BUFFER ?
;
MOVE.L INDEX(A6),A0 ;POINT TO INDEX
cmp.w #65535-1024-16,(a0) ;check for overflow? <BAL 28Apr89>
bls.s @noProb ;no, don't worry; be happy <BAL 28Apr89>
move #-147,qdErr ;indicate rgnTooBigErr <BAL 28Apr89>
bra.s GOHOME ;skip this rect <BAL 28Apr89>
@noProb MOVE.L SIZE(A6),A1 ;POINT TO SIZE
MOVEQ #16,D0
ADD (A0),D0 ;GET CURRENT INDEX + 16
CMP (A1),D0 ;IS NEW INDEX > SIZE ?
bls.s SIZEOK ;NO, CONTINUE <BAL 28Apr89>
;-------------------------------------------------------------
;
; NO, GROW THE POINT BUFFER ENOUGH FOR 256 MORE POINTS
;
ADD #1024,(A1) ;ADD 1024 TO SIZE
MOVEM.L D3/A2,-(SP) ;SAVE REGS
MOVE.L BUFHANDLE(A6),-(SP) ;PUSH HANDLE PARAM
MOVE (A1),-(SP) ;PUSH NEW SIZE
JSR SetHSize ;MAKE THE BUFFER BIGGER
MOVEM.L (SP)+,D3/A2 ;RESTORE REGS
MOVE.L INDEX(A6),A0 ;POINT TO INDEX AGAIN
;------------------------------------------------------------
;
; NOW INSTALL THE 4 NEW INVERSION POINTS
;
SIZEOK MOVE.L BUFHANDLE(A6),A1 ;GET BUFHANDLE
MOVE.L (A1),A1 ;DE-REFERENCE HANDLE
moveq #0,d0 ;clear out high end <BAL 28Apr89>
move.w (a0),d0 ;get index as a long <BAL 28Apr89>
add.l d0,A1 ;ADD INDEX TO POINTER <BAL 28Apr89>
ADD #16,(A0) ;BUMP INDEX
MOVE.L RECT(A6),A0 ;POINT TO RECTANGLE
MOVE.L TOPLEFT(A0),(A1)+ ;PUT TOPLEFT POINT
MOVE TOP(A0),(A1)+ ;PUT TOP-RIGHT POINT
MOVE RIGHT(A0),(A1)+
MOVE BOTTOM(A0),(A1)+ ;PUT BOTTOM-LEFT POINT
MOVE LEFT(A0),(A1)+
MOVE.L BOTRIGHT(A0),(A1)+ ;PUT BOTRIGHT POINT
GOHOME UNLINK PARAMSIZE,'PUTRECT '
ENDPROC