shithub: blie

ref: 0e8796746fad950ab61be075de5638fdcbd6fc32
dir: /blie.c/

View raw version
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <memdraw.h>
#include <event.h>
#include <bio.h>
#include "blie.h"

void
usage(void)
{
	fprint(2, "usage: %s [-cd] dir\n", argv0);
	exits(nil);
}

int bliedebug = 0;
char Nlayers[] = "layers";
char *root = nil;

int
loadfile(void)
{
	Biobuf *b;
	int fd;
	char *s;
	
	b = Bopen(Nlayers, OREAD);
	if (!b) {
		fd = create(Nlayers, OREAD, 0666);
		close(fd);
		b = Bopen(Nlayers, OREAD);
	}
	if (!b)
		sysfatal("unable to open layers file: %r");
	
	while (s = Brdstr(b, '\n', 1))
		addlayer(s);
	
	return 1;
}

static void
docomp(Layer *l, int id, void *aux)
{
	int i;
	Memimage **img = (Memimage**)aux;
	Editor *ed = l->editor;
	i = (id + 1)%2;
	
	if (bliedebug)
		fprint(2, "composite: %s\n", l->name);
	
	if (ed->composite)
		img[id%2] = ed->composite(l, img[i]);
	else
		img[id%2] = ecomposite(l, img[i]);
	freememimage(img[i]);
	img[i] = nil;
}

void
outputcomposite(void)
{
	Memimage *img[2]; /* swapchain */
	int i;
	
	img[0] = nil;
	img[1] = nil;
	i = foreachlayer(docomp, img);
	
	if (img[i%2])
		writememimage(1, img[i%2]);
	else
		writememimage(1, img[(i+1)%2]);
}

void
main(int argc, char **argv)
{
	int outputonly = 0;
	
	ARGBEGIN{
	case 'c':
		outputonly++;
		break;
	case 'd':
		bliedebug++;
		break;
	}ARGEND;
	
	root = "";
	if (argc) {
		root = argv[0];
	}
	
	rfork(RFNAMEG);
	if (chdir(root))
		sysfatal("cannot chdir: %r");
	
	if (memimageinit())
		sysfatal("memimageinit: %r");
	
	loadeditors();
	
	if (!loadfile())
		sysfatal("cannot load data: %r");
	
	if (outputonly) {
		outputcomposite();
		exits(nil);
	}
	
	fprint(2, "interactive mode is not implemented yet!\n");
	exits(nil);
}