diff options
Diffstat (limited to 'ipl/gprogs/coloralc.icn')
-rw-r--r-- | ipl/gprogs/coloralc.icn | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/ipl/gprogs/coloralc.icn b/ipl/gprogs/coloralc.icn new file mode 100644 index 0000000..0f76a86 --- /dev/null +++ b/ipl/gprogs/coloralc.icn @@ -0,0 +1,193 @@ +############################################################################ +# +# File: coloralc.icn +# +# Subject: Program to test color allocation +# +# Author: Gregg M. Townsend +# +# Date: February 6, 1995 +# +############################################################################ +# +# This file is in the public domain. +# +############################################################################ +# +# coloralc tests how many fixed and/or mutable colors can be allocated. +# The two sets of pushbuttons allocate 1, 8, or 32 randomly chosen colors +# of the selected type. New colors are arrayed on the display using +# squares for fixed colors and discs for mutable colors. When no more +# colors can be created, no more squares or discs will appear. +# +# Clicking on a color with the left mouse button selects it as the +# current color; the current color can be drawn on the screen by moving +# the mouse with the left button down. +# +# Clicking on a mutable color (a disc) with the right mouse mutton +# changes it to a new random color. There is also a pushbutton that +# changes all mutable colors simultaneously. +# +############################################################################ +# +# Requires: Version 9 graphics +# +############################################################################ +# +# Links: options, optwindw, button, evmux, random, graphics +# +############################################################################ + +link options +link optwindw +link button +link evmux +link random +link graphics + +record square(x, y, w, p, n) # a color square (or disc) + +global win, opts, m, w, h, s, bw, bh # main window and dimensions +global sq, nw, nh # square list and layout counts + +global brushwin, brushproc # current drawing window and procedure + + + +# main program + +procedure main(args) + + nw := 16 # number of squares wide + nh := 16 # number of squares high + s := 32 # square size + m := 4 # margin (gap) + bw := 68 # button width + bh := 20 # button height + + opts := options(args, winoptions()) + /opts["W"] := nw * (m + s) + bw + /opts["H"] := nh * (m + s) - m + /opts["M"] := m + win := optwindow(opts, "cursor=off", "echo=off") + m := opts["M"] # get obtained window dimensions + h := opts["H"] + w := opts["W"] + s := (w - bw - nw * m) / nw # calc size of each square + s <:= (h - (nh - 1) * m) / nh + + quitsensor(win) # set up sensors + sensor(win, &lpress, dobrush) + sensor(win, &ldrag, dobrush) + sensor(win, 'f', fixc, 1) + sensor(win, 'F', fixc, 8) + sensor(win, 'm', mutc, 1) + sensor(win, 'M', mutc, 8) + sensor(win, 'Aa', mutall) + buttonrow(win, m, m, bw, bh, 0, m + bh, + "1 fixed", fixc, 1, + "8 fixed", fixc, 8, + "32 fixed", fixc, 32, + ) + buttonrow(win, m, m + 4 * (bh + m), bw, bh, 0, m + bh, + "1 mutable", mutc, 1, + "8 mutable", mutc, 8, + "32 mutable", mutc, 32, + ) + buttonrow(win, m, m + 8 * (bh + m), bw, bh, 0, m + bh, + "mutate all", mutall, 0, + "quit", argless, exit, + ) + + sq := [] # init square list and procs + brushwin := win + brushproc := DrawRectangle + + randomize() + evmux(win) # loop processing events +end + + + +# fixc(w, n) -- allocate n new fixed colors + +procedure fixc(w, n) + local q + every 1 to n do { + q := newsquare(w, FillRectangle) | fail + Fg(q.w, ?65535 || "," || ?65535 || "," || ?65535) | {pull(sq); fail} + FillRectangle(q.w, q.x, q.y, s, s) # interior (random new color) + DrawRectangle(win, q.x, q.y, s, s) # outline (standard) + sensor(win, &lpress, setbrush, q, q.x, q.y, s, s) + } + return +end + + + +# mutc(w, n) -- allocate n new mutable colors + +procedure mutc(w, n) + local q + every 1 to n do { + q := newsquare(w, FillArc) | fail + q.n := NewColor(q.w, ?65535 || "," || ?65535 || "," || ?65535) | + {pull(sq); fail} + Fg(q.w, q.n) + FillArc(q.w, q.x, q.y, s, s) + DrawArc(win, q.x, q.y, s, s) + sensor(win, &lpress, setbrush, q, q.x, q.y, s, s) + sensor(win, &rpress, randmut, q, q.x, q.y, s, s) + } + return +end + + +# newsquare(w, p) -- alc next square, init for proc p, return record + +procedure newsquare(w, p) + local x, y, q + *sq < nw * nh | fail + x := m + bw + m + (m + s) * (*sq % nw) + y := m + (m + s) * (*sq / nw) + q := square(x, y, Clone(w), p) | fail + put(sq, q) + return q +end + + +# randmut(w, q) -- randomly mutate square q to a new color + +procedure randmut(w, q) + Color(q.w, \q.n, ?65535 || "," || ?65535 || "," || ?65535) + return +end + + +# mutall(w) -- randomly mutate *all* the squares + +procedure mutall(w) + local args + args := [w] + every put(args, \(!sq).n) do + put(args, ?65535 || "," || ?65535 || "," || ?65535) + if *args > 1 then + Color ! args +end + + +# setbrush(w, q) -- set the paintbrush to the values for square q + +procedure setbrush(w, q) + brushwin := q.w + brushproc := q.p + return +end + + +# dobrush(w, dummy, x, y) -- call the brush procedure at location (x, y) + +procedure dobrush(w, dummy, x, y) + brushproc(brushwin, x - s / 4, y - s / 4, s / 2, s / 2) + return +end |