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; }
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; }
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; }
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); }
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; } }
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); }
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; }