antoine-source/appleworksgs/PL/Src/PMOVE.S

1 line
7.3 KiB
ArmAsm
Executable File

load 'macros.dump'
include 'driver.equ'
include 'pl.equ'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_Deref
IMPORT P_AddObjRgn
IMPORT P_AddThreadRgn
IMPORT P_BoundsRect
IMPORT P_BuildUndo
IMPORT P_Constrain
IMPORT P_DrawFigure
IMPORT P_DrawHandles
IMPORT P_DrawRgn
IMPORT P_FixRect
IMPORT P_FixSpecRect
IMPORT P_ListOp
IMPORT P_Local2PL
IMPORT P_MagMove
IMPORT P_MagPt
IMPORT P_ObjList
IMPORT P_TrackCursor
IMPORT D_Set4Pat
IMPORT T_ReThread
IMPORT P_PrintHand
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY P_WaitMouse
;------------------------------------------------------------------------------
;
; P_MoveObject (ObjHdl:l, AnchorPt:l)
;
P_MoveObject PROC EXPORT
;Using P_Data
;Using P_ObjData
INPUT ObjHdl:l,AnchorPt:l
LOCAL ObjPtr:l,NewPt:l,ObjType:w,ObjCount:w
LOCAL Q_Rect:r,MultRect:r,TRect:r,TMultRect:r
LOCAL HDiff:w,VDiff:w,UpdateRgn:l,RealPt:l
BEGIN
call P_WaitMouse,in=(AnchorPt:l),out=(a:w)
jeq Exit
rcall D_Deref,in=(ObjHdl:ax),out=(ObjPtr:ax)
moveword [ObjPtr]:#P_Type,ObjType
moverect [ObjPtr]:#P_ObjRect,Q_Rect
call P_BoundsRect,in=(P_ObjList:l,!MultRect:l),out=(ObjCount:w)
tool _SetPenMode,in=(#notXOR:w)
tool _SetPenSize,in=(#2:w,#1:w)
call D_Set4Pat,in=(#LeftGray:w)
WhileLoop
tool _GetMouse,in=(!NewPt:l)
call P_TrackCursor,in=(!NewPt:l)
rcall P_Local2PL,in=(NewPt:ax),out=(NewPt:ax)
movelong NewPt,RealPt
in #P_MOVEMENT:w,AnchorPt:l,!NewPt:l,P_PrintHand:l
xcall P_Constrain
subword NewPt,AnchorPt,VDiff
subword NewPt+2,AnchorPt+2,HDiff
; Change Q_Rect
addword VDiff,Q_Rect,TRect
addword VDiff,Q_Rect+4,TRect+4
addword HDiff,Q_Rect+2,TRect+2
addword HDiff,Q_Rect+6,TRect+6
call P_MagMove,in=(!TRect:l)
subword TRect,Q_Rect,VDiff
subword TRect+2,Q_Rect+2,HDiff
call P_DrawFigure,in=(ObjType:w,TRect:l,TRect+4:l)
cmpw ObjCount,#2
blt NoMultDraw
; Change MultRect
addword VDiff,MultRect,TMultRect
addword VDiff,MultRect+4,TMultRect+4
addword HDiff,MultRect+2,TMultRect+2
addword HDiff,MultRect+6,TMultRect+6
call D_Set4Pat,in=(#RightGray:w)
call P_DrawFigure,in=(#P_RECTANGLE:w,TMultRect:l,TMultRect+4:l)
call D_Set4Pat,in=(#LeftGray:w)
NoMultDraw
call P_WaitMouse,in=(RealPt:l),out=(a:w)
beq EndWhile
jsr EraseStuff
brl WhileLoop
EndWhile
jsr EraseStuff
_PenNormal
tool _HUnlock,in=(ObjHdl:l)
call P_BuildUndo,in=(#P_MoveUndo:w)
tool _NewRgn,out=(UpdateRgn:l)
call P_ListOp,in=(P_ObjList:l,#PL_AddUpdate:w,UpdateRgn:l,#0:l)
call P_ListOp,in=(P_ObjList:l,#PL_OffsetObj:w,HDiff:w,VDiff:w,#0:l)
call P_ListOp,in=(P_ObjList:l,#PL_AddUpdate:w,UpdateRgn:l,#0:l)
call P_DrawRgn,in=(UpdateRgn:l)
Exit RETURN
EraseStuff
call P_DrawFigure,in=(ObjType:w,TRect:l,TRect+4:l)
cmpw ObjCount,#2
blt NoMultErase
call D_Set4Pat,in=(#RightGray:w)
call P_DrawFigure,in=(#P_RECTANGLE:w,TMultRect:l,TMultRect+4:l)
call D_Set4Pat,in=(#LeftGray:w)
NoMultErase
rts
ENDP
;------------------------------------------------------------------------------
;
; P_StretchObj (ObjHdl:l; HandleNo:w; StartPt:l; ModFlags:w)
;
P_StretchObj PROC EXPORT
;Using P_Data
;Using P_ObjData
;Using T_TextEqu
INPUT ObjHdl:l,HandleNo:w,StartPt:l,ModFlags:w
LOCAL ObjPtr:l,Q_Rect:r,NRect:r,NewPt:l,Swapped:w
LOCAL ObjType:w,HDiff:w,VDiff:w,UpdateRgn:l
LOCAL MousePt:l,AnchorPt:l
BEGIN
call P_WaitMouse,in=(StartPt:l),out=(a:w)
jeq Exit
rcall D_Deref,in=(ObjHdl:ax),out=(ObjPtr:ax)
moveword [ObjPtr]:#P_Type,ObjType
moverect [ObjPtr]:#P_ObjRect,Q_Rect
moveword [ObjPtr]:#P_Selected,a
beq NotSelected
call P_DrawHandles,in=(ObjPtr:l)
NotSelected
moveword #1,[ObjPtr]:#P_Selected
tool _SetPenMode,in=(#notXOR:w)
tool _SetPenSize,in=(#2:w,#1:w)
call D_Set4Pat,in=(#LeftGray:w)
movelong StartPt,AnchorPt ; bogus; should never have 0 handle
lda HandleNo
asl a
tax
jmp (AnchorTable,x)
AnchorTable ; ; Which handle?
DC.W Nothing
DC.W TopLeftA
DC.W BottomRightA
DC.W BottomLeftA
DC.W TopRightA
TopLeftA movelong Q_Rect+4,AnchorPt
movelong Q_Rect,StartPt
bra Nothing
BottomRightA movelong Q_Rect,AnchorPt
movelong Q_Rect+4,StartPt
bra Nothing
BottomLeftA moveword Q_Rect+6,AnchorPt+2
moveword Q_Rect,AnchorPt
moveword Q_Rect+2,StartPt+2
moveword Q_Rect+4,StartPt
bra Nothing
TopRightA moveword Q_Rect+2,AnchorPt+2
moveword Q_Rect+4,AnchorPt
moveword Q_Rect+6,StartPt+2
moveword Q_Rect,StartPt
Nothing
WhileLoop
tool _GetMouse,in=(!NewPt:l)
call P_TrackCursor,in=(!NewPt:l)
rcall P_Local2PL,in=(NewPt:ax),out=(NewPt:ax)
movelong ax,MousePt
; constrain to Q_square.
in ObjType:w,AnchorPt:l,!NewPt:l,P_PrintHand:l
xcall P_Constrain
; get to any guides.
call P_MagPt,in=(!NewPt:l,!AnchorPt:l,ObjType:w)
; keep it Q_square.
in ObjType:w,AnchorPt:l,!NewPt:l,P_PrintHand:l
xcall P_Constrain
subword NewPt,StartPt,VDiff
subword NewPt+2,StartPt+2,HDiff
; Draw It
moverect Q_Rect,NRect
jsr StretchRect
call P_DrawFigure,in=(ObjType:w,NRect:l,NRect+4:l)
call P_WaitMouse,in=(MousePt:l),out=(a:w)
beq EndWhile
; Erase It
call P_DrawFigure,in=(ObjType:w,NRect:l,NRect+4:l)
brl WhileLoop
EndWhile
_PenNormal
; Handle pictures
cmpw ObjType,#P_PICTURE
bne Resize
lda ModFlags
and #optionKey
beq StretchPict
; Set crop undo
call P_BuildUndo,in=(#P_CropUndo:w)
bra FixObjRect
; Map the Pict Q_Rect on a stretch
StretchPict
call P_BuildUndo,in=(#P_StretchUndo:w)
addlong ObjPtr,#P_PictRect,s
pushlong !Q_Rect
pushlong !NRect
_MapRect
bra FixObjRect
Resize
call P_BuildUndo,in=(#P_StretchUndo:w)
; Accumulate old and D_New objects into the D_Update Q_Region
FixObjRect
tool _NewRgn,out=(UpdateRgn:l)
call P_AddObjRgn,in=(ObjPtr:l,UpdateRgn:l)
moverect NRect,[ObjPtr]:#P_ObjRect
call P_FixSpecRect,in=(ObjPtr:l)
call P_AddObjRgn,in=(ObjPtr:l,UpdateRgn:l)
tool _HUnlock,in=(ObjHdl:l)
; Handles Q_Text objects
cmpw ObjType,#P_Alpha
bne NotAlpha
call P_AddThreadRgn,in=(ObjHdl:l,UpdateRgn:l)
call T_ReThread,in=(ObjHdl:l)
NotAlpha
call P_DrawRgn,in=(UpdateRgn:l)
Exit RETURN
StretchRect
lda HandleNo
asl a
tax
jmp (JumpTable,x)
JumpTable ; ;order determined by FindObject
DC.W RectSet
DC.W TopLeft
DC.W BottomRight
DC.W BottomLeft
DC.W TopRight
TopLeft
addword NRect,VDiff,NRect
addword NRect+2,HDiff,NRect+2
bra RectSet
BottomRight
addword NRect+4,VDiff,NRect+4
addword NRect+6,HDiff,NRect+6
bra RectSet
BottomLeft
addword NRect+2,HDiff,NRect+2
addword NRect+4,VDiff,NRect+4
bra RectSet
TopRight
addword NRect,VDiff,NRect
addword NRect+6,HDiff,NRect+6
RectSet
call P_FixRect,in=(!NRect:l,ObjType:w,#0:w,#0:w)
rts
ENDP
;------------------------------------------------------------------------------
;
; P_WaitMouse (Pt:l) : StillDown:w
;
; Waits until the mouse button is released or it changes position.
P_WaitMouse PROC EXPORT
INPUT Pt:l
OUTPUT StillDown:w
LOCAL NewPt:l
BEGIN
stz StillDown
Loop
tool _StillDown,in=(#0:w),out=(a:w)
beq Exit
tool _GetMouse,in=(!NewPt:l)
rcall P_Local2PL,in=(NewPt:ax),out=(NewPt:ax)
cmpl NewPt,Pt
beq Loop
inc StillDown
Exit RETURN
ENDP
END