diff options
Diffstat (limited to 'filter/image-tiff.c')
-rw-r--r-- | filter/image-tiff.c | 1715 |
1 files changed, 0 insertions, 1715 deletions
diff --git a/filter/image-tiff.c b/filter/image-tiff.c deleted file mode 100644 index e8893d27..00000000 --- a/filter/image-tiff.c +++ /dev/null @@ -1,1715 +0,0 @@ -/* - * "$Id: image-tiff.c 9771 2011-05-12 05:21:56Z mike $" - * - * TIFF file routines for CUPS. - * - * Copyright 2007-2011 by Apple Inc. - * Copyright 1993-2007 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: - * - * _cupsImageReadTIFF() - Read a TIFF image file. - */ - -/* - * Include necessary headers... - */ - -#include "image-private.h" - -#ifdef HAVE_LIBTIFF -# include <tiff.h> /* TIFF image definitions */ -# include <tiffio.h> -# include <unistd.h> - - -/* - * '_cupsImageReadTIFF()' - Read a TIFF image file. - */ - -int /* O - Read status */ -_cupsImageReadTIFF( - 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 */ -{ - TIFF *tif; /* TIFF file */ - uint32 width, height; /* Size of image */ - uint16 photometric, /* Colorspace */ - compression, /* Type of compression */ - orientation, /* Orientation */ - resunit, /* Units for resolution */ - samples, /* Number of samples/pixel */ - bits, /* Number of bits/pixel */ - inkset, /* Ink set for color separations */ - numinks; /* Number of inks in set */ - float xres, /* Horizontal resolution */ - yres; /* Vertical resolution */ - uint16 *redcmap, /* Red colormap information */ - *greencmap, /* Green colormap information */ - *bluecmap; /* Blue colormap information */ - int c, /* Color index */ - num_colors, /* Number of colors */ - bpp, /* Bytes per pixel */ - x, y, /* Current x & y */ - row, /* Current row in image */ - xstart, ystart, /* Starting x & y */ - xdir, ydir, /* X & y direction */ - xcount, ycount, /* X & Y counters */ - pstep, /* Pixel step (= bpp or -2 * bpp) */ - scanwidth, /* Width of scanline */ - r, g, b, k, /* Red, green, blue, and black values */ - alpha; /* cupsImage includes alpha? */ - cups_ib_t *in, /* Input buffer */ - *out, /* Output buffer */ - *p, /* Pointer into buffer */ - *scanline, /* Scanline buffer */ - *scanptr, /* Pointer into scanline buffer */ - bit, /* Current bit */ - pixel, /* Current pixel */ - zero, /* Zero value (bitmaps) */ - one; /* One value (bitmaps) */ - - - /* - * Open the TIFF file and get the required parameters... - */ - - lseek(fileno(fp), 0, SEEK_SET); /* Work around "feature" in some stdio's */ - - if ((tif = TIFFFdOpen(fileno(fp), "", "r")) == NULL) - { - fputs("DEBUG: TIFFFdOpen() failed!\n", stderr); - fclose(fp); - return (-1); - } - - if (!TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width)) - { - fputs("DEBUG: No image width tag in the file!\n", stderr); - TIFFClose(tif); - fclose(fp); - return (-1); - } - - if (!TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height)) - { - fputs("DEBUG: No image height tag in the file!\n", stderr); - TIFFClose(tif); - fclose(fp); - return (-1); - } - - if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric)) - { - fputs("DEBUG: No photometric tag in the file!\n", stderr); - TIFFClose(tif); - fclose(fp); - return (-1); - } - - if (!TIFFGetField(tif, TIFFTAG_COMPRESSION, &compression)) - { - fputs("DEBUG: No compression tag in the file!\n", stderr); - TIFFClose(tif); - fclose(fp); - return (-1); - } - - if (!TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samples)) - samples = 1; - - if (!TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bits)) - bits = 1; - - /* - * Get the image orientation... - */ - - if (!TIFFGetField(tif, TIFFTAG_ORIENTATION, &orientation)) - orientation = 0; - - /* - * Get the image resolution... - */ - - if (TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres) && - TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres) && - TIFFGetField(tif, TIFFTAG_RESOLUTIONUNIT, &resunit)) - { - if (resunit == RESUNIT_INCH) - { - img->xppi = xres; - img->yppi = yres; - } - else if (resunit == RESUNIT_CENTIMETER) - { - img->xppi = xres * 2.54; - img->yppi = yres * 2.54; - } - else - { - img->xppi = 128; - img->yppi = 128; - } - - if (img->xppi == 0 || img->yppi == 0) - { - fputs("DEBUG: Bad TIFF resolution.\n", stderr); - img->xppi = img->yppi = 128; - } - - fprintf(stderr, "DEBUG: TIFF resolution = %fx%f, units=%d\n", - xres, yres, resunit); - fprintf(stderr, "DEBUG: Stored resolution = %dx%d PPI\n", - img->xppi, img->yppi); - } - - /* - * See if the image has an alpha channel... - */ - - if (samples == 2 || (samples == 4 && photometric == PHOTOMETRIC_RGB)) - alpha = 1; - else - alpha = 0; - - /* - * Check the size of the image... - */ - - if (width == 0 || width > CUPS_IMAGE_MAX_WIDTH || - height == 0 || height > CUPS_IMAGE_MAX_HEIGHT || - (bits != 1 && bits != 2 && bits != 4 && bits != 8) || - samples < 1 || samples > 4) - { - fprintf(stderr, "DEBUG: Bad TIFF dimensions %ux%ux%ux%u!\n", - (unsigned)width, (unsigned)height, (unsigned)bits, - (unsigned)samples); - TIFFClose(tif); - fclose(fp); - return (1); - } - - /* - * Setup the image size and colorspace... - */ - - img->xsize = width; - img->ysize = height; - if (photometric == PHOTOMETRIC_MINISBLACK || - photometric == PHOTOMETRIC_MINISWHITE) - img->colorspace = secondary; - else if (photometric == PHOTOMETRIC_SEPARATED && primary == CUPS_IMAGE_RGB_CMYK) - img->colorspace = CUPS_IMAGE_CMYK; - else if (primary == CUPS_IMAGE_RGB_CMYK) - img->colorspace = CUPS_IMAGE_RGB; - else - img->colorspace = primary; - - fprintf(stderr, "DEBUG: img->colorspace = %d\n", img->colorspace); - - bpp = cupsImageGetDepth(img); - - cupsImageSetMaxTiles(img, 0); - - /* - * Set the X & Y start and direction according to the image orientation... - */ - - switch (orientation) - { - case ORIENTATION_TOPRIGHT : - fputs("DEBUG: orientation = top-right\n", stderr); - break; - case ORIENTATION_RIGHTTOP : - fputs("DEBUG: orientation = right-top\n", stderr); - break; - default : - case ORIENTATION_TOPLEFT : - fputs("DEBUG: orientation = top-left\n", stderr); - break; - case ORIENTATION_LEFTTOP : - fputs("DEBUG: orientation = left-top\n", stderr); - break; - case ORIENTATION_BOTLEFT : - fputs("DEBUG: orientation = bottom-left\n", stderr); - break; - case ORIENTATION_LEFTBOT : - fputs("DEBUG: orientation = left-bottom\n", stderr); - break; - case ORIENTATION_BOTRIGHT : - fputs("DEBUG: orientation = bottom-right\n", stderr); - break; - case ORIENTATION_RIGHTBOT : - fputs("DEBUG: orientation = right-bottom\n", stderr); - break; - } - - switch (orientation) - { - case ORIENTATION_TOPRIGHT : - case ORIENTATION_RIGHTTOP : - xstart = img->xsize - 1; - xdir = -1; - ystart = 0; - ydir = 1; - break; - default : - case ORIENTATION_TOPLEFT : - case ORIENTATION_LEFTTOP : - xstart = 0; - xdir = 1; - ystart = 0; - ydir = 1; - break; - case ORIENTATION_BOTLEFT : - case ORIENTATION_LEFTBOT : - xstart = 0; - xdir = 1; - ystart = img->ysize - 1; - ydir = -1; - break; - case ORIENTATION_BOTRIGHT : - case ORIENTATION_RIGHTBOT : - xstart = img->xsize - 1; - xdir = -1; - ystart = img->ysize - 1; - ydir = -1; - break; - } - - /* - * Allocate a scanline buffer... - */ - - scanwidth = TIFFScanlineSize(tif); - scanline = _TIFFmalloc(scanwidth); - - /* - * Allocate input and output buffers... - */ - - if (orientation < ORIENTATION_LEFTTOP) - { - if (samples > 1 || photometric == PHOTOMETRIC_PALETTE) - pstep = xdir * 3; - else - pstep = xdir; - - in = malloc(img->xsize * 3 + 3); - out = malloc(img->xsize * bpp); - } - else - { - if (samples > 1 || photometric == PHOTOMETRIC_PALETTE) - pstep = ydir * 3; - else - pstep = ydir; - - in = malloc(img->ysize * 3 + 3); - out = malloc(img->ysize * bpp); - } - - /* - * Read the image. This is greatly complicated by the fact that TIFF - * supports literally hundreds of different colorspaces and orientations, - * each which must be handled separately... - */ - - fprintf(stderr, "DEBUG: photometric = %d\n", photometric); - fprintf(stderr, "DEBUG: compression = %d\n", compression); - - switch (photometric) - { - case PHOTOMETRIC_MINISWHITE : - case PHOTOMETRIC_MINISBLACK : - if (photometric == PHOTOMETRIC_MINISWHITE) - { - zero = 255; - one = 0; - } - else - { - zero = 0; - one = 255; - } - - if (orientation < ORIENTATION_LEFTTOP) - { - /* - * Row major order... - */ - - for (y = ystart, ycount = img->ysize, row = 0; - ycount > 0; - ycount --, y += ydir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart, bit = 128; - xcount > 0; - xcount --, p += pstep) - { - if (*scanptr & bit) - *p = one; - else - *p = zero; - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart, bit = 0xc0; - xcount > 0; - xcount --, p += pstep) - { - pixel = *scanptr & bit; - while (pixel > 3) - pixel >>= 2; - *p = (255 * pixel / 3) ^ zero; - - if (bit > 3) - bit >>= 2; - else - { - bit = 0xc0; - scanptr ++; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart, bit = 0xf0; - xcount > 0; - xcount --, p += pstep) - { - if (bit == 0xf0) - { - *p = (255 * ((*scanptr & 0xf0) >> 4) / 15) ^ zero; - bit = 0x0f; - } - else - { - *p = (255 * (*scanptr & 0x0f) / 15) ^ zero; - bit = 0xf0; - scanptr ++; - } - } - } - else if (xdir < 0 || zero || alpha) - { - TIFFReadScanline(tif, scanline, row, 0); - - if (alpha) - { - if (zero) - { - for (xcount = img->xsize, p = in + xstart, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr += 2) - *p = (scanptr[1] * (255 - scanptr[0]) + - (255 - scanptr[1]) * 255) / 255; - } - else - { - for (xcount = img->xsize, p = in + xstart, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr += 2) - *p = (scanptr[1] * scanptr[0] + - (255 - scanptr[1]) * 255) / 255; - } - } - else - { - if (zero) - { - for (xcount = img->xsize, p = in + xstart, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr ++) - *p = 255 - *scanptr; - } - else - { - for (xcount = img->xsize, p = in + xstart, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr ++) - *p = *scanptr; - } - } - } - else - TIFFReadScanline(tif, in, row, 0); - - if (img->colorspace == CUPS_IMAGE_WHITE) - { - if (lut) - cupsImageLut(in, img->xsize, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, in); - } - else - { - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_RGB : - 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 - { - /* - * Column major order... - */ - - for (x = xstart, xcount = img->xsize, row = 0; - xcount > 0; - xcount --, x += xdir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart, bit = 128; - ycount > 0; - ycount --, p += ydir) - { - if (*scanptr & bit) - *p = one; - else - *p = zero; - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart, bit = 0xc0; - ycount > 0; - ycount --, p += ydir) - { - pixel = *scanptr & 0xc0; - while (pixel > 3) - pixel >>= 2; - - *p = (255 * pixel / 3) ^ zero; - - if (bit > 3) - bit >>= 2; - else - { - bit = 0xc0; - scanptr ++; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart, bit = 0xf0; - ycount > 0; - ycount --, p += ydir) - { - if (bit == 0xf0) - { - *p = (255 * ((*scanptr & 0xf0) >> 4) / 15) ^ zero; - bit = 0x0f; - } - else - { - *p = (255 * (*scanptr & 0x0f) / 15) ^ zero; - bit = 0xf0; - scanptr ++; - } - } - } - else if (ydir < 0 || zero || alpha) - { - TIFFReadScanline(tif, scanline, row, 0); - - if (alpha) - { - if (zero) - { - for (ycount = img->ysize, p = in + ystart, scanptr = scanline; - ycount > 0; - ycount --, p += ydir, scanptr += 2) - *p = (scanptr[1] * (255 - scanptr[0]) + - (255 - scanptr[1]) * 255) / 255; - } - else - { - for (ycount = img->ysize, p = in + ystart, scanptr = scanline; - ycount > 0; - ycount --, p += ydir, scanptr += 2) - *p = (scanptr[1] * scanptr[0] + - (255 - scanptr[1]) * 255) / 255; - } - } - else - { - if (zero) - { - for (ycount = img->ysize, p = in + ystart, scanptr = scanline; - ycount > 0; - ycount --, p += ydir, scanptr ++) - *p = 255 - *scanptr; - } - else - { - for (ycount = img->ysize, p = in + ystart, scanptr = scanline; - ycount > 0; - ycount --, p += ydir, scanptr ++) - *p = *scanptr; - } - } - } - else - TIFFReadScanline(tif, in, row, 0); - - if (img->colorspace == CUPS_IMAGE_WHITE) - { - if (lut) - cupsImageLut(in, img->ysize, lut); - - _cupsImagePutCol(img, x, 0, img->ysize, in); - } - else - { - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_RGB : - cupsImageWhiteToRGB(in, out, img->ysize); - break; - case CUPS_IMAGE_BLACK : - cupsImageWhiteToBlack(in, out, img->ysize); - break; - case CUPS_IMAGE_CMY : - cupsImageWhiteToCMY(in, out, img->ysize); - break; - case CUPS_IMAGE_CMYK : - cupsImageWhiteToCMYK(in, out, img->ysize); - break; - } - - if (lut) - cupsImageLut(out, img->ysize * bpp, lut); - - _cupsImagePutCol(img, x, 0, img->ysize, out); - } - } - } - break; - - case PHOTOMETRIC_PALETTE : - if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &redcmap, &greencmap, &bluecmap)) - { - fputs("DEBUG: No colormap tag in the file!\n", stderr); - fclose(fp); - return (-1); - } - - num_colors = 1 << bits; - - for (c = 0; c < num_colors; c ++) - { - redcmap[c] >>= 8; - greencmap[c] >>= 8; - bluecmap[c] >>= 8; - } - - if (orientation < ORIENTATION_LEFTTOP) - { - /* - * Row major order... - */ - - for (y = ystart, ycount = img->ysize, row = 0; - ycount > 0; - ycount --, y += ydir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, - p = in + xstart * 3, bit = 128; - xcount > 0; - xcount --, p += pstep) - { - if (*scanptr & bit) - { - p[0] = redcmap[1]; - p[1] = greencmap[1]; - p[2] = bluecmap[1]; - } - else - { - p[0] = redcmap[0]; - p[1] = greencmap[0]; - p[2] = bluecmap[0]; - } - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, - p = in + xstart * 3, bit = 0xc0; - xcount > 0; - xcount --, p += pstep) - { - pixel = *scanptr & bit; - while (pixel > 3) - pixel >>= 2; - - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - - if (bit > 3) - bit >>= 2; - else - { - bit = 0xc0; - scanptr ++; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, - p = in + 3 * xstart, bit = 0xf0; - xcount > 0; - xcount --, p += pstep) - { - if (bit == 0xf0) - { - pixel = (*scanptr & 0xf0) >> 4; - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - bit = 0x0f; - } - else - { - pixel = *scanptr++ & 0x0f; - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - bit = 0xf0; - } - } - } - else - { - TIFFReadScanline(tif, scanline, row, 0); - - for (xcount = img->xsize, p = in + 3 * xstart, scanptr = scanline; - xcount > 0; - xcount --, p += pstep) - { - p[0] = redcmap[*scanptr]; - p[1] = greencmap[*scanptr]; - p[2] = bluecmap[*scanptr++]; - } - } - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->xsize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(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); - } - } - else - { - /* - * Column major order... - */ - - for (x = xstart, xcount = img->xsize, row = 0; - xcount > 0; - xcount --, x += xdir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, - p = in + 3 * ystart, bit = 128; - ycount > 0; - ycount --, p += ydir) - { - if (*scanptr & bit) - { - p[0] = redcmap[1]; - p[1] = greencmap[1]; - p[2] = bluecmap[1]; - } - else - { - p[0] = redcmap[0]; - p[1] = greencmap[0]; - p[2] = bluecmap[0]; - } - - if (bit > 1) - bit >>= 1; - else - { - bit = 128; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, - p = in + 3 * ystart, bit = 0xc0; - ycount > 0; - ycount --, p += ydir) - { - pixel = *scanptr & 0xc0; - while (pixel > 3) - pixel >>= 2; - - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - - if (bit > 3) - bit >>= 2; - else - { - bit = 0xc0; - scanptr ++; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, - p = in + 3 * ystart, bit = 0xf0; - ycount > 0; - ycount --, p += ydir) - { - if (bit == 0xf0) - { - pixel = (*scanptr & 0xf0) >> 4; - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - bit = 0x0f; - } - else - { - pixel = *scanptr++ & 0x0f; - p[0] = redcmap[pixel]; - p[1] = greencmap[pixel]; - p[2] = bluecmap[pixel]; - bit = 0xf0; - } - } - } - else - { - TIFFReadScanline(tif, scanline, row, 0); - - for (ycount = img->ysize, p = in + 3 * ystart, scanptr = scanline; - ycount > 0; - ycount --, p += ydir) - { - p[0] = redcmap[*scanptr]; - p[1] = greencmap[*scanptr]; - p[2] = bluecmap[*scanptr++]; - } - } - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->ysize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->ysize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->ysize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->ysize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->ysize); - break; - } - - if (lut) - cupsImageLut(out, img->ysize * bpp, lut); - - _cupsImagePutCol(img, x, 0, img->ysize, out); - } - } - break; - - case PHOTOMETRIC_RGB : - if (orientation < ORIENTATION_LEFTTOP) - { - /* - * Row major order... - */ - - for (y = ystart, ycount = img->ysize, row = 0; - ycount > 0; - ycount --, y += ydir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3, bit = 0xf0; - xcount > 0; - xcount --, p += pstep) - { - if (*scanptr & bit & 0x88) - p[0] = 255; - else - p[0] = 0; - - if (*scanptr & bit & 0x44) - p[1] = 255; - else - p[1] = 0; - - if (*scanptr & bit & 0x22) - p[2] = 255; - else - p[2] = 0; - - if (bit == 0xf0) - bit = 0x0f; - else - { - bit = 0xf0; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; - xcount > 0; - xcount --, p += pstep, scanptr ++) - { - pixel = *scanptr >> 2; - p[0] = 255 * (pixel & 3) / 3; - pixel >>= 2; - p[1] = 255 * (pixel & 3) / 3; - pixel >>= 2; - p[2] = 255 * (pixel & 3) / 3; - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; - xcount > 0; - xcount -= 2, p += 2 * pstep, scanptr += 3) - { - pixel = scanptr[0]; - p[1] = 255 * (pixel & 15) / 15; - pixel >>= 4; - p[0] = 255 * (pixel & 15) / 15; - pixel = scanptr[1]; - p[2] = 255 * ((pixel >> 4) & 15) / 15; - - if (xcount > 1) - { - p[pstep + 0] = 255 * (pixel & 15) / 15; - pixel = scanptr[2]; - p[pstep + 2] = 255 * (pixel & 15) / 15; - pixel >>= 4; - p[pstep + 1] = 255 * (pixel & 15) / 15; - } - } - } - else if (xdir < 0 || alpha) - { - TIFFReadScanline(tif, scanline, row, 0); - - if (alpha) - { - for (xcount = img->xsize, p = in + xstart * 3, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr += 4) - { - p[0] = (scanptr[0] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - p[1] = (scanptr[1] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - p[2] = (scanptr[2] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - } - } - else - { - for (xcount = img->xsize, p = in + xstart * 3, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr += 3) - { - p[0] = scanptr[0]; - p[1] = scanptr[1]; - p[2] = scanptr[2]; - } - } - } - else - TIFFReadScanline(tif, in, row, 0); - - if ((saturation != 100 || hue != 0) && bpp > 1) - 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 : - cupsImageRGBToRGB(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); - } - } - else - { - /* - * Column major order... - */ - - for (x = xstart, xcount = img->xsize, row = 0; - xcount > 0; - xcount --, x += xdir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart * 3, bit = 0xf0; - ycount > 0; - ycount --, p += pstep) - { - if (*scanptr & bit & 0x88) - p[0] = 255; - else - p[0] = 0; - - if (*scanptr & bit & 0x44) - p[1] = 255; - else - p[1] = 0; - - if (*scanptr & bit & 0x22) - p[2] = 255; - else - p[2] = 0; - - if (bit == 0xf0) - bit = 0x0f; - else - { - bit = 0xf0; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart * 3; - ycount > 0; - ycount --, p += pstep, scanptr ++) - { - pixel = *scanptr >> 2; - p[0] = 255 * (pixel & 3) / 3; - pixel >>= 2; - p[1] = 255 * (pixel & 3) / 3; - pixel >>= 2; - p[2] = 255 * (pixel & 3) / 3; - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + ystart * 3; - ycount > 0; - ycount -= 2, p += 2 * pstep, scanptr += 3) - { - pixel = scanptr[0]; - p[1] = 255 * (pixel & 15) / 15; - pixel >>= 4; - p[0] = 255 * (pixel & 15) / 15; - pixel = scanptr[1]; - p[2] = 255 * ((pixel >> 4) & 15) / 15; - - if (ycount > 1) - { - p[pstep + 0] = 255 * (pixel & 15) / 15; - pixel = scanptr[2]; - p[pstep + 2] = 255 * (pixel & 15) / 15; - pixel >>= 4; - p[pstep + 1] = 255 * (pixel & 15) / 15; - } - } - } - else if (ydir < 0 || alpha) - { - TIFFReadScanline(tif, scanline, row, 0); - - if (alpha) - { - for (ycount = img->ysize, p = in + ystart * 3, scanptr = scanline; - ycount > 0; - ycount --, p += pstep, scanptr += 4) - { - p[0] = (scanptr[0] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - p[1] = (scanptr[1] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - p[2] = (scanptr[2] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; - } - } - else - { - for (ycount = img->ysize, p = in + ystart * 3, scanptr = scanline; - ycount > 0; - ycount --, p += pstep, scanptr += 3) - { - p[0] = scanptr[0]; - p[1] = scanptr[1]; - p[2] = scanptr[2]; - } - } - } - else - TIFFReadScanline(tif, in, row, 0); - - if ((saturation != 100 || hue != 0) && bpp > 1) - cupsImageRGBAdjust(in, img->ysize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->ysize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->ysize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->ysize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->ysize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->ysize); - break; - } - - if (lut) - cupsImageLut(out, img->ysize * bpp, lut); - - _cupsImagePutCol(img, x, 0, img->ysize, out); - } - } - break; - - case PHOTOMETRIC_SEPARATED : - inkset = INKSET_CMYK; - numinks = 4; - -#ifdef TIFFTAG_NUMBEROFINKS - if (!TIFFGetField(tif, TIFFTAG_INKSET, &inkset) && - !TIFFGetField(tif, TIFFTAG_NUMBEROFINKS, &numinks)) -#else - if (!TIFFGetField(tif, TIFFTAG_INKSET, &inkset)) -#endif /* TIFFTAG_NUMBEROFINKS */ - { - fputs("WARNING: No inkset or number-of-inks tag in the file!\n", stderr); - } - - if (inkset == INKSET_CMYK || numinks == 4) - { - if (orientation < ORIENTATION_LEFTTOP) - { - /* - * Row major order... - */ - - for (y = ystart, ycount = img->ysize, row = 0; - ycount > 0; - ycount --, y += ydir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3, bit = 0xf0; - xcount > 0; - xcount --, p += pstep) - { - if (*scanptr & bit & 0x11) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - if (*scanptr & bit & 0x88) - p[0] = 0; - else - p[0] = 255; - - if (*scanptr & bit & 0x44) - p[1] = 0; - else - p[1] = 255; - - if (*scanptr & bit & 0x22) - p[2] = 0; - else - p[2] = 255; - } - - if (bit == 0xf0) - bit = 0x0f; - else - { - bit = 0xf0; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; - xcount > 0; - xcount --, p += pstep, scanptr ++) - { - pixel = *scanptr; - k = 255 * (pixel & 3) / 3; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - pixel >>= 2; - b = 255 - 255 * (pixel & 3) / 3 - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - - pixel >>= 2; - g = 255 - 255 * (pixel & 3) / 3 - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - pixel >>= 2; - r = 255 - 255 * (pixel & 3) / 3 - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; - xcount > 0; - xcount --, p += pstep, scanptr += 2) - { - pixel = scanptr[1]; - k = 255 * (pixel & 15) / 15; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - pixel >>= 4; - b = 255 - 255 * (pixel & 15) / 15 - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - - pixel = scanptr[0]; - g = 255 - 255 * (pixel & 15) / 15 - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - pixel >>= 4; - r = 255 - 255 * (pixel & 15) / 15 - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - } - } - } - else if (img->colorspace == CUPS_IMAGE_CMYK) - { - TIFFReadScanline(tif, scanline, row, 0); - _cupsImagePutRow(img, 0, y, img->xsize, scanline); - } - else - { - TIFFReadScanline(tif, scanline, row, 0); - - for (xcount = img->xsize, p = in + xstart * 3, scanptr = scanline; - xcount > 0; - xcount --, p += pstep, scanptr += 4) - { - k = scanptr[3]; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - r = 255 - scanptr[0] - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - - g = 255 - scanptr[1] - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - b = 255 - scanptr[2] - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - } - } - } - - if ((saturation != 100 || hue != 0) && bpp > 1) - 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 : - cupsImageRGBToRGB(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 * 3, lut); - - _cupsImagePutRow(img, 0, y, img->xsize, out); - } - } - else - { - /* - * Column major order... - */ - - for (x = xstart, xcount = img->xsize, row = 0; - xcount > 0; - xcount --, x += xdir, row ++) - { - if (bits == 1) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + xstart * 3, bit = 0xf0; - ycount > 0; - ycount --, p += pstep) - { - if (*scanptr & bit & 0x11) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - if (*scanptr & bit & 0x88) - p[0] = 0; - else - p[0] = 255; - - if (*scanptr & bit & 0x44) - p[1] = 0; - else - p[1] = 255; - - if (*scanptr & bit & 0x22) - p[2] = 0; - else - p[2] = 255; - } - - if (bit == 0xf0) - bit = 0x0f; - else - { - bit = 0xf0; - scanptr ++; - } - } - } - else if (bits == 2) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + xstart * 3; - ycount > 0; - ycount --, p += pstep, scanptr ++) - { - pixel = *scanptr; - k = 255 * (pixel & 3) / 3; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - pixel >>= 2; - b = 255 - 255 * (pixel & 3) / 3 - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - - pixel >>= 2; - g = 255 - 255 * (pixel & 3) / 3 - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - pixel >>= 2; - r = 255 - 255 * (pixel & 3) / 3 - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - } - } - } - else if (bits == 4) - { - TIFFReadScanline(tif, scanline, row, 0); - for (ycount = img->ysize, scanptr = scanline, p = in + xstart * 3; - ycount > 0; - ycount --, p += pstep, scanptr += 2) - { - pixel = scanptr[1]; - k = 255 * (pixel & 15) / 15; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - pixel >>= 4; - b = 255 - 255 * (pixel & 15) / 15 - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - - pixel = scanptr[0]; - g = 255 - 255 * (pixel & 15) / 15 - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - pixel >>= 4; - r = 255 - 255 * (pixel & 15) / 15 - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - } - } - } - else if (img->colorspace == CUPS_IMAGE_CMYK) - { - TIFFReadScanline(tif, scanline, row, 0); - _cupsImagePutCol(img, x, 0, img->ysize, scanline); - } - else - { - TIFFReadScanline(tif, scanline, row, 0); - - for (ycount = img->ysize, p = in + xstart * 3, scanptr = scanline; - ycount > 0; - ycount --, p += pstep, scanptr += 4) - { - k = scanptr[3]; - if (k == 255) - { - p[0] = 0; - p[1] = 0; - p[2] = 0; - } - else - { - r = 255 - scanptr[0] - k; - if (r < 0) - p[0] = 0; - else if (r < 256) - p[0] = r; - else - p[0] = 255; - - g = 255 - scanptr[1] - k; - if (g < 0) - p[1] = 0; - else if (g < 256) - p[1] = g; - else - p[1] = 255; - - b = 255 - scanptr[2] - k; - if (b < 0) - p[2] = 0; - else if (b < 256) - p[2] = b; - else - p[2] = 255; - } - } - } - - if ((saturation != 100 || hue != 0) && bpp > 1) - cupsImageRGBAdjust(in, img->ysize, saturation, hue); - - switch (img->colorspace) - { - default : - break; - - case CUPS_IMAGE_WHITE : - cupsImageRGBToWhite(in, out, img->ysize); - break; - case CUPS_IMAGE_RGB : - cupsImageRGBToRGB(in, out, img->ysize); - break; - case CUPS_IMAGE_BLACK : - cupsImageRGBToBlack(in, out, img->ysize); - break; - case CUPS_IMAGE_CMY : - cupsImageRGBToCMY(in, out, img->ysize); - break; - case CUPS_IMAGE_CMYK : - cupsImageRGBToCMYK(in, out, img->ysize); - break; - } - - if (lut) - cupsImageLut(out, img->ysize * bpp, lut); - - _cupsImagePutCol(img, x, 0, img->ysize, out); - } - } - - break; - } - - default : - _TIFFfree(scanline); - free(in); - free(out); - - TIFFClose(tif); - fputs("DEBUG: Unknown TIFF photometric value!\n", stderr); - return (-1); - } - - /* - * Free temporary buffers, close the TIFF file, and return. - */ - - _TIFFfree(scanline); - free(in); - free(out); - - TIFFClose(tif); - return (0); -} -#endif /* HAVE_LIBTIFF */ - - -/* - * End of "$Id: image-tiff.c 9771 2011-05-12 05:21:56Z mike $". - */ |