REBOL [
Title: "Zoom into Images"
Date: 24-April-2001
Version: 0.1.3
File: %zoom-img.r
Home: http://www.ross-gill.com/
Author: ["Christopher Ross-Gill" "Renaud GOMBERT"]
Rights: "Copyright ©2001 Christopher Ross-Gill"
Purpose: "Zoom in to images"
History: {
0.1.0 Crude but it works :o)
0.1.1 better user controle + video resizing "on the fly"
0.1.2 controls embeded in video window
}
Comments: {
A fun video-style zoom technique using 'crop and 'fit.
Why? Because I can acheive the effect by only loading
one image (or two for two examples) and this minimal
source code.
Also tested is VID magnification for the hi-res monitors.
}
To-Do: {
make the code smarter ;-)
avoid video slow down when mouse over image
write more generic animation code
}
]
pause?: false
started?: false
img: load-image http://www.ross-gill.com/files/castle-flag.jpg
img2: load-image http://www.ross-gill.com/files/goatfell-jura.jpg
factor: 1
a: layout [
text 120 center bold white "Choose your size"
ch: choice 120 "Scale 1:1" "Scale 2:1" "Scale 3:1" [
factor: (to-integer pick ch/text 7) - 48
img-face/size: pnl/pane/size: pnl/size: img-face/size: 240x180 * factor
txt/size: 0x40 + (240x5 * factor)
txt/font/size: 20 * factor
txt/offset/y: 40 * factor
a/size: (240x180 * factor) + 180x40
]
btn 120 "PLAY ANIM" [do-anim]
bp: button 120 center bold "PAUSE" [
if started? [pause?: not pause?]
bp/texts/1: either pause? ["CONTINUE"]["PAUSE"]
show bp
]
btn 120 "STOP" [
pause?: false
started?: false
img-face/image: img
img-face/effect: [fit]
show img-face
txt/text: ""
show txt
bp/texts/1: "PAUSE"
show bp
]
btn 120 "QUIT" [quit]
at 160x20
pnl: box (240x180 * factor) frame black 1x1
]
a/image: load-image http://www.ross-gill.com/r/green.png
a/effect: [fit]
animate: func [
img
frames
duration ; in seconds
dir ; direction
title ; text to show
in
out
/locat waitval
][
img-face/image: img
os: 0x0
cp: img/size
waitval: duration / frames
repeat count frames [
if not started? [exit]
either pause? [
count: count - 1
wait 0.01
][
img-face/effect: compose [crop (os: os + dir) (cp: cp - 2x1) fit]
show img-face
wait waitval
either count = in [
txt/text: title
][
if count = out [txt/text: {}]
]
]
]
return cp
]
do-anim: does [
pause?: false
started?: true
bp/texts/1: "PAUSE" show bp
animate img 60 3 2x0 "AMS Presents" 1 40
animate img2 60 5 0x0 "The Isle of Arran" 15 40
pause?: false
started?: false
]
pnl/pane: layout/offset compose [
at 0x0
img-face: image img 240x180 effect [fit]
at 0x40
txt: vh1 bold center 240x45 white
] 0x0
view a