implement Mkcomplete;
# join many cards together to make a complete
# image that can be read substantially faster.
include "sys.m";
sys: Sys;
include "draw.m";
draw: Draw;
Rect, Point, Display, Image: import draw;
Mkcomplete: module {
init: fn(ctxt: ref Draw->Context, argv: list of string);
};
stderr: ref Sys->FD;
# usage: mkcomplete prefix
init(ctxt: ref Draw->Context, argv: list of string)
{
sys = load Sys Sys->PATH;
draw = load Draw Draw->PATH;
stderr = sys->fildes(2);
if (len argv != 2)
error("usage: mkcomplete prefix");
if (ctxt == nil)
error("mkcomplete: draw context required");
displ := ctxt.display;
prefix := hd tl argv;
img := displ.open(prefix + "0.bit");
if (img == nil)
error("mkcomplete: no images found");
cardsize := dxy(img.r);
chans := img.chans;
imgs := img :: nil;
for (i := 1; ; i++) {
img = displ.open(prefix + string i + ".bit");
if (img == nil)
break;
if (!dxy(img.r).eq(cardsize))
sys->fprint(stderr, "mkcomplete: warning image size inconsistent in %s%d.bit\n", prefix, i);
imgs = img :: imgs;
}
n := i;
complete := displ.newimage(((0, 0), (cardsize.x * n, cardsize.y)), chans, 0, 0);
for (i = n - 1; i >= 0; i--) {
(img, imgs) = (hd imgs, tl imgs);
r := ((i * cardsize.x, 0), ((i + 1) * cardsize.x, cardsize.y));
complete.clipr = r;
complete.draw(r, img, nil, img.r.min);
}
complete.clipr = complete.r;
fd := sys->create(prefix + ".all.bit", Sys->OWRITE, 8r644);
if (fd == nil)
error(sys->sprint("mkcomplete: cannot create %s: %r", prefix + ".all.bit"));
displ.writeimage(fd, complete);
sys->print("cardsize %d %d\n", cardsize.x, cardsize.y);
}
error(e: string)
{
sys->fprint(stderr, "%s\n", e);
raise "fail:error";
}
dxy(r: Rect): Point
{
return (r.max.x - r.min.x, r.max.y - r.min.y);
}
|