mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-24 17:32:59 +00:00
336 lines
11 KiB
Plaintext
336 lines
11 KiB
Plaintext
;
|
||
; File: TextLDEF.a
|
||
;
|
||
; Contains: LDEF 0 - Standard List Definition Procedure for simple text.
|
||
;
|
||
; This is the standard List defProc. Its primary task is to draw
|
||
; the contents of a list manager cell, either selected or deselected.
|
||
; It is passed a pointer to the cell's data, the length of the cell's
|
||
; data, and a rectangle in which to draw the cell. When it is called,
|
||
; the clip region is set to that rect. The cell data does NOT include a
|
||
; length byte.
|
||
;
|
||
; Originally written by Ernie Beernink in March 1985.
|
||
;
|
||
; Contains two copies of the LDEF, one for 7.0 and one for 6.0.x systems.
|
||
; The System 7.0 version automatically condenses and truncates text that is
|
||
; too long for the cell.
|
||
;
|
||
; Copyright: © 1985-1992 by Apple Computer, Inc. All rights reserved.
|
||
;
|
||
; Change History (most recent first):
|
||
;
|
||
; <SM4> 11/5/92 SWC Changed PackMacs.a->Packages.a.
|
||
; <SM3> 10/14/92 CSS Change some branch short instructions to word branches.
|
||
; <11> 2/26/92 DTY #1018596: When calculating the pen position to start drawing the
|
||
; text for a cell, take teSysJust into account for right-left
|
||
; systems. If teSysJust is non zero, compute the pen position from
|
||
; the right side of the cell.
|
||
; <10> 3/19/91 ngk VL,#b6-ngk-003: fix bug in restoring text face
|
||
; <9> 3/4/91 dba dty: get rid of SysVers conditionals
|
||
; <8> 7/20/90 gbm get rid of Asm warning
|
||
; <7> 3/9/90 HJR Fix assembling problem.
|
||
; <6> 3/8/90 JAL Removed include of QuickEqu.a because it was colliding with StandardEqu.d
|
||
; <5> 3/5/90 PKE Added smTruncEnd as truncWhere parameter for TruncText call,
|
||
; since TruncText interface now matches former NTruncText
|
||
; interface.
|
||
; <4> 1/25/90 JSM There is no Script Manager call to determine if truncation is
|
||
; needed, OK to use TextWidth.
|
||
; <3> 1/12/90 JSM Remove unnecessary MOVE.W.
|
||
; <2> 1/12/90 JSM 6.0/7.0 bifurcation. For 7.0, added automatic truncation and
|
||
; condensing when text is too long, along with general cleanup.
|
||
; <1.2> 11/17/89 dba got rid of checks for 64K ROMs
|
||
; <1.1> 8/28/89 SES removed references to nFiles
|
||
; <1.0> 11/16/88 CCH added to EASE
|
||
; 6/8/87 sad color hilighting, truncation (conditional) (version $0001)
|
||
; <S3> 1/5/87 JTC 32-bit support changes.
|
||
;
|
||
; To Do:
|
||
;
|
||
|
||
; Register Usage:
|
||
;
|
||
; A2 = handle to list data
|
||
; A3 = pointer to ListRecord (LHandle dereferenced)
|
||
; A4 = cell's rectangle (LRect), also used to store length of string copied to stack
|
||
;
|
||
; D3 = length of text to draw (LDataLen)
|
||
; D4 = current style before condensing
|
||
; D5 = offset to text in list data handle (LDataOffset)
|
||
; D6 = pointer to the list data (A2 dereferenced)
|
||
; D7 = width of cell available for drawing
|
||
|
||
LOAD 'StandardEqu.d'
|
||
INCLUDE 'Packages.a'
|
||
|
||
doTruncate EQU 1 ; do truncation
|
||
doCondense EQU 1 ; condense text before trying to truncate
|
||
|
||
LDEF0 PROC EXPORT
|
||
|
||
; PROCEDURE DrawCell(LMessage:INTEGER; LSelect:BOOLEAN; LRect:Rect; LCell: Cell;
|
||
; LDataOffset, LDataLen:INTEGER; LHandle:Handle);
|
||
|
||
; Message equates:
|
||
|
||
;InitMsg EQU 0 ; tell drawing routines to init themselves
|
||
;DrawMsg EQU 1 ; draw (and de/select) the indicated data
|
||
;HiliteMsg EQU 2 ; de/select the indicated data
|
||
;CloseMsg EQU 3 ; shut down, the list is being disposed
|
||
|
||
; Stack Frame definition for ListDefProc 0
|
||
|
||
LHandle EQU 8 ; Handle to list data record
|
||
LDataLen EQU LHandle+4 ; length of data
|
||
LDataOffset EQU LDataLen+2 ; offset to data
|
||
LCell EQU LDataOffset+2 ; cell that was hit
|
||
LDrawRect EQU LCell+4 ; rect to draw in
|
||
LSelect EQU LDrawRect+4 ; 1=selected, 0=not selected
|
||
LMessage EQU LSelect+2 ; 0=Init, 1=Draw, 2=Hilite, 3=Close
|
||
LParamSize EQU LMessage+2-8 ; # of bytes of parameters
|
||
|
||
BRA.S @0 ; enter here
|
||
|
||
; standard header
|
||
|
||
DC.W 0 ; flags word
|
||
DC.B 'LDEF' ; type
|
||
DC.W 0 ; ID
|
||
DC.W $0002 ; version
|
||
@0
|
||
LINK A6,#0 ; set up a stack frame
|
||
MOVEM.L D3-D7/A2-A4,-(SP) ; save the usual stuff
|
||
MOVE.L LHandle(A6),A0 ; get handle to list record
|
||
MOVE.L (A0),A3 ; get pointer to (locked) record
|
||
|
||
MOVE.W LMessage(A6),D0 ; why am I being called?
|
||
|
||
SUBQ #1,D0 ; check next in line
|
||
BEQ.S ListDraw ; code = 1 -> draw cell
|
||
SUBQ #1,D0 ; check next
|
||
BEQ.S LHilite ; code = 2 -> invert cell
|
||
BPL.S LDefExit ; other calls not needed here
|
||
|
||
;---------------
|
||
; LInit
|
||
; Here is the code that does the initialization for this defproc
|
||
|
||
LInit
|
||
|
||
; just set up our indent
|
||
|
||
SUBQ #8,SP ; make room for GetFontInfo record
|
||
MOVE.L SP,-(SP) ; point to it
|
||
_GetFontInfo ; and go get info
|
||
|
||
MOVE.W (SP),indent+v(A3) ; indent.v := ascent
|
||
MOVE.W #4,indent+h(A3) ; indent.h := 4
|
||
ADDQ #8,SP ; fix up stack
|
||
LDefExit
|
||
MOVEM.L (SP)+,D3-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.
|
||
|
||
LHilite
|
||
BCLR #7,HiliteMode ; now in color! <8jun87>
|
||
MOVE.L LDrawRect(A6),-(SP) ; push rect
|
||
_InverRect ; and invert it
|
||
BRA.S LDefExit ; all done
|
||
|
||
;---------------
|
||
; ListDraw -- Here is the code that does the drawing
|
||
; for the defProc.
|
||
|
||
ListDraw
|
||
MOVE.L LDrawRect(A6),A4 ; get rect into A4
|
||
tst.b TESysJust+1 ; <11> Check system justification
|
||
bz.s @isLeftJustified ; <11>
|
||
@isRightJustified
|
||
move.w right(a4),d0 ; <11>
|
||
sub.w indent+2(a3),d0 ; <11>
|
||
move.w d0,-(sp) ; <11> Calculate indent from right
|
||
move.w top(a4),d0 ; <11>
|
||
add.w indent(a3),d0 ; <11>
|
||
move.w d0,-(sp) ; <11> Calculate indent from top
|
||
bra.s @positionPen ; <11> Move the pen
|
||
@isLeftJustified
|
||
MOVE.L topLeft(A4),-(SP) ; move pen to indent point
|
||
MOVE.L indent(A3),-(SP)
|
||
PEA 4(SP)
|
||
_AddPt
|
||
@positionPen
|
||
_MoveTo
|
||
|
||
; use default text mode
|
||
|
||
_PenNormal
|
||
|
||
MOVE.L cells(A3),A2 ; get data handle
|
||
MOVEA.L A2,A0 ; data handle <S3>
|
||
_HGetState ; D0 := lock state <S3>
|
||
MOVE.B D0,-(SP) ; save lock state <S3>
|
||
_HLock ; lock across QD calls <S3>
|
||
|
||
MOVE.L A4,-(SP) ; clear out the rect
|
||
_EraseRect
|
||
|
||
MOVE.W LDataLen(A6),D3 ; anything to draw?
|
||
|
||
IF doCondense THEN
|
||
BLE @noDraw ; =>nope, don't draw <22jul87 sad>
|
||
ELSE
|
||
BLE.S @noDraw ; =>nope, don't draw <22jul87 sad>
|
||
ENDIF ; IF doCondense
|
||
|
||
IF doTruncate THEN ; should we do truncation if needed?
|
||
|
||
MOVE.L (A2),D6 ; D6.L = ptr to the text
|
||
MOVE.W LDataOffset(A6),D5 ; D5.W = offset to first byte of this cell
|
||
|
||
; calculate available width
|
||
|
||
MOVE.W right(A4),D7 ; D7 = width = right
|
||
SUB.W left(A4),D7 ; minus left
|
||
SUB.W indent+h(A3),D7 ; minus left indent
|
||
SUB.W #1,D7 ; minus right indent
|
||
|
||
; calculate the width of the text to avoid unecessary calls to _TruncText
|
||
|
||
SUB.W #2,SP ; space for width
|
||
MOVE.L D6,-(SP) ; pointer to text
|
||
MOVE.W D5,-(SP) ; offset to first byte
|
||
MOVE.W D3,-(SP) ; length of text
|
||
_TextWidth
|
||
CMP.W (SP),D7 ; will string fit? <11> Leave width on stack
|
||
BGE @noTruncate ; yes, no need to truncate <SM3> CSS
|
||
|
||
addq #2,sp ; <11> Width isn’t needed til after truncation. Lose it.
|
||
|
||
IF doCondense THEN
|
||
|
||
; condense the text first before calling _TruncText
|
||
|
||
MOVE.L GrafGlobals(A5),A0 ; get QuickDraw globals
|
||
MOVE.L thePort(A0),A0 ; get grafport
|
||
MOVE.B txFace(A0),D0 ; get current style <10 #b6-ngk-003>
|
||
MOVE.W D0,D4 ; save current style in D4.W
|
||
BSET #condenseBit,D0 ; add condensed
|
||
MOVE.W D0,-(SP) ; and set it
|
||
_TextFace
|
||
|
||
ENDIF ; IF doCondense
|
||
|
||
; duplicate current text for _TruncText so we don't change the actual data
|
||
|
||
MOVE.W D3,D0 ; get length of text
|
||
BTST #0,D0 ; is it odd?
|
||
BZ.S @notOdd ; no
|
||
ADDQ.W #1,D0 ; make length even
|
||
|
||
@notOdd
|
||
MOVE.W D0,A4 ; save length of copy in A4.W
|
||
SUB.W D0,SP ; make space on the stack
|
||
MOVE.L SP,A1 ; destination string
|
||
MOVE.L D6,A0 ; pointer to text
|
||
ADD.W D5,A0 ; offset to source
|
||
MOVEQ #0,D0 ; get a long count
|
||
MOVE.W D3,D0 ; get length
|
||
_BlockMove ; copy current text to stack
|
||
|
||
; call _TruncText to truncate the text
|
||
|
||
MOVE.W D3,-(SP) ; save pre-truncated length of text
|
||
|
||
SUBQ #2,SP ; returns whether string truncated
|
||
MOVE.W D7,-(SP) ; width
|
||
PEA 6(SP) ; textPtr
|
||
PEA 8(SP) ; length
|
||
MOVE.W #smTruncEnd,-(SP) ; truncate at end <5>
|
||
_TruncText
|
||
|
||
ADDQ #2,SP ; ignore result
|
||
|
||
; for right justified systems, shift the pen position left the width of the text.
|
||
|
||
tst.b TESysJust+1 ; <11> Right justified?
|
||
bz.s @dontShiftPen ; <11> No. Don’t move the pen
|
||
move.w (sp),d0 ; <11> Length of truncated text
|
||
subq #2,sp ; <11>
|
||
pea 4(sp) ; <11> Pointer to truncated string
|
||
clr.w -(sp) ; <11> Offset to first byte
|
||
move.w d0,-(sp) ; <11> Length of truncated string
|
||
_TextWidth ; <11> Find out how wide it is
|
||
neg.w (sp) ; <11> Use -width as amount to move the pen horizontally
|
||
clr.w -(sp) ; <11> Don’t shift it vertically
|
||
_Move ; <11> Move the pen.
|
||
|
||
; draw the truncated text
|
||
|
||
@dontShiftPen
|
||
MOVE.W (SP)+,D0 ; get truncated length
|
||
PEA (SP) ; point to the truncated text
|
||
CLR.W -(SP) ; no offset
|
||
MOVE.W D0,-(SP) ; truncated length
|
||
_DrawText
|
||
|
||
ADD.W A4,SP ; strip off truncated text
|
||
|
||
IF doCondense THEN
|
||
|
||
; restore original style
|
||
|
||
MOVE.W D4,-(SP) ; restore old style
|
||
_TextFace
|
||
|
||
ENDIF ; IF doCondense
|
||
|
||
BRA.S @noDraw ; done drawing truncated text
|
||
|
||
@noTruncate
|
||
|
||
; Move the pen for right justified systems.
|
||
|
||
tst.b TESysJust+1 ; <11> Check justification
|
||
bnz.s @shiftPen ; <11> Pen needs to be moved
|
||
addq #2,sp ; <11> Lose the string width for left justified systems
|
||
bra.s @drawCellText ; <11>
|
||
@shiftPen
|
||
neg.w (sp) ; <11> Use -width as amount to move then pen horizontally
|
||
clr.w -(sp) ; <11> Don’t move vertically
|
||
_Move ; <11> Move the pen.
|
||
|
||
; draw the text
|
||
|
||
@drawCellText
|
||
MOVE.L D6,-(SP) ; point to the text
|
||
MOVE.W LDataOffset(A6),-(SP) ; offset to first byte
|
||
MOVE.W D3,-(SP) ; and number of bytes
|
||
_DrawText
|
||
|
||
ELSE ; compiled for no truncation
|
||
|
||
MOVE.L (A2),-(SP) ; point to the text
|
||
MOVE.W LDataOffset(A6),-(SP) ; offset to first byte
|
||
MOVE.W D3,-(SP) ; and number of bytes
|
||
_DrawText
|
||
|
||
ENDIF ; IF doTruncate
|
||
|
||
@noDraw
|
||
MOVEA.L A2,A0 ; data handle <S3>
|
||
MOVE.B (SP)+,D0 ; saved lock state <S3>
|
||
_HSetState ; stuffed back to handle<S3>
|
||
|
||
TST.B LSelect(A6) ; selected? <22jul87 sad>
|
||
BNZ.S LHilite ; yes <22jul87 sad>
|
||
BRA.S LDefExit ; and return
|
||
|
||
END
|