# transparency

### [1/13] from: ammoncooke::yahoo::com at: 22-Aug-2001 18:58

Hi,
Isn't there a transparency effect? I looked at effect lab.r, but found nothing.
Thanks!!
Ammon

### [2/13] from: ryanc:iesco-dms at: 22-Aug-2001 18:11

The key is 'key.
image effect [key 0.0.0] %my-pic.gif
--Ryan
Ammon Cooke wrote:

> Hi,
> Isn't there a transparency effect? I looked at effect lab.r, but found nothing.

<<quoted lines omitted: 4>>

> **[rebol-request--rebol--com]**with "unsubscribe" in the > subject, without the quotes.--
Ryan Cole
Programmer Analyst
www.iesco-dms.com
707-468-5400

### [3/13] from: petr:krenzelok:trz:cz at: 23-Aug-2001 8:24

Ammon Cooke wrote:

> Hi,
>
> Isn't there a transparency effect? I looked at effect lab.r, but found nothing.

I think you can do transparency, but I don't remember exactly how. Try setting face
color to 'none, and you will get transparent face. You can set it's edge to see the
result. If you want some picture with defined color to be transparent, you still has
to
set face color to none, and use 'key effect IIRC. If you want to "blend", then forget
it
- we have not alpha available at user level ...
If I am wrong, someone correct me, please :-)
Cheers,
-pekr-

### [4/13] from: arolls:bigpond:au at: 23-Aug-2001 22:38

You can roll your own transparency.
See "Desktop/Rebol.com/Sites/Anton/demos/alpha blend"
Not very fast, but could be useful.

### [5/13] from: arolls:bigpond:au at: 23-Aug-2001 22:38

If you mean alpha-channel, where one image
is blended by some amount over another image
so that pixels from both images combine,
then no, there is no alpha-channel.
I am pretty sure that keying is the closest you
are going to get.
However, you could do a multiply on two images,
by 64.64.64, then manually add the pixels
for your result. It wouldn't be fast, though.

### [6/13] from: ammoncooke:ya:hoo at: 23-Aug-2001 8:03

If the layout background is an image, I want a 50% transparent colored a box
on top of it. Is that what you mean by blend?
thanks!!
Ammon

### [7/13] from: ronald:gruss:libertysurf at: 23-Aug-2001 15:57

Hi Rebolers,
I didn't go further, but Frank Sievertsen seems to use some transparency in
his FX5-Styles démo
when clicking on File for instance....
(desktop/REBOL.com/Sites/FX5)
hope it'll help
Cheers Ronald

### [8/13] from: ammoncooke:yaho:o at: 23-Aug-2001 8:22

thanks!!
Ammon

### [9/13] from: meekerdb:rain at: 15-Nov-2001 14:15

