| plan 9 kernel history: overview | file list | diff list |
1992/0622/port/devbit.c (diff list | history)
| 1990/0324/sys/src/9/port/devbit.c:9,22 – 1990/0327/sys/src/9/port/devbit.c:9,39 (short | long) | ||
| 1990/0324 | #include "gnot.h" | |
| 1990/0327 | /* * Some fields in Bitmaps are overloaded: * ldepth = -1 means free. * base is next pointer when free. * Arena is a word containing N, followed by a pointer to its bitmap, * followed by N blocks. The bitmap pointer is zero if block is free. */ | |
| 1990/0324 | struct{ Ref; int bltuse; QLock blt; /* a group of bitblts in a single write is atomic */ | |
| 1990/0327 | Bitmap *map; /* arena */ Bitmap *free; /* free list */ ulong *words; /* storage */ ulong nwords; /* total in arena */ ulong *wfree; /* pointer to next free word */ int lastid; /* last allocated bitmap id */ | |
| 1990/0324 | }bit; | |
| 1990/0327 | #define FREE 0x80000000 void bitcompact(void); void bitfree(Bitmap*); extern Bitmap screen; | |
| 1990/0324 | enum{ Qdir, Qbitblt, | |
| 1990/0324/sys/src/9/port/devbit.c:31,36 – 1990/0327/sys/src/9/port/devbit.c:48,69 | ||
| 1990/0324 | void bitreset(void) { | |
| 1990/0327 | int i; Bitmap *bp; bit.map = ialloc(conf.nbitmap * sizeof(Bitmap), 0); for(i=0,bp=bit.map; i<conf.nbitmap; i++,bp++){ bp->ldepth = -1; bp->base = (ulong*)(bp+1); } bp--; bp->base = 0; bit.map[0] = screen; /* bitmap 0 is screen */ bit.free = bit.map+1; bit.lastid = -1; bit.words = ialloc(conf.nbitbyte, 0); bit.nwords = conf.nbitbyte/sizeof(ulong); bit.wfree = bit.words; | |
| 1990/0324 | } void | |
| 1990/0324/sys/src/9/port/devbit.c:74,88 – 1990/0327/sys/src/9/port/devbit.c:107,118 | ||
| 1990/0324 | if(omode != OREAD) error(0, Eperm); }else{ | |
| 1990/0327 | if(bit.bltuse){ | |
| 1990/0324 | unlock(&bit); error(0, Einuse); } | |
| 1990/0327 | bit.lastid = -1; | |
| 1990/0324 | unlock(&bit); incref(&bit); } | |
| 1990/0324/sys/src/9/port/devbit.c:113,137 – 1990/0327/sys/src/9/port/devbit.c:143,202 | ||
| 1990/0324 | void bitclose(Chan *c) { | |
| 1990/0327 | int i; Bitmap *bp; | |
| 1990/0324 | if(c->qid != CHDIR){ | |
| 1990/0327 | lock(&bit); /* FREE ALL THE BITMAPS: BUG */ if(--bit.ref == 0){ for(i=1,bp=&bit.map[1]; i<conf.nbitmap; i++,bp++) if(bp->ldepth >= 0) bitfree(bp); | |
| 1990/0324 | bit.bltuse = 0; | |
| 1990/0327 | } | |
| 1990/0324 | unlock(&bit); } } | |
| 1990/0327 | #define GSHORT(p) (((p)[0]<<0) | ((p)[1]<<8)) #define GLONG(p) ((GSHORT(p)<<0) | (GSHORT(p+2)<<16)) | |
| 1990/0324 | long bitread(Chan *c, void *va, long n) { | |
| 1990/0327 | uchar *p; | |
| 1990/0324 | if(c->qid & CHDIR) return devdirread(c, va, n, bitdir, NBIT, devgen); | |
| 1990/0327 | if(c->qid != Qbitblt) error(0, Egreg); p = va; qlock(&bit.blt); if(waserror()){ qunlock(&bit.blt); nexterror(); } /* * Fuss about and figure out what to say. */ if(bit.lastid > 0){ if(n < 3) error(0, Ebadblt); p[0] = 'A'; p[1] = bit.lastid; p[2] = bit.lastid>>8; bit.lastid = -1; n = 3; goto done; } error(0, Ebadblt); done: qunlock(&bit.blt); return n; | |
| 1990/0324 | } | |
| 1990/0324/sys/src/9/port/devbit.c:139,193 – 1990/0327/sys/src/9/port/devbit.c:204,336 | ||
| 1990/0324 | uchar *p; long m; long v; | |
| 1990/0327 | ulong l, nw, ws; | |
| 1990/0324 | Point pt; Rectangle rect; | |
| 1990/0327 | Bitmap *bp, *src, *dst; | |
| 1990/0324 | if(c->qid == CHDIR) error(0, Eisdir); | |
| 1990/0327 | if(c->qid != Qbitblt) error(0, Egreg); | |
| 1990/0324 | p = va; m = n; | |
| 1990/0327 | qlock(&bit.blt); if(waserror()){ qunlock(&bit.blt); nexterror(); } while(m > 0) switch(*p){ case 'a': /* * allocate: * 'a' 1 * ldepth 1 * Rectangle 16 * next read returns allocated bitmap id */ if(m < 18) | |
| 1990/0324 | error(0, Ebadblt); | |
| 1990/0327 | v = *(p+1); if(v != 0) /* BUG */ error(0, Ebadblt); ws = 1<<(5-v); /* pixels per word */ if(bit.free == 0) error(0, Enobitmap); rect.min.x = GLONG(p+2); rect.min.y = GLONG(p+6); rect.max.x = GLONG(p+10); rect.max.y = GLONG(p+14); if(rect.min.x >= 0) l = (rect.max.x+ws-1)/ws - rect.min.x/ws; else{ /* make positive before divide */ long t; t = (-rect.min.x)+ws-1; t = (t/ws)*ws; l = (t+rect.max.x+ws-1)/ws; | |
| 1990/0324 | } | |
| 1990/0327 | nw = l*Dy(rect); if(bit.wfree+l+2 > bit.words+bit.nwords){ bitcompact(); if(bit.wfree+l+1 > bit.words+bit.nwords) error(0, Enobitstore); } bp = bit.free; bit.free = (Bitmap*)(bp->base); *bit.wfree++ = nw; *bit.wfree++ = (ulong)bp; bp->base = bit.wfree; memset(bp->base, 0, nw*sizeof(ulong)); bit.wfree += nw; bp->zero = l*rect.min.y; if(rect.min.x >= 0) bp->zero += rect.min.x/ws; else bp->zero -= (-rect.min.x+ws-1)/ws; bp->zero = -bp->zero; bp->width = l; bp->ldepth = v; bp->rect = rect; bp->cache = 0; bit.lastid = bp-bit.map; m -= 18; p += 18; break; | |
| 1990/0324 |
| |
| 1990/0327 | case 'b': /* * bitblt * 'b' 1 * dst id 2 * dst Point 8 * src id 2 * src Rectangle 16 * code 2 */ if(m < 31) error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; if(v<0 || v>=conf.nbitmap || dst->ldepth < 0) error(0, Ebadblt); pt.x = GLONG(p+3); pt.y = GLONG(p+7); v = GSHORT(p+11); src = &bit.map[v]; if(v<0 || v>=conf.nbitmap || src->ldepth < 0) error(0, Ebadblt); rect.min.x = GLONG(p+13); rect.min.y = GLONG(p+17); rect.max.x = GLONG(p+21); rect.max.y = GLONG(p+25); v = GSHORT(p+29); bitblt(dst, pt, src, rect, v); m -= 31; p += 31; break; case 'f': /* * free * 'f' 1 * id 2 */ if(m < 3) error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; if(v >= conf.nbitmap || dst->ldepth<0) error(0, Ebadblt); bitfree(dst); m -= 3; p += 3; break; } qunlock(&bit.blt); | |
| 1990/0324 | return n; } | |
| 1990/0324/sys/src/9/port/devbit.c:201,204 – 1990/0327/sys/src/9/port/devbit.c:344,379 | ||
| 1990/0324 | biterrstr(Error *e, char *buf) { rooterrstr(e, buf); | |
| 1990/0327 | } void bitfree(Bitmap *bp) { bp->base[1] = 0; bp->ldepth = -1; bp->base = (ulong*)bit.free; bit.free = bp; } void bitcompact(void) { ulong *p1, *p2; print("bitcompact\n"); p1 = p2 = bit.words; while(p2 < bit.wfree){ if(p2[1] == 0){ p2 += 2 + p2[0]; continue; } if(p1 != p2){ memcpy(p1, p2, (2+p2[0])*sizeof(ulong)); ((Bitmap*)p1[1])->base = p1+2; } p2 += 2 + p1[0]; p1 += 2 + p1[0]; } bit.wfree = p1; print("bitcompact done\n"); | |
| 1990/0324 | } | |
| 1990/0327/sys/src/9/port/devbit.c:9,15 – 1990/0329/sys/src/9/port/devbit.c:9,22 (short | long) | ||
| 1990/0324 | #include "gnot.h" | |
| 1990/0329 | extern Font defont0; /* BUG */ | |
| 1990/0327 | /* | |
| 1990/0329 | * Device (#b/bitblt) is exclusive use on open, so no locks are necessary * for i/o */ /* | |
| 1990/0327 | * Some fields in Bitmaps are overloaded: * ldepth = -1 means free. * base is next pointer when free. | |
| 1990/0327/sys/src/9/port/devbit.c:20,26 – 1990/0329/sys/src/9/port/devbit.c:27,32 | ||
| 1990/0324 | struct{ Ref; int bltuse; | |
| 1990/0327 | Bitmap *map; /* arena */ Bitmap *free; /* free list */ ulong *words; /* storage */ | |
| 1990/0327/sys/src/9/port/devbit.c:27,32 – 1990/0329/sys/src/9/port/devbit.c:33,39 | ||
| 1990/0327 | ulong nwords; /* total in arena */ ulong *wfree; /* pointer to next free word */ int lastid; /* last allocated bitmap id */ | |
| 1990/0329 | int init; /* freshly opened; init message pending */ | |
| 1990/0324 | }bit; | |
| 1990/0327 | #define FREE 0x80000000 | |
| 1990/0327/sys/src/9/port/devbit.c:33,46 – 1990/0329/sys/src/9/port/devbit.c:40,56 | ||
| 1990/0327 | void bitcompact(void); void bitfree(Bitmap*); extern Bitmap screen; | |
| 1990/0329 | Mouse mouse; | |
| 1990/0327 | ||
| 1990/0324 | enum{ Qdir, Qbitblt, | |
| 1990/0329 | Qmouse, | |
| 1990/0324 | }; Dirtab bitdir[]={ "bitblt", Qbitblt, 0, 0600, | |
| 1990/0329 | "mouse", Qmouse, 0, 0600, | |
| 1990/0324 | }; #define NBIT (sizeof bitdir/sizeof(Dirtab)) | |
| 1990/0327/sys/src/9/port/devbit.c:113,118 – 1990/0329/sys/src/9/port/devbit.c:123,129 | ||
| 1990/0324 | error(0, Einuse); } | |
| 1990/0327 | bit.lastid = -1; | |
| 1990/0329 | bit.init = 1; | |
| 1990/0324 | unlock(&bit); incref(&bit); } | |
| 1990/0327/sys/src/9/port/devbit.c:147,153 – 1990/0329/sys/src/9/port/devbit.c:158,164 | ||
| 1990/0327 | Bitmap *bp; | |
| 1990/0324 | if(c->qid != CHDIR){ | |
| 1990/0327 |
| |
| 1990/0329 | lock(&bit); | |
| 1990/0327 | if(--bit.ref == 0){ for(i=1,bp=&bit.map[1]; i<conf.nbitmap; i++,bp++) if(bp->ldepth >= 0) | |
| 1990/0327/sys/src/9/port/devbit.c:160,166 – 1990/0329/sys/src/9/port/devbit.c:171,186 | ||
| 1990/0324 | ||
| 1990/0327 | #define GSHORT(p) (((p)[0]<<0) | ((p)[1]<<8)) #define GLONG(p) ((GSHORT(p)<<0) | (GSHORT(p+2)<<16)) | |
| 1990/0329 | #define PSHORT(p, v) ((p)[0]=(v), (p)[1]=((v)>>8)) #define PLONG(p, v) (PSHORT(p, (v)), PSHORT(p+2, (v)>>16)) | |
| 1990/0327 | ||
| 1990/0329 | /* * These macros turn user-level (high bit at left) into internal (whatever) * bit order. On the gnot they're trivial. */ #define U2K(x) (x) #define K2U(x) (x) | |
| 1990/0324 | long bitread(Chan *c, void *va, long n) { | |
| 1990/0327/sys/src/9/port/devbit.c:172,191 – 1990/0329/sys/src/9/port/devbit.c:192,228 | ||
| 1990/0327 | if(c->qid != Qbitblt) error(0, Egreg); p = va; | |
| 1990/0329 | if(bit.init){ /* * init: * 'I' 1 * ldepth 2 * rectangle 16 */ if(n < 19) error(0, Ebadblt); p[0] = 'I'; PSHORT(p+1, screen.ldepth); PLONG(p+3, screen.r.min.x); PLONG(p+7, screen.r.min.y); PLONG(p+11, screen.r.max.x); PLONG(p+15, screen.r.max.y); bit.init = 0; goto done; } | |
| 1990/0327 | if(bit.lastid > 0){ | |
| 1990/0329 | /* * allocate: * 'A' 1 * bitmap id 2 */ | |
| 1990/0327 | if(n < 3) error(0, Ebadblt); p[0] = 'A'; | |
| 1990/0329 | PSHORT(p+1, bit.lastid); | |
| 1990/0327 | bit.lastid = -1; n = 3; goto done; | |
| 1990/0327/sys/src/9/port/devbit.c:193,199 – 1990/0329/sys/src/9/port/devbit.c:230,235 | ||
| 1990/0327 | error(0, Ebadblt); done: | |
| 1990/0324 | } | |
| 1990/0327/sys/src/9/port/devbit.c:201,209 – 1990/0329/sys/src/9/port/devbit.c:237,244 | ||
| 1990/0324 | long bitwrite(Chan *c, void *va, long n) { | |
| 1990/0329 | uchar *p, *q; long m, v, miny, maxy, t, x, y; | |
| 1990/0327 | ulong l, nw, ws; | |
| 1990/0324 | Point pt; Rectangle rect; | |
| 1990/0327/sys/src/9/port/devbit.c:217,229 – 1990/0329/sys/src/9/port/devbit.c:252,263 | ||
| 1990/0327 | ||
| 1990/0324 | p = va; m = n; | |
| 1990/0327 |
| |
| 1990/0329 | default: pprint("bitblt request 0x%x\n", *p); error(0, Ebadblt); | |
| 1990/0327 | case 'a': /* * allocate: | |
| 1990/0327/sys/src/9/port/devbit.c:247,253 – 1990/0329/sys/src/9/port/devbit.c:281,286 | ||
| 1990/0327 | if(rect.min.x >= 0) l = (rect.max.x+ws-1)/ws - rect.min.x/ws; else{ /* make positive before divide */ | |
| 1990/0327/sys/src/9/port/devbit.c:273,279 – 1990/0329/sys/src/9/port/devbit.c:306,312 | ||
| 1990/0327 | bp->zero = -bp->zero; bp->width = l; bp->ldepth = v; | |
| 1990/0329 | bp->r = rect; | |
| 1990/0327 | bp->cache = 0; bit.lastid = bp-bit.map; m -= 18; | |
| 1990/0327/sys/src/9/port/devbit.c:295,307 – 1990/0329/sys/src/9/port/devbit.c:328,340 | ||
| 1990/0327 | v = GSHORT(p+1); dst = &bit.map[v]; if(v<0 || v>=conf.nbitmap || dst->ldepth < 0) | |
| 1990/0329 | error(0, Ebadbitmap); | |
| 1990/0327 | pt.x = GLONG(p+3); pt.y = GLONG(p+7); v = GSHORT(p+11); src = &bit.map[v]; if(v<0 || v>=conf.nbitmap || src->ldepth < 0) | |
| 1990/0329 | error(0, Ebadbitmap); | |
| 1990/0327 | rect.min.x = GLONG(p+13); rect.min.y = GLONG(p+17); rect.max.x = GLONG(p+21); | |
| 1990/0327/sys/src/9/port/devbit.c:322,336 – 1990/0329/sys/src/9/port/devbit.c:355,478 | ||
| 1990/0327 | error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; | |
| 1990/0329 | if(v>=conf.nbitmap || dst->ldepth<0) error(0, Ebadbitmap); | |
| 1990/0327 | bitfree(dst); m -= 3; p += 3; break; | |
| 1990/0329 | case 's': /* * string * 's' 1 * id 2 * pt 8 * font id 2 * fcode 2 * string n (null terminated) */ if(m < 16) error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; if(v>=conf.nbitmap || dst->ldepth<0) error(0, Ebadbitmap); pt.x = GLONG(p+3); pt.y = GLONG(p+7); v = GSHORT(p+11); if(v != 0) /* BUG */ error(0, Ebadblt); v = GSHORT(p+13); p += 15; m -= 15; q = memchr(p, 0, m); if(q == 0) error(0, Ebadblt); string(dst, pt, &defont0/*BUG*/, (char*)p, v); q++; m -= q-p; p = q; break; case 't': /* * texture * 't' 1 * dst id 2 * Rectangle 16 * src id 2 * fcode 2 */ if(m < 23) error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; if(v>=conf.nbitmap || dst->ldepth<0) error(0, Ebadbitmap); rect.min.x = GLONG(p+3); rect.min.y = GLONG(p+7); rect.max.x = GLONG(p+11); rect.max.y = GLONG(p+15); v = GSHORT(p+19); src = &bit.map[v]; if(v>=conf.nbitmap || src->ldepth<0) error(0, Ebadbitmap); if(src->r.min.x!=0 || src->r.min.y!=0 || src->r.max.x!=16 || src->r.max.y!=16) error(0, Ebadblt); v = GSHORT(p+21); { int i; Texture t; for(i=0; i<16; i++) t.bits[i] = src->base[i]>>16; texture(dst, rect, &t, v); } m -= 23; p += 23; break; case 'w': /* * write * 'w' 1 * dst id 2 * miny 4 * maxy 4 * data bytewidth*(maxy-miny) */ if(m < 11) error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; if(v>=conf.nbitmap || dst->ldepth<0) error(0, Ebadbitmap); miny = GLONG(p+3); maxy = GLONG(p+7); ws = 1<<(3-dst->ldepth); /* pixels per byte */ /* set l to number of bytes of incoming data per scan line */ if(dst->r.min.x >= 0) l = (dst->r.max.x+ws-1)/ws - dst->r.min.x/ws; else{ /* make positive before divide */ t = (-dst->r.min.x)+ws-1; t = (t/ws)*ws; l = (t+dst->r.max.x+ws-1)/ws; } p += 11; m -= 11; if(m < l*(maxy-miny)) error(0, Ebadblt); for(y=miny; y<maxy; y++){ q = (uchar*)addr(dst, Pt(dst->r.min.x, y)); q += (dst->r.min.x&((sizeof(ulong))*ws-1))/8; for(x=0; x<l; x++) *q++ = U2K(*p++); m -= l; } break; | |
| 1990/0327 | } | |
| 1990/0324 | return n; } | |
| 1990/0327/sys/src/9/port/devbit.c:376,379 – 1990/0329/sys/src/9/port/devbit.c:518,530 | ||
| 1990/0327 | } bit.wfree = p1; print("bitcompact done\n"); | |
| 1990/0329 | } void mousebuttons(int b) { if(mouse.buttons != b){ print("buttons %x\n", b); mouse.buttons = b; } | |
| 1990/0324 | } | |
| 1990/0329/sys/src/9/port/devbit.c:199,216 – 1990/03291/sys/src/9/port/devbit.c:199,217 (short | long) | ||
| 1990/0329 | /* * init: * 'I' 1 | |
| 1990/03291 | * ldepth 1 | |
| 1990/0329 | * rectangle 16 */ | |
| 1990/03291 | if(n < 18) | |
| 1990/0329 | error(0, Ebadblt); p[0] = 'I'; | |
| 1990/03291 | p[1] = screen.ldepth; PLONG(p+2, screen.r.min.x); PLONG(p+6, screen.r.min.y); PLONG(p+10, screen.r.max.x); PLONG(p+14, screen.r.max.y); | |
| 1990/0329 | bit.init = 0; | |
| 1990/03291 | n = 18; | |
| 1990/0329 | goto done; } | |
| 1990/0327 | if(bit.lastid > 0){ | |
| 1990/0329/sys/src/9/port/devbit.c:450,455 – 1990/03291/sys/src/9/port/devbit.c:451,458 | ||
| 1990/0329 | error(0, Ebadbitmap); miny = GLONG(p+3); maxy = GLONG(p+7); | |
| 1990/03291 | if(miny>maxy || miny<dst->r.min.y || maxy>dst->r.max.y) error(0, Ebadblt); | |
| 1990/0329 | ws = 1<<(3-dst->ldepth); /* pixels per byte */ /* set l to number of bytes of incoming data per scan line */ if(dst->r.min.x >= 0) | |
| 1990/03291/sys/src/9/port/devbit.c:40,47 – 1990/0504/sys/src/9/port/devbit.c:40,112 (short | long) | ||
| 1990/0327 | void bitcompact(void); void bitfree(Bitmap*); extern Bitmap screen; | |
| 1990/0329 |
| |
| 1990/0327 | ||
| 1990/0504 | struct{ /* * First three fields are known in l.s */ int dx; /* interrupt-time delta */ int dy; int track; /* update cursor on screen */ Mouse; int changed; /* mouse structure changed since last read */ Rendez r; }mouse; struct{ Cursor; Lock; int visible; /* on screen */ Rectangle r; /* location */ }cursor = { {{0, 0}, {0xFFE0, 0xFFE0, 0xFFC0, 0xFF00, 0xFF00, 0xFF80, 0xFFC0, 0xFFE0, 0xE7F0, 0xE3F8, 0xC1FC, 0x00FE, 0x007F, 0x003E, 0x001C, 0x0008, }, {0x0000, 0x7FC0, 0x7F00, 0x7C00, 0x7E00, 0x7F00, 0x6F80, 0x67C0, 0x43E0, 0x41F0, 0x00F8, 0x007C, 0x003E, 0x001C, 0x0008, 0x0000, }}, }; ulong setbits[16]; Bitmap set = { setbits, 0, 1, 0, {0, 0, 16, 16} }; ulong clrbits[16]; Bitmap clr = { clrbits, 0, 1, 0, {0, 0, 16, 16} }; ulong cursorbackbits[16]; Bitmap cursorback = { cursorbackbits, 0, 1, 0, {0, 0, 16, 16} }; void cursortobitmap(void); void cursoron(int); void cursoroff(int); | |
| 1990/0324 | enum{ Qdir, Qbitblt, | |
| 1990/03291/sys/src/9/port/devbit.c:74,79 – 1990/0504/sys/src/9/port/devbit.c:139,145 | ||
| 1990/0327 | bit.words = ialloc(conf.nbitbyte, 0); bit.nwords = conf.nbitbyte/sizeof(ulong); bit.wfree = bit.words; | |
| 1990/0504 | cursortobitmap(); | |
| 1990/0324 | } void | |
| 1990/03291/sys/src/9/port/devbit.c:82,87 – 1990/0504/sys/src/9/port/devbit.c:148,154 | ||
| 1990/0324 | lock(&bit); bit.bltuse = 0; unlock(&bit); | |
| 1990/0504 | cursoron(1); | |
| 1990/0324 | } Chan* | |
| 1990/03291/sys/src/9/port/devbit.c:241,246 – 1990/0504/sys/src/9/port/devbit.c:308,314 | ||
| 1990/0329 | uchar *p, *q; long m, v, miny, maxy, t, x, y; | |
| 1990/0327 | ulong l, nw, ws; | |
| 1990/0504 | int off; | |
| 1990/0324 | Point pt; Rectangle rect; | |
| 1990/0327 | Bitmap *bp, *src, *dst; | |
| 1990/03291/sys/src/9/port/devbit.c:330,335 – 1990/0504/sys/src/9/port/devbit.c:398,406 | ||
| 1990/0327 | dst = &bit.map[v]; if(v<0 || v>=conf.nbitmap || dst->ldepth < 0) | |
| 1990/0329 | error(0, Ebadbitmap); | |
| 1990/0504 | off = 0; if(v == 0) off = 1; | |
| 1990/0327 | pt.x = GLONG(p+3); pt.y = GLONG(p+7); v = GSHORT(p+11); | |
| 1990/03291/sys/src/9/port/devbit.c:336,347 – 1990/0504/sys/src/9/port/devbit.c:407,424 | ||
| 1990/0327 | src = &bit.map[v]; if(v<0 || v>=conf.nbitmap || src->ldepth < 0) | |
| 1990/0329 | error(0, Ebadbitmap); | |
| 1990/0504 | if(v == 0) off = 1; | |
| 1990/0327 | rect.min.x = GLONG(p+13); rect.min.y = GLONG(p+17); rect.max.x = GLONG(p+21); rect.max.y = GLONG(p+25); v = GSHORT(p+29); | |
| 1990/0504 | if(off) cursoroff(1); | |
| 1990/0327 | bitblt(dst, pt, src, rect, v); | |
| 1990/0504 | if(off) cursoron(1); | |
| 1990/0327 | m -= 31; p += 31; break; | |
| 1990/03291/sys/src/9/port/devbit.c:379,384 – 1990/0504/sys/src/9/port/devbit.c:456,464 | ||
| 1990/0329 | dst = &bit.map[v]; if(v>=conf.nbitmap || dst->ldepth<0) error(0, Ebadbitmap); | |
| 1990/0504 | off = 0; if(v == 0) off = 1; | |
| 1990/0329 | pt.x = GLONG(p+3); pt.y = GLONG(p+7); v = GSHORT(p+11); | |
| 1990/03291/sys/src/9/port/devbit.c:390,396 – 1990/0504/sys/src/9/port/devbit.c:470,480 | ||
| 1990/0329 | q = memchr(p, 0, m); if(q == 0) error(0, Ebadblt); | |
| 1990/0504 | if(off) cursoroff(1); | |
| 1990/0329 | string(dst, pt, &defont0/*BUG*/, (char*)p, v); | |
| 1990/0504 | if(off) cursoron(1); | |
| 1990/0329 | q++; m -= q-p; p = q; | |
| 1990/03291/sys/src/9/port/devbit.c:411,416 – 1990/0504/sys/src/9/port/devbit.c:495,503 | ||
| 1990/0329 | dst = &bit.map[v]; if(v>=conf.nbitmap || dst->ldepth<0) error(0, Ebadbitmap); | |
| 1990/0504 | off = 0; if(v == 0) off = 1; | |
| 1990/0329 | rect.min.x = GLONG(p+3); rect.min.y = GLONG(p+7); rect.max.x = GLONG(p+11); | |
| 1990/03291/sys/src/9/port/devbit.c:428,434 – 1990/0504/sys/src/9/port/devbit.c:515,525 | ||
| 1990/0329 | for(i=0; i<16; i++) t.bits[i] = src->base[i]>>16; | |
| 1990/0504 | if(off) cursoroff(1); | |
| 1990/0329 | texture(dst, rect, &t, v); | |
| 1990/0504 | if(off) cursoron(1); | |
| 1990/0329 | } m -= 23; p += 23; | |
| 1990/03291/sys/src/9/port/devbit.c:449,454 – 1990/0504/sys/src/9/port/devbit.c:540,548 | ||
| 1990/0329 | dst = &bit.map[v]; if(v>=conf.nbitmap || dst->ldepth<0) error(0, Ebadbitmap); | |
| 1990/0504 | off = 0; if(v == 0) off = 1; | |
| 1990/0329 | miny = GLONG(p+3); maxy = GLONG(p+7); | |
| 1990/03291 | if(miny>maxy || miny<dst->r.min.y || maxy>dst->r.max.y) | |
| 1990/03291/sys/src/9/port/devbit.c:466,471 – 1990/0504/sys/src/9/port/devbit.c:560,567 | ||
| 1990/0329 | m -= 11; if(m < l*(maxy-miny)) error(0, Ebadblt); | |
| 1990/0504 | if(off) cursoroff(1); | |
| 1990/0329 | for(y=miny; y<maxy; y++){ q = (uchar*)addr(dst, Pt(dst->r.min.x, y)); q += (dst->r.min.x&((sizeof(ulong))*ws-1))/8; | |
| 1990/03291/sys/src/9/port/devbit.c:473,478 – 1990/0504/sys/src/9/port/devbit.c:569,576 | ||
| 1990/0329 | *q++ = U2K(*p++); m -= l; } | |
| 1990/0504 | if(off) cursoron(1); | |
| 1990/0329 | break; | |
| 1990/0327 | } | |
| 1990/03291/sys/src/9/port/devbit.c:524,533 – 1990/0504/sys/src/9/port/devbit.c:622,701 | ||
| 1990/0329 | } void | |
| 1990/0504 | cursortobitmap(void) | |
| 1990/0329 | { | |
| 1990/0504 | int i; lock(&cursor); for(i=0; i<16; i++){ setbits[i] = cursor.set[i]<<16; clrbits[i] = cursor.clr[i]<<16; } unlock(&cursor); } void cursoron(int dolock) { if(dolock) lock(&cursor); if(cursor.visible++ == 0){ cursor.r.min = mouse.xy; cursor.r.max = add(mouse.xy, Pt(16, 16)); cursor.r = raddp(cursor.r, cursor.offset); bitblt(&cursorback, Pt(0, 0), &screen, cursor.r, S); bitblt(&screen, add(mouse.xy, cursor.offset), &clr, Rect(0, 0, 16, 16), D&~S); bitblt(&screen, add(mouse.xy, cursor.offset), &set, Rect(0, 0, 16, 16), S|D); } if(dolock) unlock(&cursor); } void cursoroff(int dolock) { if(dolock) lock(&cursor); if(--cursor.visible == 0) bitblt(&screen, cursor.r.min, &cursorback, Rect(0, 0, 16, 16), S); if(dolock) unlock(&cursor); } void mousebuttons(int b) /* called splhi */ { mouse.buttons = b; mouse.changed = 1; wakeup(&mouse.r); } void mouseclock(void) /* called splhi */ { int x, y; if(mouse.track && canlock(&cursor)){ x = mouse.xy.x + mouse.dx; if(x < screen.r.min.x) x = screen.r.min.x; if(x >= screen.r.max.x) x = screen.r.max.x; y = mouse.xy.y + mouse.dy; if(y < screen.r.min.y) y = screen.r.min.y; if(y >= screen.r.max.y) y = screen.r.max.y; cursoroff(0); mouse.xy = Pt(x, y); cursoron(0); mouse.dx = 0; mouse.dy = 0; mouse.track = 0; mouse.changed = 1; unlock(&cursor); wakeup(&mouse.r); | |
| 1990/0329 | } | |
| 1990/0324 | } | |
| 1990/0504/sys/src/9/port/devbit.c:50,55 – 1990/0505/sys/src/9/port/devbit.c:50,56 (short | long) | ||
| 1990/0504 | int track; /* update cursor on screen */ Mouse; int changed; /* mouse structure changed since last read */ | |
| 1990/0505 | int newbuttons; /* interrupt time access only */ | |
| 1990/0504 | Rendez r; }mouse; | |
| 1990/0504/sys/src/9/port/devbit.c:106,111 – 1990/0505/sys/src/9/port/devbit.c:107,113 | ||
| 1990/0504 | void cursortobitmap(void); void cursoron(int); void cursoroff(int); | |
| 1990/0505 | int mousechanged(void*); | |
| 1990/0504 | ||
| 1990/0324 | enum{ Qdir, | |
| 1990/0504/sys/src/9/port/devbit.c:256,303 – 1990/0505/sys/src/9/port/devbit.c:258,335 | ||
| 1990/0324 | if(c->qid & CHDIR) return devdirread(c, va, n, bitdir, NBIT, devgen); | |
| 1990/0327 |
| |
| 1990/0329 |
| |
| 1990/0505 | switch(c->qid){ case Qmouse: | |
| 1990/0329 | /* | |
| 1990/03291 |
| |
| 1990/0329 |
| |
| 1990/0505 | * mouse: * 'm' 1 * buttons 1 * point 8 | |
| 1990/0329 | */ | |
| 1990/03291 |
| |
| 1990/0505 | if(n < 10) | |
| 1990/0329 | error(0, Ebadblt); | |
| 1990/03291 |
| |
| 1990/0329 |
| |
| 1990/03291 |
| |
| 1990/0329 |
| |
| 1990/0327 |
| |
| 1990/0505 | Again: while(mouse.changed == 0) sleep(&mouse.r, mousechanged, 0); lock(&cursor); if(mouse.changed == 0){ unlock(&cursor); goto Again; } p = va; p[0] = 'm'; p[1] = mouse.buttons; PLONG(p+2, mouse.xy.x); PLONG(p+6, mouse.xy.y); mouse.changed = 0; unlock(&cursor); n = 10; break; case Qbitblt: p = va; | |
| 1990/0329 | /* | |
| 1990/0505 | * Fuss about and figure out what to say. | |
| 1990/0329 | */ | |
| 1990/0327 |
| |
| 1990/0329 |
| |
| 1990/0327 |
| |
| 1990/0505 | if(bit.init){ /* * init: * 'I' 1 * ldepth 1 * rectangle 16 */ if(n < 18) error(0, Ebadblt); p[0] = 'I'; p[1] = screen.ldepth; PLONG(p+2, screen.r.min.x); PLONG(p+6, screen.r.min.y); PLONG(p+10, screen.r.max.x); PLONG(p+14, screen.r.max.y); bit.init = 0; n = 18; break; } if(bit.lastid > 0){ /* * allocate: * 'A' 1 * bitmap id 2 */ if(n < 3) error(0, Ebadblt); p[0] = 'A'; PSHORT(p+1, bit.lastid); bit.lastid = -1; n = 3; break; } error(0, Ebadblt); default: error(0, Egreg); | |
| 1990/0327 | } | |
| 1990/0324 | } | |
| 1990/0504/sys/src/9/port/devbit.c:665,679 – 1990/0505/sys/src/9/port/devbit.c:697,716 | ||
| 1990/0504 | } void | |
| 1990/0505 | mousebuttons(int b) /* called spl5 */ | |
| 1990/0504 | { | |
| 1990/0505 | /* * It is possible if you click very fast and get bad luck * you could miss a button click (down up). Doesn't seem * likely or important enough to worry about. */ mouse.newbuttons = b; mouse.track = 1; /* aggressive but o.k. */ mouseclock(); | |
| 1990/0504 | } void | |
| 1990/0505 | mouseclock(void) /* called spl6 */ | |
| 1990/0504 | { int x, y; | |
| 1990/0504/sys/src/9/port/devbit.c:694,701 – 1990/0505/sys/src/9/port/devbit.c:731,745 | ||
| 1990/0504 | mouse.dx = 0; mouse.dy = 0; mouse.track = 0; | |
| 1990/0505 | mouse.buttons = mouse.newbuttons; | |
| 1990/0504 | mouse.changed = 1; unlock(&cursor); wakeup(&mouse.r); | |
| 1990/0329 | } | |
| 1990/0505 | } int mousechanged(void *m) { return mouse.changed; | |
| 1990/0324 | } | |
| 1990/0505/sys/src/9/port/devbit.c:26,32 – 1990/0515/sys/src/9/port/devbit.c:26,31 (short | long) | ||
| 1990/0324 | struct{ Ref; | |
| 1990/0327 | Bitmap *map; /* arena */ Bitmap *free; /* free list */ ulong *words; /* storage */ | |
| 1990/0505/sys/src/9/port/devbit.c:148,154 – 1990/0515/sys/src/9/port/devbit.c:147,152 | ||
| 1990/0324 | bitinit(void) { lock(&bit); | |
| 1990/0504 | cursoron(1); | |
| 1990/0324 | } | |
| 1990/0505/sys/src/9/port/devbit.c:185,193 – 1990/0515/sys/src/9/port/devbit.c:183,191 | ||
| 1990/0324 | if(c->qid == CHDIR){ if(omode != OREAD) error(0, Eperm); | |
| 1990/0515 | }else if(c->qid == Qbitblt){ | |
| 1990/0324 | lock(&bit); | |
| 1990/0327 |
| |
| 1990/0515 | if(bit.ref){ | |
| 1990/0324 | unlock(&bit); error(0, Einuse); } | |
| 1990/0505/sys/src/9/port/devbit.c:232,238 – 1990/0515/sys/src/9/port/devbit.c:230,235 | ||
| 1990/0327 | for(i=1,bp=&bit.map[1]; i<conf.nbitmap; i++,bp++) if(bp->ldepth >= 0) bitfree(bp); | |
| 1990/0324 |
| |
| 1990/0327 | } | |
| 1990/0324 | unlock(&bit); } | |
| 1990/0515/sys/src/9/port/devbit.c:191,199 – 1990/05151/sys/src/9/port/devbit.c:191,200 (short | long) | ||
| 1990/0324 | } | |
| 1990/0327 | bit.lastid = -1; | |
| 1990/0329 | bit.init = 1; | |
| 1990/05151 | bit.ref = 1; | |
| 1990/0324 | unlock(&bit); | |
| 1990/05151 | }else | |
| 1990/0324 | incref(&bit); | |
| 1990/0515/sys/src/9/port/devbit.c:224,230 – 1990/05151/sys/src/9/port/devbit.c:225,231 | ||
| 1990/0327 | int i; Bitmap *bp; | |
| 1990/0324 |
| |
| 1990/05151 | if(c->qid!=CHDIR && (c->flag&COPEN)){ | |
| 1990/0329 | lock(&bit); | |
| 1990/0327 | if(--bit.ref == 0){ for(i=1,bp=&bit.map[1]; i<conf.nbitmap; i++,bp++) | |
| 1990/05151/sys/src/9/port/devbit.c:9,15 – 1990/05313/sys/src/9/port/devbit.c:9,15 (short | long) | ||
| 1990/0324 | #include "gnot.h" | |
| 1990/0329 |
| |
| 1990/05313 | extern Font *defont; | |
| 1990/0329 | ||
| 1990/0327 | /* | |
| 1990/0329 | * Device (#b/bitblt) is exclusive use on open, so no locks are necessary | |
| 1990/05151/sys/src/9/port/devbit.c:24,30 – 1990/05313/sys/src/9/port/devbit.c:24,31 | ||
| 1990/0327 | * followed by N blocks. The bitmap pointer is zero if block is free. */ | |
| 1990/0324 |
| |
| 1990/05313 | struct { | |
| 1990/0324 | Ref; | |
| 1990/0327 | Bitmap *map; /* arena */ Bitmap *free; /* free list */ | |
| 1990/05151/sys/src/9/port/devbit.c:53,77 – 1990/05313/sys/src/9/port/devbit.c:54,80 | ||
| 1990/0504 | Rendez r; }mouse; | |
| 1990/05313 | Cursor arrow = { {0, 0}, {0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0, 0xE7, 0xF0, 0xE3, 0xF8, 0xC1, 0xFC, 0x00, 0xFE, 0x00, 0x7F, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, }, {0x00, 0x00, 0x7F, 0xC0, 0x7F, 0x00, 0x7C, 0x00, 0x7E, 0x00, 0x7F, 0x00, 0x6F, 0x80, 0x67, 0xC0, 0x43, 0xE0, 0x41, 0xF0, 0x00, 0xF8, 0x00, 0x7C, 0x00, 0x3E, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x00, } }; | |
| 1990/0504 | struct{ Cursor; Lock; int visible; /* on screen */ Rectangle r; /* location */ | |
| 1990/05313 | }cursor; | |
| 1990/0504 | ulong setbits[16]; Bitmap set = | |
| 1990/05151/sys/src/9/port/devbit.c:103,109 – 1990/05313/sys/src/9/port/devbit.c:106,112 | ||
| 1990/0504 | {0, 0, 16, 16} }; | |
| 1990/05313 | void Cursortocursor(Cursor*); | |
| 1990/0504 | void cursoron(int); void cursoroff(int); | |
| 1990/0505 | int mousechanged(void*); | |
| 1990/05151/sys/src/9/port/devbit.c:140,146 – 1990/05313/sys/src/9/port/devbit.c:143,149 | ||
| 1990/0327 | bit.words = ialloc(conf.nbitbyte, 0); bit.nwords = conf.nbitbyte/sizeof(ulong); bit.wfree = bit.words; | |
| 1990/0504 |
| |
| 1990/05313 | Cursortocursor(&arrow); | |
| 1990/0324 | } void | |
| 1990/05151/sys/src/9/port/devbit.c:148,153 – 1990/05313/sys/src/9/port/devbit.c:151,159 | ||
| 1990/0324 | { lock(&bit); unlock(&bit); | |
| 1990/05313 | if(screen.ldepth > 1) panic("bitinit ldepth>1"); cursorback.ldepth = screen.ldepth; | |
| 1990/0504 | cursoron(1); | |
| 1990/0324 | } | |
| 1990/05151/sys/src/9/port/devbit.c:192,197 – 1990/05313/sys/src/9/port/devbit.c:198,204 | ||
| 1990/0327 | bit.lastid = -1; | |
| 1990/0329 | bit.init = 1; | |
| 1990/05151 | bit.ref = 1; | |
| 1990/05313 | Cursortocursor(&arrow); | |
| 1990/0324 | unlock(&bit); | |
| 1990/05151 | }else | |
| 1990/0324 | incref(&bit); | |
| 1990/05151/sys/src/9/port/devbit.c:341,346 – 1990/05313/sys/src/9/port/devbit.c:348,354 | ||
| 1990/0504 | int off; | |
| 1990/0324 | Point pt; Rectangle rect; | |
| 1990/05313 | Cursor curs; | |
| 1990/0327 | Bitmap *bp, *src, *dst; | |
| 1990/0324 | if(c->qid == CHDIR) | |
| 1990/05151/sys/src/9/port/devbit.c:368,374 – 1990/05313/sys/src/9/port/devbit.c:376,382 | ||
| 1990/0327 | if(m < 18) | |
| 1990/0324 | error(0, Ebadblt); | |
| 1990/0327 | v = *(p+1); | |
| 1990/05313 | if(v!=0 && v!=1) /* BUG */ | |
| 1990/0327 | error(0, Ebadblt); ws = 1<<(5-v); /* pixels per word */ if(bit.free == 0) | |
| 1990/05151/sys/src/9/port/devbit.c:385,393 – 1990/05313/sys/src/9/port/devbit.c:393,401 | ||
| 1990/0327 | l = (t+rect.max.x+ws-1)/ws; | |
| 1990/0324 | } | |
| 1990/0327 | nw = l*Dy(rect); | |
| 1990/05313 | if(bit.wfree+2+nw > bit.words+bit.nwords){ | |
| 1990/0327 | bitcompact(); | |
| 1990/05313 | if(bit.wfree+2+nw > bit.words+bit.nwords) | |
| 1990/0327 | error(0, Enobitstore); } bp = bit.free; | |
| 1990/05151/sys/src/9/port/devbit.c:453,458 – 1990/05313/sys/src/9/port/devbit.c:461,496 | ||
| 1990/0327 | p += 31; break; | |
| 1990/05313 | case 'c': /* * cursorswitch * 'c' 1 * nothing more: return to arrow; else * Point 8 * clr 32 * set 32 */ if(m == 1){ cursoroff(1); Cursortocursor(&arrow); cursoron(1); m -= 1; p += 1; break; } if(m < 73) error(0, Ebadblt); curs.offset.x = GLONG(p+1); curs.offset.y = GLONG(p+5); memcpy(curs.clr, p+9, 2*16); memcpy(curs.set, p+41, 2*16); cursoroff(1); Cursortocursor(&curs); cursoron(1); m -= 73; p += 73; break; | |
| 1990/0327 | case 'f': /* * free | |
| 1990/05151/sys/src/9/port/devbit.c:502,508 – 1990/05313/sys/src/9/port/devbit.c:540,546 | ||
| 1990/0329 | error(0, Ebadblt); | |
| 1990/0504 | if(off) cursoroff(1); | |
| 1990/0329 |
| |
| 1990/05313 | string(dst, pt, defont/*BUG*/, (char*)p, v); | |
| 1990/0504 | if(off) cursoron(1); | |
| 1990/0329 | q++; | |
| 1990/05151/sys/src/9/port/devbit.c:622,628 – 1990/05313/sys/src/9/port/devbit.c:660,666 | ||
| 1990/0327 | void bitfree(Bitmap *bp) { | |
| 1990/05313 | bp->base[-1] = 0; | |
| 1990/0327 | bp->ldepth = -1; bp->base = (ulong*)bit.free; bit.free = bp; | |
| 1990/05151/sys/src/9/port/devbit.c:633,639 – 1990/05313/sys/src/9/port/devbit.c:671,676 | ||
| 1990/0327 | { ulong *p1, *p2; | |
| 1990/05151/sys/src/9/port/devbit.c:648,665 – 1990/05313/sys/src/9/port/devbit.c:685,702 | ||
| 1990/0327 | p1 += 2 + p1[0]; } bit.wfree = p1; | |
| 1990/0329 | } void | |
| 1990/0504 |
| |
| 1990/05313 | Cursortocursor(Cursor *c) | |
| 1990/0329 | { | |
| 1990/0504 | int i; lock(&cursor); | |
| 1990/05313 | memcpy(&cursor, c, sizeof(Cursor)); | |
| 1990/0504 | for(i=0; i<16; i++){ | |
| 1990/05313 | setbits[i] = (c->set[2*i]<<24) + (c->set[2*i+1]<<16); clrbits[i] = (c->clr[2*i]<<24) + (c->clr[2*i+1]<<16); | |
| 1990/0504 | } unlock(&cursor); } | |
| 1990/05151/sys/src/9/port/devbit.c:711,717 – 1990/05313/sys/src/9/port/devbit.c:748,753 | ||
| 1990/0505 | mouseclock(void) /* called spl6 */ | |
| 1990/0504 | { int x, y; | |
| 1990/05313/sys/src/9/port/devbit.c:196,202 – 1990/0604/sys/src/9/port/devbit.c:196,202 (short | long) | ||
| 1990/0324 | error(0, Einuse); } | |
| 1990/0327 | bit.lastid = -1; | |
| 1990/0329 |
| |
| 1990/0604 | bit.init = 0; | |
| 1990/05151 | bit.ref = 1; | |
| 1990/05313 | Cursortocursor(&arrow); | |
| 1990/0324 | unlock(&bit); | |
| 1990/05313/sys/src/9/port/devbit.c:506,511 – 1990/0604/sys/src/9/port/devbit.c:506,522 | ||
| 1990/0327 | bitfree(dst); m -= 3; p += 3; | |
| 1990/0604 | break; case 'i': /* * init * * 'i' 1 */ bit.init = 1; m -= 1; p += 1; | |
| 1990/0327 | break; | |
| 1990/0329 | case 's': | |
| 1990/0604/sys/src/9/port/devbit.c:346,352 – 1990/06111/sys/src/9/port/devbit.c:346,352 (short | long) | ||
| 1990/0329 | long m, v, miny, maxy, t, x, y; | |
| 1990/0327 | ulong l, nw, ws; | |
| 1990/0504 | int off; | |
| 1990/0324 |
| |
| 1990/06111 | Point pt, pt1, pt2; | |
| 1990/0324 | Rectangle rect; | |
| 1990/05313 | Cursor curs; | |
| 1990/0327 | Bitmap *bp, *src, *dst; | |
| 1990/0604/sys/src/9/port/devbit.c:519,524 – 1990/06111/sys/src/9/port/devbit.c:519,559 | ||
| 1990/0604 | p += 1; | |
| 1990/0327 | break; | |
| 1990/0329 | ||
| 1990/06111 | case 'l': /* * line segment * * 'l' 1 * id 2 * pt1 8 * pt2 8 * value 1 * code 2 */ if(m < 22) error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; if(v>=conf.nbitmap || dst->ldepth<0) error(0, Ebadbitmap); off = 0; if(v == 0) off = 1; pt1.x = GLONG(p+3); pt1.y = GLONG(p+7); pt2.x = GLONG(p+11); pt2.y = GLONG(p+15); t = p[19]; v = GSHORT(p+20); if(off) cursoroff(1); segment(dst, pt1, pt2, t, v); if(off) cursoron(1); m -= 22; p += 22; break; | |
| 1990/0329 | case 's': /* * string | |
| 1990/0604/sys/src/9/port/devbit.c:526,532 – 1990/06111/sys/src/9/port/devbit.c:561,567 | ||
| 1990/0329 | * id 2 * pt 8 * font id 2 | |
| 1990/06111 | * code 2 | |
| 1990/0329 | * string n (null terminated) */ if(m < 16) | |
| 1990/06111/sys/src/9/port/devbit.c:34,39 – 1990/0613/sys/src/9/port/devbit.c:34,42 (short | long) | ||
| 1990/0327 | ulong *wfree; /* pointer to next free word */ int lastid; /* last allocated bitmap id */ | |
| 1990/0329 | int init; /* freshly opened; init message pending */ | |
| 1990/0613 | int rid; /* read bitmap id */ int rminy; /* read miny */ int rmaxy; /* read maxy */ | |
| 1990/0324 | }bit; | |
| 1990/0327 | #define FREE 0x80000000 | |
| 1990/06111/sys/src/9/port/devbit.c:196,201 – 1990/0613/sys/src/9/port/devbit.c:199,205 | ||
| 1990/0324 | error(0, Einuse); } | |
| 1990/0327 | bit.lastid = -1; | |
| 1990/0613 | bit.rid = -1; | |
| 1990/0604 | bit.init = 0; | |
| 1990/05151 | bit.ref = 1; | |
| 1990/05313 | Cursortocursor(&arrow); | |
| 1990/06111/sys/src/9/port/devbit.c:258,264 – 1990/0613/sys/src/9/port/devbit.c:262,272 | ||
| 1990/0324 | long bitread(Chan *c, void *va, long n) { | |
| 1990/0327 |
| |
| 1990/0613 | uchar *p, *q; long miny, maxy, t, x, y; ulong l, nw, ws; int off; Bitmap *src; | |
| 1990/0327 | ||
| 1990/0324 | if(c->qid & CHDIR) return devdirread(c, va, n, bitdir, NBIT, devgen); | |
| 1990/06111/sys/src/9/port/devbit.c:329,334 – 1990/0613/sys/src/9/port/devbit.c:337,384 | ||
| 1990/0505 | n = 3; break; } | |
| 1990/0613 | if(bit.rid >= 0){ /* * read * data bytewidth*(maxy-miny) */ src = &bit.map[bit.rid]; if(src->ldepth<0) error(0, Ebadbitmap); off = 0; if(bit.rid == 0) off = 1; miny = bit.rminy; maxy = bit.rmaxy; if(miny>maxy || miny<src->r.min.y || maxy>src->r.max.y) error(0, Ebadblt); ws = 1<<(3-src->ldepth); /* pixels per byte */ /* set l to number of bytes of incoming data per scan line */ if(src->r.min.x >= 0) l = (src->r.max.x+ws-1)/ws - src->r.min.x/ws; else{ /* make positive before divide */ t = (-src->r.min.x)+ws-1; t = (t/ws)*ws; l = (t+src->r.max.x+ws-1)/ws; } if(n < l*(maxy-miny)) error(0, Ebadblt); if(off) cursoroff(1); n = 0; p = va; for(y=miny; y<maxy; y++){ q = (uchar*)addr(src, Pt(src->r.min.x, y)); q += (src->r.min.x&((sizeof(ulong))*ws-1))/8; for(x=0; x<l; x++) *p++ = K2U(*q++); n += l; } if(off) cursoron(1); bit.rid = -1; break; } | |
| 1990/0505 | error(0, Ebadblt); default: | |
| 1990/06111/sys/src/9/port/devbit.c:552,557 – 1990/0613/sys/src/9/port/devbit.c:602,632 | ||
| 1990/06111 | cursoron(1); m -= 22; p += 22; | |
| 1990/0613 | break; case 'r': /* * read * 'r' 1 * src id 2 * miny 4 * maxy 4 */ if(m < 11) error(0, Ebadblt); v = GSHORT(p+1); src = &bit.map[v]; if(v>=conf.nbitmap || src->ldepth<0) error(0, Ebadbitmap); miny = GLONG(p+3); maxy = GLONG(p+7); if(miny>maxy || miny<src->r.min.y || maxy>src->r.max.y) error(0, Ebadblt); bit.rid = v; bit.rminy = miny; bit.rmaxy = maxy; p += 11; m -= 11; | |
| 1990/06111 | break; | |
| 1990/0329 | case 's': | |
| 1990/0613/sys/src/9/port/devbit.c:32,38 – 1990/0623/sys/src/9/port/devbit.c:32,40 (short | long) | ||
| 1990/0327 | ulong *words; /* storage */ ulong nwords; /* total in arena */ ulong *wfree; /* pointer to next free word */ | |
| 1990/0623 | Font *font; /* arena; looked up linearly BUG */ | |
| 1990/0327 | int lastid; /* last allocated bitmap id */ | |
| 1990/0623 | int lastfid; /* last allocated font id */ | |
| 1990/0329 | int init; /* freshly opened; init message pending */ | |
| 1990/0613 | int rid; /* read bitmap id */ int rminy; /* read miny */ | |
| 1990/0613/sys/src/9/port/devbit.c:126,131 – 1990/0623/sys/src/9/port/devbit.c:128,134 | ||
| 1990/0324 | }; #define NBIT (sizeof bitdir/sizeof(Dirtab)) | |
| 1990/0623 | #define NINFO 150 | |
| 1990/0324 | void bitreset(void) | |
| 1990/0613/sys/src/9/port/devbit.c:143,151 – 1990/0623/sys/src/9/port/devbit.c:146,159 | ||
| 1990/0327 | bit.map[0] = screen; /* bitmap 0 is screen */ bit.free = bit.map+1; bit.lastid = -1; | |
| 1990/0623 | bit.lastfid = -1; | |
| 1990/0327 | bit.words = ialloc(conf.nbitbyte, 0); bit.nwords = conf.nbitbyte/sizeof(ulong); bit.wfree = bit.words; | |
| 1990/0623 | bit.font = ialloc(conf.nfont * sizeof(Font), 0); bit.font[0] = *defont; for(i=1; i<conf.nfont; i++) bit.font[i].info = ialloc((NINFO+1)*sizeof(Fontchar), 0); | |
| 1990/05313 | Cursortocursor(&arrow); | |
| 1990/0324 | } | |
| 1990/0613/sys/src/9/port/devbit.c:199,204 – 1990/0623/sys/src/9/port/devbit.c:207,213 | ||
| 1990/0324 | error(0, Einuse); } | |
| 1990/0327 | bit.lastid = -1; | |
| 1990/0623 | bit.lastfid = -1; | |
| 1990/0613 | bit.rid = -1; | |
| 1990/0604 | bit.init = 0; | |
| 1990/05151 | bit.ref = 1; | |
| 1990/0613/sys/src/9/port/devbit.c:235,240 – 1990/0623/sys/src/9/port/devbit.c:244,250 | ||
| 1990/0324 | { | |
| 1990/0327 | int i; Bitmap *bp; | |
| 1990/0623 | Font *fp; | |
| 1990/0327 | ||
| 1990/05151 | if(c->qid!=CHDIR && (c->flag&COPEN)){ | |
| 1990/0329 | lock(&bit); | |
| 1990/0613/sys/src/9/port/devbit.c:242,247 – 1990/0623/sys/src/9/port/devbit.c:252,259 | ||
| 1990/0327 | for(i=1,bp=&bit.map[1]; i<conf.nbitmap; i++,bp++) if(bp->ldepth >= 0) bitfree(bp); | |
| 1990/0623 | for(i=1,fp=&bit.font[1]; i<conf.nfont; i++,fp++) fp->bits = 0; | |
| 1990/0327 | } | |
| 1990/0324 | unlock(&bit); } | |
| 1990/0613/sys/src/9/port/devbit.c:337,342 – 1990/0623/sys/src/9/port/devbit.c:349,368 | ||
| 1990/0505 | n = 3; break; } | |
| 1990/0623 | if(bit.lastfid > 0){ /* * allocate font: * 'K' 1 * font id 2 */ if(n < 3) error(0, Ebadblt); p[0] = 'K'; PSHORT(p+1, bit.lastfid); bit.lastfid = -1; n = 3; break; } | |
| 1990/0613 | if(bit.rid >= 0){ /* * read | |
| 1990/0613/sys/src/9/port/devbit.c:395,405 – 1990/0623/sys/src/9/port/devbit.c:421,433 | ||
| 1990/0329 | uchar *p, *q; long m, v, miny, maxy, t, x, y; | |
| 1990/0327 | ulong l, nw, ws; | |
| 1990/0504 |
| |
| 1990/0623 | int off, i; | |
| 1990/06111 | Point pt, pt1, pt2; | |
| 1990/0324 | Rectangle rect; | |
| 1990/05313 | Cursor curs; | |
| 1990/0623 | Fontchar *fcp; | |
| 1990/0327 | Bitmap *bp, *src, *dst; | |
| 1990/0623 | Font *f; | |
| 1990/0324 | if(c->qid == CHDIR) error(0, Eisdir); | |
| 1990/0613/sys/src/9/port/devbit.c:551,557 – 1990/0623/sys/src/9/port/devbit.c:579,585 | ||
| 1990/0327 | error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; | |
| 1990/0329 |
| |
| 1990/0623 | if(v<0 || v>=conf.nbitmap || dst->ldepth<0) | |
| 1990/0329 | error(0, Ebadbitmap); | |
| 1990/0327 | bitfree(dst); m -= 3; | |
| 1990/0613/sys/src/9/port/devbit.c:558,563 – 1990/0623/sys/src/9/port/devbit.c:586,608 | ||
| 1990/0327 | p += 3; | |
| 1990/0604 | break; | |
| 1990/0623 | case 'g': /* * free font (free bitmap separately) * 'g' 1 * id 2 */ if(m < 3) error(0, Ebadblt); v = GSHORT(p+1); f = &bit.font[v]; if(v<0 || v>=conf.nfont || f->bits==0) error(0, Ebadbitmap); f->bits = 0; m -= 3; p += 3; break; | |
| 1990/0604 | case 'i': /* * init | |
| 1990/0613/sys/src/9/port/devbit.c:569,574 – 1990/0623/sys/src/9/port/devbit.c:614,665 | ||
| 1990/0604 | p += 1; | |
| 1990/0327 | break; | |
| 1990/0329 | ||
| 1990/0623 | case 'k': /* * allocate font * 'k' 1 * n 2 * height 1 * ascent 1 * bitmap id 2 * fontchars 6*n * next read returns allocated font id */ if(m < 7) error(0, Ebadblt); v = GSHORT(p+1); if(v<0 || v>NINFO || m<7+6*(v+1)) /* BUG */ error(0, Ebadblt); for(i=1; i<conf.nfont; i++) if(bit.font[i].bits == 0) goto fontfound; error(0, Enofont); fontfound: f = &bit.font[i]; f->n = v; f->height = p[3]; f->ascent = p[4]; v = GSHORT(p+5); dst = &bit.map[v]; if(v<0 || v>=conf.nbitmap || dst->ldepth<0) error(0, Ebadbitmap); m -= 7; p += 7; fcp = f->info; for(i=0; i<=f->n; i++,fcp++){ fcp->x = GSHORT(p); fcp->top = p[2]; fcp->bottom = p[3]; fcp->left = p[4]; fcp->width = p[5]; fcp->top = p[2]; p += 6; m -= 6; } bit.lastfid = f - bit.font; f->bits = dst; break; | |
| 1990/06111 | case 'l': /* * line segment | |
| 1990/0613/sys/src/9/port/devbit.c:584,590 – 1990/0623/sys/src/9/port/devbit.c:675,681 | ||
| 1990/06111 | error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; | |
| 1990/0623 | if(v<0 || v>=conf.nbitmap || dst->ldepth<0) | |
| 1990/06111 | error(0, Ebadbitmap); off = 0; if(v == 0) | |
| 1990/0613/sys/src/9/port/devbit.c:616,622 – 1990/0623/sys/src/9/port/devbit.c:707,713 | ||
| 1990/0613 | error(0, Ebadblt); v = GSHORT(p+1); src = &bit.map[v]; | |
| 1990/0623 | if(v<0 || v>=conf.nbitmap || src->ldepth<0) | |
| 1990/0613 | error(0, Ebadbitmap); miny = GLONG(p+3); maxy = GLONG(p+7); | |
| 1990/0613/sys/src/9/port/devbit.c:643,649 – 1990/0623/sys/src/9/port/devbit.c:734,740 | ||
| 1990/0329 | error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; | |
| 1990/0623 | if(v<0 || v>=conf.nbitmap || dst->ldepth<0) | |
| 1990/0329 | error(0, Ebadbitmap); | |
| 1990/0504 | off = 0; if(v == 0) | |
| 1990/0613/sys/src/9/port/devbit.c:651,657 – 1990/0623/sys/src/9/port/devbit.c:742,749 | ||
| 1990/0329 | pt.x = GLONG(p+3); pt.y = GLONG(p+7); v = GSHORT(p+11); | |
| 1990/0623 | f = &bit.font[v]; if(v<0 || v>=conf.nfont || f->bits==0 || f->bits->ldepth<0) | |
| 1990/0329 | error(0, Ebadblt); v = GSHORT(p+13); p += 15; | |
| 1990/0613/sys/src/9/port/devbit.c:661,667 – 1990/0623/sys/src/9/port/devbit.c:753,759 | ||
| 1990/0329 | error(0, Ebadblt); | |
| 1990/0504 | if(off) cursoroff(1); | |
| 1990/05313 |
| |
| 1990/0623 | string(dst, pt, f, (char*)p, v); | |
| 1990/0504 | if(off) cursoron(1); | |
| 1990/0329 | q++; | |
| 1990/0613/sys/src/9/port/devbit.c:682,688 – 1990/0623/sys/src/9/port/devbit.c:774,780 | ||
| 1990/0329 | error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; | |
| 1990/0623 | if(v<0 || v>=conf.nbitmap || dst->ldepth<0) | |
| 1990/0329 | error(0, Ebadbitmap); | |
| 1990/0504 | off = 0; if(v == 0) | |
| 1990/0613/sys/src/9/port/devbit.c:693,699 – 1990/0623/sys/src/9/port/devbit.c:785,791 | ||
| 1990/0329 | rect.max.y = GLONG(p+15); v = GSHORT(p+19); src = &bit.map[v]; | |
| 1990/0623 | if(v<0 || v>=conf.nbitmap || src->ldepth<0) | |
| 1990/0329 | error(0, Ebadbitmap); if(src->r.min.x!=0 || src->r.min.y!=0 || src->r.max.x!=16 || src->r.max.y!=16) error(0, Ebadblt); | |
| 1990/0613/sys/src/9/port/devbit.c:727,733 – 1990/0623/sys/src/9/port/devbit.c:819,825 | ||
| 1990/0329 | error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; | |
| 1990/0623 | if(v<0 || v>=conf.nbitmap || dst->ldepth<0) | |
| 1990/0329 | error(0, Ebadbitmap); | |
| 1990/0504 | off = 0; if(v == 0) | |
| 1990/0623/sys/src/9/port/devbit.c:277,283 – 1990/06231/sys/src/9/port/devbit.c:277,284 (short | long) | ||
| 1990/0613 | uchar *p, *q; long miny, maxy, t, x, y; ulong l, nw, ws; | |
| 1990/06231 | int off, j; Fontchar *i; | |
| 1990/0613 | Bitmap *src; | |
| 1990/0327 | ||
| 1990/0324 | if(c->qid & CHDIR) | |
| 1990/0623/sys/src/9/port/devbit.c:322,327 – 1990/06231/sys/src/9/port/devbit.c:323,331 | ||
| 1990/0505 | * 'I' 1 * ldepth 1 * rectangle 16 | |
| 1990/06231 | * if count great enough, also * font info 3*12 * fontchars 6*(defont->n+1) | |
| 1990/0505 | */ if(n < 18) error(0, Ebadblt); | |
| 1990/0623/sys/src/9/port/devbit.c:331,338 – 1990/06231/sys/src/9/port/devbit.c:335,356 | ||
| 1990/0505 | PLONG(p+6, screen.r.min.y); PLONG(p+10, screen.r.max.x); PLONG(p+14, screen.r.max.y); | |
| 1990/06231 | if(n >= 18+3*12+6*(defont->n+1)){ p += 18; sprint((char*)p, "%11d %11d %11d ", defont->n, defont->height, defont->ascent); p += 3*12; for(i=defont->info,j=0; j<=defont->n; j++,i++,p+=6){ PSHORT(p, i->x); p[2] = i->top; p[3] = i->bottom; p[4] = i->left; p[5] = i->width; } n = 18+3*12+6*(defont->n+1); }else n = 18; | |
| 1990/0505 | bit.init = 0; | |
| 1990/06231/sys/src/9/port/devbit.c:128,134 – 1990/0629/sys/src/9/port/devbit.c:128,134 (short | long) | ||
| 1990/0324 | }; #define NBIT (sizeof bitdir/sizeof(Dirtab)) | |
| 1990/0623 |
| |
| 1990/0629 | #define NINFO 257 | |
| 1990/0324 | void bitreset(void) | |
| 1990/0629/sys/src/9/port/devbit.c:640,646 – 1990/0707/sys/src/9/port/devbit.c:640,646 (short | long) | ||
| 1990/0623 | * height 1 * ascent 1 * bitmap id 2 | |
| 1990/0707 | * fontchars 6*(n+1) | |
| 1990/0623 | * next read returns allocated font id */ if(m < 7) | |
| 1990/0707/sys/src/9/port/devbit.c:120,130 – 1990/0709/sys/src/9/port/devbit.c:120,132 (short | long) | ||
| 1990/0324 | Qdir, Qbitblt, | |
| 1990/0329 | Qmouse, | |
| 1990/0709 | Qscreen, | |
| 1990/0324 | }; Dirtab bitdir[]={ "bitblt", Qbitblt, 0, 0600, | |
| 1990/0329 | "mouse", Qmouse, 0, 0600, | |
| 1990/0709 | "screen", Qscreen, 0, 0400, | |
| 1990/0324 | }; #define NBIT (sizeof bitdir/sizeof(Dirtab)) | |
| 1990/0707/sys/src/9/port/devbit.c:424,429 – 1990/0709/sys/src/9/port/devbit.c:426,461 | ||
| 1990/0613 | break; } | |
| 1990/0505 | error(0, Ebadblt); | |
| 1990/0709 | case Qscreen: if(c->offset==0){ if(n < 5*12) error(0, Eio); sprint(va, "%11d %11d %11d %11d %11d ", screen.ldepth, screen.r.min.x, screen.r.min.y, screen.r.max.x, screen.r.max.y); n = 5*12; break; } ws = 1<<(3-screen.ldepth); /* pixels per byte */ l = (screen.r.max.x+ws-1)/ws - screen.r.min.x/ws; t = c->offset-5*12; miny = t/l; maxy = (t+n)/l; if(miny >= screen.r.max.y) return 0; if(maxy >= screen.r.max.y) maxy = screen.r.max.y; n = 0; p = va; for(y=miny; y<maxy; y++){ q = (uchar*)addr(&screen, Pt(0, y)); for(x=0; x<l; x++) *p++ = K2U(*q++); n += l; } break; | |
| 1990/0505 | default: error(0, Egreg); | |
| 1990/0709/sys/src/9/port/devbit.c:471,477 – 1990/0721/sys/src/9/port/devbit.c:471,477 (short | long) | ||
| 1990/0329 | uchar *p, *q; long m, v, miny, maxy, t, x, y; | |
| 1990/0327 | ulong l, nw, ws; | |
| 1990/0623 |
| |
| 1990/0721 | int off, isoff, i; | |
| 1990/06111 | Point pt, pt1, pt2; | |
| 1990/0324 | Rectangle rect; | |
| 1990/05313 | Cursor curs; | |
| 1990/0709/sys/src/9/port/devbit.c:485,490 – 1990/0721/sys/src/9/port/devbit.c:485,496 | ||
| 1990/0327 | if(c->qid != Qbitblt) error(0, Egreg); | |
| 1990/0721 | isoff = 0; if(waserror()){ if(isoff) cursoron(1); nexterror(); } | |
| 1990/0324 | p = va; m = n; | |
| 1990/0327 | while(m > 0) | |
| 1990/0709/sys/src/9/port/devbit.c:580,590 – 1990/0721/sys/src/9/port/devbit.c:586,596 | ||
| 1990/0327 | rect.max.x = GLONG(p+21); rect.max.y = GLONG(p+25); v = GSHORT(p+29); | |
| 1990/0504 |
| |
| 1990/0721 | if(off && !isoff){ | |
| 1990/0504 | cursoroff(1); | |
| 1990/0721 | isoff = 1; } | |
| 1990/0327 | bitblt(dst, pt, src, rect, v); | |
| 1990/0504 |
| |
| 1990/0327 | m -= 31; p += 31; break; | |
| 1990/0709/sys/src/9/port/devbit.c:599,607 – 1990/0721/sys/src/9/port/devbit.c:605,615 | ||
| 1990/05313 | * set 32 */ if(m == 1){ | |
| 1990/0721 | if(!isoff){ cursoroff(1); isoff = 1; } | |
| 1990/05313 | Cursortocursor(&arrow); | |
| 1990/0709/sys/src/9/port/devbit.c:612,620 – 1990/0721/sys/src/9/port/devbit.c:620,630 | ||
| 1990/05313 | curs.offset.y = GLONG(p+5); memcpy(curs.clr, p+9, 2*16); memcpy(curs.set, p+41, 2*16); | |
| 1990/0721 | if(!isoff){ cursoroff(1); isoff = 1; } | |
| 1990/05313 | Cursortocursor(&curs); | |
| 1990/0709/sys/src/9/port/devbit.c:736,746 – 1990/0721/sys/src/9/port/devbit.c:746,756 | ||
| 1990/06111 | pt2.y = GLONG(p+15); t = p[19]; v = GSHORT(p+20); | |
| 1990/0721 | if(off && !isoff){ | |
| 1990/06111 | cursoroff(1); | |
| 1990/0721 | isoff = 1; } | |
| 1990/06111 | segment(dst, pt1, pt2, t, v); | |
| 1990/0613 | break; | |
| 1990/0709/sys/src/9/port/devbit.c:801,811 – 1990/0721/sys/src/9/port/devbit.c:811,821 | ||
| 1990/0329 | q = memchr(p, 0, m); if(q == 0) error(0, Ebadblt); | |
| 1990/0504 |
| |
| 1990/0721 | if(off && !isoff){ | |
| 1990/0504 | cursoroff(1); | |
| 1990/0721 | isoff = 1; } | |
| 1990/0623 | string(dst, pt, f, (char*)p, v); | |
| 1990/0504 |
| |
| 1990/0329 | q++; m -= q-p; p = q; | |
| 1990/0709/sys/src/9/port/devbit.c:846,856 – 1990/0721/sys/src/9/port/devbit.c:856,866 | ||
| 1990/0329 | for(i=0; i<16; i++) t.bits[i] = src->base[i]>>16; | |
| 1990/0504 |
| |
| 1990/0721 | if(off && !isoff){ | |
| 1990/0504 | cursoroff(1); | |
| 1990/0721 | isoff = 1; } | |
| 1990/0329 | texture(dst, rect, &t, v); | |
| 1990/0504 |
| |
| 1990/0329 | } m -= 23; p += 23; | |
| 1990/0709/sys/src/9/port/devbit.c:891,898 – 1990/0721/sys/src/9/port/devbit.c:901,910 | ||
| 1990/0329 | m -= 11; if(m < l*(maxy-miny)) error(0, Ebadblt); | |
| 1990/0504 |
| |
| 1990/0721 | if(off && !isoff){ | |
| 1990/0504 | cursoroff(1); | |
| 1990/0721 | isoff = 1; } | |
| 1990/0329 | for(y=miny; y<maxy; y++){ q = (uchar*)addr(dst, Pt(dst->r.min.x, y)); q += (dst->r.min.x&((sizeof(ulong))*ws-1))/8; | |
| 1990/0709/sys/src/9/port/devbit.c:900,910 – 1990/0721/sys/src/9/port/devbit.c:912,922 | ||
| 1990/0329 | *q++ = U2K(*p++); m -= l; } | |
| 1990/0504 |
| |
| 1990/0329 | break; | |
| 1990/0327 | } | |
| 1990/0721 | if(isoff) cursoron(1); | |
| 1990/0324 | return n; } | |
| 1990/0721/sys/src/9/port/devbit.c:755,760 – 1990/0722/sys/src/9/port/devbit.c:755,792 (short | long) | ||
| 1990/06111 | p += 22; | |
| 1990/0613 | break; | |
| 1990/0722 | case 'p': /* * point * * 'p' 1 * id 2 * pt 8 * value 1 * code 2 */ if(m < 14) error(0, Ebadblt); v = GSHORT(p+1); dst = &bit.map[v]; if(v<0 || v>=conf.nbitmap || dst->ldepth<0) error(0, Ebadbitmap); off = 0; if(v == 0) off = 1; pt1.x = GLONG(p+3); pt1.y = GLONG(p+7); t = p[11]; v = GSHORT(p+12); if(off && !isoff){ cursoroff(1); isoff = 1; } point(dst, pt1, t, v); m -= 14; p += 14; break; | |
| 1990/0613 | case 'r': /* * read | |
| 1990/0722/sys/src/9/port/devbit.c:61,67 – 1990/0725/sys/src/9/port/devbit.c:61,67 (short | long) | ||
| 1990/0504 | ||
| 1990/05313 | Cursor arrow = { | |
| 1990/0725 | {1, 1}, | |
| 1990/05313 | {0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0, 0xE7, 0xF0, 0xE3, 0xF8, 0xC1, 0xFC, 0x00, 0xFE, | |
| 1990/0722/sys/src/9/port/devbit.c:657,663 – 1990/0725/sys/src/9/port/devbit.c:657,663 | ||
| 1990/0623 | v = GSHORT(p+1); f = &bit.font[v]; if(v<0 || v>=conf.nfont || f->bits==0) | |
| 1990/0725 | error(0, Ebadfont); | |
| 1990/0623 | f->bits = 0; m -= 3; p += 3; | |
| 1990/0725/sys/src/9/port/devbit.c:61,67 – 1990/0726/sys/src/9/port/devbit.c:61,67 (short | long) | ||
| 1990/0504 | ||
| 1990/05313 | Cursor arrow = { | |
| 1990/0725 |
| |
| 1990/0726 | {0, 0}, | |
| 1990/05313 | {0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0, 0xE7, 0xF0, 0xE3, 0xF8, 0xC1, 0xFC, 0x00, 0xFE, | |
| 1990/0725/sys/src/9/port/devbit.c:657,663 – 1990/0726/sys/src/9/port/devbit.c:657,663 | ||
| 1990/0623 | v = GSHORT(p+1); f = &bit.font[v]; if(v<0 || v>=conf.nfont || f->bits==0) | |
| 1990/0725 |
| |
| 1990/0726 | error(0, Ebadbitmap); | |
| 1990/0623 | f->bits = 0; m -= 3; p += 3; | |
| 1990/0726/sys/src/9/port/devbit.c:61,67 – 1990/0728/sys/src/9/port/devbit.c:61,67 (short | long) | ||
| 1990/0504 | ||
| 1990/05313 | Cursor arrow = { | |
| 1990/0726 |
| |
| 1990/0728 | {1, 1}, | |
| 1990/05313 | {0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0, 0xE7, 0xF0, 0xE3, 0xF8, 0xC1, 0xFC, 0x00, 0xFE, | |
| 1990/0726/sys/src/9/port/devbit.c:657,663 – 1990/0728/sys/src/9/port/devbit.c:657,663 | ||
| 1990/0623 | v = GSHORT(p+1); f = &bit.font[v]; if(v<0 || v>=conf.nfont || f->bits==0) | |
| 1990/0726 |
| |
| 1990/0728 | error(0, Ebadfont); | |
| 1990/0623 | f->bits = 0; m -= 3; p += 3; | |
| 1990/0728/sys/src/9/port/devbit.c:61,67 – 1990/0730/sys/src/9/port/devbit.c:61,67 (short | long) | ||
| 1990/0504 | ||
| 1990/05313 | Cursor arrow = { | |
| 1990/0728 |
| |
| 1990/0730 | {-1, -1}, | |
| 1990/05313 | {0xFF, 0xE0, 0xFF, 0xE0, 0xFF, 0xC0, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x80, 0xFF, 0xC0, 0xFF, 0xE0, 0xE7, 0xF0, 0xE3, 0xF8, 0xC1, 0xFC, 0x00, 0xFE, | |
| 1990/0730/sys/src/9/port/devbit.c:973,983 – 1990/08101/sys/src/9/port/devbit.c:973,996 (short | long) | ||
| 1990/0327 | bit.free = bp; } | |
| 1990/08101 | QLock bitlock; Bitmap * id2bit(int k) { Bitmap *bp; bp = &bit.map[k]; if(k<0 || k>=conf.nbitmap || bp->ldepth < 0) error(0, Ebadbitmap); return bp; } | |
| 1990/0327 | void bitcompact(void) { ulong *p1, *p2; | |
| 1990/08101 | qlock(&bitlock); | |
| 1990/0327 | p1 = p2 = bit.words; while(p2 < bit.wfree){ if(p2[1] == 0){ | |
| 1990/0730/sys/src/9/port/devbit.c:992,997 – 1990/08101/sys/src/9/port/devbit.c:1005,1011 | ||
| 1990/0327 | p1 += 2 + p1[0]; } bit.wfree = p1; | |
| 1990/08101 | qunlock(&bitlock); | |
| 1990/0329 | } void | |
| 1990/08101/sys/src/9/port/devbit.c:945,950 – 1990/0826/sys/src/9/port/devbit.c:945,968 (short | long) | ||
| 1990/0329 | m -= l; } break; | |
| 1990/0826 | case 'x': /* * cursorset * * 'x' 1 * pt 8 */ if(m < 9) error(0, Ebadblt); pt1.x = GLONG(p+1); pt1.y = GLONG(p+5); mouse.xy = pt1; mouse.track = 1; mouseclock(); m -= 9; p += 9; break; | |
| 1990/0327 | } | |
| 1990/0721 | if(isoff) | |
| 1990/0826/sys/src/9/port/devbit.c:7,15 – 1990/0902/sys/src/9/port/devbit.c:7,15 (short | long) | ||
| 1990/0324 | #include "devtab.h" | |
| 1990/0902 | #include <gnot.h> | |
| 1990/0324 | ||
| 1990/05313 |
| |
| 1990/0902 | extern GFont *defont; | |
| 1990/0329 | ||
| 1990/0327 | /* | |
| 1990/0329 | * Device (#b/bitblt) is exclusive use on open, so no locks are necessary | |
| 1990/0826/sys/src/9/port/devbit.c:17,23 – 1990/0902/sys/src/9/port/devbit.c:17,23 | ||
| 1990/0329 | */ /* | |
| 1990/0327 |
| |
| 1990/0902 | * Some fields in GBitmaps are overloaded: | |
| 1990/0327 | * ldepth = -1 means free. * base is next pointer when free. * Arena is a word containing N, followed by a pointer to its bitmap, | |
| 1990/0826/sys/src/9/port/devbit.c:27,38 – 1990/0902/sys/src/9/port/devbit.c:27,38 | ||
| 1990/05313 | struct { | |
| 1990/0324 | Ref; | |
| 1990/0327 |
| |
| 1990/0902 | GBitmap *map; /* arena */ GBitmap *free; /* free list */ | |
| 1990/0327 | ulong *words; /* storage */ ulong nwords; /* total in arena */ ulong *wfree; /* pointer to next free word */ | |
| 1990/0623 |
| |
| 1990/0902 | GFont *font; /* arena; looked up linearly BUG */ | |
| 1990/0327 | int lastid; /* last allocated bitmap id */ | |
| 1990/0623 | int lastfid; /* last allocated font id */ | |
| 1990/0329 | int init; /* freshly opened; init message pending */ | |
| 1990/0826/sys/src/9/port/devbit.c:43,50 – 1990/0902/sys/src/9/port/devbit.c:43,50 | ||
| 1990/0324 | ||
| 1990/0327 | #define FREE 0x80000000 void bitcompact(void); | |
| 1990/0902 | void bitfree(GBitmap*); extern GBitmap screen; | |
| 1990/0327 | ||
| 1990/0504 | struct{ /* | |
| 1990/0826/sys/src/9/port/devbit.c:82,88 – 1990/0902/sys/src/9/port/devbit.c:82,88 | ||
| 1990/05313 | }cursor; | |
| 1990/0504 | ulong setbits[16]; | |
| 1990/0902 | GBitmap set = | |
| 1990/0504 | { setbits, 0, | |
| 1990/0826/sys/src/9/port/devbit.c:92,98 – 1990/0902/sys/src/9/port/devbit.c:92,98 | ||
| 1990/0504 | }; ulong clrbits[16]; | |
| 1990/0902 | GBitmap clr = | |
| 1990/0504 | { clrbits, 0, | |
| 1990/0826/sys/src/9/port/devbit.c:102,108 – 1990/0902/sys/src/9/port/devbit.c:102,108 | ||
| 1990/0504 | }; ulong cursorbackbits[16]; | |
| 1990/0902 | GBitmap cursorback = | |
| 1990/0504 | { cursorbackbits, 0, | |
| 1990/0826/sys/src/9/port/devbit.c:136,144 – 1990/0902/sys/src/9/port/devbit.c:136,144 | ||
| 1990/0324 | bitreset(void) { | |
| 1990/0327 | int i; | |
| 1990/0902 | GBitmap *bp; | |
| 1990/0327 |
| |
| 1990/0902 | bit.map = ialloc(conf.nbitmap * sizeof(GBitmap), 0); | |
| 1990/0327 | for(i=0,bp=bit.map; i<conf.nbitmap; i++,bp++){ bp->ldepth = -1; bp->base = (ulong*)(bp+1); | |
| 1990/0826/sys/src/9/port/devbit.c:152,158 – 1990/0902/sys/src/9/port/devbit.c:152,158 | ||
| 1990/0327 | bit.words = ialloc(conf.nbitbyte, 0); bit.nwords = conf.nbitbyte/sizeof(ulong); bit.wfree = bit.words; | |
| 1990/0623 |
| |
| 1990/0902 | bit.font = ialloc(conf.nfont * sizeof(GFont), 0); | |
| 1990/0623 | bit.font[0] = *defont; for(i=1; i<conf.nfont; i++) bit.font[i].info = ialloc((NINFO+1)*sizeof(Fontchar), 0); | |
| 1990/0826/sys/src/9/port/devbit.c:245,252 – 1990/0902/sys/src/9/port/devbit.c:245,252 | ||
| 1990/0324 | bitclose(Chan *c) { | |
| 1990/0327 | int i; | |
| 1990/0623 |
| |
| 1990/0902 | GBitmap *bp; GFont *fp; | |
| 1990/0327 | ||
| 1990/05151 | if(c->qid!=CHDIR && (c->flag&COPEN)){ | |
| 1990/0329 | lock(&bit); | |
| 1990/0826/sys/src/9/port/devbit.c:281,287 – 1990/0902/sys/src/9/port/devbit.c:281,287 | ||
| 1990/0613 | ulong l, nw, ws; | |
| 1990/06231 | int off, j; Fontchar *i; | |
| 1990/0613 |
| |
| 1990/0902 | GBitmap *src; | |
| 1990/0327 | ||
| 1990/0324 | if(c->qid & CHDIR) return devdirread(c, va, n, bitdir, NBIT, devgen); | |
| 1990/0826/sys/src/9/port/devbit.c:476,483 – 1990/0902/sys/src/9/port/devbit.c:476,483 | ||
| 1990/0324 | Rectangle rect; | |
| 1990/05313 | Cursor curs; | |
| 1990/0623 | Fontchar *fcp; | |
| 1990/0327 |
| |
| 1990/0623 |
| |
| 1990/0902 | GBitmap *bp, *src, *dst; GFont *f; | |
| 1990/0324 | if(c->qid == CHDIR) error(0, Eisdir); | |
| 1990/0826/sys/src/9/port/devbit.c:533,539 – 1990/0902/sys/src/9/port/devbit.c:533,539 | ||
| 1990/0327 | error(0, Enobitstore); } bp = bit.free; | |
| 1990/0902 | bit.free = (GBitmap*)(bp->base); | |
| 1990/0327 | *bit.wfree++ = nw; *bit.wfree++ = (ulong)bp; bp->base = bit.wfree; | |
| 1990/0826/sys/src/9/port/devbit.c:590,596 – 1990/0902/sys/src/9/port/devbit.c:590,596 | ||
| 1990/0504 | cursoroff(1); | |
| 1990/0721 | isoff = 1; } | |
| 1990/0327 |
| |
| 1990/0902 | gbitblt(dst, pt, src, rect, v); | |
| 1990/0327 | m -= 31; p += 31; break; | |
| 1990/0826/sys/src/9/port/devbit.c:750,756 – 1990/0902/sys/src/9/port/devbit.c:750,756 | ||
| 1990/06111 | cursoroff(1); | |
| 1990/0721 | isoff = 1; } | |
| 1990/06111 |
| |
| 1990/0902 | gsegment(dst, pt1, pt2, t, v); | |
| 1990/06111 | m -= 22; p += 22; | |
| 1990/0613 | break; | |
| 1990/0826/sys/src/9/port/devbit.c:782,788 – 1990/0902/sys/src/9/port/devbit.c:782,788 | ||
| 1990/0722 | cursoroff(1); isoff = 1; } | |
| 1990/0902 | gpoint(dst, pt1, t, v); | |
| 1990/0722 | m -= 14; p += 14; break; | |
| 1990/0826/sys/src/9/port/devbit.c:847,853 – 1990/0902/sys/src/9/port/devbit.c:847,853 | ||
| 1990/0504 | cursoroff(1); | |
| 1990/0721 | isoff = 1; } | |
| 1990/0623 |
| |
| 1990/0902 | gstring(dst, pt, f, (char*)p, v); | |
| 1990/0329 | q++; m -= q-p; p = q; | |
| 1990/0826/sys/src/9/port/devbit.c:884,890 – 1990/0902/sys/src/9/port/devbit.c:884,890 | ||
| 1990/0329 | v = GSHORT(p+21); { int i; | |
| 1990/0902 | GTexture t; | |
| 1990/0329 | for(i=0; i<16; i++) t.bits[i] = src->base[i]>>16; | |
| 1990/0826/sys/src/9/port/devbit.c:892,898 – 1990/0902/sys/src/9/port/devbit.c:892,898 | ||
| 1990/0504 | cursoroff(1); | |
| 1990/0721 | isoff = 1; } | |
| 1990/0329 |
| |
| 1990/0902 | gtexture(dst, rect, &t, v); | |
| 1990/0329 | } m -= 23; p += 23; | |
| 1990/0826/sys/src/9/port/devbit.c:983,989 – 1990/0902/sys/src/9/port/devbit.c:983,989 | ||
| 1990/0327 | } void | |
| 1990/0902 | bitfree(GBitmap *bp) | |
| 1990/0327 | { | |
| 1990/05313 | bp->base[-1] = 0; | |
| 1990/0327 | bp->ldepth = -1; | |
| 1990/0826/sys/src/9/port/devbit.c:993,1002 – 1990/0902/sys/src/9/port/devbit.c:993,1002 | ||
| 1990/0327 | ||
| 1990/08101 | QLock bitlock; | |
| 1990/0902 | GBitmap * | |
| 1990/08101 | id2bit(int k) { | |
| 1990/0902 | GBitmap *bp; | |
| 1990/08101 | bp = &bit.map[k]; if(k<0 || k>=conf.nbitmap || bp->ldepth < 0) error(0, Ebadbitmap); | |
| 1990/0826/sys/src/9/port/devbit.c:1017,1023 – 1990/0902/sys/src/9/port/devbit.c:1017,1023 | ||
| 1990/0327 | } if(p1 != p2){ memcpy(p1, p2, (2+p2[0])*sizeof(ulong)); | |
| 1990/0902 | ((GBitmap*)p1[1])->base = p1+2; | |
| 1990/0327 | } p2 += 2 + p1[0]; p1 += 2 + p1[0]; | |
| 1990/0826/sys/src/9/port/devbit.c:1049,1058 – 1990/0902/sys/src/9/port/devbit.c:1049,1058 | ||
| 1990/0504 | cursor.r.min = mouse.xy; cursor.r.max = add(mouse.xy, Pt(16, 16)); cursor.r = raddp(cursor.r, cursor.offset); | |
| 1990/0902 | gbitblt(&cursorback, Pt(0, 0), &screen, cursor.r, S); gbitblt(&screen, add(mouse.xy, cursor.offset), | |
| 1990/0504 | &clr, Rect(0, 0, 16, 16), D&~S); | |
| 1990/0902 | gbitblt(&screen, add(mouse.xy, cursor.offset), | |
| 1990/0504 | &set, Rect(0, 0, 16, 16), S|D); } if(dolock) | |
| 1990/0826/sys/src/9/port/devbit.c:1065,1071 – 1990/0902/sys/src/9/port/devbit.c:1065,1071 | ||
| 1990/0504 | if(dolock) lock(&cursor); if(--cursor.visible == 0) | |
| 1990/0902 | gbitblt(&screen, cursor.r.min, &cursorback, Rect(0, 0, 16, 16), S); | |
| 1990/0504 | if(dolock) unlock(&cursor); } | |
| Too many diffs (26 > 25). Stopping. | ||