## Checkerboard, (C) 2002 p. Stanley-Marbell# pip@gemusehaken.org#implement Checkerboard; include "sys.m";include "draw.m";include "bufio.m";include "arg.m";include "math.m";include "imagefile.m"; sys : Sys;bufio : Bufio;draw : Draw;img : WImagefile;arg : Arg;math : Math; Iobuf : import bufio;Image, Point, Display, Screen, Rect : import draw; Checkerboard : module{ init : fn(nil : ref Draw->Context, args : list of string);}; init(nil : ref Draw->Context, args : list of string){ rows : list of string; inputfile, outputfile : string; outfilebuf, infilebuf : ref Iobuf; boxwidth, boxheight : int = 1; nrows, ncols : int = 0; logrith, colorldepth : int = 0; colorfactor := Draw->Black; sys = load Sys Sys->PATH; draw = load Draw Draw->PATH; img = load WImagefile WImagefile->WRITEGIFPATH; bufio = load Bufio Bufio->PATH; arg = load Arg Arg->PATH; math = load Math Math->PATH; arg->init(args); img->init(bufio); while((c := arg->opt()) != 0) { case c { 'i' => inputfile = arg->arg(); 'o' => outputfile = arg->arg(); 'w' => boxwidth = int arg->arg(); 'h' => boxheight = int arg->arg(); 'c' => colorfactor = 1; colorldepth = 3; 'l' => logrith = 1; * => usage(); } } if (arg->argv() != nil) { usage(); } # Read in the '1' and '0's input: if (inputfile == nil) { inputfile = "stdin"; infilebuf = bufio->fopen(sys->fildes(0), Sys->OREAD); } else { infilebuf = bufio->open(inputfile, Sys->OREAD); } if (infilebuf == nil) { sys->print("Could not open [%s] for reading : %r\n", inputfile); exit; } while ((buf := infilebuf.gets('\n')) != nil) { (tmp, nil) := sys->tokenize(buf, " \t"); ncols = max(ncols, tmp); rows = buf::rows; } nrows = len rows; rows = reverse(rows); # Draw the boxes: ZP := Point(0, 0); display := Display.allocate(nil); outimage := display.newimage(Rect(ZP, (ncols*boxwidth, nrows*boxheight)), colorldepth, 0, Draw->White); for (i := 0; i < nrows; i++) { (nil, bits) := sys->tokenize(hd rows, " \t"); for (j := 0; bits != nil; j++) { boxcolor := int hd bits; if (logrith != 0) { boxcolor = int math->log1p(real boxcolor); } boxrect := Rect((j*boxwidth, i*boxheight), ((j+1)*boxwidth, (i+1)*boxheight)); boximage := display.newimage(boxrect, colorldepth, 0, boxcolor*colorfactor); outimage.draw(outimage.r, boximage, nil, ZP); bits = tl bits; } rows = tl rows; } # Output images as a GIF: if (outputfile == nil) { outputfile = "stdout"; outfilebuf = bufio->fopen(sys->fildes(1), Sys->OWRITE); } else { (there, nil) := sys->stat(outputfile); if (there == -1) { if (sys->create(outputfile, Sys->OWRITE, 8r644) == nil) { sys->print("Could not create output file [%s] : %r\n", outputfile); exit; } } outfilebuf = bufio->open(outputfile, Sys->OWRITE); } if (outfilebuf == nil) { sys->print("Could not open [%s] for writing : %r\n", outputfile); exit; } img->writeimage(outfilebuf, outimage); return;} usage(){ sys->fprint(sys->fildes(2), "Usage: cb [-c] [-l] [-i infile] [-o outfile] [-w boxwidth] [-h boxheight]\n"); exit;} max(a, b : int) : int{ if (a > b) return a; return b;} reverse(f : list of string) : list of string{ r : list of string; while (f != nil) { r = hd f::r; f = tl f; } return r;}
#
# Checkerboard, (C) 2002 p. Stanley-Marbell
# pip@gemusehaken.org
#
implement Checkerboard;
include "sys.m";
include "draw.m";
include "bufio.m";
include "arg.m";
include "math.m";
include "imagefile.m";
sys : Sys;
bufio : Bufio;
draw : Draw;
img : WImagefile;
arg : Arg;
math : Math;
Iobuf : import bufio;
Image, Point, Display, Screen, Rect : import draw;
Checkerboard : module
{
init : fn(nil : ref Draw->Context, args : list of string);
};
init(nil : ref Draw->Context, args : list of string)
{
rows : list of string;
inputfile, outputfile : string;
outfilebuf, infilebuf : ref Iobuf;
boxwidth, boxheight : int = 1;
nrows, ncols : int = 0;
logrith, colorldepth : int = 0;
colorfactor := Draw->Black;
sys = load Sys Sys->PATH;
draw = load Draw Draw->PATH;
img = load WImagefile WImagefile->WRITEGIFPATH;
bufio = load Bufio Bufio->PATH;
arg = load Arg Arg->PATH;
math = load Math Math->PATH;
arg->init(args);
img->init(bufio);
while((c := arg->opt()) != 0)
{
case c
{
'i' => inputfile = arg->arg();
'o' => outputfile = arg->arg();
'w' => boxwidth = int arg->arg();
'h' => boxheight = int arg->arg();
'c' => colorfactor = 1; colorldepth = 3;
'l' => logrith = 1;
* => usage();
}
}
if (arg->argv() != nil)
{
usage();
}
# Read in the '1' and '0's input:
if (inputfile == nil)
{
inputfile = "stdin";
infilebuf = bufio->fopen(sys->fildes(0), Sys->OREAD);
}
else
{
infilebuf = bufio->open(inputfile, Sys->OREAD);
}
if (infilebuf == nil)
{
sys->print("Could not open [%s] for reading : %r\n",
inputfile);
exit;
}
while ((buf := infilebuf.gets('\n')) != nil)
{
(tmp, nil) := sys->tokenize(buf, " \t");
ncols = max(ncols, tmp);
rows = buf::rows;
}
nrows = len rows;
rows = reverse(rows);
# Draw the boxes:
ZP := Point(0, 0);
display := Display.allocate(nil);
outimage := display.newimage(Rect(ZP, (ncols*boxwidth, nrows*boxheight)),
colorldepth, 0, Draw->White);
for (i := 0; i < nrows; i++)
{
(nil, bits) := sys->tokenize(hd rows, " \t");
for (j := 0; bits != nil; j++)
{
boxcolor := int hd bits;
if (logrith != 0)
{
boxcolor = int math->log1p(real boxcolor);
}
boxrect := Rect((j*boxwidth, i*boxheight),
((j+1)*boxwidth, (i+1)*boxheight));
boximage := display.newimage(boxrect, colorldepth, 0,
boxcolor*colorfactor);
outimage.draw(outimage.r, boximage, nil, ZP);
bits = tl bits;
}
rows = tl rows;
}
# Output images as a GIF:
if (outputfile == nil)
{
outputfile = "stdout";
outfilebuf = bufio->fopen(sys->fildes(1), Sys->OWRITE);
}
else
{
(there, nil) := sys->stat(outputfile);
if (there == -1)
{
if (sys->create(outputfile, Sys->OWRITE, 8r644) == nil)
{
sys->print("Could not create output file [%s] : %r\n",
outputfile);
exit;
}
}
outfilebuf = bufio->open(outputfile, Sys->OWRITE);
}
if (outfilebuf == nil)
{
sys->print("Could not open [%s] for writing : %r\n",
outputfile);
exit;
}
img->writeimage(outfilebuf, outimage);
return;
}
usage()
{
sys->fprint(sys->fildes(2),
"Usage: cb [-c] [-l] [-i infile] [-o outfile] [-w boxwidth] [-h boxheight]\n");
exit;
}
max(a, b : int) : int
{
if (a > b)
return a;
return b;
}
reverse(f : list of string) : list of string
{
r : list of string;
while (f != nil)
{
r = hd f::r;
f = tl f;
}
return r;
}