mac-rom/QuickDraw/Rects.a

1037 lines
32 KiB
Plaintext
Raw Normal View History

;
; File: Rects.a
;
; Contains: Procedures for operating on rectangles.
;
; Copyright: <09> 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<6F>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
; <<3C>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