Exemple #1
0
static int
sizegen(int i, Dir *d, void *v)
{
	vlong path;
	Fid *fid;
	XFont *f;
	int j;

	fid = v;
	path = fid->qid.path;
	if(i == 0) {
		path += Qfontfile - Qsizedir;
		goto Done;
	}
	i--;
	f = &xfont[QFONT(path)];
	load(f);
	for(j=0; j<nelem(f->range); j++) {
		if(f->range[j] == 0)
			continue;
		if(i == 0) {
			path += Qsubfontfile - Qsizedir;
			path += qpath(0, 0, 0, 0, j);
			goto Done;
		}
		i--;
	}
	return -1;

Done:
	dostat(path, nil, d);
	return 0;
}
Exemple #2
0
static int
fontgen(int i, Dir *d, void *v)
{
	vlong path;
	Fid *f;
	
	f = v;
	path = f->qid.path;
	if(i >= 2*nelem(sizes))
		return -1;
	dostat(qpath(Qsizedir, QFONT(path), sizes[i/2], i&1, 0), nil, d);
	return 0;
}
Exemple #3
0
void
smg_cursor(void *id, int on, int row, int col)
{
	struct smg_screen * const ss = id;

	if (ss == curscr) {
		SM_ADDR(ss->ss_cury, ss->ss_curx, 14) =
		    QFONT(ss->ss_image[ss->ss_cury][ss->ss_curx], 14);
		cursor = &SM_ADDR(row, col, 14);
		if ((cur_on = on))
			*cursor ^= 255;
	}
	ss->ss_curx = col;
	ss->ss_cury = row;
}
Exemple #4
0
static void
smg_putchar(void *id, int row, int col, u_int c, long attr)
{
	struct smg_screen * const ss = id;
	int i;

	c &= 0xff;

	ss->ss_image[row][col] = c;
	ss->ss_attr[row][col] = attr;
	if (ss != curscr)
		return;
	for (i = 0; i < 15; i++) {
		unsigned char ch = QFONT(c, i);

		SM_ADDR(row, col, i) = (attr & WSATTR_REVERSE ? ~ch : ch);
		
	}
	if (attr & WSATTR_UNDERLINE)
		SM_ADDR(row, col, 14) ^= SM_ADDR(row, col, 14);
}
Exemple #5
0
static void
dostat(vlong path, Qid *qid, Dir *dir)
{
	char *name;
	Qid q;
	ulong mode;
	vlong length;
	XFont *f;
	char buf[100];
	
	q.type = 0;
	q.vers = 0;
	q.path = path;
	mode = 0444;
	length = 0;
	name = "???";

	switch(QTYPE(path)) {
	default:
		sysfatal("dostat %#llux", path);

	case Qroot:
		q.type = QTDIR;
		name = "/";
		break;

	case Qfontdir:
		q.type = QTDIR;
		f = &xfont[QFONT(path)];
		name = f->name;
		break;

	case Qsizedir:
		q.type = QTDIR;
		snprint(buf, sizeof buf, "%lld%s", QSIZE(path), QANTIALIAS(path) ? "a" : "");
		name = buf;
		break;
	
	case Qfontfile:
		f = &xfont[QFONT(path)];
		load(f);
		length = 11+1+11+1+f->nrange*(6+1+6+1+9+1);
		name = "font";
		break;

	case Qsubfontfile:
		snprint(buf, sizeof buf, "x%04x.bit", (int)QRANGE(path)*SubfontSize);
		name = buf;
		break;
	}
	
	if(qid)
		*qid = q;
	if(dir) {
		memset(dir, 0, sizeof *dir);
		dir->name = estrdup9p(name);
		dir->muid = estrdup9p("");
		dir->uid = estrdup9p("font");
		dir->gid = estrdup9p("font");
		dir->qid = q;
		if(q.type == QTDIR)
			mode |= DMDIR | 0111;
		dir->mode = mode;
		dir->length = length;
	}
}
Exemple #6
0
static void
xread(Req *r)
{
	int i, size, height, ascent;
	vlong path;
	Fmt fmt;
	XFont *f;
	char *data;
	Memsubfont *sf;
	Memimage *m;
	
	path = r->fid->qid.path;
	switch(QTYPE(path)) {
	case Qroot:
		dirread9p(r, rootgen, nil);
		break;
	case Qfontdir:
		dirread9p(r, fontgen, r->fid);
		break;
	case Qsizedir:
		dirread9p(r, sizegen, r->fid);
		break;
	case Qfontfile:
		fmtstrinit(&fmt);
		f = &xfont[QFONT(path)];
		load(f);
		if(f->unit == 0 && f->loadheight == nil) {
			readstr(r, "font missing\n");
			break;
		}
		height = 0;
		ascent = 0;
		if(f->unit > 0) {
			height = f->height * (int)QSIZE(path)/f->unit + 0.99999999;
			ascent = height - (int)(-f->originy * (int)QSIZE(path)/f->unit + 0.99999999);
		}
		if(f->loadheight != nil)
			f->loadheight(f, QSIZE(path), &height, &ascent);
		fmtprint(&fmt, "%11d %11d\n", height, ascent);
		for(i=0; i<nelem(f->range); i++) {
			if(f->range[i] == 0)
				continue;
			fmtprint(&fmt, "0x%04x 0x%04x x%04x.bit\n", i*SubfontSize, ((i+1)*SubfontSize) - 1, i*SubfontSize);
		}
		data = fmtstrflush(&fmt);
		readstr(r, data);
		free(data);
		break;
	case Qsubfontfile:
		f = &xfont[QFONT(path)];
		load(f);
		if(r->fid->aux == nil) {
			r->fid->aux = mksubfont(f, f->name, QRANGE(path)*SubfontSize, ((QRANGE(path)+1)*SubfontSize)-1, QSIZE(path), QANTIALIAS(path));
			if(r->fid->aux == nil) {
				responderrstr(r);
				return;
			}
		}
		sf = r->fid->aux;
		m = sf->bits;
		if(r->ifcall.offset < 5*12) {
			char *chan;
			if(QANTIALIAS(path))
				chan = "k8";
			else
				chan = "k1";
			data = smprint("%11s %11d %11d %11d %11d ", chan, m->r.min.x, m->r.min.y, m->r.max.x, m->r.max.y);
			readstr(r, data);
			free(data);
			break;
		}
		r->ifcall.offset -= 5*12;
		size = bytesperline(m->r, chantodepth(m->chan)) * Dy(m->r);
		if(r->ifcall.offset < size) {
			readbuf(r, byteaddr(m, m->r.min), size);
			break;
		}
		r->ifcall.offset -= size;
		data = emalloc9p(3*12+6*(sf->n+1));
		sprint(data, "%11d %11d %11d ", sf->n, sf->height, sf->ascent);
		packinfo(sf->info, (uchar*)data+3*12, sf->n);
		readbuf(r, data, 3*12+6*(sf->n+1));
		free(data);
		break;
	}
	respond(r, nil);
}
Exemple #7
0
static char*
xwalk1(Fid *fid, char *name, Qid *qid)
{
	int i, dotdot;
	vlong path;
	char *p;
	int a, n;
	XFont *f;

	path = fid->qid.path;
	dotdot = strcmp(name, "..") == 0;
	switch(QTYPE(path)) {
	default:
	NotFound:
		return "file not found";

	case Qroot:
		if(dotdot)
			break;
		for(i=0; i<nxfont; i++) {
			if(strcmp(xfont[i].name, name) == 0) {
				path = qpath(Qfontdir, i, 0, 0, 0);
				goto Found;
			}
		}
		goto NotFound;

	case Qfontdir:
		if(dotdot) {
			path = Qroot;
			break;
		}
		n = strtol(name, &p, 10);
		if(n == 0)
			goto NotFound;
		a = 0;
		if(*p == 'a') {
			a = 1;
			p++;
		}
		if(*p != 0)
			goto NotFound;
		path += Qsizedir - Qfontdir + qpath(0, 0, n, a, 0);
		break;

	case Qsizedir:
		if(dotdot) {
			path = qpath(Qfontdir, QFONT(path), 0, 0, 0);
			break;
		}
		if(strcmp(name, "font") == 0) {
			path += Qfontfile - Qsizedir;
			break;
		}
		f = &xfont[QFONT(path)];
		load(f);
		p = name;
		if(*p != 'x')
			goto NotFound;
		p++;
		n = strtoul(p, &p, 16);
		if(p != name+5 || n%SubfontSize != 0 || strcmp(p, ".bit") != 0 || !f->range[(n/SubfontSize) & SubfontMask])
			goto NotFound;
		path += Qsubfontfile - Qsizedir + qpath(0, 0, 0, 0, (n/SubfontSize) & SubfontMask);
		break;
	}
Found:
	dostat(path, qid, nil);
	fid->qid = *qid;
	return nil;
}