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

1 line
21 KiB
ArmAsm
Executable File

load 'macros.dump'
include 'driver.equ'
include 'pl.equ'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_AddRectRgn
IMPORT D_Deref
IMPORT P_DrawHandles
IMPORT P_Fix2Int
IMPORT P_FixRect
IMPORT P_GetModifiers
IMPORT P_GetPageMode
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY P_AddObjRgn
ENTRY P_DoHandles
ENTRY P_FixSpecRect
ENTRY P_PtInLine
ENTRY P_PtInOval
ENTRY P_ValidRect
;------------------------------------------------------------------------------
;
; P_ListOp (ObjList:l,Oper:w,Data:l,Data2:l)
;
; Automatically skips any object with the Deleted flag set.
P_ListOp PROC EXPORT
;Using P_ObjData
INPUT ObjList:l,Oper:w,Data:l,Data2:l
LOCAL ObjPtr:l,ObjType:w,Selected:w,Q_Rect:r
BEGIN
ObjLoop cpzl ObjList
beq Exit
movelong [ObjList],ObjPtr
moveword [ObjPtr]:#P_Deleted,a
bne NextObj
tool _HLock,in=(ObjList:l)
moveword [ObjPtr]:#P_Type,ObjType
moveword [ObjPtr]:#P_Selected,Selected
moverect [ObjPtr]:#P_ObjRect,Q_Rect
lda Oper
asl a
tax
jsr (JumpTable,x)
tool _HUnlock,in=(ObjList:l)
NextObj movelong [ObjPtr],ObjList
bra ObjLoop
Exit RETURN
JumpTable
DC.W SelectRect
DC.W DeselectAll
DC.W SelectAll
DC.W FixTObj
DC.W OffsetObj
DC.W AddUpdate
DC.W ClrUndoData
DC.W SetUndoData
DC.W CpyUndoData
; -------- Operation 0
SelectRect
;TopLeft
tool _PtInRect,in=(!Q_Rect:l,Data:l),out=(a:w)
beq Exit0
;BottomRight
tool _PtInRect,in=(!Q_Rect+4:l,Data:l),out=(a:w)
beq Exit0
lda Selected
eor #1
moveword a,[ObjPtr]:#P_Selected
call P_DrawHandles,in=(ObjPtr:l)
Exit0 rts
; -------- Operation 1
;
; If Data is not 0, then don't D_Update the screen.
DeselectAll
lda Selected
beq Exit1
moveword #0,[ObjPtr]:#P_Selected
lda Data
bne Exit1
call P_DrawHandles,in=(ObjPtr:l)
Exit1 rts
; ------- Operation 2
SelectAll
lda Selected
bne Exit2
inc a
moveword a,[ObjPtr]:#P_Selected
call P_DrawHandles,in=(ObjPtr:l)
Exit2 rts
; ------- Operation 3
FixTObj
cmpw ObjType,#P_ALPHA
bne Exit3
moveword Data,[ObjPtr]:#P_PageNo
Exit3 rts
; ------- Operation 4
; Offsets all object Q_Rects by Data.
OffsetObj
lda Selected
beq Exit4
addword Q_Rect,Data,[ObjPtr]:#P_ObjRect
addword Q_Rect+4,Data,[ObjPtr]:#P_ObjRect+4
addword Q_Rect+2,Data+2,[ObjPtr]:#P_ObjRect+2
addword Q_Rect+6,Data+2,[ObjPtr]:#P_ObjRect+6
cmpw ObjType,#P_PICTURE
bne PictSet
addword [ObjPtr]:#P_PictRect,Data,[ObjPtr]:#P_PictRect
addword [ObjPtr]:#P_PictRect+4,Data,[ObjPtr]:#P_PictRect+4
addword [ObjPtr]:#P_PictRect+2,Data+2,[ObjPtr]:#P_PictRect+2
addword [ObjPtr]:#P_PictRect+6,Data+2,[ObjPtr]:#P_PictRect+6
PictSet
call P_FixSpecRect,in=(ObjPtr:l)
Exit4 rts
; ------- Operation 5
; Adds the selected objects to the D_Update Q_Region passed in Data.
AddUpdate
lda Selected
beq Exit5
call P_AddObjRgn,in=(ObjPtr:l,Data:l)
Exit5 rts
; ------ Operation 6
; Sets the UndoData for all selected objects.
ClrUndoData
moveword #0,[ObjPtr]:#P_UndoData
Exit6 rts
; ------ Operation 7
; Sets the UndoData for all selected objects.
SetUndoData
lda Selected
beq Exit7
moveword Data,[ObjPtr]:#P_UndoData
Exit7 rts
; ------ Operation 8
; Copies the UndoData into the Selected field. Used for redo of obj deletion.
CpyUndoData
moveword [ObjPtr]:#P_UndoData,[ObjPtr]:#P_Selected
Exit8 rts
ENDP
;------------------------------------------------------------------------------
;
; P_FindObject (ObjList:l,Pt:l) : ObjHdl:l,Handle:w
;
; Pt must be in screen coordinates.
;
; Returns 0 for ObjHdl if no object is found.
; Handle ranges from 1 to 4 for normal objects, and includes
; 5 and 6 for Q_Text objects.
;
; [BOGUS] -- leaves ObjHdl X_Locked.
P_FindObject PROC EXPORT
;Using P_Data
;Using P_ObjData
INPUT ObjList:l,Pt:l
OUTPUT ObjHdl:l,Handle:w
LOCAL ObjPtr:l,Q_Rect:r,InnerRect:r,HRect:r,PageMode:w
LOCAL ObjType:w,Q_PenSize:w,RgnHdl:l,InLine:w
BEGIN
rcall P_GetPageMode,out=(PageMode:a)
; Check Handles of all objects first
movelong ObjList,ObjHdl
Loop cpzl ObjHdl
beq CheckObjects
rcall D_Deref,in=(ObjHdl:ax),out=(ObjPtr:ax)
moveword [ObjPtr]:#P_Deleted,a
bne TryNext
moveword [ObjPtr]:#P_Selected,a
beq TryNext
call P_DoHandles,in=(ObjPtr:l,#1:w,Pt:l),out=(Handle:w)
jne Exit
TryNext
tool _HUnlock,in=(ObjHdl:l)
movelong [ObjPtr],ObjHdl
brl Loop
; Check all the objects
CheckObjects
stz Handle
movelong ObjList,ObjHdl
Loop2 cpzl ObjHdl
jeq Exit
rcall D_Deref,in=(ObjHdl:ax),out=(ObjPtr:ax)
moveword [ObjPtr]:#P_Deleted,a
jne TryNext2
moveword [ObjPtr]:#P_Type,ObjType
moveword [ObjPtr]:#P_PenSize,Q_PenSize
moverect [ObjPtr]:#P_ObjRect,Q_Rect
moverect Q_Rect,InnerRect
call P_FixRect,in=(!Q_Rect:l,ObjType:w,PageMode:w,#1:w)
; Inset by Q_PenSize
pushlong !InnerRect
lda Q_PenSize
tax
asl a
inc a
pha
inx
phx
_InsetRect
call P_FixRect,in=(!InnerRect:l,ObjType:w,PageMode:w,#1:w)
lda ObjType
asl a
tax
jmp (JumpTable,x)
CheckLine
call P_PtInLine,in=(Pt:l,ObjPtr:l,!Q_Rect:l),out=(a:w)
jne Exit
brl TryNext2
CheckFRect
tool _PtInRect,in=(!Pt:l,!Q_Rect:l),out=(a:w)
jne Exit
brl TryNext2
CheckRect
moveword [ObjPtr]:#P_ObjFilled,a
bne CheckFRect
tool _PtInRect,in=(!Pt:l,!Q_Rect:l),out=(a:w)
beq TryNext2
tool _PtInRect,in=(!Pt:l,!InnerRect:l),out=(a:w)
beq Exit
bra TryNext2
CheckCircle
call P_PtInOval,in=(Pt:l,!Q_Rect:l),out=(a:w)
beq TryNext2
moveword [ObjPtr]:#P_ObjFilled,a
bne Exit
call P_PtInOval,in=(Pt:l,!InnerRect:l),out=(a:w)
beq Exit
TryNext2 tool _HUnlock,in=(ObjHdl:l)
movelong [ObjPtr],ObjHdl
brl Loop2
Exit RETURN
JumpTable DC.W TryNext2
DC.W CheckFRect
DC.W CheckFRect
DC.W CheckFRect
DC.W CheckLine
DC.W CheckLine
DC.W CheckRect
DC.W CheckRect
DC.W CheckCircle
DC.W CheckFRect
ENDP
;------------------------------------------------------------------------------
;
; P_LineAdjust (ObjPtr:l,RectPtr:l)
;
P_LineAdjust PROC EXPORT
;Using P_ObjData
INPUT ObjPtr:l,RectPtr:l
LOCAL Q_PenSize:w
BEGIN
cmpw [ObjPtr]:#P_Type,#P_LINE
beq IsLine
cmp #P_STRLINE
bne Exit
IsLine
moveword [ObjPtr]:#P_PenSize,Q_PenSize
cmpw [RectPtr]:#4,[RectPtr]
bge Normal1
addword Q_PenSize,[RectPtr],[RectPtr]
bra Horiz
Normal1 addword Q_PenSize,[RectPtr]:#4,[RectPtr]:#4
Horiz
asl Q_PenSize
cmpw [RectPtr]:#6,[RectPtr]:#2
bge Normal2
addword Q_PenSize,[RectPtr]:#2,[RectPtr]:#2
bra Exit
Normal2 addword Q_PenSize,[RectPtr]:#6,[RectPtr]:#6
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; P_DoHandles (ObjPtr:l,DoFind:w,Where:l) : Handle:w
;
; DoFind -- 1 - Find; 0 - Draw
; Where -- Mouse pos. in local screen coordinates if Find
; Handle -- Result of Find
;
; General purpose routine for drawing and finding handles.
P_DoHandles PROC EXPORT
;Using P_Data
;Using P_ObjData
INPUT ObjPtr:l,DoFind:w,Where:l
OUTPUT Handle:w
LOCAL Q_Rect:r,HRect:r,ObjType:w,Swapped:w
LOCAL Type:w,Q_PenSize:w,DblPen:w,Temp:w,PageMode:w
Q_Line equ 1
FlipLine equ 2
BEGIN
moverect [ObjPtr]:#P_ObjRect,Q_Rect
call P_LineAdjust,in=(ObjPtr:l,!Q_Rect:l)
moveword [ObjPtr]:#P_Type,ObjType
moveword [ObjPtr]:#P_PenSize,Q_PenSize
asl a
sta DblPen
rcall P_GetPageMode,out=(PageMode:a)
call P_FixRect,in=(!Q_Rect:l,ObjType:w,PageMode:w,#1:w)
call P_ValidRect,in=(!Q_Rect:l),out=(Swapped:w)
lda DoFind
beq Drawing
; finding - first test bounds, to make test fast for really bad pts
stz Handle
moverect Q_Rect,HRect
tool _InsetRect,in=(!HRect:l,#-4:w,#-6:w)
tool _PtInRect,in=(!Where:l,!HRect:l),out=(a:w)
jeq done
Drawing
stz Type
cmpw ObjType,#P_LINE
beq IsLine
cmp #P_STRLINE
bne Cont
IsLine
inc Type
lda Swapped
beq Cont
inc Type
Cont
TestHV
lda Type
jeq NotHV ; Not a horiz or vert Q_Line
subword Q_Rect+6,Q_Rect+2,a ; Q_Rect width = horiz. Q_PenSize?
cmp DblPen
bne NotVert
; Vertical Q_Line
lsr a
addword a,Q_Rect+2,a
subword a,#3,HRect+2
addword a,#6,HRect+6
addword Q_Rect,#1,HRect+4
subword a,#3,HRect
lda #P_TLHdl
jsr DoOneHand ; draw or test the handle
jcs done ; carry set if hit: exit
subword Q_Rect+4,#1,HRect
addword a,#3,HRect+4
lda #P_BRHdl
jsr DoOneHand
brl done
notvert subword Q_Rect+4,Q_Rect,a ; Q_Rect height = vert. Q_PenSize?
cmp DblPen
bne nothv
; Horizontal Q_Line
lsr a
addword a,Q_Rect,a
subword a,#1,HRect
addword a,#3,HRect+4
addword Q_Rect+2,#2,HRect+6
subword a,#6,HRect+2
lda #P_TLHdl
jsr DoOneHand
jcs done
subword Q_Rect+6,#2,HRect+2
addword a,#6,HRect+6
lda #P_BRHdl
jsr DoOneHand
brl done
; Not horizontal or vertical
nothv
addword Q_Rect,#1,HRect+4
subword a,#3,HRect
addword Q_Rect+2,#2,HRect+6
subword a,#6,HRect+2
cmpw Type,#FLipLine
beq didul
lda #P_TLHdl
jsr DoOneHand
jcs done
didul
subword Q_Rect+4,#1,HRect
addword a,#3,HRect+4
cmpw Type,#Q_Line
beq diddl
lda #P_BLHdl
jsr DoOneHand
jcs done
diddl
subword Q_Rect+6,#2,HRect+2
addword a,#6,HRect+6
cmpw Type,#FlipLine
beq diddr
lda #P_BRHdl
jsr DoOneHand
jcs done
diddr
addword Q_Rect,#1,HRect+4
subword a,#3,HRect
cmpw Type,#Q_Line
beq didur
lda #P_TRHdl
jsr DoOneHand
jcs done
didur
lda DoFind
jeq done
cmpw ObjType,#P_ALPHA
jne done
subword Q_Rect+6,Q_Rect+2,a
lsr a
subword a,#7,a
addword a,Q_Rect+2,HRect+2
addword a,#14,HRect+6
moveword Q_Rect,HRect+4
subword a,#5,HRect
lda #5
jsr DoOneHand
jcs done
moveword Q_Rect+4,HRect
addword a,#6,HRect+4
lda #6
jsr DoOneHand
done
cmpw Type,#2
bne Exit
cmpw Handle,#4
bne Try2
moveword #1,Handle
bra Exit
Try2 cmp #3
bne Exit
moveword #2,Handle
Exit RETURN
DoOneHand
sta temp
lda DoFind
beq DrawIt
tool _PtInRect,in=(!Where:l,!HRect:l),out=(a:w)
beq notin
sec
moveword temp,Handle
notin rts
DrawIt
tool _InvertRect,in=(!HRect:l)
rts
ENDP
;-------------------------------------------------------------------------------
;
; P_DoThread (ObjHdl:l,NewObj:l,Dir:w)
;
P_DoThread PROC EXPORT
;Using P_ObjData
INPUT ObjHdl:l,NewObj:l,Dir:w
LOCAL ObjPtr:l,NewPtr:l,PrevObj:l,PrevPtr:l
LOCAL NextObj:l,NextPtr:l
BEGIN
movelong [ObjHdl],ObjPtr
movelong [NewObj],NewPtr
lda Dir
bne After
movelong [ObjPtr]:#P_PThread,PrevObj
movelong ObjHdl,[NewPtr]:#P_NThread
movelong PrevObj,[NewPtr]:#P_PThread
movelong NewObj,[ObjPtr]:#P_PThread
cpzl PrevObj
beq Skip1
movelong [PrevObj],PrevPtr
movelong NewObj,[PrevPtr]:#P_NThread
Skip1
bra Exit
After
movelong [ObjPtr]:#P_NThread,NextObj
movelong ObjHdl,[NewPtr]:#P_PThread
movelong NextObj,[NewPtr]:#P_NThread
movelong NewObj,[ObjPtr]:#P_NThread
cpzl NextObj
beq Skip2
movelong [NextObj],NextPtr
movelong NewObj,[NextPtr]:#P_PThread
Skip2
Exit RETURN
ENDP
;-----------------------------------------------------------------------------
;
; P_BoundsRect (ObjHdl:l,RectPtr:l) : Count:w
;
P_BoundsRect PROC EXPORT
;Using P_Data
;Using P_ObjData
INPUT ObjHdl:l,RectPtr:l
OUTPUT Count:w
LOCAL ObjPtr:l,Q_Rect:r
BEGIN
stz Count
WhileLoop cpzl ObjHdl
jeq EndLoop
movelong [ObjHdl],ObjPtr
moveword [ObjPtr]:#P_Deleted,a
jne NextObject
moveword [ObjPtr]:#P_Selected,a
jeq NextObject
moverect [ObjPtr]:#P_ObjRect,Q_Rect
call P_LineAdjust,in=(ObjPtr:l,!Q_Rect:l)
call P_ValidRect,in=(!Q_Rect:l),out=(a:w)
lda Count
bne NotFirst
moverect Q_Rect,[RectPtr]
NotFirst
inc Count
cmpw Q_Rect,[RectPtr]
bpl x1
sta [RectPtr]
x1
cmpw Q_Rect+2,[RectPtr]:#2
bpl x2
sta [RectPtr],y
x2
cmpw Q_Rect+4,[RectPtr]:#4
bmi x3
sta [RectPtr],y
x3
cmpw Q_Rect+6,[RectPtr]:#6
bmi x4
sta [RectPtr],y
x4
NextObject movelong [ObjPtr],ObjHdl
brl WhileLoop
EndLoop
RETURN
ENDP
;------------------------------------------------------------------------------
;
; P_Constrain (Figure:w,AnchorPt:l,PointPtr:l,PrintHandle:l)
;
P_Constrain PROC EXPORT
;Using P_ObjData
INPUT Figure:w,AnchorPt:l,PointPtr:l,PHdl:l
LOCAL ModFlags:w,Flags:w,NewPt:l
LOCAL dx:w,dy:w,pdx:l,pdy:l
LOCAL ratio:l,tmp:l,newdy:l
BEGIN +B
call P_GetModifiers,out=(ModFlags:w)
lda Figure
beq ToExit
asl a
tay
lda ConstrainTable,y
sta flags
cmpw Figure,#P_STRLINE
beq DoConstr
lda ModFlags
and #shiftKey
bne DoConstr
ToExit brl Exit
*
* This code constrains newpt with reference to anchorpt. The type of
* constraint is specified in `flags,' a combination of the bits
* %01 (constrain horizontally/vertically) & %10 (constrain
* diagonally). At least one bit must be set.
* Q_Pixels are assumed to be shaped as defined by the print record.
*
DoConstr movelong [phdl],tmp
tool _FixRatio,in=([tmp]:#4:w,[tmp]:#6:w),out=(ratio:l)
movelong [pointptr],newpt
subword anchorpt,newpt,dy
abs a
sta pdy+2
stz pdy
subword anchorpt+2,newpt+2,dx
abs a
sta pdx+2
stz pdx
tool _FixDiv,in=(pdy:l,ratio:l),out=(newdy:l)
movelong newdy,tmp
clc
rol tmp
rol tmp+2
cmpl tmp,pdx ; if 2dy < dx, should be horizontal
jlt horiz
cmpl newdy,pdx ; if dy < dx, should be diag/horiz
blt diag2
movelong pdx,tmp
clc
rol tmp
rol tmp+2
cmpl newdy,tmp ; if dy < 2dx should be diag/vert
blt diag1 ; otherwise vertical.
vert lda flags ; If can't be vertical, diagonal
bit #1
beq diag1
moveword anchorpt+2,[pointptr]:#2
brl exit
diag1 lda flags ; If can't be diagonal, vertical
bit #2
beq vert
lda dx
bpl d1pos
rcall P_Fix2Int,in=(newdy:ax)
addword a,anchorpt+2,[pointptr]:#2
bra exit
d1pos rcall P_Fix2Int,in=(newdy:ax)
neg a
addword a,anchorpt+2,[pointptr]:#2
bra exit
diag2 lda flags ; If can't be diagonal, horizontal
bit #2
beq horiz
tool _FixMul,in=(pdx:l,ratio:l),out=(pdx:l)
lda dy
bpl d2pos
rcall P_Fix2Int,in=(pdx:ax)
addword a,anchorpt,[pointptr]
bra exit
d2pos rcall P_Fix2Int,in=(pdx:ax)
neg a
addword a,anchorpt,[pointptr]
bra exit
horiz lda flags ; If can't be horizontal, diagonal
bit #1
beq diag2
moveword anchorpt,[pointptr]
Exit RETURN
ConstrainTable DC.W 0,2,2,2,1,3,2,2,2,2,1
ENDP
;-----------------------------------------------------------------------------
;
; P_AddObjRgn (ObjPtr:l; RgnHdl:l)
;
; Adds the area taken up by the object to the already created RgnHdl.
P_AddObjRgn PROC EXPORT
;Using P_Data
;Using P_ObjData
INPUT ObjPtr:l,RgnHdl:l
LOCAL Q_Rect:r,HRect:r,PageMode:w
BEGIN
moverect [ObjPtr]:#P_ObjRect,Q_Rect
call P_LineAdjust,in=(ObjPtr:l,!Q_Rect:l)
rcall P_GetPageMode,out=(PageMode:a)
call P_FixRect,in=(!Q_Rect:l,#P_RECTANGLE:w,PageMode:w,#1:w)
moveword [ObjPtr]:#P_Selected,a
beq AddRect
subword Q_Rect+2,#4,Q_Rect+2
addword Q_Rect+6,#4,Q_Rect+6
cmpw [ObjPtr]:#P_Type,#P_ALPHA
bne NotAlpha
subword Q_Rect,#6,Q_Rect
addword Q_Rect+4,#6,Q_Rect+4
bra AddRect
NotAlpha dec Q_Rect
dec Q_Rect
inc Q_Rect+4
inc Q_Rect+4
AddRect
call D_AddRectRgn,in=(RgnHdl:l,!Q_Rect:l)
Exit RETURN
ENDP
;----------------------------------------------------------------------------
;
; P_SmallRect (RectPtr:l) : Small:w
P_SmallRect PROC EXPORT
INPUT RectPtr:l
OUTPUT Small:w
BEGIN
stz Small
subword [RectPtr]:#4,[RectPtr],a
cmp #6
bge Exit
subword [RectPtr]:#6,[RectPtr]:#2,a
cmp #12
bge Exit
inc Small
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; P_MaskRect (RectPtr:l)
;
P_MaskRect PROC EXPORT
INPUT RectPtr:l
BEGIN
ldy #2
lda [RectPtr],y
and #$FFFE
sta [RectPtr],y
ldy #6
lda [RectPtr],y
and #$FFFE
sta [RectPtr],y
RETURN
ENDP
;---------------------------------------------------------------------------------
;
; P_FixSpecRect (ObjPtr:l)
;
P_FixSpecRect PROC EXPORT
;Using P_ObjData
INPUT ObjPtr:l
LOCAL Q_Rect:r,TRect:r,Tmp:w
BEGIN
addlong ObjPtr,#P_ObjRect,s
jsl P_MaskRect
moveword [ObjPtr]:#P_Type,a
cmp #P_ALPHA
jne NotAlpha
moverect [ObjPtr]:#P_ObjRect,Q_Rect
addword Q_Rect+2,#22,Tmp
scmpw Tmp,Q_Rect+6
blt HOkay
moveword Tmp,Q_Rect+6
moveword a,[ObjPtr]:#P_ObjRect+6
HOkay
addword Q_Rect,#4,Tmp
scmpw Tmp,Q_Rect+4
blt VOKay
moveword Tmp,Q_Rect+4
moveword a,[ObjPtr]:#P_ObjRect+4
VOkay
addword Q_Rect,#1,TRect
subword Q_Rect+4,#1,TRect+4
addword Q_Rect+2,#4,TRect+2
subword Q_Rect+6,#4,TRect+6
moverect TRect,[ObjPtr]:#P_TRect
NotAlpha
cmpw [ObjPtr]:#P_Type,#P_PICTURE
bne Exit
addlong ObjPtr,#P_PictRect,s
jsl P_MaskRect
Exit RETURN
ENDP
;-----------------------------------------------------------------------------
;
; P_ValidRect (RectPtr:l) : Flipped:w
;
P_ValidRect PROC EXPORT
;Using P_ObjData
INPUT RectPtr:l
OUTPUT Flipped:w
BEGIN
stz Flipped
lda [RectPtr]
tax
cmpw a,[RectPtr]:#4
bmi VOkay
ldy #4
moveword [RectPtr]:y,[RectPtr]
txa
moveword a,[RectPtr]:y
inc Flipped
VOkay
moveword [RectPtr]:#2,a
tax
cmpw a,[RectPtr]:#6
bmi HOkay
moveword [RectPtr]:#6,[RectPtr]:#2
txa
moveword a,[RectPtr]:#6
lda Flipped
eor #1
sta Flipped
HOkay
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; P_GetPictSize (PictHdl:l) : Pt:l
;
; Sets RectPtr to the bounding Q_Rect for the given picture.
P_GetPictSize PROC EXPORT
INPUT PictHdl:l
OUTPUT Pt:l
LOCAL Ptr:l
BEGIN
movelong [PictHdl],Ptr
subword [Ptr]:#6,[Ptr]:#2,Pt
subword [Ptr]:#8,[Ptr]:#4,Pt+2
; moveword [Ptr],a
; and #$80
; bne Not320
; asl Pt+2
Not320
RETURN
ENDP
;------------------------------------------------------------------------------
;
; P_PtInLine (Pt:l,ObjPtr:l,RectPtr:l) : Result:w
;
; Makes a rgn of the Q_Line and does a _PtInRgn
P_PtInLine PROC EXPORT
;Using P_ObjData
INPUT Pt:l,ObjPtr:l,RectPtr:l
OUTPUT Result:w
LOCAL Start:l,End:l,width:w,height:w,lh:w,lv:w
LOCAL RgnHdl:l,Flipped:w,Q_Rect:r
BEGIN
; Make a quick check to the adjusted Q_Line coordinates to see if in
; bounding rectangle
stz Result
moverect [RectPtr],Q_Rect
call P_LineAdjust,in=(ObjPtr:l,!Q_Rect:l)
call P_ValidRect,in=(!Q_Rect:l),out=(a:w)
tool _PtInRect,in=(!Pt:l,!Q_Rect:l),out=(Result:w)
jeq Exit
moveword [ObjPtr]:#P_PenSize,lv
asl a
sta lh
call P_ValidRect,in=(RectPtr:l),out=(Flipped:w)
movelong [RectPtr],End
movelong [RectPtr]:#4,Start
; now ul is in end, dr in start
subword start,end,height
subword start+2,end+2,width
tool _NewRgn,out=(RgnHdl:l)
tool _OpenRgn
lda Flipped
bne Type2
; Q_Line is ul-dr
type1 tool _MoveTo,in=(end:l)
tool _Line,in=(#0:w,lv:w)
tool _Line,in=height:l
tool _Line,in=(lh:w,#0:w)
pea 0
lda lv
eor #-1
inc a
pha
_Line
lda width
eor #-1
inc a
pha
lda height
eor #-1
inc a
pha
_Line
tool _LineTo,in=(end:l)
bra done
; Q_Line is dl-ur
type2 tool _MoveTo,in=(end+2:w,start:w)
tool _Line,in=(#0:w,lv:w)
tool _Line,in=(lh:w,#0:w)
pushw width
lda height
eor #-1
inc a
pha
_Line
pea 0
lda lv
eor #-1
inc a
pha
_Line
lda lh
eor #-1
inc a
pha
pea 0
_Line
tool _LineTo,in=(end+2:w,start:w)
done tool _CloseRgn,in=(RgnHdl:l)
tool _PtInRgn,in=(!Pt:l,RgnHdl:l),out=(Result:w)
tool _DisposeRgn,in=(RgnHdl:l)
Exit
RETURN
ENDP
;------------------------------------------------------------------------------
;
; P_PtInOval (Q_Point:l,RectPtr:l) : boolean;
;
; Notes: To avoid floating Q_Point math or 64-bit numbers, the
; equation used is x^2 a^2 / b^2 + y^2 <= a^2. (The left
; addend is actually computed as x*x/b*a/b*a)
;
P_PtInOval PROC EXPORT
INPUT Q_Point:l,rectptr:l
OUTPUT init:w
LOCAL arad:w,brad:w,a2:l,midx:w,midy:w,temp:l
BEGIN
tool _PtInRect,in=(!Q_Point:l,RectPtr:l),out=(a:w)
jeq notinoval
subword [rectptr]:#4,[rectptr],arad ; get horiz. radius
lsr arad
addword arad,[rectptr],midy ; get horizontal Q_center
subword [rectptr]:#6,[rectptr]:#2,brad ; get vert. distance
lsr brad
addword brad,[rectptr]:#2,midx ; get vertical Q_center
tool _Multiply,in=(arad:w,arad:w),out=(a2:l) ; compute a^2
spacelong ; rmdr - used for result x*x/b*a/b*a
spacelong ; quotient x*x/b*a/b
spacelong ; rmdr - used for result x*x/b*a
spacelong ; quotient x*x/b
spacelong ; result x*x
subword Q_Point+2,midx,a
bpl xok ; Mutiply doesn't handle neg #s right
eor #$ffff
inc a
xok pha
pha
_Multiply ; x*x
pea 0
pushword brad
_LongDivide ; x*x/b
pla ; significant word of quotient
sta 1,s ; high word was 0 (assuming x <= b)
pushword arad
_Multiply ; x*x*a/b
pea 0
pushword brad
_LongDivide ; x*x*a/(b*b)
pla
sta 1,s
pushword arad
_Multiply ; x*x*a*a/(b*b)
pulllong temp
spacelong ; for Multiply...
lda Q_Point
sec
sbc midy
bpl yok
eor #$ffff
inc a
yok pha
pha
_Multiply
addlong s,temp,temp
cmpl a2,temp
bge inoval
notinoval stz init
bra done
inoval moveword #1,init
done RETURN
ENDP
END