ref: 86e36cfa87edfc317a50a15fc031d16473c3cb72
parent: 1c004c5e3503f95bbe1f969936b5e89390843439
author: ftrvxmtrx <ftrvxmtrx@gmail.com>
date: Sun Jan 20 17:33:12 EST 2013
totruecolor: support CRGBV images as input
--- a/sys/src/cmd/jpg/totruecolor.c
+++ b/sys/src/cmd/jpg/totruecolor.c
@@ -17,8 +17,8 @@
int j, k;
Rawimage *im;
char err[ERRMAX];
- uchar *rp, *gp, *bp, *cmap, *inp, *outp, cmap1[3*256];
- int r, g, b, Y, Cr, Cb;
+ uchar *rp, *gp, *bp, *cmap, *inp, *outp, cmap1[4*256];
+ int r, g, b, Y, Cr, Cb, psize;
if(chandesc!=CY && chandesc!=CRGB24)
return _remaperror("remap: can't convert to chandesc %d", chandesc);@@ -67,16 +67,15 @@
break;
case CRGB1:
+ case CRGBV:
+ psize = (i->chandesc == CRGB1) ? 3 : 4;
if(cmap == nil)
return _remaperror("remap: image has no color map");if(i->nchans != 1)
return _remaperror("remap: can't handle nchans %d", i->nchans);- for(j=1; j<=8; j++)
- if(i->cmaplen == 3*(1<<j))
- break;
- if(j > 8)
- return _remaperror("remap: can't do colormap size 3*%d", i->cmaplen/3);- if(i->cmaplen != 3*256){+ if(i->cmaplen > psize*256)
+ return _remaperror("remap: can't do colormap size %d*%d", psize, i->cmaplen/psize);+ if(i->cmaplen != psize*256){/* to avoid a range check in loop below, make a full-size cmap */
memmove(cmap1, cmap, i->cmaplen);
cmap = cmap1;
@@ -84,19 +83,19 @@
inp = i->chans[0];
if(chandesc == CY){ for(j=0; j<i->chanlen; j++){- k = *inp++;
- r = cmap[3*k+2];
- g = cmap[3*k+1];
- b = cmap[3*k+0];
+ k = psize*(*inp++);
+ r = cmap[k+2];
+ g = cmap[k+1];
+ b = cmap[k+0];
r = (2125*r + 7154*g + 721*b)/10000; /* Poynton page 84 */
*outp++ = r;
}
}else{ for(j=0; j<i->chanlen; j++){- k = *inp++;
- *outp++ = cmap[3*k+2];
- *outp++ = cmap[3*k+1];
- *outp++ = cmap[3*k+0];
+ k = psize*(*inp++);
+ *outp++ = cmap[k+2];
+ *outp++ = cmap[k+1];
+ *outp++ = cmap[k+0];
}
}
break;
--
⑨