#include <cups/string-private.h>
#include "driver.h"
#include <sys/stat.h>
void test_gray(int num_comps, const char *basename);
void test_rgb(int num_comps, const char *basename);
int
main(int argc,
char *argv[])
{
mkdir("test", 0755);
test_rgb(1, "test/K-rgb");
test_rgb(2, "test/Kk-rgb");
test_rgb(3, "test/CMY-rgb");
test_rgb(4, "test/CMYK-rgb");
test_rgb(6, "test/CcMmYK-rgb");
test_rgb(7, "test/CcMmYKk-rgb");
test_gray(1, "test/K-gray");
test_gray(2, "test/Kk-gray");
test_gray(3, "test/CMY-gray");
test_gray(4, "test/CMYK-gray");
test_gray(6, "test/CcMmYK-gray");
test_gray(7, "test/CcMmYKk-gray");
return (0);
}
void
test_gray(int num_comps,
const char *basename)
{
int i;
char filename[255];
char line[255];
int width, height;
int x, y;
int r, g, b;
unsigned char input[7000];
short output[48000],
*outptr;
FILE *in;
FILE *out[CUPS_MAX_CHAN];
FILE *comp;
cups_cmyk_t *cmyk;
in = fopen("image.pgm", "rb");
while (fgets(line, sizeof(line), in) != NULL)
if (isdigit(line[0]))
break;
sscanf(line, "%d%d", &width, &height);
fgets(line, sizeof(line), in);
cmyk = cupsCMYKNew(num_comps);
switch (num_comps)
{
case 2 :
cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0);
break;
case 4 :
cupsCMYKSetGamma(cmyk, 2, 1.0, 0.9);
cupsCMYKSetBlack(cmyk, 0.5, 1.0);
break;
case 6 :
cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0);
cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0);
cupsCMYKSetGamma(cmyk, 4, 1.0, 0.9);
cupsCMYKSetBlack(cmyk, 0.5, 1.0);
break;
case 7 :
cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0);
cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0);
cupsCMYKSetGamma(cmyk, 4, 1.0, 0.9);
cupsCMYKSetLtDk(cmyk, 5, 0.5, 1.0);
break;
}
for (i = 0; i < num_comps; i ++)
{
sprintf(filename, "%s%d.pgm", basename, i);
out[i] = fopen(filename, "wb");
fprintf(out[i], "P5\n%d %d 255\n", width, height);
}
sprintf(filename, "%s.ppm", basename);
comp = fopen(filename, "wb");
fprintf(comp, "P6\n%d %d 255\n", width, height);
for (y = 0; y < height; y ++)
{
fread(input, width, 1, in);
cupsCMYKDoGray(cmyk, input, output, width);
for (x = 0, outptr = output; x < width; x ++, outptr += num_comps)
{
for (i = 0; i < num_comps; i ++)
putc(255 - 255 * outptr[i] / 4095, out[i]);
r = 4095;
g = 4095;
b = 4095;
switch (num_comps)
{
case 1 :
r -= outptr[0];
g -= outptr[0];
b -= outptr[0];
break;
case 2 :
r -= outptr[0];
g -= outptr[0];
b -= outptr[0];
r -= outptr[1] / 2;
g -= outptr[1] / 2;
b -= outptr[1] / 2;
break;
case 3 :
r -= outptr[0];
g -= outptr[1];
b -= outptr[2];
break;
case 4 :
r -= outptr[0];
g -= outptr[1];
b -= outptr[2];
r -= outptr[3];
g -= outptr[3];
b -= outptr[3];
break;
case 6 :
r -= outptr[0] + outptr[1] / 2;
g -= outptr[2] + outptr[3] / 3;
b -= outptr[4];
r -= outptr[5];
g -= outptr[5];
b -= outptr[5];
break;
case 7 :
r -= outptr[0] + outptr[1] / 2;
g -= outptr[2] + outptr[3] / 3;
b -= outptr[4];
r -= outptr[5] + outptr[6] / 2;
g -= outptr[5] + outptr[6] / 2;
b -= outptr[5] + outptr[6] / 2;
break;
}
if (r < 0)
putc(0, comp);
else
putc(255 * r / 4095, comp);
if (g < 0)
putc(0, comp);
else
putc(255 * g / 4095, comp);
if (b < 0)
putc(0, comp);
else
putc(255 * b / 4095, comp);
}
}
for (i = 0; i < num_comps; i ++)
fclose(out[i]);
fclose(comp);
fclose(in);
cupsCMYKDelete(cmyk);
}
void
test_rgb(int num_comps,
const char *basename)
{
int i;
char filename[255];
char line[255];
int width, height;
int x, y;
int r, g, b;
unsigned char input[7000];
short output[48000],
*outptr;
FILE *in;
FILE *out[CUPS_MAX_CHAN];
FILE *comp;
cups_cmyk_t *cmyk;
in = fopen("image.ppm", "rb");
while (fgets(line, sizeof(line), in) != NULL)
if (isdigit(line[0]))
break;
sscanf(line, "%d%d", &width, &height);
fgets(line, sizeof(line), in);
cmyk = cupsCMYKNew(num_comps);
cupsCMYKSetBlack(cmyk, 0.5, 1.0);
switch (num_comps)
{
case 2 :
cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0);
break;
case 6 :
cupsCMYKSetGamma(cmyk, 0, 1.0, 0.8);
cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0);
cupsCMYKSetGamma(cmyk, 2, 1.0, 0.8);
cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0);
break;
case 7 :
cupsCMYKSetGamma(cmyk, 0, 1.0, 0.8);
cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0);
cupsCMYKSetGamma(cmyk, 2, 1.0, 0.8);
cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0);
cupsCMYKSetLtDk(cmyk, 5, 0.5, 1.0);
break;
}
for (i = 0; i < num_comps; i ++)
{
sprintf(filename, "%s%d.pgm", basename, i);
out[i] = fopen(filename, "wb");
fprintf(out[i], "P5\n%d %d 255\n", width, height);
}
sprintf(filename, "%s.ppm", basename);
comp = fopen(filename, "wb");
fprintf(comp, "P6\n%d %d 255\n", width, height);
for (y = 0; y < height; y ++)
{
fread(input, width, 3, in);
cupsCMYKDoRGB(cmyk, input, output, width);
for (x = 0, outptr = output; x < width; x ++, outptr += num_comps)
{
for (i = 0; i < num_comps; i ++)
putc(255 - 255 * outptr[i] / 4095, out[i]);
r = 4095;
g = 4095;
b = 4095;
switch (num_comps)
{
case 1 :
r -= outptr[0];
g -= outptr[0];
b -= outptr[0];
break;
case 2 :
r -= outptr[0];
g -= outptr[0];
b -= outptr[0];
r -= outptr[1] / 2;
g -= outptr[1] / 2;
b -= outptr[1] / 2;
break;
case 3 :
r -= outptr[0];
g -= outptr[1];
b -= outptr[2];
break;
case 4 :
r -= outptr[0];
g -= outptr[1];
b -= outptr[2];
r -= outptr[3];
g -= outptr[3];
b -= outptr[3];
break;
case 6 :
r -= outptr[0] + outptr[1] / 2;
g -= outptr[2] + outptr[3] / 3;
b -= outptr[4];
r -= outptr[5];
g -= outptr[5];
b -= outptr[5];
break;
case 7 :
r -= outptr[0] + outptr[1] / 2;
g -= outptr[2] + outptr[3] / 3;
b -= outptr[4];
r -= outptr[5] + outptr[6] / 2;
g -= outptr[5] + outptr[6] / 2;
b -= outptr[5] + outptr[6] / 2;
break;
}
if (r < 0)
putc(0, comp);
else
putc(255 * r / 4095, comp);
if (g < 0)
putc(0, comp);
else
putc(255 * g / 4095, comp);
if (b < 0)
putc(0, comp);
else
putc(255 * b / 4095, comp);
}
}
for (i = 0; i < num_comps; i ++)
fclose(out[i]);
fclose(comp);
fclose(in);
cupsCMYKDelete(cmyk);
}