mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-29 20:49:19 +00:00
485 lines
17 KiB
Plaintext
485 lines
17 KiB
Plaintext
;
|
|
; File: StandardFileLDEF.a
|
|
;
|
|
; Contains: an LDEF to draw a small icon and name next to it for Standard File
|
|
;
|
|
; Copyright: © 1990-1992 by Apple Computer, Inc. All rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM2> 11/6/92 SWC Changed PackMacs.a->Packages.a.
|
|
; <1> 10/1/91 JSM first checked in
|
|
; <0> 10/1/91 JSM Created from StandardFile3.LDEF.a.
|
|
;
|
|
; Modification history from StandardFile3.LDEF.a below:
|
|
;
|
|
; <14> 12/13/90 ngk <KSM>now gray disabled icons in color window on 1-bit monitor
|
|
; <13> 10/29/90 ngk Now gray out icons of disabled items.
|
|
; <12> 9/17/90 ngk change _PenMode to _TextMode to sync with changes to gray text
|
|
; also have a hack to set TextMode back to srcOr.
|
|
; <11> 8/17/90 gbm make grayishTextCopy into grayishTextOr
|
|
; <10> 8/11/90 ngk fix bug where it could trash rowBytes of a B&W grafport
|
|
; <9> 8/5/90 ngk Use trueGray for drawing dimmed text. repack FileEntry. use rgb
|
|
; array instead of pltt for colorized icons.
|
|
; <8> 7/2/90 ngk Now use hilite color for selecting items. Added color to icons.
|
|
; The userHandle of the listrec is assumed to contain a "palette",
|
|
; and each file entry contains the index into the table. It does
|
|
; not use the palette manager, just the stucture for holding a
|
|
; list of colors.
|
|
; <7> 6/6/90 ngk reduced include files
|
|
; <6> 5/2/90 ngk include IntlUtilsPriv.a
|
|
; <5> 4/11/90 ngk fix plotMini bug if SICN not found
|
|
; <4> 3/18/90 ngk Fix 68000 bug of hilite on draw not working.
|
|
; <3> 3/5/90 PKE Added smTruncEnd as truncWhere parameter for TruncString call,
|
|
; since TruncString interface now matches former NTruncString
|
|
; interface.
|
|
; <2> 2/25/90 ngk Added ability to put icon of left or right, and justify text
|
|
; <1> 2/17/90 ngk Made into real stand-alone LDEF
|
|
;
|
|
; 1.8 ngk 11/14/1989 Changed FileEntry to be a real record.
|
|
; 1.7 ngk 11/08/1989 fixed bug where incorrectly test data len often caused missing items
|
|
; 1.6 JRM 10/30/1989 changes because script and style are part of in file
|
|
; record
|
|
; 1.5 ngk 09/13/1989 fixed bug where you could select a dimmed item
|
|
; fixed bug where incorrectly test data len often caused missing items
|
|
; 1.4 JRM 08/11/1989 Add back in 604 conditionals that Darin said I could
|
|
; take out
|
|
; 1.3 JRM 08/08/1989 7.0d10 release
|
|
; 1.2 JRM 06/08/1989 sf conditionals for bigbang and 604
|
|
; 1.1 JRM 06/05/1989 big bang standard file - see StandardFilePACK.a
|
|
; 1.0 CCH 11/16/1988 Added to EASE.
|
|
;
|
|
; To Do:
|
|
; maybe use icon utils to plot icon
|
|
;
|
|
|
|
LOAD 'StandardEqu.d'
|
|
INCLUDE 'Packages.a' ; for list manager
|
|
INCLUDE 'StandardFilePriv.a' ; for LDEF record structure
|
|
|
|
Point RECORD 0 ; Point = RECORD CASE INTEGER OF
|
|
v DS.W 1 ; 1: (v: INTEGER;
|
|
h DS.W 1 ; h: INTEGER);
|
|
ORG v
|
|
vh DS.W h ; 2: (vh: ARRAY[1..2] OF INTEGER)
|
|
ENDR ; END;
|
|
|
|
Rect RECORD 0 ; Rect = RECORD CASE INTEGER OF
|
|
top DS.W 1 ; 1: (top: INTEGER;
|
|
left DS.W 1 ; left: INTEGER;
|
|
bottom DS.W 1 ; bottom: INTEGER;
|
|
right DS.W 1 ; right: INTEGER);
|
|
ORG top ;
|
|
topLeft DS Point ; 2: (topLeft: Point;
|
|
botRight DS Point ; 3: (botRight: Point)
|
|
ENDR ; END;
|
|
|
|
BitMap RECORD 0 ; BitMap = RECORD
|
|
baseAddr DS.L 1 ; baseAddr: QDPtr;
|
|
rowBytes DS.W 1 ; rowBytes: INTEGER;
|
|
bounds DS Rect ; bounds: Rect
|
|
ENDR ; END;
|
|
|
|
LFrame RECORD {A6Link},DECR
|
|
LParamSize EQU *-8 ; prameters to remove on return
|
|
lMessage DS.W 1 ; selector
|
|
lSelect DS.W 1 ; item selected?
|
|
lRect DS.L 1 ; ptr to rectangle
|
|
lCell DS.L 1 ; ?
|
|
lDataOffset DS.W 1 ; offset into data
|
|
lDataLen DS.W 1 ; length of data
|
|
lHandle DS.L 1 ; which list
|
|
ReturnAddr DS.L 1
|
|
A6Link DS.L 1
|
|
; locals go here
|
|
savedFont DS.W 1 ; saved copy of port font number
|
|
savedSize DS.W 1 ; saved copy of port font size
|
|
savedFace DS.W 1 ; saved copy of port font face
|
|
savedForeColor DS.B 6 ; saved copy of fore ground color while plotting icon
|
|
theBackColor DS.B 6 ; back ground color while plotting icon
|
|
grayForeColor DS.B 6 ; gray fore ground color while plotting dimmed icon
|
|
iconForeColor DS.B 6 ; color of icon to plot
|
|
tempString DS.B 64 ; copy of string to be truncated
|
|
sicnBitMap DS BitMap ; BitMap to hold SICN for copyBits
|
|
canUseTrueGray DS.B 1 ; boolean of whether to use true gray or patterned gray
|
|
isDimmed DS.B 1 ; boolean of whether to dim the item
|
|
colorChanged DS.B 1 ; boolean of whether color needs to be restored after plot
|
|
ALIGN
|
|
LFrameSize EQU * ; size of link
|
|
ENDR
|
|
|
|
|
|
BLANKS ON
|
|
STRING ASIS
|
|
|
|
|
|
;-------------------------------------------------------------
|
|
;
|
|
; LDEF for Standard File
|
|
;
|
|
;
|
|
; PROCEDURE DrawCell(lMessage:INTEGER; lSelect:BOOLEAN; lRect: Rect; lCell: Cell;
|
|
; lDataOffset, lDataLen:INTEGER; lHandle:Handle);
|
|
|
|
LDefEntry MAIN EXPORT
|
|
bra.s LDefStart ; bra around std header
|
|
|
|
DC.W 0 ; flags
|
|
DC.L ('LDEF')
|
|
DC.W -4000 ; pack id
|
|
DC.W 0 ; version
|
|
|
|
|
|
WITH LFrame
|
|
|
|
LDefStart LINK A6,#LFrameSize ; set up a stack frame
|
|
MOVEM.L D2-D7/A2-A4,-(SP) ; save the usual stuff
|
|
MOVE.L lHandle(A6),A4 ; get handle to list record
|
|
MOVE.L (A4),A3 ; get pointer to (locked) record
|
|
|
|
MOVE.W lMessage(A6),D0 ; why am I being called?
|
|
|
|
SUBQ #1,D0 ; draw message?
|
|
BEQ.s Draw ; br if so
|
|
SUBQ #1,D0 ; hilite message?
|
|
BEQ.S Hilite ; br if so
|
|
; ignore other messages
|
|
|
|
LDefExit MOVEM.L (SP)+,D2-D7/A2-A4 ; restore the usual stuff
|
|
UNLK A6 ; unlink our frame
|
|
MOVE.L (SP)+,A0 ; get return address
|
|
ADD.L #LParamSize,SP ; strip off parameters
|
|
JMP (A0) ; and return
|
|
|
|
;---------------
|
|
; LHilite -- Here is the code that hilights/unhilights the
|
|
; cell. We know that it's drawn, and that we're only called
|
|
; if it needs to be de/selected, so inverrect is all we need.
|
|
|
|
Hilite
|
|
move.w lDataOffset(a6),d0 ; offset to cell data
|
|
move.l cells(A3),a0 ; get data handle
|
|
move.l (a0),a0 ; dereference data handle
|
|
|
|
tst.b FileEntry.feFile.dimmed(a0,d0) ; dimmed?
|
|
bne.s LDefExit ; br if so, skip hiliting
|
|
|
|
bclr #7,HiliteMode ; now in color!
|
|
move.l lRect(A6),-(SP) ; push rect
|
|
_InverRect ; and invert it
|
|
bra.s LDefExit ; all done
|
|
|
|
;---------------
|
|
; LDraw -- Here is the code that does the drawing
|
|
; for the defProc. Sets up most registers and lets DrawIconAndFileName do the work.
|
|
|
|
Draw
|
|
_PenNormal
|
|
move.l lRect(A6),-(sp)
|
|
_EraseRect ; clear background area
|
|
|
|
MOVE.L cells(A3),A4 ; A4 = data handle
|
|
|
|
MOVE.L A4, A0 ; get handle 2mar87
|
|
_HGetState ; get lock state 2mar87
|
|
MOVE.B d0, -(SP) ; save handle state for exit 2mar87
|
|
_HLock ; and lock it 2mar87
|
|
|
|
; figure if true gray exists
|
|
clr.b canUseTrueGray(a6)
|
|
cmp.w #$3FFF,ROM85 ; do we have color QD?
|
|
bhi.s @usePattern ; no, this system has B&W QD
|
|
move.l GrafGlobals(A5),A0 ; <10>
|
|
move.l thePort(A0),A0 ; get QuickDraw globals <10>
|
|
move.w portVersion(A0),d0 ; <10>
|
|
and.w #$C000,d0 ; are we using a color grafport? <10>
|
|
beq.s @usePattern ; if not use patterned gray
|
|
st canUseTrueGray(a6)
|
|
@usePattern
|
|
; figure if the item is dimmed
|
|
move.l (a4),a0 ; dereference data handle
|
|
move.w lDataOffset(a6),d0 ; offset to cell data
|
|
tst.b FileEntry.feFile.dimmed(a0,d0.w) ; dimmed?
|
|
sne isDimmed(a6)
|
|
|
|
; draw it !
|
|
bsr.s DrawIconAndFileName ; and draw the cell
|
|
|
|
; see if this needs to be dimmed
|
|
tst.b isDimmed(a6)
|
|
beq.s @skipDim
|
|
|
|
tst.b canUseTrueGray(a6) ; is it already dimmed via TrueGray?
|
|
bne.s @skipDim ; if so don't pattern over it
|
|
|
|
; bit clear the rect with gray
|
|
move.l (A5),A0 ; get QuickDraw globals
|
|
pea Gray(A0) ; push gray
|
|
_PenPat ; set pen to it
|
|
move.w #PatBIC,-(SP) ; push patBIC penMode
|
|
_PenMode ; set penMode
|
|
move.l lRect(A6),-(sp)
|
|
_PaintRect ; or on the dim pattern
|
|
_PenNormal
|
|
|
|
@skipDim
|
|
MOVE.L cells(A3),A0 ; data handle
|
|
MOVE.B (SP)+, D0 ; and saved handle state <2mar87>
|
|
_HSetState ; restore lock state <2mar87>
|
|
|
|
@quickInvert
|
|
tst.b lSelect(A6) ; selected?
|
|
bne.s Hilite
|
|
bra LDefExit ; and return
|
|
|
|
|
|
;-----------------------------------------------------------------
|
|
;
|
|
; a3 = locked list record ptr
|
|
;
|
|
DrawIconAndFileName
|
|
move.l cells(a3),a4
|
|
move.l (a4),a4
|
|
move.w lDataOffset(a6),d0
|
|
lea (a4,d0.w),a4 ; a4 will be pointer to the file entry
|
|
sf colorChanged(a6) ; default
|
|
|
|
; set up the mini icon color
|
|
tst.b isDimmed(a6)
|
|
beq.s @notDimmed ; if not dimmed, try using colors
|
|
tst.b canUseTrueGray(a6)
|
|
beq.s @colorSetUp ; if dimmed, but can't truegray, then will be dithered
|
|
; get gray color to use
|
|
pea theBackColor(a6)
|
|
_GetBackColor ; get back color, for GetGray()
|
|
pea savedForeColor(a6)
|
|
_GetForeColor ; remember fore color, for restoring
|
|
pea grayForeColor(a6)
|
|
_GetForeColor ; get fore color, for GetGray()
|
|
subq #2,sp ; room for GetGray result
|
|
subq #4,sp ; room for device handle ### this should be window's device
|
|
_GetMainDevice
|
|
pea theBackColor(a6) ; in: backColor
|
|
pea grayForeColor(a6) ; in: foreColor, out: grayColor (mix of fore and back)
|
|
_GetGray
|
|
move.b (sp)+,canUseTrueGray(a6) ; returns true if made gray
|
|
beq.s @colorSetUp ; if true gray failed, don't set foreground
|
|
pea grayForeColor(a6)
|
|
bra.s @setFColor ; set foreground to draw in gray
|
|
|
|
@notDimmed tst.l userHandle(a3)
|
|
beq.s @colorSetUp ; NIL means no color info
|
|
tst.b lSelect(a6) ; only do color on non-selected lines
|
|
bne.s @colorSetUp
|
|
pea savedForeColor(a6) ; save current foregrounc color
|
|
_GetForeColor
|
|
move.w FileEntry.feIconColor(a4),d0 ; no label -> no color
|
|
beq.s @colorSetUp
|
|
subq.w #1,d0 ; zero based
|
|
asl.w #1,d0 ; * SizeOf(RGBColor)
|
|
move.w d0,d1
|
|
asl.w #1,d1
|
|
add.w d1,d0
|
|
move.l userHandle(a3),a0 ; get ptr to colors
|
|
pea (a0,d0.w)
|
|
@setFColor _RGBForeColor ; switch foreground to that color
|
|
st colorChanged(a6) ; mark that color was changed
|
|
@colorSetUp move.l lRect(a6),a0 ; A0 ^rect
|
|
move.l Rect.topLeft(a0),d1 ; get topleft
|
|
add.w indent+h(a3),d1 ; add in horizontal indent
|
|
tst.b FileEntry.feIconLeft(a4) ; is icon on left?
|
|
bne.s @1
|
|
move.w Rect.Right(a0),d1 ; get topRight
|
|
sub.w #iconWidth,d1 ; need to pass topLeft corner to PlotMini
|
|
sub.w indent+h(a3),d1 ; factor in horizontal indent
|
|
@1 sub.l #$00010000,d1 ; vertical fudge
|
|
move.w FileEntry.feIcon(a4),d0 ; icon selector
|
|
bsr PlotMini
|
|
tst.b colorChanged(a6)
|
|
beq.s @colorRestored
|
|
pea savedForeColor(a6)
|
|
_RGBForeColor ; restore foreground color
|
|
@colorRestored
|
|
|
|
; make a copy of the string so we don't destroy it
|
|
lea tempString(a6),a1 ; destination string
|
|
lea FileEntry.feFile.text(a4),a0; get ptr to source string
|
|
moveq #0,d0 ; get a long count
|
|
move.b (a0),d0 ; get the count
|
|
addq.b #1,d0 ; add in the length byte
|
|
_BlockMove ; get name to be trunc'd
|
|
|
|
; save off port font info before changing
|
|
move.l port(a3),a1 ; get its grafport
|
|
move.w txFont(a1),savedFont(a6) ; save off font state
|
|
move.w txFace(a1),savedFace(a6)
|
|
move.w txSize(a1),savedSize(a6)
|
|
|
|
@checkFont move.w FileEntry.feFile.font(a4),d0 ; get font
|
|
cmp.w savedFont(a6),d0 ; same as port's font?
|
|
beq.s @checkFace ; br if so, skip set
|
|
move d0,-(sp)
|
|
_TextFont ; set font
|
|
|
|
@checkFace move.b FileEntry.fefile.style(a4),d0 ; get face
|
|
cmp.w savedFace(a6),d0 ; same as port's face?
|
|
beq.s @checkSize ; br if so, skip set
|
|
move d0,-(sp)
|
|
_TextFace ; set face
|
|
|
|
@checkSize move.w FileEntry.feFile.size(a4),d0 ; get size
|
|
cmp.w savedSize(a6),d0 ; same as port's size?
|
|
beq.s @checkWidth ; br if so, skip set
|
|
move d0,-(sp)
|
|
_TextSize ; set size
|
|
|
|
@checkWidth
|
|
move.l lRect(a6),a0
|
|
move.w Rect.right(a0),d3
|
|
sub.w Rect.left(a0),d3 ; got width of rectangle
|
|
sub.w indent+h(a3),d3 ; got width less indent
|
|
sub.w #iconWidth+iconPad,d3 ; less icon and its padding
|
|
|
|
subq #2,SP ; space for result
|
|
pea tempString(a6)
|
|
_StringWidth
|
|
cmp.w (sp)+,d3
|
|
bgt.s @truncDone
|
|
|
|
; text doesn't fit, so let's try using condensed mode
|
|
move.b FileEntry.feFile.style(a4),d0 ; get current style
|
|
bset #condenseBit,d0 ; add condensed to current style
|
|
move.w d0,-(SP) ; and set it
|
|
_TextFace
|
|
|
|
; let _TruncString truncate the string if needed
|
|
subq #2,SP ; returns whether string truncated
|
|
move.w D3,-(SP) ; width
|
|
pea tempString(a6) ; the string
|
|
move.w #smTruncEnd,-(SP) ; truncate at end <3>
|
|
_TruncString
|
|
addq #2,SP ; ignore result
|
|
|
|
@truncDone
|
|
|
|
; position the pen to draw the file name
|
|
move.l lRect(a6),a0 ; A0 = rect
|
|
move.l Rect.topLeft(a0),d1 ; get topleft
|
|
add.l indent(a3),d1 ; add in horizontal and vertical indent
|
|
tst.b FileEntry.feIconLeft(a4); is icon on left?
|
|
beq.s @2 ; if not, don't move over for icon
|
|
add.w #iconWidth+iconPad,d1 ; shift over width of icon plus pad on each side
|
|
@2 cmp.b #teJustLeft,FileEntry.feJust(a4) ; normal left justification?
|
|
beq.s @moveTo ; is so, go on
|
|
cmp.b #teJustRight,FileEntry.feJust(a4) ; right justification?
|
|
bne.s @moveTo ; if not, can't handle it, go on
|
|
|
|
; need to move pen over so draw will end on the right border
|
|
move.l d1,-(sp) ; save d1
|
|
subq #2,SP ; space for result
|
|
pea tempString(a6)
|
|
_StringWidth
|
|
move.w (sp)+,d0 ; d0.w = string width
|
|
move.l (sp)+,d1 ; restore d1
|
|
move.l lRect(A6),a0
|
|
move.w Rect.right(a0),d2
|
|
tst.b FileEntry.feIconLeft(a4); is icon on left?
|
|
bne.s @3 ; if not, don't move over for icon
|
|
sub.w #iconWidth+iconPad+3,d2 ; shift over width of icon plus pad
|
|
@3 sub.w d1,d2 ; got width in which to draw
|
|
sub.w d0,d2 ; got width of no drawn
|
|
add.w d2,d1 ; d1 now shifted over to start draw
|
|
|
|
@moveTo move.l d1,-(sp)
|
|
_MoveTo ; position the pen
|
|
|
|
tst.b isDimmed(a6) ; is this item dimmed?
|
|
beq.s @drawIt
|
|
tst.b canUseTrueGray(a6) ; can we true-gray it?
|
|
beq.s @drawIt
|
|
move.w #grayishTextOr,-(SP) ; yes => set the pen mode to grayishTextOr
|
|
_TextMode ; <12 ngk 17Sept90 >
|
|
|
|
@drawIt
|
|
; draw the file name
|
|
pea tempString(a6) ; the string
|
|
_DrawString
|
|
_PenNormal
|
|
move.w #srcOr,-(SP) ; force gray off <12 ngk 17Sept90 > is this required?
|
|
_TextMode ; <12 ngk 17Sept90 > is this required?
|
|
|
|
; restore port's font state
|
|
move.l port(a3),a1 ; get its grafport
|
|
|
|
@restoreFont
|
|
move.w savedFont(a6),d0 ; get old font
|
|
cmp.w txFont(a1),d0 ; was font not changed?
|
|
beq.s @restoreFace ; br if so, skip reseting
|
|
move.w d0,-(sp)
|
|
_TextFont ; reset font
|
|
|
|
@restoreFace
|
|
move.w savedFace(a6),d0 ; get old face
|
|
cmp.w txFace(a1),d0 ; was face not changed?
|
|
beq.s @restoreSize ; br if so, skip reseting
|
|
move.w d0,-(sp)
|
|
_TextFace ; reset face
|
|
|
|
@restoreSize
|
|
move.w savedSize(a6),d0 ; get old size
|
|
cmp.w txSize(a1),d0 ; was size not changed?
|
|
beq.s @restoreDone ; br if so, skip reseting
|
|
move.w d0,-(sp)
|
|
_TextSize ; reset size
|
|
|
|
@restoreDone
|
|
rts
|
|
|
|
|
|
|
|
;---------------------------------------------------
|
|
;
|
|
; Plot one of the mini icons. d0 = sicn ID
|
|
; d1 = topleft for icon
|
|
; a3 = locked list record
|
|
; Trashes: a0,d1
|
|
PlotMini
|
|
lea sicnBitMap(a6),a0
|
|
move #2,BitMap.rowBytes(a0) ; QD Rowbytes for 16x16
|
|
clr.l BitMap.bounds.topLeft(a0) ; boundsrect 0,0,16,16
|
|
move.l #$00100010,BitMap.bounds.botRight(a0) ;
|
|
|
|
subq #4, sp ; space for handle
|
|
move.l #'SICN', -(sp) ; get a small icon
|
|
move d0, -(sp) ; pass SICN id
|
|
_GetResource
|
|
move.l (sp)+,d0
|
|
beq.s @exit ; br if not, exit
|
|
move.l d0,a0
|
|
move.l (a0),sicnBitMap+BitMap.baseAddr(a6) ; replace in bitmap
|
|
|
|
pea sicnBitMap(a6) ; pass local var as source bit map
|
|
move.l port(a3),a0 ; get its grafport
|
|
pea portBits(a0) ; pass window bitmap as dest bitmap
|
|
|
|
pea sicnBitMap+BitMap.bounds(a6) ; use bounds as src rect
|
|
|
|
lea Scratch20,a0 ; use Scratch20 as dst rect
|
|
move.l a0,-(sp) ; save the address
|
|
move.l d1,(a0)+ ; point to topleft
|
|
move.l d1,(a0) ; copy topLeft to botRight
|
|
add.w #16,(a0)+ ; bottom = top+size
|
|
add.w #16,(a0) ; right = left+size
|
|
|
|
move #srcCopy,-(sp) ; copy mode
|
|
clr.l -(sp) ; NIL MaskRgn
|
|
_CopyBits ; finally
|
|
@exit
|
|
rts
|
|
|
|
|
|
ENDWITH
|
|
|
|
|
|
END
|