sys7.1-doc-wip/QuickDraw/Arcs.a
2019-07-27 22:37:48 +08:00

229 lines
6.0 KiB
Plaintext

;
; File: Arcs.a
;
; Copyright: © 1981-1992 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <SM2> 6/10/92 stb <sm 6/9/92>stb Note that StdArc has the fix from QDciPatchROM.a
; <•1.4> 5/29/89 BAL Blasting in 32-Bit QuickDraw version 1.0 Final
; <•1.3> 4/12/89 BAL Blasting in 32-Bit QuickDraw 1.0B1
; 1/8/89 BAL Vectorized CheckPic
; 9/5/86 EHB Added FillCArc
; 8/16/86 EHB In FillArc, call SetFillPat for color patterns
;
;
BLANKS ON
STRING ASIS
;-----------------------------------------------------------
;
;
; * ***** *** ***
; * * * * * * * *
; * * * * * *
; * * ***** * ***
; ***** * * * *
; * * * * * * * *
; * * * * *** ***
;
; Procedures for drawing Arcs:
;
StdArc PROC EXPORT
IMPORT PutPicVerb,PutPicWord,PutPicRect
IMPORT PushVerb,DrawArc,StdDevLoop
;---------------------------------------------------------------
;
; PROCEDURE StdArc(verb: GrafVerb; r: Rect; startAngle,arcAngle: INTEGER);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
; contains fix as seen in QDciPatchROM.a <sm 6/9/92>stb
PARAMSIZE EQU 10
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
RECT EQU VERB-4 ;LONG, ADDR OF RECT
STARTANG EQU RECT-2 ;WORD
ARCANG EQU STARTANG-2 ;WORD
OVWD EQU -2 ;WORD
OVHT EQU OVWD-2 ;WORD
VARSIZE EQU OVHT ;TOTAL BYTES OF LOCALS
LINK A6,#VARSIZE ;ALLOCATE STACK FRAME
MOVEM.L D4/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)
bsr.l PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
MOVEQ #$60,D0 ;PUT ARCNOUN 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
bsr.l PutPicRect ;PUT OPCODE AND RECTANGLE
MOVE STARTANG(A6),-(SP)
bsr.l PutPicWord ;PUT STARTANGLE
MOVE ARCANG(A6),-(SP)
bsr.l PutPicWord ;PUT ARCANGLE
; 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
MOVEM.L (SP)+,D4/D7/A3-A4 ;RESTORE REGS
UNLINK PARAMSIZE,'STDARC '
;---------------------------------------------------------------
;
; 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),A0 ;POINT TO RECT
MOVE RIGHT(A0),D0
SUB LEFT(A0),D0
MOVE D0,OVWD(A6) ;OVWD := R.RIGHT - R.LEFT
MOVE BOTTOM(A0),D0
SUB TOP(A0),D0
MOVE D0,OVHT(A6) ;OVHT := R.BOTTOM - R.TOP
MOVE.L A0,-(SP) ;PUSH ADDR OF RECT
CLR.B -(SP) ;PUSH HOLLOW = FALSE
TST.B D7 ;IS VERB FRAME ?
BNE.S DOIT ;NO, CONTINUE
;
; Currently, FrameArc does not put inversion points to theRgn.
; If this changes, add test and call to PutArc here.
;
MOVE.B #1,(SP) ;REPLACE, PUSH HOLLOW = TRUE
DOIT MOVE.L OVHT(A6),-(SP) ;PUSH OVWD,OVHT
_PushVerb ;PUSH MODE AND PATTERN
MOVE STARTANG(A6),-(SP) ;PUSH STARTANGLE
MOVE ARCANG(A6),-(SP) ;PUSH ARCANGLE
; DrawArc(r,hollow,ovWd,ovHt,mode,pat,startAng,arcAng);
_DrawArc
RTS
FrameArc PROC EXPORT
EXPORT CallArc,PaintArc,EraseArc,InvertArc,FillArc,FillCArc
IMPORT SETFILLPAT
;-----------------------------------------------------
;
; PROCEDURE FrameArc(* r: Rect; startAngle,arcAngle: INTEGER *);
;
MOVEQ #FRAME,D0 ;VERB = FRAME
BRA.S CallArc ;SHARE COMMON CODE
;-----------------------------------------------------
;
; PROCEDURE PaintArc(* r: Rect; startAngle,arcAngle: INTEGER *);
;
PaintArc
MOVEQ #PAINT,D0 ;VERB = PAINT
BRA.S CallArc ;SHARE COMMON CODE
;--------------------------------------------------------
;
; PROCEDURE EraseArc(* r: Rect; startAngle,arcAngle: INTEGER *);
;
EraseArc
MOVEQ #ERASE,D0 ;VERB = ERASE
BRA.S CallArc ;SHARE COMMON CODE
;--------------------------------------------------------
;
; PROCEDURE InvertArc(* r: Rect; startAngle,arcAngle: INTEGER *);
;
InvertArc
MOVEQ #INVERT,D0 ;VERB = INVERT
BRA.S CallArc ;SHARE COMMON CODE
;--------------------------------------------------------
;
; PROCEDURE FillArc(* r: Rect; startAngle,arcAngle: INTEGER; pat: Pattern *);
;
FillArc MOVEQ #0,D0 ;FLAG = FillArc
BRA.S SHARE ; => USE COMMON CODE
;----------------------------------------------------------
;
; PROCEDURE FillCArc(r: Rect; startAngle,arcAngle: INTEGER; PPH: PixPatHandle);
;
FillCArc
MOVEQ #1,D0 ;FLAG = FillCArc
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) ;PUT ADDR OF PATTERN BACK
_SETFILLPAT ;FILLPAT := PAT
MOVEQ #FILL,D0 ;VERB = FILL
; BRA.S CallArc ;SHARE COMMON CODE
;---------------------------------------------------------------
;
; PROCEDURE CallArc(r: Rect; startAngle,arcAngle: INTEGER);
;
; code shared by FrameArc, PaintArc, EraseArc, InvertArc, and FillArc.
; enter with verb in D0.
;
CallArc MOVE.L (SP)+,A0 ;POP RETURN ADDR
MOVE.L (SP)+,D1 ;POP BOTH ANGLES
MOVE.L (SP)+,A1 ;POP ADDR OF RECT
MOVE.B D0,-(SP) ;PUSH VERB
MOVE.L A1,-(SP) ;PUSH ADDR OF RECT
MOVE.L D1,-(SP) ;PUSH BOTH ANGLES
MOVE.L A0,-(SP) ;PUSH 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 JSTDARC,A0 ;get piece of trap table
BEQ.S USESTD ;YES, USE STD PROC
MOVE.L D0,A0
MOVE.L ARCPROC(A0),A0 ;NO, GET PROC PTR
USESTD JMP (A0) ;GO TO IT
ENDPROC