Add CMYK support to the TurboJPEG C API

This commit is contained in:
DRC
2013-08-23 02:49:25 +00:00
parent 9ad7a4c6ca
commit 24668df1df
13 changed files with 392 additions and 91 deletions

View File

@@ -68,13 +68,14 @@ const char *subName[TJ_NUMSAMP]={"444", "422", "420", "GRAY", "440", "411"};
const char *pixFormatStr[TJ_NUMPF]=
{
"RGB", "BGR", "RGBX", "BGRX", "XBGR", "XRGB", "Grayscale",
"RGBA", "BGRA", "ABGR", "ARGB"
"RGBA", "BGRA", "ABGR", "ARGB", "CMYK"
};
const int alphaOffset[TJ_NUMPF] = {-1, -1, -1, -1, -1, -1, -1, 3, 3, 0, 0};
const int alphaOffset[TJ_NUMPF] = {-1, -1, -1, -1, -1, -1, -1, 3, 3, 0, 0, -1};
const int _3byteFormats[]={TJPF_RGB, TJPF_BGR};
const int _4byteFormats[]={TJPF_RGBX, TJPF_BGRX, TJPF_XBGR, TJPF_XRGB};
const int _4byteFormats[]={TJPF_RGBX, TJPF_BGRX, TJPF_XBGR, TJPF_XRGB,
TJPF_CMYK};
const int _onlyGray[]={TJPF_GRAY};
const int _onlyRGB[]={TJPF_RGB};
@@ -93,9 +94,9 @@ void initBuf(unsigned char *buf, int w, int h, int pf, int flags)
int ps=tjPixelSize[pf];
int index, row, col, halfway=16;
memset(buf, 0, w*h*ps);
if(pf==TJPF_GRAY)
{
memset(buf, 0, w*h*ps);
for(row=0; row<h; row++)
{
for(col=0; col<w; col++)
@@ -107,8 +108,30 @@ void initBuf(unsigned char *buf, int w, int h, int pf, int flags)
}
}
}
else if(pf==TJPF_CMYK)
{
memset(buf, 255, w*h*ps);
for(row=0; row<h; row++)
{
for(col=0; col<w; col++)
{
if(flags&TJFLAG_BOTTOMUP) index=(h-row-1)*w+col;
else index=row*w+col;
if(((row/8)+(col/8))%2==0)
{
if(row>=halfway) buf[index*ps+3]=0;
}
else
{
buf[index*ps+2]=0;
if(row<halfway) buf[index*ps+1]=0;
}
}
}
}
else
{
memset(buf, 0, w*h*ps);
for(row=0; row<h; row++)
{
for(col=0; col<w; col++)
@@ -167,6 +190,36 @@ int checkBuf(unsigned char *buf, int w, int h, int pf, int subsamp,
int halfway=16*sf.num/sf.denom;
int blocksize=8*sf.num/sf.denom;
if(pf==TJPF_CMYK)
{
for(row=0; row<h; row++)
{
for(col=0; col<w; col++)
{
unsigned char c, m, y, k;
if(flags&TJFLAG_BOTTOMUP) index=(h-row-1)*w+col;
else index=row*w+col;
c=buf[index*ps];
m=buf[index*ps+1];
y=buf[index*ps+2];
k=buf[index*ps+3];
if(((row/blocksize)+(col/blocksize))%2==0)
{
checkval255(c); checkval255(m); checkval255(y);
if(row<halfway) checkval255(k)
else checkval0(k)
}
else
{
checkval255(c); checkval0(y); checkval255(k);
if(row<halfway) checkval0(m)
else checkval255(m)
}
}
}
return 1;
}
for(row=0; row<h; row++)
{
for(col=0; col<w; col++)
@@ -225,8 +278,13 @@ int checkBuf(unsigned char *buf, int w, int h, int pf, int subsamp,
{
for(col=0; col<w; col++)
{
printf("%.3d/%.3d/%.3d ", buf[(row*w+col)*ps+roffset],
buf[(row*w+col)*ps+goffset], buf[(row*w+col)*ps+boffset]);
if(pf==TJPF_CMYK)
printf("%.3d/%.3d/%.3d/%.3d ", buf[(row*w+col)*ps],
buf[(row*w+col)*ps+1], buf[(row*w+col)*ps+2],
buf[(row*w+col)*ps+3]);
else
printf("%.3d/%.3d/%.3d ", buf[(row*w+col)*ps+roffset],
buf[(row*w+col)*ps+goffset], buf[(row*w+col)*ps+boffset]);
}
printf("\n");
}
@@ -610,7 +668,7 @@ void bufSizeTest(void)
int main(int argc, char *argv[])
{
int doyuv=0, i;
int doyuv=0, i, num4bf=5;
#ifdef _WIN32
srand((unsigned int)time(NULL));
#endif
@@ -626,17 +684,17 @@ int main(int argc, char *argv[])
}
}
if(alloc) printf("Testing automatic buffer allocation\n");
if(doyuv) {yuv=YUVENCODE; alloc=0;}
if(doyuv) {yuv=YUVENCODE; alloc=0; num4bf=4;}
doTest(35, 39, _3byteFormats, 2, TJSAMP_444, "test");
doTest(39, 41, _4byteFormats, 4, TJSAMP_444, "test");
doTest(39, 41, _4byteFormats, num4bf, TJSAMP_444, "test");
doTest(41, 35, _3byteFormats, 2, TJSAMP_422, "test");
doTest(35, 39, _4byteFormats, 4, TJSAMP_422, "test");
doTest(35, 39, _4byteFormats, num4bf, TJSAMP_422, "test");
doTest(39, 41, _3byteFormats, 2, TJSAMP_420, "test");
doTest(41, 35, _4byteFormats, 4, TJSAMP_420, "test");
doTest(41, 35, _4byteFormats, num4bf, TJSAMP_420, "test");
doTest(35, 39, _3byteFormats, 2, TJSAMP_440, "test");
doTest(39, 41, _4byteFormats, 4, TJSAMP_440, "test");
doTest(39, 41, _4byteFormats, num4bf, TJSAMP_440, "test");
doTest(41, 35, _3byteFormats, 2, TJSAMP_411, "test");
doTest(35, 39, _4byteFormats, 4, TJSAMP_411, "test");
doTest(35, 39, _4byteFormats, num4bf, TJSAMP_411, "test");
doTest(39, 41, _onlyGray, 1, TJSAMP_GRAY, "test");
doTest(41, 35, _3byteFormats, 2, TJSAMP_GRAY, "test");
doTest(35, 39, _4byteFormats, 4, TJSAMP_GRAY, "test");