#include <cups/string-private.h>
#include "driver.h"
#include <sys/stat.h>
#ifdef HAVE_LIBLCMS
# include <lcms/lcms.h>
#endif
void test_gray(cups_sample_t *samples, int num_samples,
int cube_size, int num_comps, const char *basename);
void test_rgb(cups_sample_t *samples, int num_samples,
int cube_size, int num_comps,
const char *basename);
int
main(int argc,
char *argv[])
{
static cups_sample_t CMYK[] =
{
{ { 0, 0, 0 }, { 0, 0, 0, 255 } },
{ { 255, 0, 0 }, { 0, 255, 240, 0 } },
{ { 0, 255, 0 }, { 200, 0, 200, 0 } },
{ { 255, 255, 0 }, { 0, 0, 240, 0 } },
{ { 0, 0, 255 }, { 200, 200, 0, 0 } },
{ { 255, 0, 255 }, { 0, 200, 0, 0 } },
{ { 0, 255, 255 }, { 200, 0, 0, 0 } },
{ { 255, 255, 255 }, { 0, 0, 0, 0 } }
};
mkdir("test", 0755);
test_rgb(CMYK, 8, 2, 4, "test/rgb-cmyk");
test_gray(CMYK, 8, 2, 4, "test/gray-cmyk");
return (0);
}
void
test_gray(cups_sample_t *samples,
int num_samples,
int cube_size,
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];
unsigned char output[48000],
*outptr;
FILE *in;
FILE *out[CUPS_MAX_CHAN];
FILE *comp;
cups_rgb_t *rgb;
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);
rgb = cupsRGBNew(num_samples, samples, cube_size, num_comps);
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);
cupsRGBDoGray(rgb, input, output, width);
for (x = 0, outptr = output; x < width; x ++, outptr += num_comps)
{
for (i = 0; i < num_comps; i ++)
putc(255 - outptr[i], out[i]);
r = 255;
g = 255;
b = 255;
r -= outptr[0];
g -= outptr[1];
b -= outptr[2];
r -= outptr[3];
g -= outptr[3];
b -= outptr[3];
if (num_comps > 4)
{
r -= outptr[4] / 2;
g -= outptr[5] / 2;
}
if (num_comps > 6)
{
r -= outptr[6] / 2;
g -= outptr[6] / 2;
b -= outptr[6] / 2;
}
if (r < 0)
putc(0, comp);
else
putc(r, comp);
if (g < 0)
putc(0, comp);
else
putc(g, comp);
if (b < 0)
putc(0, comp);
else
putc(b, comp);
}
}
for (i = 0; i < num_comps; i ++)
fclose(out[i]);
fclose(comp);
fclose(in);
cupsRGBDelete(rgb);
}
void
test_rgb(cups_sample_t *samples,
int num_samples,
int cube_size,
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];
unsigned char output[48000],
*outptr;
FILE *in;
FILE *out[CUPS_MAX_CHAN];
FILE *comp;
cups_rgb_t *rgb;
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);
rgb = cupsRGBNew(num_samples, samples, cube_size, num_comps);
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);
cupsRGBDoRGB(rgb, input, output, width);
for (x = 0, outptr = output; x < width; x ++, outptr += num_comps)
{
for (i = 0; i < num_comps; i ++)
putc(255 - outptr[i], out[i]);
r = 255;
g = 255;
b = 255;
r -= outptr[0];
g -= outptr[1];
b -= outptr[2];
r -= outptr[3];
g -= outptr[3];
b -= outptr[3];
if (num_comps > 4)
{
r -= outptr[4] / 2;
g -= outptr[5] / 2;
}
if (num_comps > 6)
{
r -= outptr[6] / 2;
g -= outptr[6] / 2;
b -= outptr[6] / 2;
}
if (r < 0)
putc(0, comp);
else
putc(r, comp);
if (g < 0)
putc(0, comp);
else
putc(g, comp);
if (b < 0)
putc(0, comp);
else
putc(b, comp);
}
}
for (i = 0; i < num_comps; i ++)
fclose(out[i]);
fclose(comp);
fclose(in);
cupsRGBDelete(rgb);
}