mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 01:29:20 +00:00
0ba83392d4
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
176 lines
4.1 KiB
Plaintext
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
|