69 lines · 1.1 KB · C
RawDownload
#include "compose.h" voidintimg(C *c, char *path, int fd){	memset(c, 0, sizeof *c);	c->path = path;	c->fd = fd; 	if(c->fd == -1)		c->fd = open(c->path, OREAD);	if(c->fd == -1)		sysfatal("open: %r");} Memimage*pageimg(C *c, ulong chan){	char *args[10];	int i, p[2];	Memimage *t; 	if(c->im)		return c->im;	if(pipe(p) == -1)		sysfatal("pipe: %r");	switch(fork()){	case -1:		sysfatal("fork: %r");	case 0:		i = 0;		args[i++] = "/bin/imgtype";		args[i++] = "imgtype";		if(flag['t'])			args[i++] = "-t";		args[i++] = "-e";		args[i] = nil;		close(p[0]);		close(0);		dup(c->fd, 0);		dup(p[1], 1);		exec(args[0], args+1);		sysfatal("exec: %r");	}	close(p[1]);	c->im = readmemimage(p[0]);	if(c->im == nil)		sysfatal("readmemimage: %r");	if(chan != 0){		t = allocmemimage(c->im->r, chan);		if(t == nil)			sysfatal("readmemimage: %r");		memfillcolor(t, DTransparent);		memdraw(t, t->r, c->im, ZP, nil, ZP, SoverD);		freememimage(c->im);		c->im = t;	}	close(p[0]);	return c->im;} voidcloseimg(C *c){	freememimage(c->im);	c->im = nil;	if(c->path)		close(c->fd);}