diff options
Diffstat (limited to 'filter/image-photocd.c')
-rw-r--r-- | filter/image-photocd.c | 333 |
1 files changed, 0 insertions, 333 deletions
diff --git a/filter/image-photocd.c b/filter/image-photocd.c deleted file mode 100644 index 625b0a2c..00000000 --- a/filter/image-photocd.c +++ /dev/null @@ -1,333 +0,0 @@ -/* - * "$Id: image-photocd.c 9771 2011-05-12 05:21:56Z mike $" - * - * PhotoCD routines for CUPS. - * - * PhotoCD support is currently limited to the 768x512 base image, which - * is only YCC encoded. Support for the higher resolution images will - * require a lot of extra code... - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2006 by Easy Software Products. - * - * These coded instructions, statements, and computer programs are the - * property of Apple Inc. and are protected by Federal copyright - * law. Distribution and use rights are outlined in the file "LICENSE.txt" - * which should have been included with this file. If this file is - * file is missing or damaged, see the license at "http://www.cups.org/". - * - * This file is subject to the Apple OS-Developed Software exception. - * - * Contents: - * - * _cupsImageReadPhotoCD() - Read a PhotoCD image file. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - - -/* - * '_cupsImageReadPhotoCD()' - Read a PhotoCD image file. - */ - -int /* O - Read status */ -_cupsImageReadPhotoCD( - cups_image_t *img, /* IO - cupsImage */ - FILE *fp, /* I - cupsImage file */ - cups_icspace_t primary, /* I - Primary choice for colorspace */ - cups_icspace_t secondary, /* I - Secondary choice for colorspace */ - int saturation, /* I - Color saturation (%) */ - int hue, /* I - Color hue (degrees) */ - const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ -{ - int x, y; /* Looping vars */ - int xdir, /* X direction */ - xstart; /* X starting point */ - int bpp; /* Bytes per pixel */ - int pass; /* Pass number */ - int rotation; /* 0 for 768x512, 1 for 512x768 */ - int temp, /* Adjusted luminance */ - temp2, /* Red, green, and blue values */ - cb, cr; /* Adjusted chroma values */ - cups_ib_t *in, /* Input (YCC) pixels */ - *iy, /* Luminance */ - *icb, /* Blue chroma */ - *icr, /* Red chroma */ - *rgb, /* RGB */ - *rgbptr, /* Pointer into RGB data */ - *out; /* Output pixels */ - - - (void)secondary; - - /* - * Get the image orientation... - */ - - fseek(fp, 72, SEEK_SET); - rotation = (getc(fp) & 63) != 8; - - /* - * Seek to the start of the base image... - */ - - fseek(fp, 0x30000, SEEK_SET); - - /* - * Allocate and initialize... - */ - - img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; - img->xppi = 128; - img->yppi = 128; - - if (rotation) - { - img->xsize = 512; - img->ysize = 768; - } - else - { - img->xsize = 768; - img->ysize = 512; - } - - cupsImageSetMaxTiles(img, 0); - - bpp = cupsImageGetDepth(img); - - if ((in = malloc(768 * 3)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - return (1); - } - - if ((out = malloc(768 * bpp)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - free(in); - return (1); - } - - if (bpp > 1) - { - if ((rgb = malloc(768 * 3)) == NULL) - { - fputs("DEBUG: Unable to allocate memory!\n", stderr); - fclose(fp); - free(in); - free(out); - return (1); - } - } - else - rgb = NULL; - - if (rotation) - { - xstart = 767 * bpp; - xdir = -2 * bpp; - } - else - { - xstart = 0; - xdir = 0; - } - - /* - * Read the image file... - */ - - for (y = 0; y < 512; y += 2) - { - /* - * Grab the next two scanlines: - * - * YYYYYYYYYYYYYYY... - * YYYYYYYYYYYYYYY... - * CbCbCb...CrCrCr... - */ - - if (fread(in, 1, 768 * 3, fp) < (768 * 3)) - { - /* - * Couldn't read a row of data - return an error! - */ - - free(in); - free(out); - - if (bpp > 1) - free(rgb); - - return (-1); - } - - /* - * Process the two scanlines... - */ - - for (pass = 0, iy = in; pass < 2; pass ++) - { - if (bpp == 1) - { - /* - * Just extract the luminance channel from the line and put it - * in the image... - */ - - if (primary == CUPS_IMAGE_BLACK) - { - if (rotation) - { - for (rgbptr = out + xstart, x = 0; x < 768; x ++) - *rgbptr-- = 255 - *iy++; - - if (lut) - cupsImageLut(out, 768, lut); - - _cupsImagePutCol(img, 511 - y - pass, 0, 768, out); - } - else - { - cupsImageWhiteToBlack(iy, out, 768); - - if (lut) - cupsImageLut(out, 768, lut); - - _cupsImagePutRow(img, 0, y + pass, 768, out); - iy += 768; - } - } - else if (rotation) - { - for (rgbptr = out + xstart, x = 0; x < 768; x ++) - *rgbptr-- = 255 - *iy++; - - if (lut) - cupsImageLut(out, 768, lut); - - _cupsImagePutCol(img, 511 - y - pass, 0, 768, out); - } - else - { - if (lut) - cupsImageLut(iy, 768, lut); - - _cupsImagePutRow(img, 0, y + pass, 768, iy); - iy += 768; - } - } - else - { - /* - * Convert YCbCr to RGB... While every pixel gets a luminance - * value, adjacent pixels share chroma information. - */ - - cb = cr = 0.0f; - - for (x = 0, rgbptr = rgb + xstart, icb = in + 1536, icr = in + 1920; - x < 768; - x ++, iy ++, rgbptr += xdir) - { - if (!(x & 1)) - { - cb = (float)(*icb - 156); - cr = (float)(*icr - 137); - } - - temp = 92241 * (*iy); - - temp2 = (temp + 86706 * cr) / 65536; - if (temp2 < 0) - *rgbptr++ = 0; - else if (temp2 > 255) - *rgbptr++ = 255; - else - *rgbptr++ = temp2; - - temp2 = (temp - 25914 * cb - 44166 * cr) / 65536; - if (temp2 < 0) - *rgbptr++ = 0; - else if (temp2 > 255) - *rgbptr++ = 255; - else - *rgbptr++ = temp2; - - temp2 = (temp + 133434 * cb) / 65536; - if (temp2 < 0) - *rgbptr++ = 0; - else if (temp2 > 255) - *rgbptr++ = 255; - else - *rgbptr++ = temp2; - - if (x & 1) - { - icb ++; - icr ++; - } - } - - /* - * Adjust the hue and saturation if needed... - */ - - if (saturation != 100 || hue != 0) - cupsImageRGBAdjust(rgb, 768, saturation, hue); - - /* - * Then convert the RGB data to the appropriate colorspace and - * put it in the image... - */ - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(rgb, out, 768); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(rgb, out, 768); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(rgb, out, 768); - break; - } - - if (lut) - cupsImageLut(out, 768 * bpp, lut); - - if (rotation) - _cupsImagePutCol(img, 511 - y - pass, 0, 768, out); - else - _cupsImagePutRow(img, 0, y + pass, 768, out); - } - } - } - - /* - * Free memory and return... - */ - - free(in); - free(out); - if (bpp > 1) - free(rgb); - - return (0); -} - - -/* - * End of "$Id: image-photocd.c 9771 2011-05-12 05:21:56Z mike $". - */ |