summaryrefslogtreecommitdiff
path: root/filter/image-bmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'filter/image-bmp.c')
-rw-r--r--filter/image-bmp.c545
1 files changed, 0 insertions, 545 deletions
diff --git a/filter/image-bmp.c b/filter/image-bmp.c
deleted file mode 100644
index dde040b8..00000000
--- a/filter/image-bmp.c
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * "$Id: image-bmp.c 9771 2011-05-12 05:21:56Z mike $"
- *
- * BMP image 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:
- *
- * _cupsImageReadBMP() - Read a BMP image file.
- * read_word() - Read a 16-bit unsigned integer.
- * read_dword() - Read a 32-bit unsigned integer.
- * read_long() - Read a 32-bit signed integer.
- */
-
-/*
- * Include necessary headers...
- */
-
-#include "image-private.h"
-
-
-/*
- * Constants for the bitmap compression...
- */
-
-# define BI_RGB 0 /* No compression - straight BGR data */
-# define BI_RLE8 1 /* 8-bit run-length compression */
-# define BI_RLE4 2 /* 4-bit run-length compression */
-# define BI_BITFIELDS 3 /* RGB bitmap with RGB masks */
-
-
-/*
- * Local functions...
- */
-
-static unsigned short read_word(FILE *fp);
-static unsigned int read_dword(FILE *fp);
-static int read_long(FILE *fp);
-
-
-/*
- * '_cupsImageReadBMP()' - Read a BMP image file.
- */
-
-int /* O - Read status */
-_cupsImageReadBMP(
- 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 offset, /* Offset to bitmap data */
- info_size, /* Size of info header */
- planes, /* Number of planes (always 1) */
- depth, /* Depth of image (bits) */
- compression, /* Type of compression */
- image_size, /* Size of image in bytes */
- colors_used, /* Number of colors used */
- colors_important, /* Number of important colors */
- bpp, /* Bytes per pixel */
- x, y, /* Looping vars */
- color, /* Color of RLE pixel */
- count, /* Number of times to repeat */
- temp, /* Temporary color */
- align; /* Alignment bytes */
- cups_ib_t bit, /* Bit in image */
- byte; /* Byte in image */
- cups_ib_t *in, /* Input pixels */
- *out, /* Output pixels */
- *ptr; /* Pointer into pixels */
- cups_ib_t colormap[256][4]; /* Colormap */
-
-
- (void)secondary;
-
- /*
- * Get the header...
- */
-
- getc(fp); /* Skip "BM" sync chars */
- getc(fp);
- read_dword(fp); /* Skip size */
- read_word(fp); /* Skip reserved stuff */
- read_word(fp);
- offset = read_dword(fp);
-
- fprintf(stderr, "DEBUG: offset = %d\n", offset);
-
- if (offset < 0)
- {
- fprintf(stderr, "DEBUG: Bad BMP offset %d\n", offset);
- fclose(fp);
- return (1);
- }
-
- /*
- * Then the bitmap information...
- */
-
- info_size = read_dword(fp);
- img->xsize = read_long(fp);
- img->ysize = read_long(fp);
- planes = read_word(fp);
- depth = read_word(fp);
- compression = read_dword(fp);
- image_size = read_dword(fp);
- img->xppi = read_long(fp) * 0.0254 + 0.5;
- img->yppi = read_long(fp) * 0.0254 + 0.5;
- colors_used = read_dword(fp);
- colors_important = read_dword(fp);
-
- if (img->xsize == 0 || img->xsize > CUPS_IMAGE_MAX_WIDTH ||
- img->ysize == 0 || img->ysize > CUPS_IMAGE_MAX_HEIGHT ||
- (depth != 1 && depth != 4 && depth != 8 && depth != 24))
- {
- fprintf(stderr, "DEBUG: Bad BMP dimensions %ux%ux%d\n",
- img->xsize, img->ysize, depth);
- fclose(fp);
- return (1);
- }
-
- if (colors_used < 0 || colors_used > 256)
- {
- fprintf(stderr, "DEBUG: Bad BMP colormap size %d\n", colors_used);
- fclose(fp);
- return (1);
- }
-
- if (img->xppi == 0 || img->yppi == 0)
- {
- fprintf(stderr, "DEBUG: Bad BMP resolution %dx%d PPI.\n",
- img->xppi, img->yppi);
- img->xppi = img->yppi = 128;
- }
-
- /*
- * Make sure the resolution info is valid...
- */
-
- fprintf(stderr, "info_size = %d, xsize = %d, ysize = %d, planes = %d, depth = %d\n",
- info_size, img->xsize, img->ysize, planes, depth);
- fprintf(stderr, "compression = %d, image_size = %d, xppi = %d, yppi = %d\n",
- compression, image_size, img->xppi, img->yppi);
- fprintf(stderr, "colors_used = %d, colors_important = %d\n", colors_used,
- colors_important);
-
- if (info_size > 40)
- for (info_size -= 40; info_size > 0; info_size --)
- getc(fp);
-
- /*
- * Get colormap...
- */
-
- if (colors_used == 0 && depth <= 8)
- colors_used = 1 << depth;
-
- if (colors_used > 0)
- fread(colormap, colors_used, 4, fp);
- else
- memset(colormap, 0, sizeof(colormap));
-
- /*
- * Setup image and buffers...
- */
-
- img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary;
-
- cupsImageSetMaxTiles(img, 0);
-
- bpp = cupsImageGetDepth(img);
-
- if ((in = malloc(img->xsize * 3)) == 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);
- free(in);
- fclose(fp);
- return (1);
- }
-
- /*
- * Read the image data...
- */
-
- color = 0;
- count = 0;
- align = 0;
-
- for (y = img->ysize - 1; y >= 0; y --)
- {
- ptr = in;
-
- switch (depth)
- {
- case 1 : /* Bitmap */
- for (x = img->xsize, bit = 128, byte = 0; x > 0; x --)
- {
- if (bit == 128)
- byte = getc(fp);
-
- if (byte & bit)
- {
- *ptr++ = colormap[1][2];
- *ptr++ = colormap[1][1];
- *ptr++ = colormap[1][0];
- }
- else
- {
- *ptr++ = colormap[0][2];
- *ptr++ = colormap[0][1];
- *ptr++ = colormap[0][0];
- }
-
- if (bit > 1)
- bit >>= 1;
- else
- bit = 128;
- }
-
- /*
- * Read remaining bytes to align to 32 bits...
- */
-
- for (temp = (img->xsize + 7) / 8; temp & 3; temp ++)
- getc(fp);
- break;
-
- case 4 : /* 16-color */
- for (x = img->xsize, bit = 0xf0, temp = 0; x > 0; x --)
- {
- /*
- * Get a new count as needed...
- */
-
- if (compression != BI_RLE4 && count == 0)
- {
- count = 2;
- color = -1;
- }
-
- if (count == 0)
- {
- while (align > 0)
- {
- align --;
- getc(fp);
- }
-
- if ((count = getc(fp)) == 0)
- {
- if ((count = getc(fp)) == 0)
- {
- /*
- * End of line...
- */
-
- x ++;
- continue;
- }
- else if (count == 1)
- {
- /*
- * End of image...
- */
-
- break;
- }
- else if (count == 2)
- {
- /*
- * Delta...
- */
-
- count = getc(fp) * getc(fp) * img->xsize;
- color = 0;
- }
- else
- {
- /*
- * Absolute...
- */
-
- color = -1;
- align = ((4 - (count & 3)) / 2) & 1;
- }
- }
- else
- color = getc(fp);
- }
-
- /*
- * Get a new color as needed...
- */
-
- count --;
-
- if (bit == 0xf0)
- {
- if (color < 0)
- temp = getc(fp);
- else
- temp = color;
-
- /*
- * Copy the color value...
- */
-
- *ptr++ = colormap[temp >> 4][2];
- *ptr++ = colormap[temp >> 4][1];
- *ptr++ = colormap[temp >> 4][0];
- bit = 0x0f;
- }
- else
- {
- /*
- * Copy the color value...
- */
-
- *ptr++ = colormap[temp & 15][2];
- *ptr++ = colormap[temp & 15][1];
- *ptr++ = colormap[temp & 15][0];
- bit = 0xf0;
- }
- }
- break;
-
- case 8 : /* 256-color */
- for (x = img->xsize; x > 0; x --)
- {
- /*
- * Get a new count as needed...
- */
-
- if (compression != BI_RLE8)
- {
- count = 1;
- color = -1;
- }
-
- if (count == 0)
- {
- while (align > 0)
- {
- align --;
- getc(fp);
- }
-
- if ((count = getc(fp)) == 0)
- {
- if ((count = getc(fp)) == 0)
- {
- /*
- * End of line...
- */
-
- x ++;
- continue;
- }
- else if (count == 1)
- {
- /*
- * End of image...
- */
-
- break;
- }
- else if (count == 2)
- {
- /*
- * Delta...
- */
-
- count = getc(fp) * getc(fp) * img->xsize;
- color = 0;
- }
- else
- {
- /*
- * Absolute...
- */
-
- color = -1;
- align = (2 - (count & 1)) & 1;
- }
- }
- else
- color = getc(fp);
- }
-
- /*
- * Get a new color as needed...
- */
-
- if (color < 0)
- temp = getc(fp);
- else
- temp = color;
-
- count --;
-
- /*
- * Copy the color value...
- */
-
- *ptr++ = colormap[temp][2];
- *ptr++ = colormap[temp][1];
- *ptr++ = colormap[temp][0];
- }
- break;
-
- case 24 : /* 24-bit RGB */
- for (x = img->xsize; x > 0; x --, ptr += 3)
- {
- ptr[2] = getc(fp);
- ptr[1] = getc(fp);
- ptr[0] = getc(fp);
- }
-
- /*
- * Read remaining bytes to align to 32 bits...
- */
-
- for (temp = img->xsize * 3; temp & 3; temp ++)
- getc(fp);
- break;
- }
-
- 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 :
- 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);
- }
-
- fclose(fp);
- free(in);
- free(out);
-
- return (0);
-}
-
-
-/*
- * 'read_word()' - Read a 16-bit unsigned integer.
- */
-
-static unsigned short /* O - 16-bit unsigned integer */
-read_word(FILE *fp) /* I - File to read from */
-{
- unsigned char b0, b1; /* Bytes from file */
-
- b0 = getc(fp);
- b1 = getc(fp);
-
- return ((b1 << 8) | b0);
-}
-
-
-/*
- * 'read_dword()' - Read a 32-bit unsigned integer.
- */
-
-static unsigned int /* O - 32-bit unsigned integer */
-read_dword(FILE *fp) /* I - File to read from */
-{
- unsigned char b0, b1, b2, b3; /* Bytes from file */
-
- b0 = getc(fp);
- b1 = getc(fp);
- b2 = getc(fp);
- b3 = getc(fp);
-
- return ((((((b3 << 8) | b2) << 8) | b1) << 8) | b0);
-}
-
-
-/*
- * 'read_long()' - Read a 32-bit signed integer.
- */
-
-static int /* O - 32-bit signed integer */
-read_long(FILE *fp) /* I - File to read from */
-{
- unsigned char b0, b1, b2, b3; /* Bytes from file */
-
- b0 = getc(fp);
- b1 = getc(fp);
- b2 = getc(fp);
- b3 = getc(fp);
-
- return ((int)(((((b3 << 8) | b2) << 8) | b1) << 8) | b0);
-}
-
-
-/*
- * End of "$Id: image-bmp.c 9771 2011-05-12 05:21:56Z mike $".
- */