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; |