#include "image-private.h"
static short read_short(FILE *fp);
int
_cupsImageReadPIX(
cups_image_t *img,
FILE *fp,
cups_icspace_t primary,
cups_icspace_t secondary,
int saturation,
int hue,
const cups_ib_t *lut)
{
short width,
height,
depth;
int count,
bpp,
x, y;
cups_ib_t r, g, b;
cups_ib_t *in,
*out,
*ptr;
width = read_short(fp);
height = read_short(fp);
read_short(fp);
read_short(fp);
depth = read_short(fp);
if (width <= 0 || height <= 0 ||
(depth != 8 && depth != 24))
{
fprintf(stderr, "DEBUG: Bad PIX image dimensions %dx%dx%d\n",
width, height, depth);
fclose(fp);
return (1);
}
if (depth == 8)
img->colorspace = secondary;
else
img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary;
img->xsize = width;
img->ysize = height;
cupsImageSetMaxTiles(img, 0);
bpp = cupsImageGetDepth(img);
if ((in = malloc(img->xsize * (depth / 8))) == NULL)
{
fputs("DEBUG: Unable to allocate memory!\n", stderr);
fclose(fp);
return (1);
}
if ((out = malloc(img->xsize * bpp)) == NULL)
{
fputs("DEBUG: Unable to allocate memory!\n", stderr);
fclose(fp);
free(in);
return (1);
}
if (depth == 8)
{
for (count = 0, y = 0, g = 0; y < img->ysize; y ++)
{
if (img->colorspace == CUPS_IMAGE_WHITE)
ptr = out;
else
ptr = in;
for (x = img->xsize; x > 0; x --, count --)
{
if (count == 0)
{
count = getc(fp);
g = getc(fp);
}
*ptr++ = g;
}
if (img->colorspace != CUPS_IMAGE_WHITE)
switch (img->colorspace)
{
default :
cupsImageWhiteToRGB(in, out, img->xsize);
break;
case CUPS_IMAGE_BLACK :
cupsImageWhiteToBlack(in, out, img->xsize);
break;
case CUPS_IMAGE_CMY :
cupsImageWhiteToCMY(in, out, img->xsize);
break;
case CUPS_IMAGE_CMYK :
cupsImageWhiteToCMYK(in, out, img->xsize);
break;
}
if (lut)
cupsImageLut(out, img->xsize * bpp, lut);
_cupsImagePutRow(img, 0, y, img->xsize, out);
}
}
else
{
for (count = 0, y = 0, r = 0, g = 0, b = 0; y < img->ysize; y ++)
{
ptr = in;
for (x = img->xsize; x > 0; x --, count --)
{
if (count == 0)
{
count = getc(fp);
b = getc(fp);
g = getc(fp);
r = getc(fp);
}
*ptr++ = r;
*ptr++ = g;
*ptr++ = b;
}
if (saturation != 100 || hue != 0)
cupsImageRGBAdjust(in, img->xsize, saturation, hue);
switch (img->colorspace)
{
default :
break;
case CUPS_IMAGE_WHITE :
cupsImageRGBToWhite(in, out, img->xsize);
break;
case CUPS_IMAGE_RGB :
cupsImageRGBToWhite(in, out, img->xsize);
break;
case CUPS_IMAGE_BLACK :
cupsImageRGBToBlack(in, out, img->xsize);
break;
case CUPS_IMAGE_CMY :
cupsImageRGBToCMY(in, out, img->xsize);
break;
case CUPS_IMAGE_CMYK :
cupsImageRGBToCMYK(in, out, img->xsize);
break;
}
if (lut)
cupsImageLut(out, img->xsize * bpp, lut);
_cupsImagePutRow(img, 0, y, img->xsize, out);
}
}
fclose(fp);
free(in);
free(out);
return (0);
}
static short
read_short(FILE *fp)
{
int ch;
ch = getc(fp);
return ((ch << 8) | getc(fp));
}