mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2025-01-03 09:31:04 +00:00
4325cdcc78
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
1116 lines
42 KiB
Plaintext
1116 lines
42 KiB
Plaintext
;
|
|
; File: IconUtils.a
|
|
;
|
|
; Contains: Assembler portion of utilities for plotting color icons.
|
|
; Includes dispatcher.
|
|
;
|
|
; Written by: David Collins
|
|
;
|
|
; Copyright: © 1990-1993 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM5> 6/3/93 PN In routines GetIconCacheData and SetIconCacheData the input
|
|
; parameters are 8 bytes. In returning from the routines, 6 was
|
|
; added to stack pointer and left 2 bytes on the stack. Correction
|
|
; is made by adding 8 to stack pointer.
|
|
; <SM4> 11/19/92 RB Set ROMMapInsert to MapTrue just before doing some GetResource
|
|
; calls so that we look in ROM first.
|
|
; <28> 7/1/92 DC #1032893 <csd>: Replaced the Psychotic Farmer fix to the listed
|
|
; bug with the CubeE fix which is more robust and correct and
|
|
; makes the world safe for Tsunami.
|
|
; <27> 3/20/92 DC Removed GetGlobalPtr in future versions to take advantage of
|
|
; GetExpandMem macro.
|
|
; <26> 3/19/92 DC Changed references to printerPortCache in the globalIconData
|
|
; structure to a separate ExpandMem reference.
|
|
; <25> 10/29/91 DC Rolled out all post-7.0 changes by one huge conditional for
|
|
; Cube-E.
|
|
; <24> 9/27/91 DC Fixed a bug in Get/SetIconDevice. Still treated icon globals as
|
|
; a handle as opposed to a Ptr.
|
|
; <23> 8/30/91 DC Removed GetGlobalHandle (no longer used). Added patches to
|
|
; printing traps to intercept the creation of grafports used for
|
|
; printing.
|
|
; <22> 3/5/91 DC dba, #84160: Added GetGlobalHandle
|
|
; <21> 11/29/90 DC ngk - Added GetIconDevice. Changed the internal name of
|
|
; SetIconDevice from SetIconDevice.
|
|
; <20> 11/27/90 DC NGK - Added dispatch info for PlotIconHandle PlotSICNHandle and
|
|
; PlotCIconHandle
|
|
; <19> 9/15/90 DC Fixed bug in SetIconDevice
|
|
; <18> 7/30/90 gbm axe warnings
|
|
; <17> 7/26/90 DC Fixed some dumb bugs.
|
|
; <16> 7/25/90 DC added Get/Set cache proc/data (untested)
|
|
; <15> 7/23/90 DC added default label usin in PlotIconSuite glue
|
|
; <14> 7/5/90 DC Added hit-testing and region-producing
|
|
; <13> 6/29/90 DC Fixed ShouldPlotDeep() to not check a GrafPort's bit-depth.
|
|
; Added GetLabel and SetLabel
|
|
; <12> 6/13/90 DC Adding an install proc to set up global color icon data
|
|
; <11> 6/7/90 ngk Added END to end of file to suppress warning
|
|
; <10> 5/31/90 DC Changed sicn to icm#
|
|
; <9> 5/30/90 DC Changed name of interface from IconUtils.a to Icons.a
|
|
; <8> 5/22/90 DC Made IconCache a subclass of IconSuite.
|
|
; <7> 5/4/90 DC Added many routines NewIconSuite, ForEachIconDo, etc.
|
|
; <6> 4/18/90 DC Use typeTable for mapping of IconType values to corresponding
|
|
; ResType
|
|
; <5> 4/10/90 DC Fixed dispatcher so that it dispatches as opposed to crashing
|
|
; <4> 4/9/90 DC Fixed ShouldPlotDeep
|
|
; <1> 4/7/90 DC first checked in
|
|
;
|
|
; To Do:
|
|
;
|
|
|
|
; this is a big conditional used to protect Cube-E from all my post-7.0 changes. I thought
|
|
; this was the safest way to roll back completely to 7.0. The code in the else clause of this
|
|
; conditional is the entirety (minus header comments) of version 64 of IconUtils.c, which is
|
|
; the version that went into 7.0 final.
|
|
|
|
IF TheFuture THEN
|
|
|
|
LOAD 'StandardEqu.d'
|
|
INCLUDE 'InternalMacros.a'
|
|
INCLUDE 'LinkedPatchMacros.a'
|
|
INCLUDE 'IconUtilsPriv.a'
|
|
INCLUDE 'ToolUtils.a'
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; IconDispatch - dispatcher for all Icon utilities.
|
|
;----------------------------------------------------------------------------------
|
|
|
|
IconDispatch BeginDispatcher $ABC9,(Plus,SE,II,Portable,IIci)
|
|
|
|
DispatchSelectors __PlotIconID=selectPlotIconID
|
|
DispatchSelectors __GetIconSuite=selectGetIconSuite
|
|
DispatchSelectors __DisposeIconSuite=selectDisposeIconSuite
|
|
DispatchSelectors __PlotIconSuite=selectPlotIconSuite
|
|
|
|
DispatchSelectors __MakeIconCache=selectMakeIconCache
|
|
DispatchSelectors __PlotIconMethod=selectPlotIconMethod
|
|
DispatchSelectors __LoadIconCache=selectLoadIconCache
|
|
DispatchSelectors __NewIconSuite=selectNewIconSuite
|
|
|
|
DispatchSelectors __AddIconToSuite=selectAddIconToSuite
|
|
DispatchSelectors __GetIconFromSuite=selectGetIconFromSuite
|
|
DispatchSelectors __ForEachIconDo=selectForEachIconDo
|
|
DispatchSelectors __GetLabel=selectGetLabel
|
|
|
|
DispatchSelectors __SetLabel=selectSetLabel
|
|
DispatchSelectors __PtInIconID=selectPtInIconID
|
|
DispatchSelectors __PtInIconSuite=selectPtInIconSuite
|
|
DispatchSelectors __PtInIconMethod=selectPtInIconMethod
|
|
|
|
DispatchSelectors __RectInIconID=selectRectInIconID
|
|
DispatchSelectors __RectInIconSuite=selectRectInIconSuite
|
|
DispatchSelectors __RectInIconMethod=selectRectInIconMethod
|
|
DispatchSelectors __IconIDToRgn=selectIconIDToRgn
|
|
|
|
DispatchSelectors __IconSuiteToRgn=selectIconSuiteToRgn
|
|
DispatchSelectors __IconMethodToRgn=selectIconMethodToRgn
|
|
DispatchSelectors __SetSuiteLabel=selectSetSuiteLabel
|
|
DispatchSelectors __GetSuiteLabel=selectGetSuiteLabel
|
|
|
|
DispatchSelectors __SetIconDevice=selectSetIconDevice
|
|
DispatchSelectors __GetIconCacheData=selectGetIconCacheData
|
|
DispatchSelectors __SetIconCacheData=selectSetIconCacheData
|
|
DispatchSelectors __GetIconCacheProc=selectGetIconCacheProc
|
|
|
|
DispatchSelectors __SetIconCacheProc=selectSetIconCacheProc
|
|
DispatchSelectors __PlotIconHandle=selectPlotIconHandle
|
|
DispatchSelectors __PlotSICNHandle=selectPlotSICNHandle
|
|
DispatchSelectors __PlotCIconHandle=selectPlotCIconHandle
|
|
|
|
DispatchSelectors __GetIconDevice=selectGetIconDevice
|
|
DispatchSelectors __UpdateIconGlobals=selectUpdateIconGlobals
|
|
|
|
EndDispatcher
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; typeTable - a table that maps icontype values to the corresponding ResType.
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
CASE ON
|
|
EXPORT typeTable
|
|
typeTable
|
|
CASE OFF
|
|
DC.L Large1BitMask
|
|
DC.L Large4BitData
|
|
DC.L Large8BitData
|
|
DC.L Small1BitMask
|
|
DC.L Small4BitData
|
|
DC.L Small8BitData
|
|
DC.L Mini1BitMask
|
|
DC.L Mini4BitData
|
|
DC.L Mini8BitData
|
|
CASE ON
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; FromResource is a call-back of the kind used by PlotIconGeneric, IconToRgnGeneric
|
|
; and HitTestIconGeneric (See IconUtils.c). It is used to implement PlotIconID,
|
|
; PtInIconID, RectInIconID and IconIDtoRgn.
|
|
;----------------------------------------------------------------------------------
|
|
|
|
FromResource PROC EXPORT
|
|
IMPORT typeTable
|
|
MOVE.W $A(SP), D0 ; get the icon type
|
|
MOVE.L $4(SP), D1 ; get the icon data
|
|
SUBQ #$4, SP ; Make Room for return parameter
|
|
ASL.W #$2, D0 ; get index into type table
|
|
LEA typeTable, A1 ; get the table of resTypes
|
|
MOVE.L $00(A1,D0.W), -(SP) ; push the icon type
|
|
MOVE.W D1, -(SP) ; push the icon id
|
|
MOVE.W #MAPTRUE,ROMMAPINSERT ; look in ROM first <SM4> rb
|
|
_GetResource ; call GetResource
|
|
MOVE.L (A7)+, D0 ; pop the handle into D0 for return
|
|
RTS ; return
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements PlotIconID, PlotIconSuite and LoadIconCache
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
|
|
EXPORT __PLOTICONID
|
|
EXPORT __PLOTICONSUITE
|
|
EXPORT __LOADICONCACHE
|
|
IMPORT PLOTICONGENERIC ; defined in IconUtils.c
|
|
IMPORT FromResource
|
|
IMPORT FromSuite ; defined in IconUtils.c
|
|
defaultID EQU 2
|
|
suiteHandle EQU 4
|
|
transform EQU 8
|
|
labelMask EQU $0F00
|
|
|
|
__PLOTICONID
|
|
MOVEQ #0, D1 ; record a true value for "dontDraw"
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
MOVE.W (A7)+, D0 ; Pop the Id off the stack
|
|
EXT.L D0 ; Extend the id to a long
|
|
MOVE.L D0, -(A7) ; Push it back on the stack as a refcon for PlotIconGeneric
|
|
PEA FromResource ; Push the address of FromResource
|
|
BRA.S COMMON ; go to common code
|
|
|
|
__LOADICONCACHE
|
|
MOVEQ #1, D1 ; record a true value for "dontDraw"
|
|
BRA.S POPRETURN ; go to the save return address code
|
|
|
|
__PLOTICONSUITE
|
|
MOVE.W transform(A7), D1 ; Get the current transform
|
|
ANDI.W #labelMask, D1 ; check if there is a specified label
|
|
BNE.S SETFLAG ; if there is, plot normally
|
|
MOVEA.L suiteHandle(A7), A0 ; Get a handle to the suite
|
|
MOVEA.L (A0), A0 ; Get a pointer to the suite
|
|
MOVE.W defaultID(A0), D0 ; Get the default label
|
|
BEQ.S SETFLAG ; if there is no default, plot normally
|
|
OR.W D0,transform(A7) ; replace label with the new value
|
|
SETFLAG
|
|
MOVEQ #0, D1 ; record a false value for "dontDraw"
|
|
|
|
POPRETURN
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
PEA FromSuite ; Push the address of FromSuite (the suite handle is already on the stack)
|
|
|
|
COMMON
|
|
MOVE.W D1,-(A7) ; Push the "dontDraw" value
|
|
MOVE.L A0, -(A7) ; Re-push the return address
|
|
JMP PLOTICONGENERIC ; Jump to PlotIconGeneric
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements IconIdToRgn and IconSuiteToRgn
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
EXPORT __ICONIDTORGN
|
|
EXPORT __ICONSUITETORGN
|
|
IMPORT ICONTORGNGENERIC
|
|
IMPORT FromResource
|
|
IMPORT FromSuite
|
|
|
|
__ICONIDTORGN
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
MOVE.W (A7)+, D0 ; Pop the Id off the stack
|
|
EXT.L D0 ; Extend the id to a long
|
|
MOVE.L D0, -(A7) ; Push it back on the stack as a refcon for PlotIconGeneric
|
|
PEA FromResource ; Push the address of FromResource
|
|
BRA.S COMMON ; go to common code
|
|
|
|
__ICONSUITETORGN
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
PEA FromSuite ; Push the address of FromSuite (the suite handle is already on the stack)
|
|
|
|
COMMON
|
|
MOVE.L A0, -(A7) ; Re-push the return address
|
|
JMP ICONTORGNGENERIC ; Jump to IconToRgnGeneric
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements PtInIconID, PtInIconSuite, RectInIconID and
|
|
; RectInIconSuite
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
EXPORT __PTINICONID
|
|
EXPORT __PTINICONSUITE
|
|
EXPORT __RECTINICONID
|
|
EXPORT __RECTINICONSUITE
|
|
IMPORT HITTESTICONGENERIC ; defined in IconUtils.c
|
|
IMPORT FromResource
|
|
IMPORT FromSuite ; defined in IconUtils.c
|
|
|
|
__RECTINICONID
|
|
MOVEQ #1, D1 ; record that this is a rect call
|
|
BRA.S IDCODE
|
|
__PTINICONID
|
|
MOVEQ #0, D1 ; record that this is a point call
|
|
|
|
IDCODE
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
MOVE.W (A7)+, D0 ; Pop the Id off the stack
|
|
EXT.L D0 ; Extend the id to a long
|
|
MOVE.L D0, -(A7) ; Push it back on the stack as a refcon for PlotIconGeneric
|
|
PEA FromResource ; Push the address of FromResource
|
|
BRA.S COMMON ; go to common code
|
|
|
|
__RECTINICONSUITE
|
|
MOVEQ #1, D1 ; record that this is a rect call
|
|
BRA.S SUITECODE
|
|
__PTINICONSUITE
|
|
MOVEQ #0, D1 ; record that this is a point call
|
|
|
|
SUITECODE
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
PEA FromSuite ; Push the address of FromSuite (the suite handle is already on the stack)
|
|
|
|
COMMON
|
|
MOVE.W D1,-(A7) ; Push the IsRect value
|
|
MOVE.L A0, -(A7) ; Re-push the return address
|
|
JMP HITTESTICONGENERIC ; Jump to HitTestIconGeneric
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; FromMethod is a call-back of the kind used by PlotIconGeneric, IconToRgnGeneric
|
|
; and HitTestIconGeneric (See IconUtils.c). It is used to implement PlotIconMethod,
|
|
; PtInIconMethod, RectInIconMethod and IconMethodtoRgn.
|
|
;----------------------------------------------------------------------------------
|
|
|
|
FromMethod PROC EXPORT
|
|
IMPORT typeTable
|
|
MOVE.W $A(SP), D0 ; get the icon type
|
|
MOVEA.L $4(SP), A0 ; get the icon data
|
|
SUBQ #$4, SP ; Make Room for return parameter
|
|
ASL.W #$2, D0 ; get index into type table
|
|
LEA typeTable, A1 ; get the table of resTypes
|
|
MOVE.L $00(A1,D0.W), -(SP) ; push the icon type
|
|
MOVE.L (A0)+,-(SP) ; push the method data
|
|
MOVE.L (A0), A0 ; get the address of the IconGetter
|
|
JSR (A0) ; call the IconGetter
|
|
MOVE.L (A7)+, D0 ; pop the handle into D0 for return
|
|
RTS ; return
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; PlotIconMethod
|
|
;----------------------------------------------------------------------------------
|
|
|
|
__PLOTICONMETHOD PROC EXPORT
|
|
IMPORT FromMethod
|
|
IMPORT PLOTICONGENERIC ; defined in IconUtils.c
|
|
|
|
LEA $14(SP), A0 ; Point to just beyond the rect parameter
|
|
LEA 4(SP), A1 ; Get the address of the Method and its data
|
|
SUBQ #2, SP ; Make room for return value
|
|
MOVE.L -(A0), -(SP) ; Repush the rect parameter
|
|
MOVE.L -(A0), -(SP) ; Repush the alignment and transform
|
|
MOVE.L A1, -(SP) ; push a ptr to the method data
|
|
PEA FromMethod ; push the method handler
|
|
CLR.W -(SP) ; push a false for dontDraw parameter and allocate for return value
|
|
JSR PLOTICONGENERIC ; Jump to PLOTICONGENERIC
|
|
MOVE.W (SP)+, D0 ; Get return value
|
|
MOVEA.L (SP), A0 ; Get return address
|
|
LEA $14(SP), SP ; Pop the parameters
|
|
MOVE.W D0, (SP) ; place the return value
|
|
JMP (A0) ; RETURN
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; IconMethodToRgn
|
|
;----------------------------------------------------------------------------------
|
|
|
|
__ICONMETHODTORGN PROC EXPORT
|
|
IMPORT FromMethod
|
|
IMPORT ICONTORGNGENERIC ; defined in IconUtils.c
|
|
|
|
LEA $16(SP), A0 ; Point to just beyond the rect parameter
|
|
LEA $4(SP), A1 ; Get the address of the Method and its data
|
|
SUBQ #$2, SP ; Make room for return value
|
|
MOVE.L -(A0), -(SP) ; Repush the RgnHandle parameter
|
|
MOVE.L -(A0), -(SP) ; Repush the DestRect
|
|
MOVE.W -(A0), -(SP) ; Repush the alignment
|
|
MOVE.L A1, -(SP) ; push a ptr to the method data
|
|
PEA FromMethod ; push the method handler
|
|
JSR ICONTORGNGENERIC ; Call common icon to rgn code
|
|
MOVE.W (SP)+, D0 ; Get return value
|
|
MOVEA.L (SP), A0 ; Get return address
|
|
LEA $16(SP), SP ; Pop the parameters
|
|
MOVE.W D0, (SP) ; place the return value
|
|
JMP (A0) ; RETURN
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements PtInIconMethod and RectInIconMethod
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
isAPoint EQU 0
|
|
isARect EQU 1
|
|
EXPORT __PTINICONMETHOD
|
|
EXPORT __RECTINICONMETHOD
|
|
IMPORT FromMethod
|
|
IMPORT HITTESTICONGENERIC ; defined in IconUtils.c
|
|
|
|
__RECTINICONMETHOD
|
|
MOVEQ #isARect, D0 ; record that this is a rect test
|
|
BRA.S COMMON
|
|
|
|
__PTINICONMETHOD
|
|
MOVEQ #isAPoint, D0 ; record that this is a point test
|
|
|
|
COMMON
|
|
LEA $16(SP), A0 ; Load A0 with address just after all params
|
|
LEA $4(SP), A1 ; Get the address of the method data
|
|
SUBQ #$2, SP ; make room for return value
|
|
MOVE.L -(A0), -(SP) ; repush the test data (point or rect ptr)
|
|
MOVE.L -(A0), -(SP) ; repush the icon dest rect
|
|
MOVE.W -(A0), -(SP) ; repush the alignment
|
|
MOVE.L A1, -(SP) ; push a pointer to the method data
|
|
PEA FromMethod ; push the method handler
|
|
MOVE.W D0, -(SP) ; push the point/rect identifier
|
|
JSR HITTESTICONGENERIC ; jsr to HitTestIconGeneric
|
|
MOVE.W (SP)+, D0 ; pop the return value
|
|
MOVEA.L (SP), A0 ; pop the return address
|
|
LEA $16(SP), SP ; pop the remaining parameters
|
|
MOVE.W D0, (SP) ; return the error
|
|
JMP (A0) ; return
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements AddIconToSuite and GetIconFromSuite
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
|
|
paramErr EQU -50
|
|
IMPORT EDITICONSUITE ; defined IconUtils.c
|
|
EXPORT __ADDICONTOSUITE, __GETICONFROMSUITE
|
|
|
|
__ADDICONTOSUITE
|
|
MOVEQ #1, D1 ; Store a code indicating __AddIconToSuite
|
|
BRA.S COMMON ; Branch to Common code
|
|
__GETICONFROMSUITE
|
|
MOVEQ #0, D1 ; Store a code indicating __GetIconFromSuite
|
|
COMMON MOVEA.L (SP), A0 ; Get the return address
|
|
MOVE.L D1, (SP) ; Place the routine flag at the top of the stack
|
|
MOVE.L A0, -(SP) ; Push the return address
|
|
JMP EDITICONSUITE
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; pascal void AdjustRgn(RgnHandle, Rect *from, Rect *to);
|
|
;
|
|
; exactly like MapRgn except it checks if the from and to rect are the same width
|
|
; and height. If they are the same width and height, it calls OffsetRgn (much cheaper).
|
|
; It is NOT a general purpose routine. It makes use of the fact that "from" has (0,0)
|
|
; for a top left point.
|
|
;----------------------------------------------------------------------------------
|
|
|
|
ADJUSTRGN PROC EXPORT
|
|
TO EQU $4
|
|
FROM EQU $8
|
|
MASKRGN EQU $C
|
|
|
|
MOVEA.L TO(A7), A0 ; Get a pointer to the "to" Rect
|
|
MOVEA.L FROM(A7), A1 ; Get pointer to the "from" Rect
|
|
ADDQ.L #4, A1 ; A1 is now a pointer to the "bottom" coordinate of "from"
|
|
|
|
MOVE.L MASKRGN(A7), -(A7) ; re-push the RgnHandle for the call to offset or map
|
|
|
|
; Get the top left point of "to" into D0. This is also the offset of "to" from
|
|
; "from" because we know that "from"'s upper left is (0, 0).
|
|
|
|
MOVE.L (A0)+, D0 ; Move the top left point of "to" into D0
|
|
|
|
; The following code gets the difference between the bottom right point
|
|
; of the "to" Rect and the bottom right point of the "from" rect and
|
|
; stores it as a Point in D1
|
|
|
|
MOVE.L (A0), D1 ; Move the bottom right point of "to" into D1
|
|
SWAP D1 ; Get the bottom value into the low word of D1
|
|
SUB.W (A1)+, D1 ; Subtract the bottom value of "from"
|
|
SWAP D1 ; Get the right value of "to" into low word of D1
|
|
SUB.W (A1), D1 ; Subtract the right value of "from"
|
|
|
|
; If the two difference points are the same, then the rectangles are equivalent
|
|
; but offset from one another, in which case we call OffsetRgn.
|
|
|
|
CMP.L D0, D1
|
|
BNE.S DOMAP
|
|
|
|
TST.L D0 ; Are the Rects Identical?
|
|
BNE.S OFFSET ; No, do the offset rgn.
|
|
ADDQ.L #4, A7 ; Yes, pop the rgn handle and leave
|
|
BRA.S LEAVE
|
|
|
|
OFFSET MOVE.L D0, -(A7) ; Push the difference point
|
|
_OffsetRgn ; trap to OffsetRgn
|
|
BRA.S LEAVE ; exit the routine
|
|
|
|
DOMAP SUBQ.L #$6, A1 ; Rewind A1 to point at "from"
|
|
MOVE.L A1, -(A7) ; push a pointer to the "from" rect
|
|
SUBQ.L #$4, A0 ; Rewind A0 to point at "to"
|
|
MOVE.L A0, -(A7) ; push a Pointer to the "to" rect
|
|
_MapRgn ; trap to MapRgn
|
|
|
|
LEAVE MOVEA.L (A7)+, A0 ; Get return address
|
|
MOVEQ #$C, D0 ; Clean up stack
|
|
ADD.L D0, A7
|
|
JMP (A0) ; return
|
|
RTS
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements GetIconCacheData, SetIconCacheData, GetIconCacheProc
|
|
; and SetIconCacheProc
|
|
;----------------------------------------------------------------------------------
|
|
|
|
CASE OFF
|
|
PROC
|
|
THEDATA EQU 4 ; offset on the stack of data/proc
|
|
THECACHE EQU 8 ; offset on the stack of the cache
|
|
EXPORT __GetIconCacheData, __SetIconCacheData
|
|
EXPORT __GetIconCacheProc, __SetIconCacheProc
|
|
|
|
__GetIconCacheData
|
|
MOVEQ #0, D0 ; record that this is a get call
|
|
BRA.S COMMONDATA ; Go to the common call for Get/Set Data
|
|
|
|
__SetIconCacheData
|
|
MOVEQ #1, D0 ; record that this is a set call
|
|
BRA.S COMMONDATA ; Go to the common call for Get/Set Data
|
|
|
|
__GetIconCacheProc
|
|
MOVEQ #0, D0 ; record that this is a get call
|
|
BRA.S COMMONPROC ; Go to the common call for Get/Set Proc
|
|
|
|
__SetIconCacheProc
|
|
MOVEQ #1, D0 ; record that this is a set call
|
|
|
|
COMMONPROC
|
|
MOVEQ #IconCache.userMethod, D1 ; record the offset of the procPtr
|
|
|
|
COMMONDATA
|
|
MOVEQ #IconCache.userPtr, D1 ; record the offset of the data
|
|
|
|
COMMON MOVEA.L THECACHE(SP), A0 ; Get the handle to the cache
|
|
MOVEA.L (A0), A0 ; Get the ptr to the cache
|
|
TST.W IconSuite.theType(A0) ; check if it is a cache
|
|
BNE.S ISSUITE ; exit with paramErr
|
|
MOVE.W #paramErr, D0 ; record the error
|
|
BRA.S EXIT ; cleanup and exit
|
|
ISSUITE ADDA.L D1, A0 ; A1 now points to data or proc as apropriate
|
|
TST.L D0 ; check if this is a get or set callÉ
|
|
BEQ.S GETCODE ; and branch as appropriate.
|
|
MOVE.L THEDATA(SP), (A0) ; set the apropriate member
|
|
BRA.S EXITOK ; Exit without error.
|
|
GETCODE MOVEA.L THEDATA(SP), A1 ; get the address to return data in
|
|
MOVE.L (A0), (A1) ; return the data
|
|
EXITOK MOVEQ #noErr, D0 ; record no error.
|
|
EXIT MOVEA.L (SP)+, A0 ; Pop return address into A0
|
|
ADDQ.L #8, SP ; Point stack at return value <PN>
|
|
MOVE.W D0, (SP) ; put return value on the stack
|
|
JMP (A0) ; return
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements SetIconDevice and GetIconDevice
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
EXPORT __SetIconDevice
|
|
EXPORT __GetIconDevice
|
|
|
|
__GetIconDevice
|
|
MOVEQ #1, D0 ; Set flag indicating this is a GetIconDevice call
|
|
BRA.S COMMON
|
|
__SetIconDevice
|
|
CLR.L D0 ; Set flag indicating this is a SetIconDevice call
|
|
|
|
COMMON
|
|
MOVEA.L 4(SP), A1 ; Get the parameter
|
|
CMPI.W #$3FFF, ROM85 ; Bail if not color QuickDraw
|
|
BGT.S CHECK_AND_EXIT
|
|
MOVE.L EXPANDMEM, A0 ; point to expandMem
|
|
MOVEA.L ExpandMemRec.emIconCluts(A0), A0 ; Get pointer to our globals
|
|
TST.L D0 ; Is this a get or a set call?
|
|
BEQ.S SET
|
|
|
|
MOVE.L GlobalIconData.virtualScreen(A0), (A1) ; Stuff the variable parameter with the current icon device
|
|
BRA.S EXIT
|
|
|
|
SET MOVE.L A1, GlobalIconData.virtualScreen(A0) ; Stuff the right field with the imput data
|
|
BRA.S EXIT
|
|
|
|
CHECK_AND_EXIT
|
|
TST.L D0
|
|
BEQ.S EXIT
|
|
CLR.L (A1)
|
|
|
|
EXIT MOVEA.L (SP), A1
|
|
ADDQ.L #$8, SP ; pop the parameters and return address
|
|
JMP (A1) ; return
|
|
ENDPROC
|
|
|
|
; here begins the 7.0 version of the code
|
|
|
|
ELSE
|
|
|
|
LOAD 'StandardEqu.d'
|
|
INCLUDE 'InternalMacros.a'
|
|
INCLUDE 'LinkedPatchMacros.a'
|
|
INCLUDE 'IconUtilsPriv.a'
|
|
INCLUDE 'ToolUtils.a'
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; IconDispatch - dispatcher for all Icon utilities.
|
|
;----------------------------------------------------------------------------------
|
|
|
|
IconDispatch BeginDispatcher $ABC9,(Plus,SE,II,Portable,IIci)
|
|
|
|
DispatchSelectors __PlotIconID=selectPlotIconID
|
|
DispatchSelectors __GetIconSuite=selectGetIconSuite
|
|
DispatchSelectors __DisposeIconSuite=selectDisposeIconSuite
|
|
DispatchSelectors __PlotIconSuite=selectPlotIconSuite
|
|
DispatchSelectors __MakeIconCache=selectMakeIconCache
|
|
DispatchSelectors __PlotIconMethod=selectPlotIconMethod
|
|
DispatchSelectors __LoadIconCache=selectLoadIconCache
|
|
DispatchSelectors __NewIconSuite=selectNewIconSuite
|
|
DispatchSelectors __AddIconToSuite=selectAddIconToSuite
|
|
|
|
DispatchSelectors __GetIconFromSuite=selectGetIconFromSuite
|
|
DispatchSelectors __ForEachIconDo=selectForEachIconDo
|
|
DispatchSelectors __GetLabel=selectGetLabel
|
|
DispatchSelectors __SetLabel=selectSetLabel
|
|
DispatchSelectors __PtInIconID=selectPtInIconID
|
|
DispatchSelectors __PtInIconSuite=selectPtInIconSuite
|
|
DispatchSelectors __PtInIconMethod=selectPtInIconMethod
|
|
DispatchSelectors __RectInIconID=selectRectInIconID
|
|
DispatchSelectors __RectInIconSuite=selectRectInIconSuite
|
|
DispatchSelectors __RectInIconMethod=selectRectInIconMethod
|
|
DispatchSelectors __IconIDToRgn=selectIconIDToRgn
|
|
DispatchSelectors __IconSuiteToRgn=selectIconSuiteToRgn
|
|
DispatchSelectors __IconMethodToRgn=selectIconMethodToRgn
|
|
DispatchSelectors __SetSuiteLabel=selectSetSuiteLabel
|
|
DispatchSelectors __GetSuiteLabel=selectGetSuiteLabel
|
|
DispatchSelectors __SetIconDevice=selectSetIconDevice
|
|
DispatchSelectors __GetIconCacheData=selectGetIconCacheData
|
|
DispatchSelectors __SetIconCacheData=selectSetIconCacheData
|
|
DispatchSelectors __GetIconCacheProc=selectGetIconCacheProc
|
|
DispatchSelectors __SetIconCacheProc=selectSetIconCacheProc
|
|
|
|
DispatchSelectors __PlotIconHandle=selectPlotIconHandle
|
|
DispatchSelectors __PlotSICNHandle=selectPlotSICNHandle
|
|
DispatchSelectors __PlotCIconHandle=selectPlotCIconHandle
|
|
DispatchSelectors __GetIconDevice=selectGetIconDevice
|
|
|
|
EndDispatcher
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; typeTable - a table that maps icontype values to the corresponding ResType.
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
CASE ON
|
|
EXPORT typeTable
|
|
typeTable
|
|
CASE OFF
|
|
DC.L Large1BitMask
|
|
DC.L Large4BitData
|
|
DC.L Large8BitData
|
|
DC.L Small1BitMask
|
|
DC.L Small4BitData
|
|
DC.L Small8BitData
|
|
DC.L Mini1BitMask
|
|
DC.L Mini4BitData
|
|
DC.L Mini8BitData
|
|
CASE ON
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; GetGlobalPtr and GetGlobalHandle are utilities which return either a pointer or
|
|
; handle to the icon utilities global block
|
|
;----------------------------------------------------------------------------------
|
|
|
|
GetGlobalPtr PROC EXPORT
|
|
CASE OFF
|
|
WITH ExpandMemRec
|
|
MOVE.L ExpandMem, A0
|
|
MOVE.L emIconCluts(A0), A0
|
|
MOVE.L (A0), D0
|
|
ENDWITH
|
|
RTS
|
|
CASE ON
|
|
ENDPROC
|
|
|
|
GetGlobalHandle PROC EXPORT
|
|
CASE OFF
|
|
WITH ExpandMemRec
|
|
MOVE.L ExpandMem, A0
|
|
MOVE.L emIconCluts(A0), D0
|
|
ENDWITH
|
|
RTS
|
|
CASE ON
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; FromResource is a call-back of the kind used by PlotIconGeneric, IconToRgnGeneric
|
|
; and HitTestIconGeneric (See IconUtils.c). It is used to implement PlotIconID,
|
|
; PtInIconID, RectInIconID and IconIDtoRgn.
|
|
;----------------------------------------------------------------------------------
|
|
|
|
FromResource PROC EXPORT
|
|
IMPORT typeTable
|
|
MOVE.W $A(SP), D0 ; get the icon type
|
|
MOVE.L $4(SP), D1 ; get the icon data
|
|
SUBQ #$4, SP ; Make Room for return parameter
|
|
ASL.W #$2, D0 ; get index into type table
|
|
LEA typeTable, A1 ; get the table of resTypes
|
|
MOVE.L $00(A1,D0.W), -(SP) ; push the icon type
|
|
MOVE.W D1, -(SP) ; push the icon id
|
|
MOVE.W #MAPTRUE,ROMMAPINSERT ; look in ROM first <SM4> rb
|
|
_GetResource ; call GetResource
|
|
MOVE.L (A7)+, D0 ; pop the handle into D0 for return
|
|
RTS ; return
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements PlotIconID, PlotIconSuite and LoadIconCache
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
|
|
EXPORT __PLOTICONID
|
|
EXPORT __PLOTICONSUITE
|
|
EXPORT __LOADICONCACHE
|
|
IMPORT PLOTICONGENERIC ; defined in IconUtils.c
|
|
IMPORT FromResource
|
|
IMPORT FromSuite ; defined in IconUtils.c
|
|
defaultID EQU 2
|
|
suiteHandle EQU 4
|
|
transform EQU 8
|
|
labelMask EQU $0F00
|
|
|
|
__PLOTICONID
|
|
MOVEQ #0, D1 ; record a true value for "dontDraw"
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
MOVE.W (A7)+, D0 ; Pop the Id off the stack
|
|
EXT.L D0 ; Extend the id to a long
|
|
MOVE.L D0, -(A7) ; Push it back on the stack as a refcon for PlotIconGeneric
|
|
PEA FromResource ; Push the address of FromResource
|
|
BRA.S COMMON ; go to common code
|
|
|
|
__LOADICONCACHE
|
|
MOVEQ #1, D1 ; record a true value for "dontDraw"
|
|
BRA.S POPRETURN ; go to the save return address code
|
|
|
|
__PLOTICONSUITE
|
|
MOVE.W transform(A7), D1 ; Get the current transform
|
|
ANDI.W #labelMask, D1 ; check if there is a specified label
|
|
BNE.S SETFLAG ; if there is, plot normally
|
|
MOVEA.L suiteHandle(A7), A0 ; Get a handle to the suite
|
|
MOVEA.L (A0), A0 ; Get a pointer to the suite
|
|
MOVE.W defaultID(A0), D0 ; Get the default label
|
|
BEQ.S SETFLAG ; if there is no default, plot normally
|
|
OR.W D0,transform(A7) ; replace label with the new value
|
|
SETFLAG
|
|
MOVEQ #0, D1 ; record a false value for "dontDraw"
|
|
|
|
POPRETURN
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
PEA FromSuite ; Push the address of FromSuite (the suite handle is already on the stack)
|
|
|
|
COMMON
|
|
MOVE.W D1,-(A7) ; Push the "dontDraw" value
|
|
MOVE.L A0, -(A7) ; Re-push the return address
|
|
JMP PLOTICONGENERIC ; Jump to PlotIconGeneric
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements IconIdToRgn and IconSuiteToRgn
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
EXPORT __ICONIDTORGN
|
|
EXPORT __ICONSUITETORGN
|
|
IMPORT ICONTORGNGENERIC
|
|
IMPORT FromResource
|
|
IMPORT FromSuite
|
|
|
|
__ICONIDTORGN
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
MOVE.W (A7)+, D0 ; Pop the Id off the stack
|
|
EXT.L D0 ; Extend the id to a long
|
|
MOVE.L D0, -(A7) ; Push it back on the stack as a refcon for PlotIconGeneric
|
|
PEA FromResource ; Push the address of FromResource
|
|
BRA.S COMMON ; go to common code
|
|
|
|
__ICONSUITETORGN
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
PEA FromSuite ; Push the address of FromSuite (the suite handle is already on the stack)
|
|
|
|
COMMON
|
|
MOVE.L A0, -(A7) ; Re-push the return address
|
|
JMP ICONTORGNGENERIC ; Jump to IconToRgnGeneric
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements PtInIconID, PtInIconSuite, RectInIconID and
|
|
; RectInIconSuite
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
EXPORT __PTINICONID
|
|
EXPORT __PTINICONSUITE
|
|
EXPORT __RECTINICONID
|
|
EXPORT __RECTINICONSUITE
|
|
IMPORT HITTESTICONGENERIC ; defined in IconUtils.c
|
|
IMPORT FromResource
|
|
IMPORT FromSuite ; defined in IconUtils.c
|
|
|
|
__RECTINICONID
|
|
MOVEQ #1, D1 ; record that this is a rect call
|
|
BRA.S IDCODE
|
|
__PTINICONID
|
|
MOVEQ #0, D1 ; record that this is a point call
|
|
|
|
IDCODE
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
MOVE.W (A7)+, D0 ; Pop the Id off the stack
|
|
EXT.L D0 ; Extend the id to a long
|
|
MOVE.L D0, -(A7) ; Push it back on the stack as a refcon for PlotIconGeneric
|
|
PEA FromResource ; Push the address of FromResource
|
|
BRA.S COMMON ; go to common code
|
|
|
|
__RECTINICONSUITE
|
|
MOVEQ #1, D1 ; record that this is a rect call
|
|
BRA.S SUITECODE
|
|
__PTINICONSUITE
|
|
MOVEQ #0, D1 ; record that this is a point call
|
|
|
|
SUITECODE
|
|
MOVEA.L (A7)+, A0 ; Save the return address in A0
|
|
PEA FromSuite ; Push the address of FromSuite (the suite handle is already on the stack)
|
|
|
|
COMMON
|
|
MOVE.W D1,-(A7) ; Push the IsRect value
|
|
MOVE.L A0, -(A7) ; Re-push the return address
|
|
JMP HITTESTICONGENERIC ; Jump to HitTestIconGeneric
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; FromMethod is a call-back of the kind used by PlotIconGeneric, IconToRgnGeneric
|
|
; and HitTestIconGeneric (See IconUtils.c). It is used to implement PlotIconMethod,
|
|
; PtInIconMethod, RectInIconMethod and IconMethodtoRgn.
|
|
;----------------------------------------------------------------------------------
|
|
|
|
FromMethod PROC EXPORT
|
|
IMPORT typeTable
|
|
MOVE.W $A(SP), D0 ; get the icon type
|
|
MOVEA.L $4(SP), A0 ; get the icon data
|
|
SUBQ #$4, SP ; Make Room for return parameter
|
|
ASL.W #$2, D0 ; get index into type table
|
|
LEA typeTable, A1 ; get the table of resTypes
|
|
MOVE.L $00(A1,D0.W), -(SP) ; push the icon type
|
|
MOVE.L (A0)+,-(SP) ; push the method data
|
|
MOVE.L (A0), A0 ; get the address of the IconGetter
|
|
JSR (A0) ; call the IconGetter
|
|
MOVE.L (A7)+, D0 ; pop the handle into D0 for return
|
|
RTS ; return
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; PlotIconMethod
|
|
;----------------------------------------------------------------------------------
|
|
|
|
__PLOTICONMETHOD PROC EXPORT
|
|
IMPORT FromMethod
|
|
IMPORT PLOTICONGENERIC ; defined in IconUtils.c
|
|
|
|
LEA $14(SP), A0 ; Point to just beyond the rect parameter
|
|
LEA 4(SP), A1 ; Get the address of the Method and its data
|
|
SUBQ #2, SP ; Make room for return value
|
|
MOVE.L -(A0), -(SP) ; Repush the rect parameter
|
|
MOVE.L -(A0), -(SP) ; Repush the alignment and transform
|
|
MOVE.L A1, -(SP) ; push a ptr to the method data
|
|
PEA FromMethod ; push the method handler
|
|
CLR.W -(SP) ; push a false for dontDraw parameter and allocate for return value
|
|
JSR PLOTICONGENERIC ; Jump to PLOTICONGENERIC
|
|
MOVE.W (SP)+, D0 ; Get return value
|
|
MOVEA.L (SP), A0 ; Get return address
|
|
LEA $14(SP), SP ; Pop the parameters
|
|
MOVE.W D0, (SP) ; place the return value
|
|
JMP (A0) ; RETURN
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; IconMethodToRgn
|
|
;----------------------------------------------------------------------------------
|
|
|
|
__ICONMETHODTORGN PROC EXPORT
|
|
IMPORT FromMethod
|
|
IMPORT ICONTORGNGENERIC ; defined in IconUtils.c
|
|
|
|
LEA $16(SP), A0 ; Point to just beyond the rect parameter
|
|
LEA $4(SP), A1 ; Get the address of the Method and its data
|
|
SUBQ #$2, SP ; Make room for return value
|
|
MOVE.L -(A0), -(SP) ; Repush the RgnHandle parameter
|
|
MOVE.L -(A0), -(SP) ; Repush the DestRect
|
|
MOVE.W -(A0), -(SP) ; Repush the alignment
|
|
MOVE.L A1, -(SP) ; push a ptr to the method data
|
|
PEA FromMethod ; push the method handler
|
|
JSR ICONTORGNGENERIC ; Call common icon to rgn code
|
|
MOVE.W (SP)+, D0 ; Get return value
|
|
MOVEA.L (SP), A0 ; Get return address
|
|
LEA $16(SP), SP ; Pop the parameters
|
|
MOVE.W D0, (SP) ; place the return value
|
|
JMP (A0) ; RETURN
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements PtInIconMethod and RectInIconMethod
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
isAPoint EQU 0
|
|
isARect EQU 1
|
|
EXPORT __PTINICONMETHOD
|
|
EXPORT __RECTINICONMETHOD
|
|
IMPORT FromMethod
|
|
IMPORT HITTESTICONGENERIC ; defined in IconUtils.c
|
|
|
|
__RECTINICONMETHOD
|
|
MOVEQ #isARect, D0 ; record that this is a rect test
|
|
BRA.S COMMON
|
|
|
|
__PTINICONMETHOD
|
|
MOVEQ #isAPoint, D0 ; record that this is a point test
|
|
|
|
COMMON
|
|
LEA $16(SP), A0 ; Load A0 with address just after all params
|
|
LEA $4(SP), A1 ; Get the address of the method data
|
|
SUBQ #$2, SP ; make room for return value
|
|
MOVE.L -(A0), -(SP) ; repush the test data (point or rect ptr)
|
|
MOVE.L -(A0), -(SP) ; repush the icon dest rect
|
|
MOVE.W -(A0), -(SP) ; repush the alignment
|
|
MOVE.L A1, -(SP) ; push a pointer to the method data
|
|
PEA FromMethod ; push the method handler
|
|
MOVE.W D0, -(SP) ; push the point/rect identifier
|
|
JSR HITTESTICONGENERIC ; jsr to HitTestIconGeneric
|
|
MOVE.W (SP)+, D0 ; pop the return value
|
|
MOVEA.L (SP), A0 ; pop the return address
|
|
LEA $16(SP), SP ; pop the remaining parameters
|
|
MOVE.W D0, (SP) ; return the error
|
|
JMP (A0) ; return
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements AddIconToSuite and GetIconFromSuite
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
|
|
paramErr EQU -50
|
|
IMPORT EDITICONSUITE ; defined IconUtils.c
|
|
EXPORT __ADDICONTOSUITE, __GETICONFROMSUITE
|
|
|
|
__ADDICONTOSUITE
|
|
MOVEQ #1, D1 ; Store a code indicating __AddIconToSuite
|
|
BRA.S COMMON ; Branch to Common code
|
|
__GETICONFROMSUITE
|
|
MOVEQ #0, D1 ; Store a code indicating __GetIconFromSuite
|
|
COMMON MOVEA.L (SP), A0 ; Get the return address
|
|
MOVE.L D1, (SP) ; Place the routine flag at the top of the stack
|
|
MOVE.L A0, -(SP) ; Push the return address
|
|
JMP EDITICONSUITE
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; pascal void AdjustRgn(RgnHandle, Rect *from, Rect *to);
|
|
;
|
|
; exactly like MapRgn except it checks if the from and to rect are the same width
|
|
; and height. If they are the same width and height, it calls OffsetRgn (much cheaper).
|
|
; It is NOT a general purpose routine. It makes use of the fact that "from" has (0,0)
|
|
; for a top left point.
|
|
;----------------------------------------------------------------------------------
|
|
|
|
ADJUSTRGN PROC EXPORT
|
|
TO EQU $4
|
|
FROM EQU $8
|
|
MASKRGN EQU $C
|
|
|
|
MOVEA.L TO(A7), A0 ; Get a pointer to the "to" Rect
|
|
MOVEA.L FROM(A7), A1 ; Get pointer to the "from" Rect
|
|
ADDQ.L #4, A1 ; A1 is now a pointer to the "bottom" coordinate of "from"
|
|
|
|
MOVE.L MASKRGN(A7), -(A7) ; re-push the RgnHandle for the call to offset or map
|
|
|
|
; Get the top left point of "to" into D0. This is also the offset of "to" from
|
|
; "from" because we know that "from"'s upper left is (0, 0).
|
|
|
|
MOVE.L (A0)+, D0 ; Move the top left point of "to" into D0
|
|
|
|
; The following code gets the difference between the bottom right point
|
|
; of the "to" Rect and the bottom right point of the "from" rect and
|
|
; stores it as a Point in D1
|
|
|
|
MOVE.L (A0), D1 ; Move the bottom right point of "to" into D1
|
|
SWAP D1 ; Get the bottom value into the low word of D1
|
|
SUB.W (A1)+, D1 ; Subtract the bottom value of "from"
|
|
SWAP D1 ; Get the right value of "to" into low word of D1
|
|
SUB.W (A1), D1 ; Subtract the right value of "from"
|
|
|
|
; If the two difference points are the same, then the rectangles are equivalent
|
|
; but offset from one another, in which case we call OffsetRgn.
|
|
|
|
CMP.L D0, D1
|
|
BNE.S DOMAP
|
|
|
|
TST.L D0 ; Are the Rects Identical?
|
|
BNE.S OFFSET ; No, do the offset rgn.
|
|
ADDQ.L #4, A7 ; Yes, pop the rgn handle and leave
|
|
BRA.S LEAVE
|
|
|
|
OFFSET MOVE.L D0, -(A7) ; Push the difference point
|
|
_OffsetRgn ; trap to OffsetRgn
|
|
BRA.S LEAVE ; exit the routine
|
|
|
|
DOMAP SUBQ.L #$6, A1 ; Rewind A1 to point at "from"
|
|
MOVE.L A1, -(A7) ; push a pointer to the "from" rect
|
|
SUBQ.L #$4, A0 ; Rewind A0 to point at "to"
|
|
MOVE.L A0, -(A7) ; push a Pointer to the "to" rect
|
|
_MapRgn ; trap to MapRgn
|
|
|
|
LEAVE MOVEA.L (A7)+, A0 ; Get return address
|
|
MOVEQ #$C, D0 ; Clean up stack
|
|
ADD.L D0, A7
|
|
JMP (A0) ; return
|
|
RTS
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements GetIconCacheData, SetIconCacheData, GetIconCacheProc
|
|
; and SetIconCacheProc
|
|
;----------------------------------------------------------------------------------
|
|
|
|
CASE OFF
|
|
PROC
|
|
THEDATA EQU 4 ; offset on the stack of data/proc
|
|
THECACHE EQU 8 ; offset on the stack of the cache
|
|
EXPORT __GetIconCacheData, __SetIconCacheData
|
|
EXPORT __GetIconCacheProc, __SetIconCacheProc
|
|
|
|
__GetIconCacheData
|
|
MOVEQ #0, D0 ; record that this is a get call
|
|
BRA.S COMMONDATA ; Go to the common call for Get/Set Data
|
|
|
|
__SetIconCacheData
|
|
MOVEQ #1, D0 ; record that this is a set call
|
|
BRA.S COMMONDATA ; Go to the common call for Get/Set Data
|
|
|
|
__GetIconCacheProc
|
|
MOVEQ #0, D0 ; record that this is a get call
|
|
BRA.S COMMONPROC ; Go to the common call for Get/Set Proc
|
|
|
|
__SetIconCacheProc
|
|
MOVEQ #1, D0 ; record that this is a set call
|
|
|
|
COMMONPROC
|
|
MOVEQ #IconCache.userMethod, D1 ; record the offset of the procPtr
|
|
|
|
COMMONDATA
|
|
MOVEQ #IconCache.userPtr, D1 ; record the offset of the data
|
|
|
|
COMMON MOVEA.L THECACHE(SP), A0 ; Get the handle to the cache
|
|
MOVEA.L (A0), A0 ; Get the ptr to the cache
|
|
TST.W IconSuite.theType(A0) ; check if it is a cache
|
|
BNE.S ISSUITE ; exit with paramErr
|
|
MOVE.W #paramErr, D0 ; record the error
|
|
BRA.S EXIT ; cleanup and exit
|
|
ISSUITE ADDA.L D1, A0 ; A1 now points to data or proc as apropriate
|
|
TST.L D0 ; check if this is a get or set callÉ
|
|
BEQ.S GETCODE ; and branch as appropriate.
|
|
MOVE.L THEDATA(SP), (A0) ; set the apropriate member
|
|
BRA.S EXITOK ; Exit without error.
|
|
GETCODE MOVEA.L THEDATA(SP), A1 ; get the address to return data in
|
|
MOVE.L (A0), (A1) ; return the data
|
|
EXITOK MOVEQ #noErr, D0 ; record no error.
|
|
EXIT MOVEA.L (SP)+, A0 ; Pop return address into A0
|
|
ADDQ.L #8, SP ; Point stack at return value <PN>
|
|
MOVE.W D0, (SP) ; put return value on the stack
|
|
JMP (A0) ; return
|
|
|
|
ENDPROC
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; The following block implements SetIconDevice and GetIconDevice
|
|
;----------------------------------------------------------------------------------
|
|
|
|
PROC
|
|
EXPORT __SetIconDevice
|
|
EXPORT __GetIconDevice
|
|
|
|
__GetIconDevice
|
|
MOVEQ #1, D0 ; Set flag indicating this is a GetIconDevice call
|
|
BRA.S COMMON
|
|
__SetIconDevice
|
|
CLR.L D0 ; Set flag indicating this is a SetIconDevice call
|
|
|
|
COMMON
|
|
MOVEA.L 4(SP), A1 ; Get the parameter
|
|
CMPI.W #$3FFF, ROM85 ; Bail if not color QuickDraw
|
|
BGT.S CHECK_AND_EXIT
|
|
MOVE.L EXPANDMEM, A0 ; point to expandMem
|
|
MOVEA.L ExpandMemRec.emIconCluts(A0), A0 ; Get Handle to our globals
|
|
MOVEA.L (A0), A0 ; Get pointer
|
|
TST.L D0 ; Is this a get or a set call?
|
|
BEQ.S SET
|
|
|
|
MOVE.L GlobalIconData.virtualScreen(A0), (A1) ; Stuff the variable parameter with the current icon device
|
|
BRA.S EXIT
|
|
|
|
SET MOVE.L A1, GlobalIconData.virtualScreen(A0) ; Stuff the right field with the imput data
|
|
BRA.S EXIT
|
|
|
|
CHECK_AND_EXIT
|
|
TST.L D0
|
|
BEQ.S EXIT
|
|
CLR.L (A1)
|
|
|
|
EXIT MOVEA.L (SP), A1
|
|
ADDQ.L #$8, SP ; pop the parameters and return address
|
|
JMP (A1) ; return
|
|
ENDPROC
|
|
|
|
ENDIF
|
|
|
|
END ; of file |