home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
gprocs
/
weavegif.icn
< prev
next >
Wrap
Text File
|
2001-06-10
|
4KB
|
133 lines
############################################################################
#
# File: weavegif.icn
#
# Subject: Procedure to produce a woven image from a draft
#
# Author: Ralph E. Griswold
#
# Date: June 10, 2001
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# This procedure produces a woven image from a pattern-form draft, which
# is passed to it as it's first argument. Window attributes may be
# passed as a list in the second argument
#
############################################################################
#
# Requires: Version 9 graphics
#
############################################################################
#
# Links: tables, wopen
#
############################################################################
#
# Links: wopen
#
############################################################################
link wopen
link tables, wopen
procedure weavegif(draft, attribs) #: create GIF from ISD
local x, y, color, treadle, i, j, treadle_list, k
local win, treadle_colors, lst, s
/attribs := []
/draft.width := *draft.threading
/draft.height := *draft.treadling
put(attribs, "label=" || draft.name, "size=" || draft.width || "," ||
draft.height)
win := (WOpen ! attribs) | {
write(&errout, "Cannot open window for woven image.")
fail
}
# Draw warp threads as "background".
if \draft.color_list then {
if *set(draft.warp_colors) = 1 then { # solid warp ground
Fg(draft.color_list[draft.warp_colors[1]])
FillRectangle()
}
every i := 1 to draft.width do {
Fg(win, draft.color_list[draft.warp_colors[i]])
DrawLine(win, i - 1, 0, i - 1, *draft.treadling - 1)
}
}
else {
every i := 1 to draft.width do {
Fg(win, draft.warp_colors[i])
DrawLine(win, i - 1, 0, i - 1, *draft.treadling - 1)
}
}
# Precompute points at which weft threads are on top.
treadle_list := list(draft.treadles)
every !treadle_list := [win]
every i := 1 to draft.treadles do {
every j := 1 to draft.shafts do
if draft.tieup[j, i] == "0" then
every k := 1 to *draft.threading do
if draft.threading[k] = j then
put(treadle_list[i], k - 1, 0)
}
if \draft.color_list then {
treadle_colors := list(*draft.color_list)
every !treadle_colors := []
every i := 1 to draft.height do {
j := draft.weft_colors[i]
put(treadle_colors[j], i)
}
}
else {
treadle_colors := table()
every i := 1 to draft.width do {
j := draft.weft_colors[i]
/treadle_colors[j] := []
put(treadle_colors[j], i)
}
}
# "Overlay" weft threads.
if \draft.color_list then {
every i := 1 to *treadle_colors do {
Fg(win, draft.color_list[i]) | stop("bogon")
every y := !treadle_colors[i] do {
WAttrib(win, "dy=" || (y - 1))
if *treadle_list[draft.treadling[y]] = 1 then next # blank pick
DrawPoint ! treadle_list[draft.treadling[y]]
}
}
}
else {
every s := !keylist(treadle_colors) do {
Fg(win, s) | stop("bogon")
lst := treadle_colors[s]
every y := !lst do {
WAttrib(win, "dy=" || (y - 1))
if *treadle_list[draft.treadling[y]] = 1 then next # blank pick
DrawPoint ! treadle_list[draft.treadling[y]]
}
}
}
return win
end