diff options
author | ftrvxmtrx <ftrvxmtrx@gmail.com> | 2013-01-20 22:33:12 +0100 |
---|---|---|
committer | ftrvxmtrx <ftrvxmtrx@gmail.com> | 2013-01-20 22:33:12 +0100 |
commit | 311a8ef0769bd44f3f2d9a1e2f46815a81a5e0be (patch) | |
tree | 5cd6a157b25ebdbc4f5ea1029bc3c234668eb875 /sys/src/cmd/jpg | |
parent | a89aca24b9323ffd70f8d761c72840ef2ab80d4c (diff) |
totruecolor: support CRGBV images as input
Diffstat (limited to 'sys/src/cmd/jpg')
-rw-r--r-- | sys/src/cmd/jpg/totruecolor.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/sys/src/cmd/jpg/totruecolor.c b/sys/src/cmd/jpg/totruecolor.c index 0da5d9a3f..4942a7e5b 100644 --- a/sys/src/cmd/jpg/totruecolor.c +++ b/sys/src/cmd/jpg/totruecolor.c @@ -17,8 +17,8 @@ totruecolor(Rawimage *i, int chandesc) 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 @@ totruecolor(Rawimage *i, int chandesc) 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 @@ totruecolor(Rawimage *i, int chandesc) 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; |