| Index: bmp.c
|
| diff --git a/bmp.c b/bmp.c
|
| index fa4479dad7b3bf173a750ee6fdadac1fe0f7ecea..9fcf7bbd5d6257801997ba85013e14efae60f50b 100644
|
| --- a/bmp.c
|
| +++ b/bmp.c
|
| @@ -1,5 +1,5 @@
|
| /*
|
| - * Copyright (C)2011 D. R. Commander. All Rights Reserved.
|
| + * Copyright (C)2011, 2015 D. R. Commander. All Rights Reserved.
|
| *
|
| * Redistribution and use in source and binary forms, with or without
|
| * modification, are permitted provided that the following conditions are met:
|
| @@ -75,30 +75,90 @@ static void my_output_message(j_common_ptr cinfo)
|
| static void pixelconvert(unsigned char *srcbuf, int srcpf, int srcbottomup,
|
| unsigned char *dstbuf, int dstpf, int dstbottomup, int w, int h)
|
| {
|
| - unsigned char *srcptr=srcbuf, *srcptr2;
|
| + unsigned char *srcrowptr=srcbuf, *srccolptr;
|
| int srcps=tjPixelSize[srcpf];
|
| int srcstride=srcbottomup? -w*srcps:w*srcps;
|
| - unsigned char *dstptr=dstbuf, *dstptr2;
|
| + unsigned char *dstrowptr=dstbuf, *dstcolptr;
|
| int dstps=tjPixelSize[dstpf];
|
| int dststride=dstbottomup? -w*dstps:w*dstps;
|
| int row, col;
|
|
|
| - if(srcbottomup) srcptr=&srcbuf[w*srcps*(h-1)];
|
| - if(dstbottomup) dstptr=&dstbuf[w*dstps*(h-1)];
|
| - for(row=0; row<h; row++, srcptr+=srcstride, dstptr+=dststride)
|
| + if(srcbottomup) srcrowptr=&srcbuf[w*srcps*(h-1)];
|
| + if(dstbottomup) dstrowptr=&dstbuf[w*dstps*(h-1)];
|
| +
|
| + /* NOTE: These quick & dirty CMYK<->RGB conversion routines are for testing
|
| + purposes only. Properly converting between CMYK and RGB requires a color
|
| + management system. */
|
| +
|
| + if(dstpf==TJPF_CMYK)
|
| + {
|
| + for(row=0; row<h; row++, srcrowptr+=srcstride, dstrowptr+=dststride)
|
| + {
|
| + for(col=0, srccolptr=srcrowptr, dstcolptr=dstrowptr;
|
| + col<w; col++, srccolptr+=srcps)
|
| + {
|
| + double c=1.0-((double)(srccolptr[tjRedOffset[srcpf]])/255.);
|
| + double m=1.0-((double)(srccolptr[tjGreenOffset[srcpf]])/255.);
|
| + double y=1.0-((double)(srccolptr[tjBlueOffset[srcpf]])/255.);
|
| + double k=min(min(c,m),min(y,1.0));
|
| + if(k==1.0) c=m=y=0.0;
|
| + else
|
| + {
|
| + c=(c-k)/(1.0-k);
|
| + m=(m-k)/(1.0-k);
|
| + y=(y-k)/(1.0-k);
|
| + }
|
| + if(c>1.0) c=1.0; if(c<0.) c=0.;
|
| + if(m>1.0) m=1.0; if(m<0.) m=0.;
|
| + if(y>1.0) y=1.0; if(y<0.) y=0.;
|
| + if(k>1.0) k=1.0; if(k<0.) k=0.;
|
| + *dstcolptr++=(unsigned char)(255.0-c*255.0+0.5);
|
| + *dstcolptr++=(unsigned char)(255.0-m*255.0+0.5);
|
| + *dstcolptr++=(unsigned char)(255.0-y*255.0+0.5);
|
| + *dstcolptr++=(unsigned char)(255.0-k*255.0+0.5);
|
| + }
|
| + }
|
| + }
|
| + else if(srcpf==TJPF_CMYK)
|
| + {
|
| + for(row=0; row<h; row++, srcrowptr+=srcstride, dstrowptr+=dststride)
|
| + {
|
| + for(col=0, srccolptr=srcrowptr, dstcolptr=dstrowptr;
|
| + col<w; col++, dstcolptr+=dstps)
|
| + {
|
| + double c=(double)(*srccolptr++);
|
| + double m=(double)(*srccolptr++);
|
| + double y=(double)(*srccolptr++);
|
| + double k=(double)(*srccolptr++);
|
| + double r=c*k/255.;
|
| + double g=m*k/255.;
|
| + double b=y*k/255.;
|
| + if(r>255.0) r=255.0; if(r<0.) r=0.;
|
| + if(g>255.0) g=255.0; if(g<0.) g=0.;
|
| + if(b>255.0) b=255.0; if(b<0.) b=0.;
|
| + dstcolptr[tjRedOffset[dstpf]]=(unsigned char)(r+0.5);
|
| + dstcolptr[tjGreenOffset[dstpf]]=(unsigned char)(g+0.5);
|
| + dstcolptr[tjBlueOffset[dstpf]]=(unsigned char)(b+0.5);
|
| + }
|
| + }
|
| + }
|
| + else
|
| {
|
| - for(col=0, srcptr2=srcptr, dstptr2=dstptr; col<w; col++, srcptr2+=srcps,
|
| - dstptr2+=dstps)
|
| + for(row=0; row<h; row++, srcrowptr+=srcstride, dstrowptr+=dststride)
|
| {
|
| - dstptr2[tjRedOffset[dstpf]]=srcptr2[tjRedOffset[srcpf]];
|
| - dstptr2[tjGreenOffset[dstpf]]=srcptr2[tjGreenOffset[srcpf]];
|
| - dstptr2[tjBlueOffset[dstpf]]=srcptr2[tjBlueOffset[srcpf]];
|
| + for(col=0, srccolptr=srcrowptr, dstcolptr=dstrowptr;
|
| + col<w; col++, srccolptr+=srcps, dstcolptr+=dstps)
|
| + {
|
| + dstcolptr[tjRedOffset[dstpf]]=srccolptr[tjRedOffset[srcpf]];
|
| + dstcolptr[tjGreenOffset[dstpf]]=srccolptr[tjGreenOffset[srcpf]];
|
| + dstcolptr[tjBlueOffset[dstpf]]=srccolptr[tjBlueOffset[srcpf]];
|
| + }
|
| }
|
| }
|
| }
|
|
|
|
|
| -int loadbmp(char *filename, unsigned char **buf, int *w, int *h,
|
| +int loadbmp(char *filename, unsigned char **buf, int *w, int *h,
|
| int dstpf, int bottomup)
|
| {
|
| int retval=0, dstps, srcpf, tempc;
|
|
|