I need to plot some points dynamically over an image. I thought I could
do it easily by adapting graph.r by Phil Bevans. I'd just make the
paper
transparent and make the image the backdrop. This sorta
worked. I made the "paper" color, white, transparent in the panel on
which the plot is done. That works up until I clear the plot to update
it. Then the "paper" goes back to white - which should be OK since
I've made white the transparent color - but it isn't transparent
anymore. Is it a bug that white doesn't remain transparent - or do I
just not know how to keep it that way.
Below is the code of graph.r with my few mods to it. If you search down
for ";;;this works" and ";;;this makes paper opaque again" you'll see
where I think the problem is - but then I obviously don't understand
the problem.
Brent Meeker
"A computer lets you make more mistakes faster than any invention in
human
history--with the possible exceptions of handguns and tequila."
--Mitch Ratcliffe
================================================================================
REBOL []
; functions
paper: make object!
[
size: 0x0
x-min: -1
x-max: 1
y-min: -1
y-max: 1
grid: yes
x-grid: 20
y-grid: 20
grid-color: red
axes: yes
axes-color: black
paper-color: white
pen-color: black
axes-color: black
image: none
crt: func
[
size [pair!]
xmin [decimal!]
xmax [decimal!]
ymin [decimal!]
ymax [decimal!]
]
[
self/size: size
self/x-min: xmin
self/x-max: xmax
self/y-min: ymin
self/y-max: ymax
self/image: to-image to-pair reduce [size/x size/y]
clear-im self/image self/paper-color
]
]
; clear the image to a colour
clear-im: func [im [image!] color [tuple!] /local j]
[
repeat j im/size/x * im/size/y [poke im j color]
]
; plot a point
plot: func [im [image!] p col [tuple!] /local i xs ys]
[
set [xs ys] [im/size/x im/size/y]
if any[p/x < 1 p/x > xs p/y < 1 p/y > ys]
[return]
i: ys - p/y * xs + p/x
if any [i <= 0 i > (im/size/x * im/size/y)]
[return]
poke im i col
]
draw-line: func [
{draw line from point a to b using Bresenham's algorithm}
im [image!]
a [pair!]
b [pair!]
color [tuple!]
/local d inc dpr dpru p set-pixel xs ys
][
set [xs ys] [im/size/x im/size/y]
set-pixel: func [p c] [poke im (ys - p/y * xs + p/x) c]
if any [a/x < 1 a/y < 1 a/x > xs a/y > ys b/x < 1 b/y < 1 b/x > xs
b/y >
ys] [return]
d: abs (b - a)
inc: 1x1
if a/x > b/x [inc/x: -1]
if a/y > b/y [inc/y: -1]
either d/x >= d/y [
dpr: 2 * d/y
dpru: dpr - (2 * d/x)
p: dpr - d/x
loop d/x + 1 [
set-pixel a color
either p > 0 [
a: a + inc
p: p + dpru
][
a/x: a/x + inc/x
p: p + dpr
]
]
][
dpr: 2 * d/x
dpru: dpr - (2 * d/y)
p: dpr - d/y
loop d/y + 1 [
set-pixel a color
either p > 0 [
a: a + inc
p: p + dpru
][
a/y: a/y + inc/y
p: p + dpr
]
]
]
]
; Convert Degrees to Radians & Radians to Degrees
rad: function [x] [] [ x * pi / 180 ]
deg: function [x] [] [ x * 180 / pi ]
; trig functions
sin: function [x] [] [return sine/radians x]
cos: function [x] [] [return cosine/radians x]
tan: function [x] [] [return tangent/radians x]
; square-root
sqrt: function [x] [] [return square-root x]
; hyperbolic trig functions
sinh: function [x] [] [return ((exp(x)) - (exp(- x))) / 2]
cosh: function [x] [] [return ((exp(x)) + (exp(- x))) / 2]
tanh: function [x] [] [return ((exp(2 * x)) - 1) / ((exp(2 * x)) + 1)]
fac: func [x [integer!] /local fa i]
[
if x < 0 [return none]
fa: 1.0
i: 1
while [i <= x]
[
fa: fa * i
i: i + 1
]
return fa
]
; create a function
create-function: function [t-func [string!]] [f]
[
; return a newly created function
if error? try [f: to-block load t-func]
[return none]
function [x [any-type!]] [] f
]
mod: func
[
{compute a non-negative remainder}
a [number!]
b [number!]
/local r
]
[
either negative? r: a // b [
r + abs b
] [r]
]
round: func
[
"Round a number"
n [number!]
/places
p [integer!] {Decimal places - can be negative}
/local factor r
]
[
factor: either places [10 ** (- p)] [1]
n: 0.5 * factor + n
n - mod n factor
]
floor: func [
n [number!]
/places
p [integer!] {Decimal places - can be negative}
/local factor r
] [
factor: either places [10 ** (- p)] [1]
n - mod n factor
]
ceiling: func [
n [number!]
/places
p [integer!] {Decimal places - can be negative}
/local factor r
] [
factor: either places [10 ** (- p)] [1]
n + mod (- n) factor
]
truncate: func [
n [number!]
/places
p [integer!] {Decimal places - can be negative}
/local factor r
] [
factor: either places [10 ** (- p)] [1]
n - (n // factor)
]
; initialise the graph
init-graph: func [paper [object!]]
[
clear-im paper/image paper/paper-color
draw-axes paper
]
draw-axes: func [paper /local pt]
[
pt: coordinates paper 0 0
if all [pt/y >= 0 pt/y < paper/size/y]
[draw-line paper/image to-pair reduce [1 pt/y] to-pair reduce
[(paper/size/x - 1) pt/y] paper/axes-color] ; x-axis
if all [pt/x >= 0 pt/x < paper/size/x]
[draw-line paper/image to-pair reduce [pt/x 1] to-pair reduce
[pt/x
paper/size/y] paper/axes-color]; y-axis
]
; convert to co-ordinates
coordinates: func [paper [object!] x [number!] y [number!] /local xc yc]
[
xd: x - paper/x-min
xp: (paper/x-max - paper/x-min) / paper/size/x
xc: xd / xp
if any [xc < 0 xc > paper/size/x] [-1]
if error? try[xc: to-integer round xc]
[return none]
yd: y - paper/y-min
yp: (paper/y-max - paper/y-min) / paper/size/y
yc: yd / yp
if any [yc < 0 yc > paper/size/y] [-1]
if error? try[yc: to-integer round yc]
[return none]
return make pair! reduce [xc yc]
]
new-styles: stylize
[
fix-area: area font [name: "courier new" size: 12] wrap
fix-field: field font [name: "courier new" size: 12]
fix-text: text font [name: "courier new" size: 12]
]
; Draw the graph
draw-graph: func [paper [object!] t-fx [string!] trace [string!] /local
x
x-step fx pt last-pt]
[
if t-fx = ""
[request/ok "No function entered" return]
f-fx: create-function t-fx
if not function? :f-fx
[request/ok "Improper function entered" return]
last-pt: none
x-step: (paper/x-max - paper/x-min) / paper/size/x
for x paper/x-min paper/x-max x-step
[
either not error? try [fx: f-fx x]
[
pt: coordinates paper x fx
if pt <> none
[
switch trace
[
"Point"
[plot paper/image pt paper/pen-color]
"Line"
[
either last-pt <> none
[draw-line paper/image last-pt pt
paper/pen-color]
[plot paper/image pt
paper/pen-color]
]
]
]
last-pt: pt
]
[last-pt: none]
]
]
; Graph Paper settings
gr-settings: func
[
paper [object!]
gr-face [object!]
/local f-xmin f-xmax f-ymin f-ymax f-paper-color f-pen-color
lv-valid
lv-col
]
[
view/new layout
[
backdrop 0.150.0
styles new-styles
origin 5x5
space 5
across
at 5x5
label "Min X" right 80x24
f-xmin: fix-field to-string(paper/x-min) 100x24
return
label "Max X" right 80x24
f-xmax: fix-field to-string(paper/x-max) 100x24
return
label "Min Y" right 80x24
f-ymin: fix-field to-string(paper/y-min) 100x24
return
label "Max Y" right 80x24
f-ymax: fix-field to-string(paper/y-max) 100x24
return
pad 0x-3
label "Clear" right 80x24
pad 0x3
cb-clear: check with [state: false]
return
pad 0x-5
button "Paper Color" 80x24
[
lv-col: request-color/color paper/paper-color
if lv-col <> none
[
f-paper-color/color: lv-col
show f-paper-color
]
]
f-paper-color: box paper/paper-color 100x24 edge [size: 2x2
color:
gray effect: 'bevel]
return
button "Pen Color" 80x24
[
lv-col: request-color/color paper/paper-color
if lv-col <> none
[
f-pen-color/color: lv-col
show f-pen-color
]
]
f-pen-color: box paper/pen-color 100x24 edge [size: 2x2 color:
gray
effect: 'bevel]
return
button "Apply" 185x24
[
lv-valid: yes
if error? try [paper/x-min: to-decimal f-xmin/text]
[request/ok
Invalid Min X value entered
lv-valid: no]
if error? try [paper/x-max: to-decimal f-xmax/text]
[request/ok
Invalid Max X value entered
lv-valid: no]
if error? try [paper/y-min: to-decimal f-ymin/text]
[request/ok
Invalid Min Y value entered
lv-valid: no]
if error? try [paper/y-max: to-decimal f-ymax/text]
[request/ok
Invalid Min Y value entered
lv-valid: no]
paper/paper-color: f-paper-color/color
paper/pen-color: f-pen-color/color
if cb-clear/data = true
[
init-graph pape
show gr-face
]
if lv-valid = yes
[unview]
]
]
]
;
; Main Line
;
gr-size: 700x500
gr-paper: make paper []
gr-paper/crt gr-size -180.0 180.0 -10.0 90.0
gr-paper/pen-color: 0.0.255
gr-paper/paper-color: 255.255.255
gr-paper/image: to-image 650x400
draw-axes gr-paper
lv-init-eqn: "10 * (1 + ((sin (x / 30)) / (x / 30)))"
;
; view the window
;
view layout [
backdrop %ma-31f-16.jpg
origin 0x0
styles new-styles
at 0x0
space 0x0
panel
[
backdrop teal
origin 0x0
space 0
across
vtext "Clear" bold white teal 40x24
[
init-graph gr-paper
show gr-paper-f ;;;this makes paper opaque
again
]
vtext "Save" bold white teal 40x24
[
t-save-name: request-file/title/filter/keep/file "Save Graph
as
png" "Save" "*.png" "graph.png"
if t-save-name <> none
[
if error? try [save/png to-file t-save-name
gr-paper/image]
[request/OK "Unable to Save graph"]
]
]
vtext "Settings" bold white teal [gr-settings gr-paper
gr-paper-f]
60x24
vtext "Quit" bold white teal [quit] 40x24
] edge [size: 1x1 color: gray effect: 'bevel] 510x24
panel
[
across
origin 5x5
space 5x5
at 5x5
gr-paper-f: image gr-paper/image
effect [key white] ;;;this works
return
t-func1: fix-field lv-init-eqn (gr-size * 1x0 + 0x24)
space 0
return
r-trace: rotary 120.20.120 100x24 data ["Line" "Point"]
button "Graph Color"
[
gr-col: request-color/color gr-paper/pen-color
if gr-col <> none [gr-paper/pen-color: gr-col]
]
space 0x5
button "Draw f(x)" 100x24
[
draw-graph gr-paper t-func1/text first r-trace/data
show gr-paper-f
]
button "Save Equation"
[
either t-func1/text = ""
[request/ok "No equation to Save"]
[
filnm: request-file/title/filter/file/keep "Save
Equation"
Save
"*.eqn" "graph.eqn"
if filnm <> none
[
if error? try [write to-file filnm t-func1/text]
[request/OK "Unable to Save Equation"]
]
]
]
button "Load Equation"
[
filnm: request-file/title/filter/file/keep "Load Equation"
Load
"*.eqn" "graph.eqn"
if filnm <> none
[
t-func1/text: read to-file filnm
show t-func1
]
]
] 660x410 + (2 * 0x25) + 0x5
]

### [10/13] from: arolls:idatam:au at: 16-Nov-2001 13:21

Try changing effect [key white] to effect [key 255.255.255]
Anton.

> I need to plot some points dynamically over an image. I
> thought I could

<<quoted lines omitted: 15>>

> gr-paper-f: image gr-paper/image
> effect [key white] ;;;this works
effect [key 255.255.255]

### [11/13] from: arolls:idatam:au at: 16-Nov-2001 16:10

Also it was mentioned before, by
Holger I think, that it is not recommended
to roll your own object!s to be used as
faces.
ie. if you want a face, then
make face [...]
not
make object! [...]
It should be more future-proof that way.
Anton.

### [12/13] from: philb:upnaway at: 16-Nov-2001 21:30

Hi Anton,
the make object in this program (to create the paper attibutes) really was an object
not a face.
Cheers Phil
=== Original Message ===
Also it was mentioned before, by
Holger I think, that it is not recommended
to roll your own object!s to be used as
faces.
ie. if you want a face, then
make face [...]
not
make object! [...]
It should be more future-proof that way.
Anton.

### [13/13] from: philb:upnaway at: 16-Nov-2001 21:42

Hi Brent,
I never managed to get the key effect to work ... excellent.
The version of graph.r you are using is rather old.
I did start work on a version that used the draw dialect to draw lines instead of poke'ing
the image.
As the lines are just enties in a block it is possible to remove the lines by removing
the entries in the block & re-showing the face.
This is much quicker than clearing the image as the program currently does (by poking
every pixel!!).
It may solve your transparency problem.
Cheers Phil
=== Original Message ===
I need to plot some points dynamically over an image. I thought I could
do it easily by adapting graph.r by Phil Bevans. I'd just make the
paper
transparent and make the image the backdrop. This sorta
worked. I made the "paper" color, white, transparent in the panel on
which the plot is done. That works up until I clear the plot to update
it. Then the "paper" goes back to white - which should be OK since
I've made white the transparent color - but it isn't transparent
anymore. Is it a bug that white doesn't remain transparent - or do I
just not know how to keep it that way.
Below is the code of graph.r with my few mods to it. If you search down
for ";;;this works" and ";;;this makes paper opaque again" you'll see
where I think the problem is - but then I obviously don't understand
the problem.
Brent Meeker
"A computer lets you make more mistakes faster than any invention in
human
history--with the possible exceptions of handguns and tequila."
--Mitch Ratcliffe
================================================================================
REBOL []
; functions
paper: make object!
[
size: 0x0
x-min: -1
x-max: 1
y-min: -1
y-max: 1
grid: yes
x-grid: 20
y-grid: 20
grid-color: red
axes: yes
axes-color: black
paper-color: white
pen-color: black
axes-color: black
image: none
crt: func
[
size [pair!]
xmin [decimal!]
xmax [decimal!]
ymin [decimal!]
ymax [decimal!]
]
[
self/size: size
self/x-min: xmin
self/x-max: xmax
self/y-min: ymin
self/y-max: ymax
self/image: to-image to-pair reduce [size/x size/y]
clear-im self/image self/paper-color
]
]
; clear the image to a colour
clear-im: func [im [image!] color [tuple!] /local j]
[
repeat j im/size/x * im/size/y [poke im j color]
]
; plot a point
plot: func [im [image!] p col [tuple!] /local i xs ys]
[
set [xs ys] [im/size/x im/size/y]
if any[p/x < 1 p/x > xs p/y < 1 p/y > ys]
[return]
i: ys - p/y * xs + p/x
if any [i <= 0 i > (im/size/x * im/size/y)]
[return]
poke im i col
]
draw-line: func [
{draw line from point a to b using Bresenham's algorithm}
im [image!]
a [pair!]
b [pair!]
color [tuple!]
/local d inc dpr dpru p set-pixel xs ys
][
set [xs ys] [im/size/x im/size/y]
set-pixel: func [p c] [poke im (ys - p/y * xs + p/x) c]
if any [a/x < 1 a/y < 1 a/x > xs a/y > ys b/x < 1 b/y < 1 b/x > xs
b/y >
ys] [return]
d: abs (b - a)
inc: 1x1
if a/x > b/x [inc/x: -1]
if a/y > b/y [inc/y: -1]
either d/x >= d/y [
dpr: 2 * d/y
dpru: dpr - (2 * d/x)
p: dpr - d/x
loop d/x + 1 [
set-pixel a color
either p > 0 [
a: a + inc
p: p + dpru
][
a/x: a/x + inc/x
p: p + dpr
]
]
][
dpr: 2 * d/x
dpru: dpr - (2 * d/y)
p: dpr - d/y
loop d/y + 1 [
set-pixel a color
either p > 0 [
a: a + inc
p: p + dpru
][
a/y: a/y + inc/y
p: p + dpr
]
]
]
]
; Convert Degrees to Radians & Radians to Degrees
rad: function [x] [] [ x * pi / 180 ]
deg: function [x] [] [ x * 180 / pi ]
; trig functions
sin: function [x] [] [return sine/radians x]
cos: function [x] [] [return cosine/radians x]
tan: function [x] [] [return tangent/radians x]
; square-root
sqrt: function [x] [] [return square-root x]
; hyperbolic trig functions
sinh: function [x] [] [return ((exp(x)) - (exp(- x))) / 2]
cosh: function [x] [] [return ((exp(x)) + (exp(- x))) / 2]
tanh: function [x] [] [return ((exp(2 * x)) - 1) / ((exp(2 * x)) + 1)]
fac: func [x [integer!] /local fa i]
[
if x < 0 [return none]
fa: 1.0
i: 1
while [i <= x]
[
fa: fa * i
i: i + 1
]
return fa
]
; create a function
create-function: function [t-func [string!]] [f]
[
; return a newly created function
if error? try [f: to-block load t-func]
[return none]
function [x [any-type!]] [] f
]
mod: func
[
{compute a non-negative remainder}
a [number!]
b [number!]
/local r
]
[
either negative? r: a // b [
r + abs b
] [r]
]
round: func
[
"Round a number"
n [number!]
/places
p [integer!] {Decimal places - can be negative}
/local factor r
]
[
factor: either places [10 ** (- p)] [1]
n: 0.5 * factor + n
n - mod n factor
]
floor: func [
n [number!]
/places
p [integer!] {Decimal places - can be negative}
/local factor r
] [
factor: either places [10 ** (- p)] [1]
n - mod n factor
]
ceiling: func [
n [number!]
/places
p [integer!] {Decimal places - can be negative}
/local factor r
] [
factor: either places [10 ** (- p)] [1]
n + mod (- n) factor
]
truncate: func [
n [number!]
/places
p [integer!] {Decimal places - can be negative}
/local factor r
] [
factor: either places [10 ** (- p)] [1]
n - (n // factor)
]
; initialise the graph
init-graph: func [paper [object!]]
[
clear-im paper/image paper/paper-color
draw-axes paper
]
draw-axes: func [paper /local pt]
[
pt: coordinates paper 0 0
if all [pt/y >= 0 pt/y < paper/size/y]
[draw-line paper/image to-pair reduce [1 pt/y] to-pair reduce
[(paper/size/x - 1) pt/y] paper/axes-color] ; x-axis
if all [pt/x >= 0 pt/x < paper/size/x]
[draw-line paper/image to-pair reduce [pt/x 1] to-pair reduce
[pt/x
paper/size/y] paper/axes-color]; y-axis
]
; convert to co-ordinates
coordinates: func [paper [object!] x [number!] y [number!] /local xc yc]
[
xd: x - paper/x-min
xp: (paper/x-max - paper/x-min) / paper/size/x
xc: xd / xp
if any [xc < 0 xc > paper/size/x] [-1]
if error? try[xc: to-integer round xc]
[return none]
yd: y - paper/y-min
yp: (paper/y-max - paper/y-min) / paper/size/y
yc: yd / yp
if any [yc < 0 yc > paper/size/y] [-1]
if error? try[yc: to-integer round yc]
[return none]
return make pair! reduce [xc yc]
]
new-styles: stylize
[
fix-area: area font [name: "courier new" size: 12] wrap
fix-field: field font [name: "courier new" size: 12]
fix-text: text font [name: "courier new" size: 12]
]
; Draw the graph
draw-graph: func [paper [object!] t-fx [string!] trace [string!] /local
x
x-step fx pt last-pt]
[
if t-fx = ""
[request/ok "No function entered" return]
f-fx: create-function t-fx
if not function? :f-fx
[request/ok "Improper function entered" return]
last-pt: none
x-step: (paper/x-max - paper/x-min) / paper/size/x
for x paper/x-min paper/x-max x-step
[
either not error? try [fx: f-fx x]
[
pt: coordinates paper x fx
if pt <> none
[
switch trace
[
"Point"
[plot paper/image pt paper/pen-color]
"Line"
[
either last-pt <> none
[draw-line paper/image last-pt pt
paper/pen-color]
[plot paper/image pt
paper/pen-color]
]
]
]
last-pt: pt
]
[last-pt: none]
]
]
; Graph Paper settings
gr-settings: func
[
paper [object!]
gr-face [object!]
/local f-xmin f-xmax f-ymin f-ymax f-paper-color f-pen-color
lv-valid
lv-col
]
[
view/new layout
[
backdrop 0.150.0
styles new-styles
origin 5x5
space 5
across
at 5x5
label "Min X" right 80x24
f-xmin: fix-field to-string(paper/x-min) 100x24
return
label "Max X" right 80x24
f-xmax: fix-field to-string(paper/x-max) 100x24
return
label "Min Y" right 80x24
f-ymin: fix-field to-string(paper/y-min) 100x24
return
label "Max Y" right 80x24
f-ymax: fix-field to-string(paper/y-max) 100x24
return
pad 0x-3
label "Clear" right 80x24
pad 0x3
cb-clear: check with [state: false]
return
pad 0x-5
button "Paper Color" 80x24
[
lv-col: request-color/color paper/paper-color
if lv-col <> none
[
f-paper-color/color: lv-col
show f-paper-color
]
]
f-paper-color: box paper/paper-color 100x24 edge [size: 2x2
color:
gray effect: 'bevel]
return
button "Pen Color" 80x24
[
lv-col: request-color/color paper/paper-color
if lv-col <> none
[
f-pen-color/color: lv-col
show f-pen-color
]
]
f-pen-color: box paper/pen-color 100x24 edge [size: 2x2 color:
gray
effect: 'bevel]
return
button "Apply" 185x24
[
lv-valid: yes
if error? try [paper/x-min: to-decimal f-xmin/text]
[request/ok
Invalid Min X value entered
lv-valid: no]
if error? try [paper/x-max: to-decimal f-xmax/text]
[request/ok
Invalid Max X value entered
lv-valid: no]
if error? try [paper/y-min: to-decimal f-ymin/text]
[request/ok
Invalid Min Y value entered
lv-valid: no]
if error? try [paper/y-max: to-decimal f-ymax/text]
[request/ok
Invalid Min Y value entered
lv-valid: no]
paper/paper-color: f-paper-color/color
paper/pen-color: f-pen-color/color
if cb-clear/data = true
[
init-graph pape
show gr-face
]
if lv-valid = yes
[unview]
]
]
]
;
; Main Line
;
gr-size: 700x500
gr-paper: make paper []
gr-paper/crt gr-size -180.0 180.0 -10.0 90.0
gr-paper/pen-color: 0.0.255
gr-paper/paper-color: 255.255.255
gr-paper/image: to-image 650x400
draw-axes gr-paper
lv-init-eqn: "10 * (1 + ((sin (x / 30)) / (x / 30)))"
;
; view the window
;
view layout [
backdrop %ma-31f-16.jpg
origin 0x0
styles new-styles
at 0x0
space 0x0
panel
[
backdrop teal
origin 0x0
space 0
across
vtext "Clear" bold white teal 40x24
[
init-graph gr-paper
show gr-paper-f ;;;this makes paper opaque
again
]
vtext "Save" bold white teal 40x24
[
t-save-name: request-file/title/filter/keep/file "Save Graph
as
png" "Save" "*.png" "graph.png"
if t-save-name <> none
[
if error? try [save/png to-file t-save-name
gr-paper/image]
[request/OK "Unable to Save graph"]
]
]
vtext "Settings" bold white teal [gr-settings gr-paper
gr-paper-f]
60x24
vtext "Quit" bold white teal [quit] 40x24
] edge [size: 1x1 color: gray effect: 'bevel] 510x24
panel
[
across
origin 5x5
space 5x5
at 5x5
gr-paper-f: image gr-paper/image
effect [key white] ;;;this works
return
t-func1: fix-field lv-init-eqn (gr-size * 1x0 + 0x24)
space 0
return
r-trace: rotary 120.20.120 100x24 data ["Line" "Point"]
button "Graph Color"
[
gr-col: request-color/color gr-paper/pen-color
if gr-col <> none [gr-paper/pen-color: gr-col]
]
space 0x5
button "Draw f(x)" 100x24
[
draw-graph gr-paper t-func1/text first r-trace/data
show gr-paper-f
]
button "Save Equation"
[
either t-func1/text = ""
[request/ok "No equation to Save"]
[
filnm: request-file/title/filter/file/keep "Save
Equation"
Save
"*.eqn" "graph.eqn"
if filnm <> none
[
if error? try [write to-file filnm t-func1/text]
[request/OK "Unable to Save Equation"]
]
]
]
button "Load Equation"
[
filnm: request-file/title/filter/file/keep "Load Equation"
Load
"*.eqn" "graph.eqn"
if filnm <> none
[
t-func1/text: read to-file filnm
show t-func1
]
]
] 660x410 + (2 * 0x25) + 0x5
]

Notes

- Quoted lines have been omitted from some messages.

View the message alone to see the lines that have been omitted