void writeuncompressed(int fd, Memimage *m) { char chanstr[32]; int bpl, y, j; uchar *buf; if(chantostr(chanstr, m->chan) == nil) sysfatal("can't convert channel descriptor: %r"); fprint(fd, "%11s %11d %11d %11d %11d ", chanstr, m->r.min.x, m->r.min.y, m->r.max.x, m->r.max.y); bpl = bytesperline(m->r, m->depth); buf = malloc(bpl); if(buf == nil) sysfatal("malloc failed: %r"); for(y=m->r.min.y; y<m->r.max.y; y++){ j = unloadmemimage(m, Rect(m->r.min.x, y, m->r.max.x, y+1), buf, bpl); if(j != bpl) sysfatal("image unload failed: %r"); if(write(fd, buf, bpl) != bpl) sysfatal("write failed: %r"); } free(buf); }
/* * Initialize and install the rgbv color map as a private color map * for this application. It gets the best colors when it has the * cursor focus. * * We always choose the best depth possible, but that might not * be the default depth. On such "suboptimal" systems, we have to allocate an * empty color map anyway, according to Axel Belinfante. */ static int setupcmap(XWindow w) { char buf[30]; int i; u32int p, pp; XColor c; if(_x.depth <= 1) return 0; if(_x.depth >= 24) { if(_x.usetable == 0) _x.cmap = XCreateColormap(_x.display, w, _x.vis, AllocNone); /* * The pixel value returned from XGetPixel needs to * be converted to RGB so we can call rgb2cmap() * to translate between 24 bit X and our color. Unfortunately, * the return value appears to be display server endian * dependant. Therefore, we run some heuristics to later * determine how to mask the int value correctly. * Yeah, I know we can look at _x.vis->byte_order but * some displays say MSB even though they run on LSB. * Besides, this is more anal. */ c = _x.map[19]; /* known to have different R, G, B values */ if(!XAllocColor(_x.display, _x.cmap, &c)){ werrstr("XAllocColor: %r"); return -1; } p = c.pixel; pp = rgb2cmap((p>>16)&0xff,(p>>8)&0xff,p&0xff); if(pp != _x.map[19].pixel) { /* check if endian is other way */ pp = rgb2cmap(p&0xff,(p>>8)&0xff,(p>>16)&0xff); if(pp != _x.map[19].pixel){ werrstr("cannot detect X server byte order"); return -1; } switch(_x.chan){ case RGB24: _x.chan = BGR24; break; case XRGB32: _x.chan = XBGR32; break; default: werrstr("cannot byteswap channel %s", chantostr(buf, _x.chan)); break; } } }else if(_x.vis->class == TrueColor || _x.vis->class == DirectColor){
static long vgaread(Chan* c, void* a, long n, vlong off) { int len; char *p, *s; VGAscr *scr; ulong offset = off; char chbuf[30]; switch((ulong)c->qid.path) { case Qdir: return devdirread(c, a, n, vgadir, nelem(vgadir), devgen); case Qvgabios: if(offset >= 0x100000) return 0; if(offset+n >= 0x100000) n = 0x100000 - offset; memmove(a, (uchar*)kaddr(0)+offset, n); return n; case Qvgactl: scr = &vgascreen[0]; p = malloc(READSTR); if(waserror()) { free(p); nexterror(); } len = 0; if(scr->dev) s = scr->dev->name; else s = "cga"; len += snprint(p+len, READSTR-len, "type %s\n", s); if(scr->gscreen) { len += snprint(p+len, READSTR-len, "size %dx%dx%d %s\n", scr->gscreen->r.max.x, scr->gscreen->r.max.y, scr->gscreen->depth, chantostr(chbuf, scr->gscreen->chan)); if(Dx(scr->gscreen->r) != Dx(physgscreenr) || Dy(scr->gscreen->r) != Dy(physgscreenr)) len += snprint(p+len, READSTR-len, "actualsize %dx%d\n", physgscreenr.max.x, physgscreenr.max.y); } len += snprint(p+len, READSTR-len, "blank time %lud idle %d state %s\n", blanktime, drawidletime(), scr->isblank ? "off" : "on"); len += snprint(p+len, READSTR-len, "hwaccel %s\n", hwaccel ? "on" : "off"); len += snprint(p+len, READSTR-len, "hwblank %s\n", hwblank ? "on" : "off"); len += snprint(p+len, READSTR-len, "panning %s\n", panning ? "on" : "off"); len += snprint(p+len, READSTR-len, "addr p 0x%lux v 0x%p size 0x%ux\n", scr->paddr, scr->vaddr, scr->apsize); USED(len); n = readstr(offset, a, n, p); poperror(); free(p); return n; case Qvgaovl: case Qvgaovlctl: error(Ebadusefd); break; default: error(Egreg); break; } return 0; }
static long vgaread(Chan* c, void* a, long n, vlong off) { int len; char *p, *s; VGAscr *scr; ulong offset = off; char chbuf[30]; switch((ulong)c->qid.path){ case Qdir: return devdirread(c, a, n, vgadir, nelem(vgadir), devgen); case Qvgactl: scr = &vgascreen[0]; p = malloc(READSTR); if(waserror()){ free(p); nexterror(); } len = 0; if(scr->dev) s = scr->dev->name; else s = "cga"; len += snprint(p+len, READSTR-len, "type %s\n", s); if(scr->gscreen) { len += snprint(p+len, READSTR-len, "size %dx%dx%d %s\n", scr->gscreen->r.max.x, scr->gscreen->r.max.y, scr->gscreen->depth, chantostr(chbuf, scr->gscreen->chan)); if(Dx(scr->gscreen->r) != Dx(physgscreenr) || Dy(scr->gscreen->r) != Dy(physgscreenr)) len += snprint(p+len, READSTR-len, "actualsize %dx%d\n", physgscreenr.max.x, physgscreenr.max.y); } len += snprint(p+len, READSTR-len, "blanktime %lud\n", blanktime); len += snprint(p+len, READSTR-len, "hwaccel %s\n", hwaccel ? "on" : "off"); len += snprint(p+len, READSTR-len, "hwblank %s\n", hwblank ? "on" : "off"); snprint(p+len, READSTR-len, "addr 0x%lux\n", scr->paddr); n = readstr(offset, a, n, p); poperror(); free(p); return n; case Qvgabios: if(vgabios == nil) error(Egreg); if(offset&0x80000000) offset &= ~0x800E0000; if(offset+n > 0x10000) n = 0x10000-offset; if(n < 0) return 0; memmove(a, vgabios+offset, n); return n; default: error(Egreg); break; } return 0; }