colormap doesnt change to rgbv after the first image when doing png *.png, for example. torgbv now understands about crgb24 &c. Reference: /n/sources/patch/applied/jpgpngtorgbv Date: Sun Feb 20 20:54:44 CET 2005 --- /sys/src/cmd/jpg/jpg.c Sun Feb 20 20:52:20 2005 +++ /sys/src/cmd/jpg/jpg.c Sun Feb 20 20:52:18 2005 @@ -259,16 +259,18 @@ c = nil; if(jflag) goto Return; - if(!dflag && !inited){ - if(initdraw(0, 0, 0) < 0){ - fprint(2, "jpg: initdraw failed: %r\n"); - return "initdraw"; + if(!dflag){ + if (!inited) { + if(initdraw(0, 0, 0) < 0){ + fprint(2, "jpg: initdraw failed: %r\n"); + return "initdraw"; + } + if(Fflag == 0) + einit(Ekeyboard|Emouse); + inited++; } - if(Fflag == 0) - einit(Ekeyboard|Emouse); if(defaultcolor && screen->depth>8 && outchan==CMAP8) outchan = RGB24; - inited++; } if(outchan == CMAP8) c = torgbv(r, !eflag); --- /sys/src/cmd/jpg/png.c Sun Feb 20 20:52:33 2005 +++ /sys/src/cmd/jpg/png.c Sun Feb 20 20:52:31 2005 @@ -154,15 +154,17 @@ Bterm(&b); r = array[0]; - if(!dflag && !inited){ - if(initdraw(0, 0, 0) < 0){ - fprint(2, "png: initdraw failed: %r\n"); - return "initdraw"; + if(!dflag){ + if (!inited) { + if(initdraw(0, 0, 0) < 0){ + fprint(2, "png: initdraw failed: %r\n"); + return "initdraw"; + } + einit(Ekeyboard|Emouse); + inited++; } - einit(Ekeyboard|Emouse); if(defaultcolor && screen->depth>8 && outchan==CMAP8) outchan = RGB24; - inited++; } if(outchan == CMAP8) c = torgbv(r, !eflag); --- /sys/src/cmd/jpg/torgbv.c Sun Feb 20 20:52:49 2005 +++ /sys/src/cmd/jpg/torgbv.c Sun Feb 20 20:52:46 2005 @@ -32,6 +32,7 @@ int j, k, rgb, x, y, er, eg, eb, col, t; int r, g, b, r1, g1, b1; int *ered, *egrn, *eblu, *rp, *gp, *bp; + int bpc; uint *map3; uchar *closest; Rawimage *im; @@ -173,26 +174,52 @@ break; case CYCbCr: + bpc = 1; + rpic = i->chans[0]; + gpic = i->chans[1]; + bpic = i->chans[2]; closest = closestycbcr; map3 = ycbcrmap; + if(i->nchans != 3) + return _remaperror("remap: RGB image has %d channels", i->nchans); goto Threecolor; case CRGB: + bpc = 1; + rpic = i->chans[0]; + gpic = i->chans[1]; + bpic = i->chans[2]; + if(i->nchans != 3) + return _remaperror("remap: RGB image has %d channels", i->nchans); + goto rgbgen; + + case CRGB24: + bpc = 3; + bpic = i->chans[0]; + gpic = i->chans[0] + 1; + rpic = i->chans[0] + 2; + goto rgbgen; + + case CRGBA32: + bpc = 4; + /* i->chans[0]+0 is alpha */ + bpic = i->chans[0] + 1; + gpic = i->chans[0] + 2; + rpic = i->chans[0] + 3; + + rgbgen: closest = closestrgb; map3 = rgbmap; Threecolor: - if(i->nchans != 3) - return _remaperror("remap: RGB image has %d channels", i->nchans); - rpic = i->chans[0]; - gpic = i->chans[1]; - bpic = i->chans[2]; + if(errdiff == 0){ - for(j=0; jchanlen; j++){ + outp = out; + for(j=0; jchanlen; j+=bpc){ r = rpic[j]>>4; g = gpic[j]>>4; b = bpic[j]>>4; - out[j] = closest[b+16*(g+16*r)]; + *outp++ = closest[b+16*(g+16*r)]; } }else{ /* modified floyd steinberg, coefficients (1 0) 3/16, (0, 1) 3/16, (1, 1) 7/16 */ @@ -204,9 +231,12 @@ gp = egrn; bp = eblu; for(x=0; xchans[0] + 0 is alpha */ + rpic = i->chans[0] + 1; + goto greygen; + case CY: + bpc = 1; + rpic = i->chans[0]; if(i->nchans != 1) return _remaperror("remap: Y image has %d chans", i->nchans); - rpic = i->chans[0]; + + greygen: if(errdiff == 0){ - for(j=0; jchanlen; j++){ + for(j=0; jchanlen; j+=bpc){ r = rpic[j]>>4; *outp++ = closestrgb[r+16*(r+16*r)]; } @@ -276,7 +315,8 @@ er = 0; rp = ered; for(x=0; x