supermario/base/SuperMarioProj.1994-02-09/QuickDraw/Patches/AllB&WQDPatch.a

2309 lines
72 KiB
Plaintext
Raw Normal View History

2019-06-29 15:17:50 +00:00
;
; File: AllB&WQDPatch.a
;
; Contains: This linked patch gets loaded on all B&W machines.
;
; Written by: Konstanin Othmer
;
; Copyright: © 1990-1991 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <35> 6/4/92 KON For CubeE - Fix OpenCPicture on Classic machines (bug #1028642).
; Look at the picSize rather than the picIndex for aligning for
; PICT2. This was causing problems when the stdPutpic bottleneck
; proc is replaced by a 3rd party. These bottnecks must update
; picsize but don't update picIndex.
; <34> 2/3/92 KON Fix problem with GetForeColor trashing memory on classicQD
; machines.
; <33> 8/30/91 DTY Define onMac to keep GrafTypes.m.a happy. (Its not a feature
; in BBSStartup any more which is why its defined here.) Also
; define hasCQD to be false. (This is a patchfile for black and
; white machines, after all…)
; <32> 8/23/91 JSM Remove benign redefinition of TRUE and FALSE, which are now
; defined by the build script.
; <31> 7/10/91 JSM Remove obsolete SysVers conditionals, remove code that is never
; compiled.
; <30> 3/26/91 KON csd, WRKSHT#RBN-QD-017: Plus patch to stdRgn calls putpicOp
; which puts out a word if it's an OpenCPicture. The high part of
; D0 is garbage, so this causes problems. With this change
; putPicByte is called instead.
; <29> 3/20/91 KON gbm, WRKSHT#SAH-QD-057: Rectangle size in picture header in
; OpenCPicture was not calculated correctly.
; <28> 3/13/91 JT Added the glyph state opcode support to picture drawing drawing
; under old 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.
; <27> 2/28/91 KON csd: BRC# 83982 Patch StdRgn to patch PutRgn to handle
; rectangular regions correctly. This was causing the Finder to
; crash on the Plus.
; <26> 2/12/91 KON SMC: BRC# unknown: Close picture opcode ($FF) is not padded to
; even boundary when creating version 2 pictures on B&W machines.
; <25> 2/4/91 KON smc: BRC# 81599: Fix calcmask and seedfill so it always scans
; both up and down.
; <24> 2/1/91 KON smc: BRC# 81818, Fix round ovals saved in PICT2 for SE, Plus,
; Portable.
; <23> 1/25/91 KON DDG: BRC# 81516, When saving to a picture, StdBits assumes that
; the result will pack into 256 bytes or less. This is not a valid
; assumption, and for large BitMaps can cause the stack to
; overflow.
; <22> 1/16/91 KON Comefrom patch on FixRatio to fix problem with drawing arcs.
; [smc]
; <21> 12/14/90 csd & gbm: Change the jShowCursor patch to call the old version
; instead of jumping into ROM. This allows people who patch
; jShowCursor, like the Outbound, to work.
; <20> 11/25/90 gbm (with sab) Fix ROMBind addresses for PutPicLong and PutPicByte
; on Portable
; <19> 11/15/90 JSM <bbm> Move _OpenCPort patch from <5> to QuickDrawPatches.a,
; since it isn't installed on any B&W machines.
; <18> 11/8/90 KON Stretch chokes when horizonally scaling bitmaps with rowbytes >=
; $100. The problem is ratiocase assumes reg. D0 is cleared
; (except the low byte) which it ain't. [CEL]
; <17> 9/23/90 KON Patch stdbits and stdpoly on portable so Pict2 creation via
; OpenCpicture works right.
; <16> 9/21/90 KON Move StdBits patch from PatchSEROM.a, PatchPortableROM.a, and
; PatchPlusROM.a to this file and make it a linked patch. Added
; openCpicture stuff for stdbits and stdpoly.
; <15> 9/14/90 KON Added QDError, RGBForeColor, RGBBackColor, GetForeColor,
; GetBackColor calls to classic machines.
; <14> 8/24/90 PKE (per JT) Use new names picQdChExtra and picQdRunSlop instead of
; picSMgrChar and picSMgrSlop.
; <13> 8/16/90 dba use VisRgnChanged on II and IIci as well
; <12> 8/15/90 dba improve the implementation of VisRgnChanged
; <11> 8/10/90 gbm fix reference to JStdPutPic on the Plus
; <10> 7/16/90 dba fix ROM binds ROMStdLineRtn, ROMStdLineNotPic, and
; ROMShowCrsrEntry1 which were all wrong on the Plus
; <9> 6/27/90 KON Always clear the script manager state variables in the picture
; save record.
; <8> 6/27/90 KON Always clear the script manager state information in a picture
; save record.
; <7> 6/26/90 KON Fix show cursor so obscure, hide, show leaves cursor obscured.
; <6> 6/20/90 KON Add OpenCPicture call.
; <5> 5/30/90 JT Linked patches for OpenPort, OpenCPort, InitPort, SetPort, Line,
; LineTo, Move, and MoveTo all reset the horizontal pen fraction
; and fall into the original code.
; <4> 5/27/90 JT Clear the line layout variables in the picture state record.
; <3> 5/3/90 JT Set the SCRIPT_CHAR_EXTRA flag according to the system-wide
; version number and include the Script Manager equates so the
; various patch files will compile.
; <2> 4/4/90 KON Make it into a linked patch.
; 3/26/90 KON Created file, it's ptch 44.
;
INITFILE EQU 0 ;set to 1 for standalone install, 0 for ptchInstall
withFonts EQU 1 ;set to 1 to build with font name/ID binding
wholeErrors EQU 1
IF (&TYPE('SCRIPT_CHAR_EXTRA') = 'UNDEFINED') THEN ; <5> CEL
IF forROM THEN
SCRIPT_CHAR_EXTRA EQU 0
ELSE
SCRIPT_CHAR_EXTRA EQU 1
ENDIF
ENDIF
IF (&TYPE('hasPenFraction') = 'UNDEFINED') THEN
IF forROM THEN
hasPenFraction EQU 0
ELSE
hasPenFraction EQU 1
ENDIF
ENDIF
IF (&TYPE('hasGlyphState') = 'UNDEFINED') THEN
IF forROM THEN
hasGlyphState EQU 0
ELSE
hasGlyphState EQU 1
ENDIF
ENDIF
if (&type('onMac') = 'UNDEFINED') then
if forROM then
onMac: equ 0
else
onMac: equ 1 ; Define as true for non-ROM because this is the way it used to be in
endif ; the System featurelist in BBSStartup.
endif
if (&type('hasCQD') = 'UNDEFINED') then
hasCQD: equ 0
endif
INCLUDE 'SysErr.a'
INCLUDE 'Traps.a'
INCLUDE 'QuickEqu.a'
INCLUDE 'SysEqu.a'
INCLUDE 'GrafTypes.m.a'
INCLUDE 'LinkedPatchMacros.a'
INCLUDE 'FixMath.a'
INCLUDE 'ToolEqu.a'
INCLUDE 'fontPrivate.a'
; Here's a couple of vectors used in a patch below
;
PStdPutPic_SE_Portable EQU $0E00+(4*$F0)
PStdPutPic_Plus EQU $0C00+(4*$F0)
;NOTE: $400000 is stripped from the actual rom address on SE and Plus and $900000 from Esprit
DPEntry ROMBind (Plus, $DAEC), (SE, $00018268), (Portable, $00025664)
GetVers ROMBind (Plus, $DDA2), (SE, $0001852E), (Portable, $000259C4)
;DPEntry+$FC
DPQuit ROMBind (Plus, $DBE8), (SE, $00018364), (Portable, $00025782)
;DPEntry+$120
DPGoHome ROMBind (Plus, $DC0C), (SE, $00018388), (Portable, $000257A6)
;GetVers+$24
OvalEnd ROMBind (Plus, $DDC6), (SE, $00018552), (Portable, $000259F0)
;GetVers+$44
XOrigin ROMBind (Plus, $DDE6), (SE, $00018572), (Portable, $00025A0E)
;GetVers+$C6
RomLNOK ROMBind (Plus, $DE68), (SE, $000185F4), (Portable, $00025B26)
;GetVers+$13C
RomTextOP ROMBind (Plus, $DEDE), (SE, $0001866A), (Portable, $00025B9C)
;GetVers+$180
RomRectOP ROMBind (Plus, $DF22), (SE, $000186AE), (Portable, $00025BEE)
;GetVers+$19A
RomRRectOP ROMBind (Plus, $DF3C), (SE, $000186C8), (Portable, $00025C16)
;GetVers+$1BC
RomOvalOP ROMBind (Plus, $DF5E), (SE, $000186EA), (Portable, $00025C46)
;GetVers+$1E0
RomArcOP ROMBind (Plus, $DF82), (SE, $0001870E), (Portable, $00025C78)
;GetVers+$1FA
RomPolyOP ROMBind (Plus, $DF9C), (SE, $00018728), (Portable, $00025CA6)
;GetVers+$22C
RomRgnOP ROMBind (Plus, $DFCE), (SE, $0001875A), (Portable, $00025CEA)
;GetVers+$326
RomBits ROMBind (Plus, $E0C8), (SE, $00018854), (Portable, $00025E58)
;GetVers+$33A
RomCommentOP ROMBind (Plus, $E0DC), (SE, $00018868), (Portable, $00025EEE)
;GetVers+$35E
RomLongCom ROMBind (Plus, $E100), (SE, $0001888C), (Portable, $00025F12)
;GetVers+$458
RomGetRect ROMBind (Plus, $E1FA), (SE, $00018986), (Portable, $00025FC8)
;GetVers+$4BC
RomKill1 ROMBind (Plus, $E25E), (SE, $000189EA), (Portable, $00026052)
;GetVers+$4C4
RomAbort ROMBind (Plus, $E266), (SE, $000189F2), (Portable, $0002605A)
;GetVers+$4CC
RomDone ROMBind (Plus, $E26E), (SE, $000189FA), (Portable, $00026062)
;DPEntry+$1EC
RomXClip ROMBind (Plus, $DCD8), (SE, $00018454), (Portable, $000258E0)
;DPEntry+$1F8
RomXClip2 ROMBind (Plus, $DCE4), (SE, $00018460), (Portable, $000258EC)
;DPEntry+$272
RomXPnSize ROMBind (Plus, $DD5E), (SE, $000184DA), (Portable, $00025974)
ROMPutPicData ROMBind (SE, $18A1A), (Plus, $0E28E), \
(Portable,$263FA) ;Trap=KillPicture
ROMDPutPicByte ROMBind (SE, $18A30), (Plus, $0E2A4), \
(Portable,$26410) ;Trap=KillPicture
ROMPutPicRgn ROMBind (Plus, $E32C), (SE, $00018AB8), (Portable, $00026498)
ROMCopyRgn ROMBind (Plus, $BDFE), (SE, $0001656E), (Portable, $00023654)
ROMEqualRgn ROMBind (Plus, $BFA0), (SE, $00016710), (Portable, $000237F6)
;xxx Fix Me: portable needs putPicByte address
ROMPutPicByte ROMBind (SE, $18A36), (Plus, $0E2AA), \
(Portable,$26416) ;Trap=KillPicture
ROMPutPicWord ROMBind (SE, $18A48), (Plus, $0E2BC), \
(Portable,$26428) ;Trap=KillPicture
ROMPutPicLong ROMBind (SE, $18A5A), (Plus, $0E2CE), \
(Portable,$2643A) ;Trap=KillPicture
;Open Picture + $34
OpenPictptchEntry ROMBind (Plus, $DA20), (SE, $0001819C), (Portable, $00025598)
;Open Picture + $B2
OpenPictDone ROMBind (Plus, $DA9E), (SE, $0001821A), (Portable, $00025616)
;Close Picture + $E
ClosePictptchEntry ROMBind (Plus, $DAB6), (SE, $00018232), (Portable, $0002562e)
ClosePictptchEntryNew ROMBind (Plus, $DABC), (SE, $00018238), (Portable, $00025634)
;Close Picture + $36
ClosePictGoHome ROMBind (Plus, $DADE), (SE, $0001825A), (Portable, $00025656)
; put data to picture routines
ROMStdBitsStart2 ROMBind (Plus, $CA06), (SE, $17182), (Portable, $24510)
ROMStdBitsOK ROMBind (Plus, $CA0A), (SE, $17186), (Portable, $24514)
ROMStdBitsNotPic ROMBind (Plus, $CA0C), (SE, $17188), (Portable, $24516)
ROMStdLineRtn ROMBind (Plus, $967C), (SE, $13DEC), (Portable, $20832)
ROMStdLineNotPic ROMBind (Plus, $96E8), (SE, $13E58), (Portable, $2089E)
ROMStdRectRtn ROMBind (Plus, $9E96), (SE, $14606), (Portable, $2104C)
ROMStdRectNotPic ROMBind (Plus, $9EA4), (SE, $14614), (Portable, $2105A)
ROMStdRRectRtn ROMBind (Plus, $ACA8), (SE, $15418), (Portable, $21E5E)
ROMStdRRectNotPic ROMBind (Plus, $ACB6), (SE, $15426), (Portable, $21E6C)
ROMStdOvalRtn ROMBind (Plus, $AD64), (SE, $154D4), (Portable, $21F1A)
ROMStdOvalNotPic ROMBind (Plus, $AD72), (SE, $154E2), (Portable, $21F28)
ROMStdArcRtn ROMBind (Plus, $AF70), (SE, $156E0), (Portable, $22126)
ROMStdArcNotPic ROMBind (Plus, $AF8E), (SE, $156FE), (Portable, $22144)
ROMStdRgnRtn ROMBind (Plus, $BC0E), (SE, $1637E), (Portable, $23464)
ROMStdRgnNotPic ROMBind (Plus, $BC20), (SE, $16390), (Portable, $23476)
ROMStdComment ROMBind (Plus, $D8D0), (SE, $1804C), (Portable, $2544E)
ROMShowCrsr ROMBind (Plus, $1CE6), (SE, $18E18), (Portable, $267F8)
ROMStdPolyRtn ROMBind (Portable, $22B50)
ROMStdPolyNotPic ROMBind (Portable, $22B60)
PortableStdBitsNotPict ROMBind (Portable, $24516)
PortableStdBitsRtn ROMBind (Portable, $243E8)
;
; Binds for CalcMask and SeedFill
;
ROMGoHome ROMBind (Plus, $CE7C), (SE, $175F8), (Portable, $24986)
ROMSeedFill ROMBind (Plus, $CDBC), (SE, $17538), (Portable, $248C6)
;
; the following Plus and SE binds were taken from QuickPolysClassicPatch.a
; and are used by that file only
;
ROMShowCursor ROMBIND (SE, $12A2E), (Plus, $82F8)
ROMShieldCursor ROMBIND (SE, $12A34), (Plus, $82FE)
ROMMaskTab ROMBIND (SE, $12B6E), (Plus, $8438)
ROMPatExpand ROMBIND (SE, $12BCE), (Plus, $8498)
ROMColorMap ROMBIND (SE, $12C96), (Plus, $8560)
ROMXorSlab ROMBIND (SE, $12D78), (Plus, $8642)
ROMDrawSlab ROMBIND (SE, $12DBC), (Plus, $8686)
ROMSlabMode ROMBIND (SE, $12E4C), (Plus, $8716)
ROMFastSlabMode ROMBIND (SE, $12EA6), (Plus, $8770)
ROMPushVerb ROMBIND (SE, $14650), (Plus, $9EE0)
ROMRSect ROMBIND (SE, $14880), (Plus, $A110)
ROMSeekMask ROMBIND (SE, $15DC4), (Plus, $B654)
ROMFrPoly ROMBIND (SE, $162D0), (Plus, $BB60)
ROMTrimRect ROMBIND (SE, $1692A), (Plus, $C1BA)
ROMInitRgn ROMBIND (SE, $16A36), (Plus, $C2C6)
ROMDrawRect ROMBIND (SE, $146C8), (Plus,$9F58)
;PutPicVerb Equ $418AD6 ;call routine in this file instead
;ROMPutPicRgn Equ $418AB8 ;already defined
;------------------
; GetPMData trap
;
INCLUDE 'GetPMData.a'
;
;------------------
;
; ----- Add GWorld calls. This needs to broken off into it's own file --------
;
include 'QDOffscreenEqu.a'
; put these in some romantic equate file when you are inspired
macro
_NewHandleCommaTemp
import NewHandleCommaTemp
jsr NewHandleCommaTemp
endm
macro
rtd_a0 &params
if &eval(&params) = 0 then
rts
else
if &setting('MACHINE') <> 'MC68000' then
rtd #&params
else
if &eval(&params) = 4 then
move.l (sp)+,(sp)
rts
elseif &eval(&params) <= 8 then
move.l (sp)+,a0
addq #&params,sp
jmp (a0)
else
move.l (sp)+,a0
lea &params(sp),sp
jmp (a0)
endif
endif
endif
endm
INCLUDE 'ClassicGWorld.a'
;
; --------------- End of ClassicGWorld stuff -----------------
;
;=========================================================================================
;=========================================================================================
;
; ComeFrom patch on FixRatio to see if from arc drawing
;
;=========================================================================================
;=========================================================================================
FromDrawArc ROMBind (Plus, $B17E), (SE, $158EE), (Portable, $22334)
newFixRatio ComeFromPatchProc _FixRatio, FromDrawArc, (Plus,SE,Portable)
IMPORT FromDrawArc
;------------------------------------------------
;
; A6 OFFSETS OF PARAMETERS AFTER LINK:
;
PARAMSIZE EQU 20 ;TOTAL SIZE OF PARAMETERS
DSTRECT EQU PARAMSIZE+8-4 ;ADDR OF RECT
HOLLOW EQU DSTRECT-2 ;BOOLEAN
OVALWIDTH EQU HOLLOW-2 ;INTEGER
OVALHEIGHT EQU OVALWIDTH-2 ;INTEGER
MODE EQU OVALHEIGHT-2 ;INTEGER
PAT EQU MODE-4 ;LONG, ADDR OF PATTERN
STARTANGLE EQU PAT-2 ;INTEGER
ARCANGLE EQU STARTANGLE-2 ;INTEGER
;------------------------------------------------------
;
; OFFSETS IN AN OVAL STATE RECORD:
;
OVALTOP EQU 0 ;INTEGER
OVALBOT EQU OVALTOP+2 ;INTEGER
OVALY EQU OVALBOT+2 ;INTEGER
RSQYSQ EQU OVALY+2 ;LONGINT
SQUARE EQU RSQYSQ+4 ;64 BIT LONGFIX
ODDNUM EQU SQUARE+8 ;64 BIT LONGFIX
ODDBUMP EQU ODDNUM+8 ;64 BIT LONGFIX
LEFTEDGE EQU ODDBUMP+8 ;32 BIT FIXED POINT
RIGHTEDGE EQU LEFTEDGE+4 ;32 BIT FIXED POINT
ONEHALF EQU RIGHTEDGE+4 ;32 BIT FIXED POINT
OVALSIZE EQU ONEHALF+4 ;SIZE OF AN OVALREC
;-------------------------------------------------
;
; A6 OFFSETS OF LOCAL VARIABLES AFTER LINK:
;
EXPAT EQU -64 ;16 LONGS
MINRECT EQU EXPAT-8 ;RECT
STATEA EQU MINRECT-RGNREC ;RGN STATE RECORD
STATEB EQU STATEA-RGNREC ;RGN STATE RECORD
STATEC EQU STATEB-RGNREC ;RGN STATE RECORD
SAVESTK EQU STATEC-4 ;LONG
RECTFLAG EQU SAVESTK-2 ;WORD
MASKBUF EQU RECTFLAG-4 ;LONG
BUFLEFT EQU MASKBUF-2 ;WORD
BUFSIZE EQU BUFLEFT-2 ;WORD
MODECASE EQU BUFSIZE-4 ;LONG
DSTLEFT EQU MODECASE-4 ;LONG
SAVEA5 EQU DSTLEFT-4 ;LONG
PORT EQU SAVEA5-4 ;LONG
FASTFLAG EQU PORT-2 ;BYTE
EXTRARECT EQU FASTFLAG-8 ;RECT
INNEROVAL EQU EXTRARECT-OVALSIZE ;OVAL RECORD
OUTEROVAL EQU INNEROVAL-OVALSIZE ;OVAL RECORD
SKIPTOP EQU OUTEROVAL-2 ;WORD
SKIPBOT EQU SKIPTOP-2 ;WORD
ARCFLAG EQU SKIPBOT-1 ;BYTE FLAG
SKIPFLAG EQU ARCFLAG-1 ;BYTE FLAG
STOPANGLE EQU SKIPFLAG-2 ;INTEGER
MIDVERT EQU STOPANGLE-2 ;INTEGER
MIDHORIZ EQU MIDVERT-2 ;INTEGER
WIDTH EQU MIDHORIZ-2 ;INTEGER
HEIGHT EQU WIDTH-2 ;INTEGER
SLOPE1 EQU HEIGHT-4 ;LONG, FIXED POINT
SLOPE2 EQU SLOPE1-4 ;LONG, FIXED POINT
LINE1 EQU SLOPE2-4 ;LONG, FIXED POINT
LINE2 EQU LINE1-4 ;LONG, FIXED POINT
FLAG1 EQU LINE2-2 ;WORD
FLAG2 EQU FLAG1-2 ;WORD
OUTERLEFT EQU FLAG2-2 ;WORD
OUTERRIGHT EQU OUTERLEFT-2 ;WORD
INNERLEFT EQU OUTERRIGHT-2 ;WORD
INNERRIGHT EQU INNERLEFT-2 ;WORD
PATINDEX EQU INNERRIGHT-2 ;WORD
VARSIZE EQU PATINDEX ;SIZE OF LOCAL VARIABLES
MOVE.L DSTRECT(A6),A0 ;POINT TO DSTRECT
MOVE TOP(A0),A1
ADD BOTTOM(A0),A1
MOVE.L A1,D0
ASR.L #1,D0
MOVE D0,MIDVERT(A6) ;MID VERT := (DSTBOT+DSTTOP)/2
MOVE LEFT(A0),A1
ADD RIGHT(A0),A1
MOVE.L A1,D0
ASR.L #1,D0
MOVE D0,MIDHORIZ(A6) ;MID HORIZ := (DSTLEFT+DSTRIGHT)/2
jmpOld
ENDPROC
;---------------- This stuff taken from PatchSEROM and PatchPlusROM ---------
;___________________________________________________________________________
; Patch PMA361 18Jan88 AWC StdPoly from QuickPolysClassicPatch.a
;
; Fix File Date Patch# Fix Routine(s) Routine(s) Fixed
;AppleSystemPatch PatchSEROM.a 18Jan88 #PMA361 (StdPoly) (StdPoly)
;
; This patch speeds up polygons ENORMOUSLY (well, maybe just a fair bit).
; But wait -- there's more! You also get this non-explosive way of drawing polygons!
PatchPMA361 PROC EXPORT
INCLUDE 'QuickPolysClassicPatch.a'
;---------------- End of stuff taken from PatchSEROM and PatchPlusROM -------
VisRgnChanged PROC EXPORT ;<26MAR90 KON>
;-----------------------------------------------------------
;
; Procedure VisRgnChanged(thePort: GrafPort);
;
; This call will be needed for video windows so the mask plane
; for touchstone can be updated. Non-video QD simply returns.
;
rts
ENDPROC
StretchBits PROC EXPORT
IMPORT RgnBlt,RSect,ShieldCursor,ShowCursor
IMPORT InitRgn,SeekRgn,SetupStretch,ColorMap,XorSlab
;--------------------------------------------------------------
;
; PROCEDURE StretchBits(srcBits,dstBits: BitMap;
; srcRect,dstRect: Rect;
; mode: INTEGER
; rgnA,rgnB,rgnC: RgnHandle);
;
; Transfer a rectangle of bits from srcBits to dstBits,
; stretching or compressing according to srcRect and dstRect.
; The transfer is clipped to the intersection of rgnA, rgnB, and rgnC.
;
;
; Restrictions:
;
; transfer mode 0..7 only.
; if numer <> denom, then src and dst bitmaps do not overlap.
;
;
; COPYRIGHT APPLE COMPUTER INC.
; DESIGNED AND WRITTEN BY BILL ATKINSON
;
;----------------------------------------------------
;
; A6 OFFSETS OF PARAMETERS AFTER LINK:
;
PARAMSIZE EQU 30 ;TOTAL BYTES OF PARAMETERS
SRCBITS EQU PARAMSIZE+8-4 ;LONG, ADDR OF BITMAP
DSTBITS EQU SRCBITS-4 ;LONG, ADDR OF BITMAP
SRCRECT EQU DSTBITS-4 ;LONG, ADDR OF RECT
DSTRECT EQU SRCRECT-4 ;LONG, ADDR OF RECT
MODE EQU DSTRECT-2 ;WORD
RGNA EQU MODE-4 ;RGNHANDLE
RGNB EQU RGNA-4 ;RGNHANDLE
RGNC EQU RGNB-4 ;RGNHANDLE
;-------------------------------------------------
;
; A6 OFFSETS OF LOCAL VARIABLES AFTER LINK:
;
NUMER EQU -4 ;POINT
DENOM EQU NUMER-4 ;POINT
VERROR EQU DENOM-4 ;INTEGER
MINRECT EQU VERROR-8 ;RECT
SRCBUF EQU MINRECT-4 ;LONG
DSTBUF EQU SRCBUF-4 ;LONG
SRCLONGS EQU DSTBUF-2 ;WORD
DSTLONGS EQU SRCLONGS-2 ;WORD
STATEA EQU DSTLONGS-RGNREC ;RGN STATE RECORD
STATEB EQU STATEA-RGNREC ;RGN STATE RECORD
STATEC EQU STATEB-RGNREC ;RGN STATE RECORD
SAVESTK EQU STATEC-4 ;LONG
RECTFLAG EQU SAVESTK-2 ;WORD
MASKBUF EQU RECTFLAG-4 ;LONG
BUFLEFT EQU MASKBUF-2 ;WORD
BUFSIZE EQU BUFLEFT-2 ;WORD
SRCADDR EQU BUFSIZE-4 ;LONG
DSTADDR EQU SRCADDR-4 ;LONG
SRCROW EQU DSTADDR-4 ;LONG
DSTROW EQU SRCROW-4 ;LONG
SRCLIMIT EQU DSTROW-4 ;LONG
VERT EQU SRCLIMIT-2 ;WORD
MODECASE EQU VERT-4 ;LONG
PAT EQU MODECASE-4 ;LONG, ADDR OF PAT
RATIOCASE EQU PAT-4 ;LONG
HORIZFRACTION EQU RATIOCASE-2 ;WORD
VARSIZE EQU HORIZFRACTION ;SIZE OF LOCAL VARIABLES
LINK A6,#VARSIZE ;ALLOCATE LOCAL VARIABLES
MOVEM.L D0-D7/A1-A4,-(SP) ;SAVE REGS
MOVE.L SP,SAVESTK(A6) ;REMEMBER STACK FOR LATER
;----------------------------------------------------------------
;
; CALC NUMER AND DENOM BASED ON DSTRECT AND SRCRECT.
; IF NUMER = DENOM THEN JUST CALL RGNBLT.
;
MOVE.L DSTRECT(A6),A0 ;POINT TO DSTRECT
MOVE BOTTOM(A0),D0
SUB TOP(A0),D0 ;CALC DST HEIGHT
SWAP D0 ;PUT IN HI WORD
MOVE RIGHT(A0),D0
SUB LEFT(A0),D0 ;CALC DST WIDTH
MOVE.L SRCRECT(A6),A0 ;POINT TO SRCRECT
MOVE BOTTOM(A0),D1
SUB TOP(A0),D1 ;CALC SRC HEIGHT
SWAP D1 ;PUT IN HI WORD
MOVE RIGHT(A0),D1
SUB LEFT(A0),D1 ;CALC SRC WIDTH
CMP.L D0,D1 ;ARE BOTH RECTS SAME SIZE
BNE.S STRETCH ;NO, CAN'T USE RGNBLT
XRGNBLT
jmpROM ROMXRGNBLT ;back to the ROM
; MOVE.L SRCBITS(A6),-(SP) ;PUSH SRCBITS
; MOVE.L DSTBITS(A6),-(SP) ;PUSH DSTBITS
; MOVE.L SRCRECT(A6),-(SP) ;PUSH SRCRECT
; MOVE.L DSTRECT(A6),-(SP) ;PUSH DSTRECT
; MOVE MODE(A6),-(SP) ;PUSH MODE
; MOVE.L PAT(A6),-(SP) ;PAT ONLY USED FROM BELOW
; MOVE.L RGNA(A6),-(SP) ;PUSH RGNA
; MOVE.L RGNB(A6),-(SP) ;PUSH RGNB
; MOVE.L RGNC(A6),-(SP) ;PUSH RGNC
; JSR RGNBLT ;CALL RGNBLT
; BRA GOHOME ;AND QUIT
MiniHeadPatch
moveq #0,d0 ; <KON 6NOV90>
MyJumpLoc
jmp $40800000 ; <KON 6NOV90>
STRETCH MOVE.L D0,NUMER(A6) ;NUMER := DST SIZE
MOVE.L D1,DENOM(A6) ;DENOM := SRC SIZE
jsrROM ROMSetupStretch ;CALC CASEJUMP AND HORIZ FRACT <KON 6NOV90>
lea MyJumpLoc+2,a1 ; <KON 6NOV90>
move.l a0,(a1) ;Save address of routine <KON 6NOV90>
lea MiniHeadPatch,a0 ;Address of my head patch <KON 6NOV90>
jmpROM ROMBackToROM ; <KON 6NOV90>
; MOVE.L A0,RATIOCASE(A6) ;SAVE CASE JUMP FOR LATER
; MOVE D0,HORIZFRACTION(A6) ;SAVE FRACTION FOR LATER
ROMXRGNBLT ROMBind (Plus, $D09A), (SE, $17816), (Portable, $24BD4)
ROMSetupStretch ROMBind (Plus, $D52E), (SE, $17CAA), (Portable, $25068)
ROMBackToROM ROMBind (Plus, $D0D2), (SE, $1784E), (Portable, $24C0C)
ENDPROC
NewStdGetPic FUNC EXPORT
;------------------------------------------------------------------
;
; PROCEDURE StdGetPic(dataPtr: QDPtr; byteCount: INTEGER);
; Fix File Date Patch# Fix Routine(s) Routine(s) Fixed
;AppleSystemPatch DrawPicturePatch.a 01Jan1904 #??? (StdGetPic) (StdGetPic)
;
;
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
;----------------------------------
;
; procedure RGBForeColor (Color : RGBColor);
; procedure RGBBackColor (Color : RGBColor);
; procedure GetForeColor (VAR Color : RGBColor);
; procedure GetBackColor (VAR Color : RGBColor);
; <14Sept90 KON>
;
RGBForeColor PROC EXPORT
EXPORT RGBBackColor
IMPORT RGB2OLD
MOVEQ #FGCOLOR,D0 ; get offset to index field
SHARE MOVE.L 4(SP),A1 ; point at the RGB color
MOVE.L GRAFGLOBALS(A5),A0 ; get the QuickDraw globals pointer
MOVE.L THEPORT(A0),A0 ; point at the port
PEA 0(A0,D0) ; save pointer to the index field
JSR RGB2OLD ; else convert RGB to old color
DONE MOVE.L (SP)+,A0 ; get pointer to index field
MOVE.L D0,(A0) ; and set the index field
RTD_a0 4 ; all done
;
; procedure RGBBackColor (Color : RGBColor);
;
; This routine takes an RGB triple and sets the current Graf- or CGrafPort
; fields so that drawing will take place with the best match of the
; requested color, using the current GDevice's color matching rules. The
; appropriate fields are set depending on portType.
;
RGBBackColor
MOVEQ #BKCOLOR,D0 ; get offset to the index field
BRA.S SHARE ; => and use common code
ENDPROC
;
; PROCEDURE GetForeColor (VAR Color: RGBColor);
;
; Return the RGB components of the current foreground color
; Works for old and new ports.
GetForeColor PROC EXPORT
EXPORT GetBackColor
MOVEQ #FGCOLOR,D0 ; get offset to the index field
MOVEQ #RGBFgColor,D1 ; get offset to RGB field
SHARE MOVE.L 4(SP),A1 ; point at the RGB color
MOVE.L GRAFGLOBALS(A5),A0 ; get the QuickDraw globals pointer
MOVE.L THEPORT(A0),A0 ; point at the port
; USE CMYB BITS IN COLOR TO DERIVE PROPER RGB COMPONENTS
MOVE.L (A0,D0),D0 ; get planar color from port
LSR #1,D0 ; CHECK FOR WHITE (I CMYB rgbw)
BCS.S @BLACK ; =>NOT WHITE
OR #$00E0,D0 ; ELSE SET WHITE BITS (CMY = 111)
@BLACK LSR #5,D0 ; SHIFT ICMY INTO LOW NIBBLE
AND #$7,D0 ; CLEAR ALL BUT CMY
lea InLineQDColors,A0 ; GET DEFAULT COLORS
; LEA 2(A0,D0*8),A0 ; point to proper entry
lsl.w #3,d0 ;d0*8
lea 2(a0,d0),a0 ;point to entry
MOVE.L (A0)+,(A1)+ ; copy red, green
MOVE (A0)+,(A1)+ ; copy blue
; MOVE.L red(A0,D1),red(A1) ; copy red and green components from the port <34>
; MOVE.W blue(A0,D1),blue(A1) ; and blue too <34>
DONE MOVE.L (SP)+,A0 ; get the return address
ADDQ #4,SP ; get rid of the parameter
JMP (A0) ; and return
;
; On color machines this table resides in low memory pointed to by the QDColors global
; variable.
;
InLineQDColors
dc.w $0000, $0000, $0000, $0000 ;0 black
dc.w $0001, $FC00, $F37D, $052F ;1 yellow
dc.w $0002, $F2D7, $0856, $84EC ;2 magenta
dc.w $0003, $DD6B, $08C2, $06A2 ;3 red
dc.w $0004, $0241, $AB54, $EAFF ;4 cyan
dc.w $0005, $0000, $8000, $11B0 ;5 green
dc.w $0006, $0000, $0000, $D400 ;6 blue
dc.w $0007, $FFFF, $FFFF, $FFFF ;7 white
;
; PROCEDURE GetBackColor (VAR Color: RGBColor);
;
; Return the RGB components of the current background color
; Works for old and new ports.
;
GetBackColor
MOVEQ #BKCOLOR,D0 ; get offset to the index field
MOVEQ #RGBBkColor,D1 ; get offset to RGB field
BRA.S SHARE ; and use common code
ENDPROC
QDError PROC EXPORT
clr.w 4(a7)
rts
ENDPROC
OpenCPicture FUNC EXPORT
IMPORT HidePen,NewRgn,ClipRect,DPutPicOp,DPutPicByte,PUTPICWORD,PUTPICDATA
;------------------------------------------------------
;
; 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
;------------------------------------------------------------------
;
; FUNCTION OpenCPicture(picParams: params): 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 ;<29>
; moveq #0,d1 ;extend d1 to long in copy: don't trash high word <KON>
; move.w d2,d1 ;<29>
; clr.w d2 ;<29>
move.l picHdrRec+hdrHRes(a6),d0 ;<29>
beq.s @skip ;<29>
move.l a0,-(sp) ;save d1 (which has been moved to a0
subq #4,sp
move.l d2,-(sp) ;longint/fixed = longint
move.l d0,-(sp)
_FixDiv
move.l (sp)+,d2 ;longint result, only interested in bottom word portion
;<29> swap d2 ;get quotient (decimal part) in low word
move.l (sp)+,d1 ;restore d1
; 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 ;<29>
; swap d1 ;<29>
; move.w d1,d2 ;<29>
; clr.w d1 ;<29>
subq #4,sp
move.l d1,-(sp) ;longint/fixed = longint
move.l d0,-(sp)
_FixDiv
move.l (sp)+,d1 ;longint result, only interested in low word <29>
;<29> swap d1 ;get quotient (decimal part) in low word
; divu.l d0,d2:d1 ;d1.w = (height*72)/vRes
move.w d1,defaultFrame+bottom(a6) ;bottom = new height
@skip
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
; ALLOCATE PICSAVE RECORD
MOVE.L #picSaveRec,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
clr.l (a4)+ ;picQdChExtra := 0
clr.l (a4)+ ;picQdRunSlop := 0
;
; 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
; INIT GLYPH STATE TO INVALID
move.l #$80808080,picGlyphState(a1) ; set glyph state to invalid values
; PUT VERSION NUMBER TO PICTURE
move.w #1,picVersion(a1) ;picVersion := new picture (non-zer)
MOVEQ #opVersion,D0 ;GET VERSION OPCODE
JSR DPutPicOp ;PUT TO PICTURE
MOVE SAVEVERSION(A6),D0 ;GET VERSION NUMBER
; For new pictures, put version as word, followed by header
@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,'OPENCPIC'
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 DPutPicByte,PutPicWord,PutPicLong,PutPicPat,DoPict2
;------------------------------------------------------
;
; PROCEDURE PutPicVerb(verb: GrafVerb);
;
; check additional picture params associated with
; this verb, and add those that have changed to thePic.
;
PARAMSIZE EQU 2
VERB EQU PARAMSIZE+8-2 ;BYTE
LINK A6,#0 ;NO LOCAL VARS
MOVEM.L D5-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 BASSED ON VERB
BLT FRAME1
BEQ PAINT1 ;YES CHECK PNMODE, PNPAT
CMP.B #INVERT,D7 ;IS VERB INVERT ?
BEQ DONE ;YES, NOTHING TO CHECK
BLT.S ERASE1
FILL1 MOVE.L FILLPAT(A3),D5 ;GET FILLPAT
MOVE.L FILLPAT+4(A3),D6
CMP.L PICFILLPAT(A4),D5 ;SAME AS PICFILLPAT ?
BNE.S @1 ;NO, PUT CHANGE TO THEPIC
CMP.L PICFILLPAT+4(A4),D6
BEQ DONE
@1 MOVE.L D5,PICFILLPAT(A4) ;UPDATE STATE VARIABLE
MOVE.L D6,PICFILLPAT+4(A4)
;
; Do alignement for new pictures
;
; tst.w picVersion(a4)
; beq.s @Pict1
jsr DoPict2 ;align for PICT2
;@Pict1
MOVEQ #$0A,D0 ;PUSH FILLPAT OPCODE
JSR DPutPicByte ;ADD TO THEPIC
PEA FILLPAT(A3)
JSR PutPicPat ;PUT PATTERN DATA
BRA DONE ;AND QUIT
ERASE1 MOVE.L BKPAT(A3),D5 ;GET BKPAT
MOVE.L BKPAT+4(A3),D6
CMP.L PICBKPAT(A4),D5 ;SAME AS PICBKPAT ?
BNE.S NEWBK ;NO, PUT CHANGE TO THEPIC
CMP.L PICBKPAT+4(A4),D6
BEQ DONE
NEWBK MOVE.L D5,PICBKPAT(A4) ;UPDATE STATE VARIABLE
MOVE.L D6,PICBKPAT+4(A4)
;
; Do alignement for new pictures
;
; tst.w picVersion(a4)
; beq.s @Pict1
jsr DoPict2 ;align for PICT2
;@Pict1
MOVEQ #$02,D0 ;BKPAT OPCODE
JSR DPutPicByte ;ADD TO THEPIC
PEA BKPAT(A3)
JSR PutPicPat ;PUT PATTERN DATA
BRA DONE ;AND QUIT
FRAME1 MOVE.L PNSIZE(A3),D6 ;GET PNSIZE
CMP.L PICPNSIZE(A4),D6 ;HAS IT CHANGED ?
BEQ.S PAINT1 ;NO, CONTINUE
;
; Do alignement for new pictures
;
; tst.w picVersion(a4)
; beq.s @Pict1
jsr DoPict2 ;align for PICT2
;@Pict1
MOVEQ #$07,D0
JSR DPutPicByte ;YES, PUT PNSIZE OPCODE
MOVE.L D6,-(SP)
JSR PutPicLong ;PUT NEW PNSIZE
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
MOVE.L D6,PICPNSIZE(A4) ;AND UPDATE STATE VARIABLE
PAINT1 MOVE PNMODE(A3),D6 ;GET PNMODE
CMP PICPNMODE(A4),D6 ;HAS IT CHANGED ?
BEQ.S MODEOK ;NO, CONTINUE
;
; Do alignement for new pictures
;
; tst.w picVersion(a4)
; beq.s @Pict1
jsr DoPict2 ;align for PICT2
;@Pict1
MOVEQ #$08,D0
JSR DPutPicByte ;YES, PUT PNMODE OPCODE
MOVE D6,-(SP)
JSR PutPicWord ;PUT NEW PNMODE
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
MOVE D6,PICPNMODE(A4) ;AND UPDATE STATE VARIABLE
MODEOK MOVE.L PNPAT(A3),D5 ;GET PNPAT
MOVE.L PNPAT+4(A3),D6
CMP.L PICPNPAT(A4),D5 ;SAME AS PICPNPAT ?
BNE.S @1 ;NO, PUT CHANGE TO THEPIC
CMP.L PICPNPAT+4(A4),D6
BEQ.S DONE
@1 MOVE.L D5,PICPNPAT(A4) ;UPDATE STATE VARIABLE
MOVE.L D6,PICPNPAT+4(A4)
;
; Do alignment for new pictures
;
; tst.w picVersion(a4)
; beq.s @Pict1
jsr DoPict2 ;align for PICT2
;@Pict1
MOVEQ #$09,D0 ;PNPAT OPCODE
JSR DPutPicByte ;ADD TO THEPIC
PEA PNPAT(A3)
JSR PutPicPat ;PUT PATTERN DATA
DONE
;
; Do alignment for new pictures: align for next opcode
;
; tst.w picVersion(a4)
; beq.s @Pict1
jsr DoPict2 ;align for PICT2
;@Pict1
MOVEM.L (SP)+,D5-D7/A3-A4 ;RESTORE REGS
UNLINK PARAMSIZE,'PUTPICVERB'
ENDP
PutPicData PROC EXPORT
EXPORT DPutPicByte, PutPicByte, PutPicWord, PutPicLong
IMPORT ROMDPutPicByte, ROMPutPicByte, ROMPutPicWord, ROMPutPicLong
jmpROM ROMPutPicData
DPutPicByte
jmpROM ROMDPutPicByte
PutPicWord
jmpROM ROMPutPicWord
PutPicLong
jmpROM ROMPutPicLong
PutPicByte
jmpROM ROMPutPicByte
ENDPROC
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
tst.w 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
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
tst PICVERSION(A0) ;IS IT AN OLD PICTURE? <KON 12FEB90>
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
ENDPROC
;____________________________________________________________________________________
; PB399 StdBits Patch
;
; Fix File Date Patch# Fix Routine(s) Routine(s) Fixed
;AppleSystemPatch PatchPlusROM.a 21Feb88 PMAB399 StdBits StdBits
;
; An earlier patch fixed PackBits to work with scanlines longer than 127 bytes. Unfortunately,
; when pict recording, StdBits JSRs rather than traps to PackBits, so the earlier patch
; didn't help that much. This (big) patch fixes StdBits to trap to the new routine.
;
PatchStdBits PROC EXPORT
IMPORT CheckPic, DoPict2
IMPORT PutPicByte,PutPicWord,PutPicData
;---------------------------------------------------------------
;
; PROCEDURE StdBits(VAR srcBits: BitMap;
; VAR srcRect: Rect;
; VAR dstRect: Rect;
; mode: INTEGER;
; maskRgn: RgnHandle);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 18
SRCBITS EQU PARAMSIZE+8-4 ;LONG, ADDR OF BITMAP
SRCRECT EQU SRCBITS-4 ;LONG, ADDR OF RECT
DSTRECT EQU SRCRECT-4 ;LONG, ADDR OF RECT
MODE EQU DSTRECT-2 ;WORD
MASKRGN EQU MODE-4 ;LONG, RGNHANDLE
MYBITS EQU -14 ;BITMAP
SRCPTR EQU MYBITS-4 ;LONG
DSTPTR EQU SRCPTR-4 ;LONG
PACKBUF EQU DSTPTR-4 ;POINTER TO PACKING BUFFER
SAVEDSP EQU PACKBUF-4 ;PRESERVE STACK POINTER
VARSIZE EQU SAVEDSP
LINK A6,#VARSIZE ;ALLOCATE STACK FRAME
MOVEM.L D3-D7/A2-A4,-(SP) ;SAVE REGS
JSR CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
BGT.S @100 ;BRANCH IF PICSAVE
JMPROM ROMStdBitsNotPic ;continue in ROM
@100
MOVE.L SP,SAVEDSP(A6) ;PRESERVE STACK POINTER
MOVEQ #8,D6
;
; TRIM SRCBITS
;
MOVE.L SRCBITS(A6),A0 ;GET ADDR OF SRCBITS
LEA MYBITS(A6),A1 ;POINT TO MY COPY
MOVE.L BASEADDR(A0),A3 ;GET BASEADDR (CLOBBERS A3)
MOVE ROWBYTES(A0),D4 ;GET OLD ROWBYTES
MOVE.L BOUNDS+TOPLEFT(A0),BOUNDS+TOPLEFT(A1) ;COPY BOUNDS TOPLEFT
MOVE.L BOUNDS+BOTRIGHT(A0),BOUNDS+BOTRIGHT(A1) ;COPY BOUNDS BOTRIGHT
MOVE.L SRCRECT(A6),A0 ;POINT TO SRCRECT
MOVE TOP(A0),D0 ;GET SRCRECT.TOP
SUB BOUNDS+TOP(A1),D0 ;SKIPTOP:=SRCRECT.TOP-BOUNDS.TOP
BLE.S TOPOK ;CONTINUE IF SKIPTOP NEG
ADD D0,BOUNDS+TOP(A1) ;NEWTOP := SRCRECT TOP
MULU D4,D0 ;CALC VERT OFFSET
ADD.L D0,A3 ;ADJUST BASEADDR
TOPOK MOVE BOTTOM(A0),D0 ;GET SRCRECT.BOTTOM
CMP BOUNDS+BOTTOM(A1),D0 ;IS SRCRECT BOT < BOUNDS BOT ?
BGE.S BOTOK ;NO, CONTINUE
MOVE D0,BOUNDS+BOTTOM(A1) ;YES, TRIM BOUNDS BOTTOM
BOTOK MOVE LEFT(A0),D0 ;GET SRCRECT.LEFT
SUB BOUNDS+LEFT(A1),D0 ;CALC SKIPLEFT
BLE.S LEFTOK ;CONTINUE IF SKIPLEFT NEG
LSR #3,D0 ;DIV BY 8 FOR SKIP BYTES
ADD D0,A3 ;OFFSET BASEADDR HORIZ
LSL #3,D0 ;BYTES TIMES 8 FOR DOTS
ADD D0,BOUNDS+LEFT(A1) ;ADD DOTS TO BOUNDS.LEFT
LEFTOK MOVE RIGHT(A0),D0 ;GET SRCRECT.RIGHT
SUB BOUNDS+LEFT(A1),D0 ;CONVERT TO GLOBAL
ADD #7,D0 ;ROUND UP
LSR #3,D0 ;TO NEXT MULT OF 8
LSL #3,D0
ADD BOUNDS+LEFT(A1),D0 ;RETURN TO LOCAL
CMP BOUNDS+RIGHT(A1),D0 ;IS RESULT < BOUNDS.RIGHT ?
BGE.S RIGHTOK ;NO, CONTINUE
MOVE D0,BOUNDS+RIGHT(A1) ;YES, TRIM RIGHT
RIGHTOK
;
; CALC NEW ROWBYTES AFTER TRIMMING
;
MOVE BOUNDS+RIGHT(A1),D5 ;GET TRIMMED RIGHT
SUB BOUNDS+LEFT(A1),D5 ;CALC WIDTH
ADD #15,D5 ;ROUND UP
LSR #4,D5 ;DIV BY 16
BGT.S @200 ;continue if greater than 0
; MOVE.L SAVEDSP(A6),SP ;RESTORE STACK POINTER
JMPROM ROMStdBitsOK ;IGNORE IF NEWROW <= 0
@200
ADD D5,D5 ;DOUBLE FOR NEW ROWBYTES
MOVE D5,ROWBYTES(A1) ;COPY ROWBYTES
MOVE.B #$90,-(SP) ;PUSH OPCODE=BITSRECT
TST.L MASKRGN(A6) ;IS MASKRGN NIL ?
BEQ.S NOTRGN ;YES, CONTINUE
ADD.B #1,(SP) ;REPLACE OPCODE=BITSRGN (IE. $91)
NOTRGN CMP D6,D5 ;IS NEWROW < 8 ?
BLT.S NOPACK ;YES, DONT BITPACK
ADD.B #8,(SP) ;SET BIT 3 FOR BITPACK
NOPACK
jsr DoPict2 ;align for PICT2 <17Sept90 KON>
JSR PutPicByte ;PUT OPCODE TO THEPIC
PEA MYBITS+ROWBYTES(A6) ;PUSH ADDR OF ROWBYTYES,BOUNDS
MOVE #10,-(SP) ;PUSH BYTECOUNT = 10
JSR PutPicData ;PUT ROWBYTES,BOUNDS TO THEPIC
MOVE.L SRCRECT(A6),-(SP)
MOVE D6,-(SP)
JSR PutPicData ;PUT SRCRECT
MOVE.L DSTRECT(A6),-(SP)
MOVE D6,-(SP)
JSR PutPicData ;PUT DSTRECT
MOVE MODE(A6),-(SP)
JSR PutPicWord ;PUT MODE
TST.L MASKRGN(A6) ;IS MASKRGN NIL ?
BEQ.S NOMASK ;YES, SKIP IT
MOVE.L MASKRGN(A6),-(SP) ;NO, PUSH MASKRGN
JSRROM ROMPutPicRgn ;PUT MASKRGN TO THEPIC
NOMASK
;
; NOW PUT THE BITMAP DATA: IF NEWROW >= 8 THEN USE PACKBITS
;
LEA MYBITS(A6),A2 ;POINT TO (TRIMMED) BITMAP
MOVE BOUNDS+BOTTOM(A2),D7
SUB BOUNDS+TOP(A2),D7 ;HEIGHT := BOUNDS BOT - TOP
CMP D6,D5 ;IS NEWROW < 8 ?
BGE.S @PackIt ;No, use packing
; MOVE.L SAVEDSP(A6),SP ;RESTORE STACK POINTER
jmpROM ROMStdBitsStart2 ;continue in ROM
;----------------------------------------------------------------
;
; MAKE SURE THE STACK IS ON A LONGWORD BOUNDARY (FOR FAST BUFFERS)
;
@PackIt
MOVE.L SP,D1 ;GET THE STACK POINTER
AND.B #$FC,D1 ;FORCE LONG ALIGNMENT
MOVE.L D1,SP ;USE IT
;----------------------------------------------------------------
;
; ALLOCATE PACKBUF ON THE STACK
;
SUB D5,SP ;SET SIZE OF PACKBUF
SUB D5,SP ;TO 2*ROWBYTES FOR LONG ALIGNMENT
MOVE.L SP,PACKBUF(A6) ;POINT TO PACKBUF
;----------------------------------------------------------------
;
; ROWBYTES >= 8, WRITE THE PACKED BIT/PIXMAP TO THE PICTURE
;
; PACKED FORMAT = [BYTECOUNT][DATA] FOR EACH SCANLINE
;
; IF ROWBYTES > 250 THEN BYTECOUNT IS A WORD, ELSE IT IS A BYTE
;
BRA.S START1 ;GO TO LOOP START
MORE1 MOVE.L A3,SRCPTR(A6) ;SRCPTR := ^SCANLINE DATA
move.l PACKBUF(A6),A0
MOVE.L A0,DSTPTR(A6) ;DSTPTR := @PACKBUF
PEA SRCPTR(A6) ;PUSH VAR SRCPTR
PEA DSTPTR(A6) ;PUSH VAR DSTPTR
MOVE D5,-(SP) ;PUSH SRCBYTES = NEWROW
_PackBits ;PACK ROW INTO PACKBUF (here's the fix!) <PMA399/DAF>
MOVE.L DSTPTR(A6),D6 ;GET UPDATED DSTPTR
move.l PACKBUF(A6),A0 ;POINT TO PACKBUF
SUB.L A0,D6 ;CALC PACKED BYTECOUNT
CMP #250,D5 ;IS ROWBYTES > 250?
BGT.S @1 ;=>YES, PUT WORD
MOVE.B D6,-(SP) ;ELSE PUSH THE BYTE
JSR PUTPICBYTE ;AND PUT TO PICTURE
BRA.S @2 ;=>AND GO PUT DATA
@1 MOVE.W D6,-(SP) ;PUSH PACKED BYTECOUNT
JSR PUTPICWORD ;PUT THE WORD
@2 MOVE.L PACKBUF(A6),-(SP)
MOVE D6,-(SP)
JSR PutPicData ;PUT PACKED DATA TO THEPIC
ADD D4,A3 ;ADD OLDROW TO BITS PTR
START1 DBRA D7,MORE1 ;LOOP FOR HEIGHT ROWS
MOVE.L SAVEDSP(A6),SP ;RESTORE STACK POINTER
jmpROM ROMStdBitsOK ;and continue in ROM
PortablePatchStdPoly PROC EXPORT
IMPORT CheckPic
;---------------------------------------------------------------
;
; PROCEDURE StdPoly(verb: GrafVerb; poly: PolyHandle);
;
; A6 OFFSETS OF PARAMS AND LOCALS AFTER LINK:
;
PARAMSIZE EQU 6
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
POLY EQU VERB-4 ;LONG, PolyHandle
MINRECT EQU -8 ;RECT
VARSIZE EQU MINRECT ;TOTAL BYTES OF LOCALS
LINK A6,#VARSIZE ;ALLOCATE STACK FRAME
MOVEM.L D5-D7/A2-A4,-(SP) ;SAVE REGS
MOVE.B VERB(A6),D7 ;GET VERB
JSR CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
MOVE.B D7,-(SP)
peaROM ROMStdPolyRtn
jmp PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
NotPic
jmpROM ROMStdPolyNotPic
ENDPROC
PatchStdRect PROC EXPORT
IMPORT CheckPic
;---------------------------------------------------------------
;
; PROCEDURE StdRect(verb: GrafVerb; r: Rect);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 6
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
RECT EQU VERB-4 ;LONG, ADDR OF RECT
LINK A6,#0 ;NO LOCALS
MOVEM.L D7/A3-A4,-(SP) ;SAVE REGS
MOVE.B VERB(A6),D7 ;GET VERB
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
MOVE.B D7,-(SP) ;PUSH VERB
peaROM ROMStdRectRtn
jmp PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
NotPic
jmpROM ROMStdRectNotPic
ENDPROC
PatchStdLine PROC EXPORT
IMPORT CheckPic
;---------------------------------------------------------------
;
; PROCEDURE StdLine(newPt: Point);
;
PARAMSIZE EQU 4
NEWPT EQU PARAMSIZE+8-4
LINK A6,#0 ;NO LOCAL VARS
MOVEM.L D5-D7/A3-A4,-(SP) ;SAVE REGS
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
MOVE.B #FRAME,-(SP) ;PUSH VERB
peaROM ROMStdLineRtn
jmp PutPicVerb ;CHECK pnSize, pnMode, pnPat
NotPic
jmpROM ROMStdLineNotPic
ENDPROC
PatchStdRRect PROC EXPORT
IMPORT CheckPic, DoPict2
;---------------------------------------------------------------
;
; PROCEDURE StdRRect(verb: GrafVerb; r: Rect; ovWd,ovHt: INTEGER);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 10
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
RECT EQU VERB-4 ;LONG, ADDR OF RECT
OVWD EQU RECT-2 ;WORD
OVHT EQU OVWD-2 ;WORD
LINK A6,#0 ;NO LOCALS
MOVEM.L D7/A3-A4,-(SP) ;SAVE REGS
MOVE.B VERB(A6),D7 ;GET VERB
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
MOVE.B D7,-(SP) ;PUSH VERB
jsr PutPicVerb
;
; CHECK FOR NEW OVAL SIZE
;
MOVE.L PICSAVE(A3),A0 ;GET PICSAVE HANDLE
MOVE.L (A0),A0 ;DE-REFERENCE PICSAVE
MOVE.L OVHT(A6),D0 ;GET OVWD AND OVHT
CMP.L PICOVSIZE(A0),D0 ;SAME AS CURRENT OVAL SIZE ?
BEQ.S OVALOK ;YES, CONTINUE
MOVE.L D0,PICOVSIZE(A0) ;NO, UPDATE STATE VARIABLE
MOVE.L D0,-(SP) ;PUSH OVSIZE FOR PutPicLong CALL
MOVEQ #$0B,D0
JSR DPutPicByte ;PUT OVSIZE OPCODE
JSR PutPicLong ;PUT NEW OVAL SIZE DATA
jsr DoPict2
OVALOK
jmpROM ROMStdRRectRtn
NotPic
jmpROM ROMStdRRectNotPic
ENDPROC
PatchStdOval PROC EXPORT
IMPORT CheckPic
;---------------------------------------------------------------
;
; PROCEDURE StdOval(verb: GrafVerb; r: Rect);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 6
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
RECT EQU VERB-4 ;LONG, ADDR OF RECT
OVWD EQU -2 ;WORD
OVHT EQU OVWD-2 ;WORD
VARSIZE EQU OVHT ;TOTAL BYTES OF LOCALS
LINK A6,#VARSIZE ;ALLOCATE STACK FRAME
MOVEM.L D7/A3-A4,-(SP) ;SAVE REGS
MOVE.B VERB(A6),D7 ;GET VERB
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
MOVE.B D7,-(SP) ;PUSH VERB
peaROM ROMStdOvalRtn
jmp PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
NotPic
jmpROM ROMStdOvalNotPic
ENDPROC
PatchStdArc PROC EXPORT
IMPORT CheckPic
;---------------------------------------------------------------
;
; PROCEDURE StdArc(verb: GrafVerb; r: Rect; startAngle,arcAngle: INTEGER);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
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
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
MOVE.B D7,-(SP) ;PUSH VERB
peaROM ROMStdArcRtn
jmp PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
NotPic
jmpROM ROMStdArcNotPic
ENDPROC
PatchStdRgnSEPortable PROC EXPORT
IMPORT CheckPic
;---------------------------------------------------------------
;
; PROCEDURE StdRgn(verb: GrafVerb; rgn: RgnHandle);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 6
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
RGN EQU VERB-4 ;LONG, RGNHANDLE
LINK A6,#0 ;NO LOCALS
MOVEM.L D6-D7/A2-A4,-(SP) ;SAVE REGS
MOVE.B VERB(A6),D7 ;GET VERB
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
MOVE.B D7,-(SP) ;PUSH VERB
peaROM ROMStdRgnRtn
jmp PutPicVerb ;PUT ADDIONAL PARAMS TO THEPIC
NotPic
jmpROM ROMStdRgnNotPic
ENDPROC
;
; Patch StdRgn differently on the Plus because PutRgn, which is called by
; StdDraw has a bug in it only on the Plus ROM.
;
PatchStdRgnPlus PROC EXPORT
IMPORT CheckPic,MyPutRgn
ROMNotRgn ROMBind (Plus, $BC46)
ROMNotFr ROMBind (Plus, $BC4C)
;---------------------------------------------------------------
;
; PROCEDURE StdRgn(verb: GrafVerb; rgn: RgnHandle);
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 6
VERB EQU PARAMSIZE+8-2 ;GRAFVERB
RGN EQU VERB-4 ;LONG, RGNHANDLE
LINK A6,#0 ;NO LOCALS
MOVEM.L D6-D7/A2-A4,-(SP) ;SAVE REGS
MOVE.B VERB(A6),D7 ;GET VERB
jsr CHECKPIC ;SET UP A4,A3 AND CHECK PICSAVE
BLE.S NOTPIC ;BRANCH IF NOT PICSAVE
MOVE.B D7,-(SP) ;PUSH VERB
JSR PutPicVerb ;PUT ADDITONAL PARAMS TO THEPIC
MOVE #$80,D0 ;PUT RGNNOUN IN HI NIBBLE
ADD D7,D0 ;PUT VERB IN LO NIBBLE
JSR DPutPicByte ;PUT OPCODE TO THEPIC <30>
MOVE.L RGN(A6),-(SP) ;PUSH RGNHANDLE
JSRROM ROMPutPicRgn ;PUT REGION TO THEPIC
NOTPIC MOVE.L RGN(A6),-(SP) ;PUSH RGNHANDLE
jsrROM ROMPushVerb ;PUSH MODE AND PATTERN
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 RGN(A6),-(SP) ;YES, PUSH RGNHANDLE
MOVE.L RGNBUF(A4),-(SP) ;PUSH RGNBUF
PEA RGNINDEX(A4) ;PUSH VAR RGNINDEX
PEA RGNMAX(A4) ;PUSH VAR RGNMAX
JSR MyPutRgn ;ADD INVERSION PTS TO THERGN
NOTRGN jmpROM ROMNotRgn
; JSR FrRgn ;FrRgn(rgn,pnMode,pnPat)
; BRA.S GOHOME
NOTFR jmpROM ROMNotFr
; JSR DrawRgn ;DrawRgn(rgn,mode,pat);
;GOHOME MOVEM.L (SP)+,D6-D7/A2-A4 ;RESTORE REGS
; UNLINK PARAMSIZE,'STDRGN '
ENDPROC
MyPutRgn PROC
IMPORT SETHSIZE
PlusPutRgnDone ROMBind (Plus, $C8BA)
PlusNotRect ROMBind (Plus, $C8A0)
PlusSetHSize ROMBind (Plus, $8798)
;----------------------------------------------------------------
;
; PROCEDURE PutRgn(Rgn: RgnHandle; bufHandle: Handle; VAR index,size: INTEGER);
;
; Expands a region out to an array of inversion points.
;
;------------------------------------------------
;
; A6 OFFSETS OF PARAMETERS AFTER LINK:
;
PARAMSIZE EQU 16 ;TOTAL SIZE OF PARAMETERS
RGNHANDLE EQU PARAMSIZE+8-4 ;LONG,RGNHANDLE
BUFHANDLE EQU RGNHANDLE-4 ;LONG, HANDLE
INDEX EQU BUFHANDLE-4 ;LONG, VAR
SIZE EQU INDEX-4 ;LONG, VAR
LINK A6,#0 ;NO LOCAL VARS
MOVEM.L D7/A2-A4,-(SP) ;SAVE REGS
;-------------------------------------------------------
;
; EXPAND BUF TO FIT WORST CASE BYTESNEEDED = RGNSIZE * 2
;
MOVE.L BUFHANDLE(A6),A4 ;GET BUFHANDLE
MOVE.L RGNHANDLE(A6),A3 ;GET RGNHANDLE
MOVE.L INDEX(A6),A2 ;POINT TO CURRENT INDEX
MOVE.L (A3),A0 ;DE-REFERENCE RGN
MOVE (A0),D7 ;GET RGNSIZE
ADD D7,D7 ;TIMES 2
ADD (A2),D7 ;ADD CURRENT INDEX
MOVE.L SIZE(A6),A1 ;POINT TO SIZE
CMP (A1),D7 ;IS REQUIRED > CURRENT SIZE ?
BLE.S NOGROW ;NO, CONTINUE
ADD #256,D7 ;GROW IN CHUNKS
MOVE D7,(A1) ;UPDATE CURRENT SIZE
MOVE.L A4,-(SP) ;PUSH BUFHANDLE
MOVE D7,-(SP) ;PUSH NEW SIZE
jsrROM PlusSetHSize ;MAKE ROOM IN BUF
MOVE.L (A3),A0 ;RE-DEREFERENCE RGNHANDLE
MOVE.L INDEX(A6),A2 ;GET ADDR OF INDEX AGAIN
NOGROW MOVE.L (A4),A1 ;DE-REFERENCE BUFHANDLE
ADD (A2),A1 ;ADD INDEX TO BUFPTR
CMP #10,RGNSIZE(A0) ;IS REGION RECTANGULAR ?
BNE.S NOTRECT ;NO, CONTINUE
ADD #2,A0 ;YES, POINT TO BBOX TOPLEFT
;
; Here's the patch that was left out of the Plus ROM <28FEB90 KON>
;
MOVE.L (A0),(A1)+ ;COPY TOPLEFT <EHB 26Sep86>
MOVE (A0)+,(A1)+ ;COPY TOP <EHB 26Sep86>
MOVE (A0)+,D0 ;GET LEFT <EHB 26Sep86>
MOVE.L (A0),D1 ;GET BOTRIGHT <EHB 26Sep86>
MOVE D1,(A1)+ ;COPY RIGHT <EHB 26Sep86>
MOVE (A0),(A1)+ ;COPY BOT <EHB 26Sep86>
MOVE D0,(A1)+ ;COPY LEFT <EHB 26Sep86>
MOVE.L D1,(A1)+ ;COPY BOTRIGHT <EHB 26Sep86>
jmpROM PlusPutRgnDone ;Back to ROM
; BRA.S DONE ;UPDATE INDEX AND QUIT
NOTRECT
jmpROM PlusNotRect
; LEA RGNDATA(A0),A0 ;POINT TO TOP VERT IN RGN
;NXTVERT MOVE.L (A0)+,D7 ;GET VERT AND HORIZ COORDS
;NXTHOR MOVE.L D7,(A1)+ ;PUT LEFT POINT TO DST
; MOVE (A0)+,D7 ;GET HORIZ COORD
; MOVE.L D7,(A1)+ ;PUT RIGHT POINT TO DST
; MOVE (A0)+,D7 ;GET NEXT HORIZ COORD
; CMP #32767,D7 ;END OF SCAN FLAG ?
; BNE NXTHOR ;NO, GO FOR MORE
; CMP #32767,(A0) ;END OF REGION ?
; BNE NXTVERT ;NO, LOOP FOR MORE
;DONE SUB.L (A4),A1 ;CALC DSTPTR - DSTSTART
; MOVE A1,(A2) ;UPDATE VAR INDEX
;GOHOME MOVEM.L (SP)+,D7/A2-A4 ;RESTORE REGISTERS
; UNLINK PARAMSIZE,'PUTRGN '
ENDPROC
PatchStdComment PROC EXPORT
IMPORT DoPict2
;---------------------------------------------------------------
;
; PROCEDURE StdComment
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
peaROM ROMStdComment
jmp DoPict2
ENDPROC
DoPict2 PROC EXPORT
IMPORT DPutPicByte
;
; if we are recording a PICT2, align pixSize by padding with zeros
;
MOVE.L GRAFGLOBALS(A5),A0 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A0),A0 ;GET CURRENT GRAFPORT
MOVE.L PICSAVE(A0),d0 ;GET PICSAVE HANDLE
beq.s @AllDone
move.l d0,a0
MOVE.L (A0),A0 ;DE-REFERENCE PICSAVE
tst PICVERSION(A0) ;IS IT AN OLD PICTURE?
BEQ.S @AllDone ;=>YES, DON'T PAD
MOVE.L THEPIC(A0),A0 ;GET THEPIC HANDLE <KON 6/4/92>
MOVE.L (A0),A0 ;POINT AT THE PIC <KON 6/4/92>
MOVE PICSIZE(A0),D0 ;GET THE LOW WORD OF THE SIZE <KON 6/4/92>
and.b #1,d0 ;odd?
beq.s @OneZero
moveq #0,d0
jsr DPutPicByte ;put d0=0 to picture
moveq #0,d0
@OneZero
jsr DPutPicByte ;should be odd aligned after this
@AllDone
rts ;return to called ROM routine
ENDPROC
CheckPic PROC EXPORT
IMPORT ROMEqualRgn,ROMCopyRgn
IMPORT DPutPicByte,PutPicLong
;---------------------------------------------------------------
;
; PROCEDURE CheckPic;
;
; PUT GRAFGLOBALS IN A4, THEPORT IN A3, AND CHECK PICSAVE.
; IF PICSAVE IS NIL, RETURN FLAGS LE.
;
; IF PICSAVE NOT NIL, RETURN FLAGS GT, AND
; CHECK FOR CHANGES IN FGCOLOR, BKCOLOR, ORIGIN, AND CLIPRGN.
;
;
MOVE.L D7,-(SP) ;SAVE REGS
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A4),A3 ;POINT TO CURRENT GRAFPORT
TST.L PICSAVE(A3) ;ARE WE SAVING FOR A PICTURE ?
BEQ DONE ;NO, QUIT
CMP #-1,PNVIS(A3) ;IS PEN HIDDEN MORE THAN ONE ?
BLT DONE ;YES, DON'T ADD TO THEPIC
MOVE.L PICSAVE(A3),A4 ;YES, GET PICSAVE HANDLE
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
;
; CHECK FOR CHANGES IN FOREGROUND COLOR
;
MOVE.L FGCOLOR(A3),D7 ;GET FORGROUND COLOR
CMP.L PICFGCOLOR(A4),D7 ;HAS IT CHANGED ?
BEQ.S FGCOLOK ;NO, CONTINUE
;
; Do alignement for new pictures
;
; tst.w picVersion(a4)
; beq.s @Pict1
jsr DoPict2 ;align for PICT2
;@Pict1
MOVEQ #$0E,D0
JSR DPutPicByte ;PUT FGCOLOR OPCODE
MOVE.L D7,-(SP)
JSR PutPicLong ;PUT FGCOLOR
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
MOVE.L D7,PICFGCOLOR(A4) ;UPDATE CURRENT STATE
FGCOLOK
;
; CHECK FOR CHANGES IN BACKGROUND COLOR
;
MOVE.L BKCOLOR(A3),D7 ;GET BACKGROUND COLOR
CMP.L PICBKCOLOR(A4),D7 ;HAS IT CHANGED ?
BEQ.S BKCOLOK ;NO, CONTINUE
;
; Do alignement for new pictures
;
; tst.w picVersion(a4)
; beq.s @Pict1
jsr DoPict2 ;align for PICT2
;@Pict1
MOVEQ #$0F,D0
JSR DPutPicByte ;PUT BKCOLOR OPCODE
MOVE.L D7,-(SP)
JSR PutPicLong ;PUT BKCOLOR PARAM
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
MOVE.L D7,PICBKCOLOR(A4) ;UPDATE CURRENT STATE
BKCOLOK
;
; CHECK FOR ORIGIN CHANGES
;
MOVE.L PORTRECT+TOPLEFT(A3),D0 ;GET PORTRECT.TOPLEFT
CMP.L PICORIGIN(A4),D0 ;SAME AS PIC ORIGIN ?
BEQ.S ORIGNOK ;YES, CONTINUE
MOVE PORTRECT+LEFT(A3),D7 ;GET PORTRECT LEFT
SUB PICORIGIN+H(A4),D7 ;CALC DH
ADD D7,PICORIGIN+H(A4) ;UPDATE STATE VARIABLE
SWAP D7 ;PUT DH IN HI WORD
MOVE PORTRECT+TOP(A3),D7 ;GET PORTRECT TOP
SUB PICORIGIN+V(A4),D7 ;CALC DV
ADD D7,PICORIGIN+V(A4) ;UPDATE STATE VARIABLE
;
; Do alignement for new pictures
;
; tst.w picVersion(a4)
; beq.s @Pict1
jsr DoPict2 ;align for PICT2
;@Pict1
MOVEQ #$0C,D0
JSR DPutPicByte ;PUT ORIGIN OPCODE TO THEPIC
MOVE.L D7,-(SP)
JSR PutPicLong ;PUT DH,DV TO THEPIC
MOVE.L PICSAVE(A3),A4 ;GET PICSAVE HANDLE
MOVE.L (A4),A4 ;DE-REFERENCE PICSAVE
;
; CHECK FOR CLIPRGN CHANGES
;
ORIGNOK CLR.B -(SP) ;MAKE ROOM FOR FCN VALUE
MOVE.L CLIPRGN(A3),-(SP) ;PUSH CLIPRGN
MOVE.L PICCLIPRGN(A4),-(SP) ;PUSH STATE VARIABLE
JSRROM ROMEqualRgn ;ARE THEY THE SAME ?
TST.B (SP)+ ;TEST RESULT
BNE.S CLIPOK ;QUIT IF SAME
MOVE.L CLIPRGN(A3),-(SP) ;SET UP FOR COPYRGN BELOW
MOVE.L PICCLIPRGN(A4),-(SP)
;
; Do alignement for new pictures
;
; tst.w picVersion(a4)
; beq.s @Pict1
jsr DoPict2 ;align for PICT2
;@Pict1
MOVEQ #$01,D0
JSR DPutPicByte ;PUT CLIPRGN PARAM OPCODE
MOVE.L CLIPRGN(A3),-(SP) ;PUSH CLIPRGN HANDLE
JSRROM ROMPutPicRgn ;PUT CLIPRGN TO THEPIC
JSRROM ROMCOPYRGN ;COPY CLIPRGN INTO PICCLIPRGN
CLIPOK
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
MOVEQ #1,D0 ;CLEAR ZERO FLAG
DONE MOVEM.L (SP)+,D7 ;MOVEM FOR CC, RESTORE REGS
RTS ;AND RETURN
;----------------------------------
PatchOpenPicture FUNC EXPORT
;------------------------------------------------------------------
;
; FUNCTION OpenPicture(picFrame: Rect): PicHandle;
;
; A6 OFFSETS OF PARAMS AFTER LINK:
;
PARAMSIZE EQU 4
RESULT EQU PARAMSIZE+8 ;LONG, PICHANDLE
RECT EQU RESULT-4 ;LONG, ADDR OF RECT
LINK A6,#0 ;NO LOCALS
MOVEM.L A3-A4,-(SP) ;SAVE REGS
CLR.L RESULT(A6) ;INIT FCN RESULT TO NIL
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
;
; Abort OpenPicture if heap doesn't have at least 500 bytes.
;
MOVE.L #500,D0 ;GET BYTE COUNT
_NewHandle ;AT LEAST 500 BYTES IN THE HEAP ?
BNE DONE ;NO, RETURN NIL AND QUIT
_DisposHandle ;YES, Discard test handle
;
; ALLOCATE PICSAVE RECORD
;
MOVE.L #PICSAVEREC,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 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
clr.w picVersion(a1) ;old picture
; Clear picQdRunSlop and picQdChExtra
clr.l picQdChExtra(a1) ; picQdChExtra := 0
clr.l picQdRunSlop(a1) ; picQdRunSlop := 0
; INIT GLYPH STATE TO INVALID
move.l #$80808080,picGlyphState(a1) ; set glyph state to invalid values
; Fall into original OpenPicture at the proper point.
jmpROM OpenPictptchEntry
Done jmpROM OpenPictDone
PatchClosePicture PROC EXPORT
;------------------------------------------------------------------
;
; 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.L D7,A0 ;GET PICSAVE HANDLE <Nov02-89 KON>
MOVE.L (A0),A0 ;POINT TO PICSAVE RECORD <Nov02-89 KON>
move.l picFontList(a0),a0 ;get fontList handle <Nov02-89 KON>
_DisposHandle
; move picVersion(a0),d0
; bne.s @DoNewPicture
; jmpROM ClosePictptchEntry
;@DoNewPicture
MOVE #opEndPic,-(SP) ;YES, PUSH ENDPIC OPCODE
JSR PutPicOp ;PUT TO THEPIC
jmpROM ClosePictptchEntryNew
GoHome jmpROM ClosePictGoHome
ENDPROC
PatchOpenPort patchProc _OpenPort, (Plus,SE,Portable,II,IIci)
;-------------------------------------------------------------
;
; PROCEDURE OpenPort(port: GrafPtr);
;
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
jmpOld ; join the original ROM code.
endproc
PatchInitPort patchProc _InitPort, (Plus,SE,Portable,II,IIci)
;-------------------------------------------------------------
;
; PROCEDURE InitPort(port: GrafPtr);
;
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
jmpOld ; join the original ROM code.
endproc
PatchSetPort patchProc _SetPort, (Plus,SE,Portable,II,IIci)
;----------------------------------------------------------
;
; PROCEDURE SetPort(gp: GrafPtr);
;
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
jmpOld ; join the original ROM code.
endproc
PatchLineTo patchProc _LineTo, (Plus,SE,Portable,II,IIci)
;----------------------------------------------------------
;
; PROCEDURE LineTo(h,v: INTEGER);
;
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
jmpOld ; join the original ROM code.
endproc
PatchLine patchProc _Line, (Plus,SE,Portable,II,IIci)
;----------------------------------------------------------
;
; PROCEDURE Line(dh,dv: INTEGER);
;
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
jmpOld ; join the original ROM code.
endproc
PatchMoveTo patchProc _MoveTo, (Plus,SE,Portable,II,IIci)
;----------------------------------------------------------
;
; PROCEDURE MoveTo(h,v: INTEGER);
;
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
jmpOld ; join the original ROM code.
endproc
PatchMove patchProc _Move, (Plus,SE,Portable,II,IIci)
;----------------------------------------------------------
;
; PROCEDURE Move(dh,dv: INTEGER);
;
move.l grafGlobals(a5),a0 ; load QuickDraw globals.
move.w #$8000,pnLocFixed(a0) ; reset pen fraction.
jmpOld ; join the original ROM code.
endproc
PatchShowCursor PROC EXPORT
;----------------------------------------------------------
;
; PROCEDURE ShowCursor();
;
MOVE.B #1,CRSRBUSY ;MARK CHANGE IN PROGRESS
ADDQ #1,CRSRSTATE ;CURSOR HIDDEN ONE LESS DEEP
BLT.S DoneHide ;QUIT IF STILL HIDDEN
clr.b CrsrObscure ;unobscure if level goes +
subq #1,CrsrState ; setup for ROMs ADDQ #1 <21>
jmpOld ; call the ROM (or other patcher) <21>
DoneHide
jmpROM ROMShowCrsr
endproc
;=========================================================================================
;=========================================================================================
;
; Patch SeedFill and CalcMask to check both up and down on the first pass of filling
;
;=========================================================================================
;=========================================================================================
SeedFill PROC EXPORT
EXPORT CalcMask
;-------------------------------------------------------------------------
;
; PROCEDURE SeedFill(srcPtr,dstPtr: Ptr;
; srcRow,dstRow,height,words: INTEGER;
; seedH,seedV: INTEGER)
;
MOVE.L (SP)+,A0 ;pop return addr
MOVEQ #-1,D0 ;get a long of -1
MOVE.L D0,-(SP) ;push edge = all ones
BRA.S SHARE ;share common code
;-------------------------------------------------------------------------
;
; PROCEDURE CalcMask(srcPtr,dstPtr: Ptr;
; srcRow,dstRow,height,words: INTEGER);
;
CalcMask MOVE.L (SP)+,A0 ;pop return addr
MOVEQ #-1,D0 ;get a long of -1
MOVE.L D0,-(SP) ;push seed = (-1,-1)
CLR.L -(SP) ;push edge = zeros
SHARE MOVE.L A0,-(SP) ;restore return addr
;-------------------------------------------------------------------------
;
; LOCAL PROCEDURE MakeMask(srcPtr,dstPtr: Ptr;
; srcRow,dstRow,height,words: INTEGER;
; seedH,seedV: INTEGER;
; edge: LongInt);
;
; A6 OFFSETS OF PARAMS AND LOCALS AFTER LINK:
;
PARAMSIZE EQU 24
srcPtr EQU PARAMSIZE+8-4 ;long
dstPtr EQU srcPtr-4 ;long
srcRow EQU dstPtr-2 ;word
dstRow EQU srcRow-2 ;word
height EQU dstRow-2 ;word
words EQU height-2 ;word
seedH EQU words-2 ;word
seedV EQU seedH-2 ;word
edge EQU seedV-4 ;long
dstBump EQU -2 ;word
saveStk EQU dstBump-4 ;long
varSize EQU saveStk ;total locals
LINK A6,#varSize ;allocate stack frame
MOVEM.L D3-D7/A2-A4,-(SP) ;save regs
MOVE.L SP,saveStk(A6) ;save stack pointer
;
; prepare height and words for DBRA count. Quit if either <= 0.
;
MOVE words(A6),D5 ;get count of words
BLE GOHOME ;quit if words <= 0
SUB #1,D5 ;subtract 1 for DBRA count
SUB #1,height(A6) ;convert height to DBRA
BLT GOHOME ;quit if height <= 0
;
; init dst to all ones:
;
MOVE words(A6),D0 ;get # of words
ADD D0,D0 ;double for bytes
MOVE dstRow(A6),D1 ;get dstRow
SUB D0,D1 ;subtract bytes for dstBump
MOVE D1,dstBump(A6) ;save dstBump for later
MOVE.L dstPtr(A6),A2 ;point to dst
MOVEQ #-1,D0 ;get some black
MOVE height(A6),D3 ;init DBRA rowCount
BLACK1 MOVE D5,D2 ;init DBRA wordCount
BLACK2 MOVE D0,(A2)+ ;put a word of black
DBRA D2,BLACK2 ;loop all words in row
ADD D1,A2 ;bump to next row
DBRA D3,BLACK1 ;loop height rows
;
; clear one dst pixel at seedH,seedV
;
MOVE seedV(A6),D0 ;get seed vert coord
BLT.S NOSEED ;skip if neg (no seed)
MULU dstRow(A6),D0 ;mul times dst row
MOVE.L dstPtr(A6),A0 ;point to dst
ADD.L D0,A0 ;add vertical offset <EHB 28-Oct-85>
MOVE seedH(A6),D0 ;get seed horiz coord
MOVE D0,D1 ;copy seedH
ASR #3,D0 ;div by 8 for byte
NOT D1 ;invert bit number
BCLR D1,0(A0,D0) ;clear seed pixel
NOSEED
;
; allocate a scanline buffer of ones or zeros on the stack:
;
MOVE.L edge(A6),D6 ;get zero or all ones
MOVE D5,D1 ;get longCount
NEXTBUF MOVE D6,-(SP) ;write a word of ones or zeros
DBRA D1,NEXTBUF ;loop all words
MOVE.L srcPtr(A6),A0 ;point to top of src
MOVE.L dstPtr(A6),A2 ;point to top of dst
st d7 ;set dirty flag to force <KON 24JAN91>
; bra.s FirstPass ;search up and down <KON 24JAN91>
;NXTPASS SF D7 ;clear dirty flag
FirstPass
jmpROM ROMSeedFill
GoHome
jmpROM ROMGoHome
ENDPROC
; ---------------------------------------------------------------------------
INCLUDE 'DrawPicture32Patch.a'
; ---------------------------------------------------------------------------
ROMs Plus,SE,Portable
JShowCursor EQU $0804 ;this shouldn't be here
MakePatch CalcMask,$A838 ; CalcMask and SeedFill need to <KON 24JAN91>
MakePatch SeedFill,$A839 ; always scan up as well as down <KON 24JAN91>
MakePatch StretchBits, $AB27
MakePatch PatchShowCursor, JShowCursor
MakePatch PatchStdRect, $A8A0
MakePatch PatchStdLine, $A890
MakePatch PatchStdRRect, $A8AF
MakePatch PatchStdOval, $A8B6
MakePatch PatchStdArc, $A8BD
MakePatch PatchStdComment, $A8F1
MakePatch NewStdGetPic, $A8EE
MakePatch PatchOpenPicture, $A8F3
MakePatch PatchClosePicture, $A8F4
MakePatch GetPMData, $ABC4
MakePatch OpenCPicture, $AA20
MakePatch QDExtDispatcher, $AB1D
MakePatch VisRgnChanged, $A0A5, (Plus,SE,Portable,II,IIci)
MakePatch PatchStdBits, $A8EB ;used to be Plus, SE only
;
; RGBForeColor, RGBBackColor, GetForeColor, GetBackColor, and QDError
;
MakePatch RGBForeColor, $AA14
MakePatch RGBBackColor, $AA15
MakePatch GetForeColor, $AA19
MakePatch GetBackColor, $AA1A
MakePatch QDError, $AA40
; ---------------------------------------------------------------------------
ROMs Plus, SE
MakePatch PicItemPlusSE, $AB9A
MakePatch PatchStdPoly, $A8C5
MakePatch BitMapRgnptch, $A8D7
MakePatch PlusSEDrawPicture, $A8f6
ROMs Portable, SE
MakePatch PatchStdRgnSEPortable, $A8D1
ROMs Plus
MakePatch PatchStdRgnPlus, $A8D1
; ---------------------------------------------------------------------------
ROMs Portable
MakePatch PicItemPortable, $AB9A
MakePatch PortablePatchStdPoly, $A8C5
MakePatch PortableDrawPicture, $A8f6
; ---------------------------------------------------------------------------
END