implement Pimpl;
include "sys.m";
sys: Sys;
tokenize, sprint, fprint: import sys;
include "styx.m";
include "styxservers.m";
Styxserver: import Styxservers;
include "daytime.m";
include "dat.m";
dat: Dat;
mnt, evc, Qdir, debug, appl, slash: import dat;
include "string.m";
str: String;
splitl: import str;
include "names.m";
names: Names;
dirname: import names;
include "error.m";
err: Error;
checkload, panic, stderr: import err;
include "tbl.m";
tbl: Tbl;
Table: import tbl;
include "mpanel.m";
Amax, Panel, Repl, Tappl, Trepl: import Panels;
Drawfunc: type ref fn(args: list of string): string;
Dcmd: adt {
name: string;
drawfn: Drawfunc;
};
icols: array of string;
dcmds: array of Dcmd;
init(d: Dat): list of string
{
dat = d;
sys = dat->sys;
err = dat->err;
str = dat->str;
names = dat->names;
# keep in sync with owpdraw.b, including the functions!
dcmds = array[] of {
Dcmd("ellipse", dellipse), # ellipse cx cy rx ry [w col]
Dcmd("fillellipse", dfillellipse), # fillellipse cx cy rx ry [col]
Dcmd("line", dline), # line ax ay bx by [ea eb r col]
Dcmd("rect", drect), # rect ax ay bx by [col]
Dcmd("poly", dpoly), # poly x0 y0 x1 y1 ... xn yn e0 en w col
Dcmd("bezspline", dpoly), # bezspline x0 y0 x1 y1 ... xn yn e0 en w col
Dcmd("fillpoly", dfillpoly), # fillpoly x0 y0 x1 y1 ... xn yn w col
Dcmd("fillbezspline", dfillpoly) # fillbezspline x0 y0 x1 y1 ... xn yn w col
};
icols = array[] of {
"back", "high", "bord", "text", "htext", "hbord", "set", "clear",
"mback", "mset", "mclear", "ws1", "ws2", "ws3",
"black",
"white",
"red",
"green",
"blue",
"cyan",
"magenta",
"yellow",
"grey",
"paleyellow",
"darkyellow",
"darkgreen",
"palegreen",
"medgreen",
"darkblue",
"palebluegreen",
"paleblue",
"bluegreen",
"greygreen",
"palegreygreen",
"yellowgreen",
"medblue",
"greyblue",
"palegreyblue",
"purpleblue"
};
return list of {"draw:"};
}
pinit(nil: ref Panel)
{
}
rinit(nil: ref Panel, r: ref Repl)
{
nattrs := array[len r.attrs] of string;
nattrs[0:] = r.attrs;
r.attrs = nattrs;
}
chkcol(s: string): string
{
for(i := 0; i < len icols; i++)
if (icols[i] == s)
return nil;
return sprint("%s: not a color", s);
}
nth(l: list of string, n: int): string
{
for (i := 0; i < n && l != nil; i++)
l = tl l;
if (l != nil)
return hd l;
else
return nil;
}
dellipse(args: list of string): string
{
if (len args < 5 || len args > 7)
return "ellipse: wrong number of args";
if (len args == 7){
c := chkcol(nth(args, 6));
if (c != nil)
return c;
}
return nil;
}
dfillellipse(args: list of string): string
{
if (len args < 5 || len args > 6)
return "fillellipse: wrong number of args";
if (len args == 6){
c := chkcol(nth(args, 5));
if (c != nil)
return c;
}
return nil;
}
dline(args: list of string): string
{
if (len args < 5 || len args > 9)
return "line: wrong number of args";
if (len args >= 9){
c := chkcol(nth(args, 8));
if (c != nil)
return c;
}
return nil;
}
drect(args: list of string): string
{
if (len args < 5 || len args > 6)
return "rect: wrong number of args";
if (len args == 6){
c := chkcol(nth(args, 5));
if (c != nil)
return c;
}
return nil;
}
dpoly(args: list of string): string
{
l := len args;
if (l < 5 + 3 * 2)
return sprint("%s: wrong number of args", hd args);
np := (l -5)/2;
args = tl args;
for(i := 0; i < np; i++)
args = tl tl args;
args = tl args;
args = tl args;
args = tl args;
return chkcol(hd args);
}
dfillpoly(args: list of string): string
{
l := len args;
if (l < 3 + 3 * 2)
return sprint("%s: wrong number of args", hd args);
np := (l - 3)/2;
args = tl args;
for(i := 0; i < np; i++){
args = tl tl args;
}
args = tl args;
return chkcol(hd args);
}
drawcmds(s: string): string
{
(nil, cmds) := tokenize(s, "\n");
for(; cmds != nil; cmds = tl cmds){
(nargs, args) := tokenize(hd cmds, " \t");
if (nargs > 0){
for (i := 0; i < len dcmds; i++)
if (dcmds[i].name == hd args){
x := dcmds[i];
e := x.drawfn(args);
if (e != nil)
return e;
else
break;
}
if (i == len dcmds)
return "bad draw operation";
}
}
return nil;
}
newdata(p: ref Panel): string
{
return drawcmds(string p.data);
}
ctl(nil: ref Panel, nil: ref Repl, nil: list of string): (int, string)
{
return (0, "not mine");
}
|