summaryrefslogtreecommitdiff
path: root/sys/src/cmd/jpg
diff options
context:
space:
mode:
authorftrvxmtrx <ftrvxmtrx@gmail.com>2013-01-20 22:33:12 +0100
committerftrvxmtrx <ftrvxmtrx@gmail.com>2013-01-20 22:33:12 +0100
commit311a8ef0769bd44f3f2d9a1e2f46815a81a5e0be (patch)
tree5cd6a157b25ebdbc4f5ea1029bc3c234668eb875 /sys/src/cmd/jpg
parenta89aca24b9323ffd70f8d761c72840ef2ab80d4c (diff)
totruecolor: support CRGBV images as input
Diffstat (limited to 'sys/src/cmd/jpg')
-rw-r--r--sys/src/cmd/jpg/totruecolor.c31
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;