sys7.1-doc-wip/ProcessMgr/ZoomRect.a

176 lines
4.1 KiB
Plaintext

;
; File: ZoomRect.a
;
; Contains: A convenient window-zooming routine
;
; Written by: Phil Goldman
;
; Copyright: © 1986-1991 by Apple Computer, Inc., all rights reserved.
;
; Change History (most recent first):
;
; <0> x/xx/87 PYG New Today.
;
;--------------------------------------------------------------------
;=====================================FUtil68K=====================================
;
; PROCEDURE ZoomRect(VAR smallRect,bigRect: Rect; zoomUp: BOOLEAN);
;
; Frees the passed dialog record (or 0 if none).
;
;=====================================FUtil68K=====================================
LOAD 'ProcessMgrIncludes.D'
zoomSteps EQU 12
tickDelay EQU 1 ; 1*1/60 sec between rects
; takes two rects in a2/a3 and blends into rect in a4
; fract in d7, factor in d5.
ZoomRect PROC EXPORT
ZoomRectRegs REG d2-d7/a2-a4
link a6,#-32 ; 4 rectangles
movem.l ZoomRectRegs,-(sp) ; save registers
lea -32(a6),a0
moveq #7,d0
nilRects
clr.l (a0)+ ; zero out all the rects
dbra d0,nilRects
subq.l #4,sp
move.l sp,-(sp)
_GetPort
move.l wmgrPort,-(sp)
_SetPort
move.l GrayRgn,a0 ; get rgn hdl of gray rgn
move.l (a0),a0 ; hdl -> ptr
pea rgnBBox(a0) ; push the rect
_ClipRect
move.l (a5),a0
pea gray(a0)
_PenPat
move.w #notpatXor,-(sp)
_PenMode
; see if going up or down (point a0 to starting rect)
tst.b 8(a6) ; up or down
beq.s zoomDown
zoomUp
subq.l #4,sp
move.l #$00050007,-(sp) ; 7/5
_FixRatio
move.l (sp),d5 ; factor in d5 (leave on stack)
move.l #$271000B0,-(sp) ; 5/7 ^zoomSteps = 0.017638
_FixRatio
move.l (sp)+,d7 ; fract in d7
BRA.S zoomStart
zoomDown
subq.l #4,sp
move.l #$00070005,-(sp) ; 5/7
_FixRatio
move.l (sp)+,d5 ; factor in d5
moveq #1,d7 ; fract is 1
swap d7 ; fract in d7
zoomStart
moveq #zoomSteps,d4 ; counter
subq.l #4,sp ; make room for result
_TickCount
move.l (sp)+,d6 ; sync with ticks
zoomloop
lea -8(a6),a4 ; start w/rect 4
move.l 10(a6),a3 ; point to big rect
move.l 14(a6),a2 ; point to small rect
bsr.s Blender ; 4 halves of the rect
bsr.s Blender
bsr.s Blender
bsr.s Blender
pea -8(a6) ; frame newest
_FrameRect
ticksSync
cmp.l Ticks,d6 ; less than time we want?
bhs.s ticksSync ; unsigned! wait
; move.l d0,d6 ; save current time
addq.l #tickDelay,d6 ; wait until this time is by
tst.l -32(a6) ; oldest topLeft nil?
bne.s @frameIt ; br if not
tst.l -28(a6) ; botRight nil?
beq.s @skipFrame ; br if so, skip empty rect
@frameIt
pea -32(a6) ; remove oldest
_FrameRect
@skipFrame
lea -24(a6),a0 ; rect1=rect2, etc.
lea -32(a6),a1
moveq #24,d0
_BlockMove
subq.l #4,sp
move.l d7,-(sp) ; bump interp.
move.l d5,-(sp)
_FixMul
move.l (sp)+,d7
subq.w #1,d4 ; more to do?
bne.s zoomLoop
pea -32(a6) ; remove oldest
_FrameRect
pea -24(a6) ; remove oldest
_FrameRect
pea -16(a6) ; remove oldest
_FrameRect
_PenNormal
_SetPort
noZoom
movem.l (sp)+,ZoomRectRegs ; and restore regs
unlk a6 ; get rid of frame ptr
move.l (sp)+,a0 ; get ret addr
add.l #10,sp ; strip params
jmp (a0) ; and return
Blender
subq.l #6,sp ; room for temp
move.l d7,-(sp)
clr.w -(sp) ; zero fractional part
move.w (a3)+,-(sp) ; get big rect part
_FixMul
subq.l #4,sp ; room for temp
clr.l -(sp) ; make a $00010000 on the stack
addq.w #1,(sp)
sub.l d7,(sp) ; subtract fract
clr.w -(sp) ; zero fractional part
move.w (a2)+,-(sp) ; get small rect part
_FixMul
move.l (sp)+,d0
add.l d0,(sp) ; add the two
_FixRound
move.w (sp)+,(a4)+ ; stuff rect
rts
ENDPROC ; ZoomRect
END