diff options
Diffstat (limited to 'Build/source/utils/sam2p/input-tga.ci')
-rw-r--r-- | Build/source/utils/sam2p/input-tga.ci | 604 |
1 files changed, 0 insertions, 604 deletions
diff --git a/Build/source/utils/sam2p/input-tga.ci b/Build/source/utils/sam2p/input-tga.ci deleted file mode 100644 index 9f8b72dcf0a..00000000000 --- a/Build/source/utils/sam2p/input-tga.ci +++ /dev/null @@ -1,604 +0,0 @@ -/* This code is ripped from Autotrace-0.29. Small modifications by pts. */ - -/* input-tga.ci reads tga files */ - -#ifdef __GNUC__ -#pragma implementation -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -/* #include <unistd.h> */ - -#include "at_bitmap.h" -/* #include "message.h" */ -/* #include "xstd.h" */ -/* #include "input-tga.h" */ /* BUGFIX by pts: bmp -> tga */ - -/* TODO: - - Handle loading images that aren't 8 bits per channel. -*/ - -/* Round up a division to the nearest integer. */ -#define ROUNDUP_DIVIDE(n,d) (((n) + (d - 1)) / (d)) - -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#define MIN(a,b) ((a) < (b) ? (a) : (b)) - -#define INDEXED 1 -#define INDEXEDA 2 -#define GRAY 3 -#define TGA_RGB 5 -#define INDEXED_IMAGE 1 -#define INDEXEDA_IMAGE 2 -#define GRAY_IMAGE 3 -#define GRAYA_IMAGE 4 -#define TGA_RGB_IMAGE 5 -#define TGA_RGBA_IMAGE 6 - -typedef struct _TgaSaveVals -{ - int rle; -} TgaSaveVals; - -typedef struct _TgaSaveInterface -{ - int run; -} TgaSaveInterface; - -struct tga_header -{ - unsigned char idLength; - unsigned char colorMapType; - - /* The image type. */ -#define TGA_TYPE_MAPPED 1 -#define TGA_TYPE_COLOR 2 -#define TGA_TYPE_GRAY 3 -#define TGA_TYPE_MAPPED_RLE 9 -#define TGA_TYPE_COLOR_RLE 10 -#define TGA_TYPE_GRAY_RLE 11 - unsigned char imageType; - - /* Color Map Specification. */ - /* We need to separately specify high and low bytes to avoid endianness - and alignment problems. */ - unsigned char colorMapIndexLo, colorMapIndexHi; - unsigned char colorMapLengthLo, colorMapLengthHi; - unsigned char colorMapSize; - - /* Image Specification. */ - unsigned char xOriginLo, xOriginHi; - unsigned char yOriginLo, yOriginHi; - - unsigned char widthLo, widthHi; - unsigned char heightLo, heightHi; - - unsigned char bpp; - - /* Image descriptor. - 3-0: attribute bpp - 4: left-to-right ordering - 5: top-to-bottom ordering - 7-6: zero - */ -#define TGA_DESC_ABITS 0x0f -#define TGA_DESC_HORIZONTAL 0x10 -#define TGA_DESC_VERTICAL 0x20 - unsigned char descriptor; -}; - -#if 0 -static struct -{ - unsigned int extensionAreaOffset; - unsigned int developerDirectoryOffset; -#define TGA_SIGNATURE "TRUEVISION-XFILE" - char signature[16]; - char dot; - char null; -} tga_footer; -#endif - - -static bitmap_type ReadImage (FILE *fp, - struct tga_header *hdr); -#if PTS_SAM2P /**** pts ****/ -bitmap_type tga_load_image (FILE* filename) -#else -bitmap_type tga_load_image (at_string filename) -#endif -{ - FILE *fp; - struct tga_header hdr; - - bitmap_type image; - - image.bitmap = NULL; - - #if PTS_SAM2P /**** pts ****/ - fp=filename; - #else - fp = fopen (filename, "rb"); - if (!fp) - FATAL1 ("TGA: can't open \"%s\"\n", filename); - #endif - - memset(&hdr, '\0', sizeof(hdr)); - -#if 0 - /* Check the footer. */ - if (fseek (fp, 0L - (sizeof (tga_footer)), SEEK_END) - || fread (&tga_footer, sizeof (tga_footer), 1, fp) != 1) -#if PTS_SAM2P - FATALP("TGA: Cannot read footer"); -#else - FATAL1 ("TGA: Cannot read footer from \"%s\"\n", filename); -#endif - /* Check the signature. */ - if (fseek (fp, 0, SEEK_SET) || -#else - if (0 || -#endif - fread (&hdr, sizeof (hdr), 1, fp) != 1) -#if PTS_SAM2P - FATALP("TGA: Cannot read header"); -#else - FATAL1 ("TGA: Cannot read header from \"%s\"\n", filename); -#endif - - /* Skip the image ID field. */ - { -#if 0 - if (hdr.idLength && fseek (fp, hdr.idLength, SEEK_CUR)) -#else - char buf[256]; - if (hdr.idLength!=fread(buf, 1, hdr.idLength, fp)) -#endif -#if PTS_SAM2P - FATALP("TGA: Cannot skip ID field"); -#else - FATAL1 ("TGA: Cannot skip ID field in \"%s\"\n", filename); -#endif - } - - image = ReadImage (fp, &hdr); - /* fclose (fp); */ - return image; -} - - -static int -std_fread (unsigned char *buf, - int datasize, - int nelems, - FILE *fp) -{ - - return fread (buf, datasize, nelems, fp); -} - -#define RLE_PACKETSIZE 0x80 - -/* Decode a bufferful of file. */ -static int -rle_fread (unsigned char *buf, - int datasize, - int nelems, - FILE *fp) -{ - static unsigned char *statebuf = 0; - static int statelen = 0; - static int laststate = 0; - - int j, k; - int buflen, count, bytes; - unsigned char *p; - - /* Scale the buffer length. */ - buflen = nelems * datasize; - - j = 0; - while (j < buflen) - { - if (laststate < statelen) - { - /* Copy bytes from our previously decoded buffer. */ - bytes = MIN (buflen - j, statelen - laststate); - memcpy (buf + j, statebuf + laststate, bytes); - j += bytes; - laststate += bytes; - - /* If we used up all of our state bytes, then reset them. */ - if (laststate >= statelen) - { - laststate = 0; - statelen = 0; - } - - /* If we filled the buffer, then exit the loop. */ - if (j >= buflen) - break; - } - - /* Decode the next packet. */ - count = fgetc (fp); - if (count == EOF) - { - return j / datasize; - } - - /* Scale the byte length to the size of the data. */ - bytes = ((count & ~RLE_PACKETSIZE) + 1) * datasize; - - if (j + bytes <= buflen) - { - /* We can copy directly into the image buffer. */ - p = buf + j; - } - else { - /* Allocate the state buffer if we haven't already. */ - if (!statebuf) - statebuf = (unsigned char *) malloc (RLE_PACKETSIZE * datasize); - p = statebuf; - } - - if (count & RLE_PACKETSIZE) - { - /* Fill the buffer with the next value. */ - if (fread (p, datasize, 1, fp) != 1) - { - return j / datasize; - } - - /* Optimized case for single-byte encoded data. */ - if (datasize == 1) - memset (p + 1, *p, bytes - 1); - else - for (k = datasize; k < bytes; k += datasize) - memcpy (p + k, p, datasize); - } - else - { - /* Read in the buffer. */ - if (fread (p, bytes, 1, fp) != 1) - { - return j / datasize; - } - } - - /* We may need to copy bytes from the state buffer. */ - if (p == statebuf) - statelen = bytes; - else - j += bytes; - } - -return nelems; -} - -static bitmap_type -ReadImage (FILE *fp, - struct tga_header *hdr) -{ - bitmap_type image; - unsigned char *buffer; - unsigned char *alphas; - - int width, height, bpp, abpp, pbpp, nalphas; - int j, k; - int pelbytes, wbytes, bsize, npels, pels; - int rle, badread; - int itype=0, dtype; - unsigned char *cmap = NULL; - int (*myfread)(unsigned char *, int, int, FILE *); - - /* Find out whether the image is horizontally or vertically reversed. */ - char horzrev = (char) (hdr->descriptor & TGA_DESC_HORIZONTAL); - char vertrev = (char) (!(hdr->descriptor & TGA_DESC_VERTICAL)); - - image.bitmap = NULL; - - /* Reassemble the multi-byte values correctly, regardless of - host endianness. */ - width = (hdr->widthHi << 8) | hdr->widthLo; - height = (hdr->heightHi << 8) | hdr->heightLo; - - bpp = hdr->bpp; - abpp = hdr->descriptor & TGA_DESC_ABITS; - - if (hdr->imageType == TGA_TYPE_COLOR || - hdr->imageType == TGA_TYPE_COLOR_RLE) - pbpp = MIN (bpp / 3, 8) * 3; - else if (abpp < bpp) - pbpp = bpp - abpp; - else - pbpp = bpp; - - if (abpp + pbpp > bpp) - { - WARNINGP3 ("TGA: ",pbpp," bit image, ",abpp," bit alpha is greater than ",bpp," total bits per pixel"); - - /* Assume that alpha bits were set incorrectly. */ - abpp = bpp - pbpp; - WARNINGP1 ("TGA: reducing to * bit alpha: ", abpp); - } - else if (abpp + pbpp < bpp) - { - WARNINGP3 ("TGA: ",pbpp," bit image, ",abpp," bit alpha is less than ",bpp," total bits per pixel"); - - /* Again, assume that alpha bits were set incorrectly. */ - abpp = bpp - pbpp; - WARNINGP1 ("TGA: increasing to * bit alpha: ", abpp); - } - - rle = 0; - switch (hdr->imageType) - { - case TGA_TYPE_MAPPED_RLE: - rle = 1; - case TGA_TYPE_MAPPED: - itype = INDEXED; - - /* Find the size of palette elements. */ - pbpp = MIN (hdr->colorMapSize / 3, 8) * 3; - if (pbpp < hdr->colorMapSize) - abpp = hdr->colorMapSize - pbpp; - else - abpp = 0; - - - if (bpp != 8) - /* We can only cope with 8-bit indices. */ - FATALP ("TGA: index sizes other than 8 bits are unimplemented"); - - if (abpp) - dtype = INDEXEDA_IMAGE; - else - dtype = INDEXED_IMAGE; - break; - - case TGA_TYPE_GRAY_RLE: - rle = 1; - case TGA_TYPE_GRAY: - itype = GRAY; - - if (abpp) - dtype = GRAYA_IMAGE; - else - dtype = GRAY_IMAGE; - break; - - case TGA_TYPE_COLOR_RLE: - rle = 1; - case TGA_TYPE_COLOR: - itype = TGA_RGB; - - if (abpp) - dtype = TGA_RGBA_IMAGE; - else - dtype = TGA_RGB_IMAGE; - break; - - default: - FATALP1 ("TGA: unrecognized image type ", (unsigned)hdr->imageType); -} - - if ((abpp && abpp != 8) || - ((itype == TGA_RGB || itype == INDEXED) && pbpp != 24) || - (itype == GRAY && pbpp != 8)) - /* FIXME: We haven't implemented bit-packed fields yet. */ - FATALP ("TGA: channel sizes other than 8 bits are unimplemented"); - - /* Check that we have a color map only when we need it. */ - if (itype == INDEXED) - { - if (hdr->colorMapType != 1) - FATALP1 ("TGA: indexed image has invalid color map type ", - (unsigned)hdr->colorMapType); - } - else if (hdr->colorMapType != 0) - FATALP1 ("TGA: non-indexed image has invalid color map type ", - (unsigned)hdr->colorMapType); - - alphas = 0; - nalphas = 0; - if (hdr->colorMapType == 1) - { - /* We need to read in the colormap. */ - int index, colors; - unsigned int length; - - index = (hdr->colorMapIndexHi << 8) | hdr->colorMapIndexLo; - length = (hdr->colorMapLengthHi << 8) | hdr->colorMapLengthLo; - - if (length == 0) - FATALP1 ("TGA: invalid color map length ", length); - - pelbytes = ROUNDUP_DIVIDE (hdr->colorMapSize, 8); - colors = length + index; - cmap = (unsigned char *) malloc (colors * pelbytes); - - /* Zero the entries up to the beginning of the map. */ - memset (cmap, 0, index * pelbytes); - - /* Read in the rest of the colormap. */ - if (fread (cmap + (index * pelbytes), pelbytes, length, fp) != length) - FATALP1 ("TGA: error reading colormap; ftell == ", ftell (fp)); - - /* If we have an alpha channel, then create a mapping to the alpha - values. */ - if (pelbytes > 3) - alphas = (unsigned char *) malloc (colors); - - k = 0; - for (j = 0; j < colors * pelbytes; j += pelbytes) - { - /* Swap from BGR to TGA_RGB. */ - unsigned char tmp = cmap[j]; - cmap[k ++] = cmap[j + 2]; - cmap[k ++] = cmap[j + 1]; - cmap[k ++] = tmp; - - /* Take the alpha values out of the colormap. */ - if (alphas) - alphas[nalphas ++] = cmap[j + 3]; - } - - /* If the last color was transparent, then omit it from the - mapping. */ - if (nalphas && alphas[nalphas - 1] == 0) - colors --; - - /* Now pretend as if we only have 8 bpp. */ - abpp = 0; - pbpp = 8; - pelbytes = 1; - } - else - pelbytes = 3; - - image.bitmap = (unsigned char *) malloc (width * height * 3 * sizeof(unsigned char)); - BITMAP_WIDTH (image) = (unsigned short) width; - BITMAP_HEIGHT (image) = (unsigned short) height; - BITMAP_PLANES (image) = (unsigned short) 3; - - /* Calculate TGA bytes per pixel. */ - bpp = ROUNDUP_DIVIDE (pbpp + abpp, 8); - - /* Maybe we need to reverse the data. */ - buffer = NULL; - if (horzrev || vertrev) - buffer = (unsigned char *) malloc (width * height * pelbytes * sizeof (unsigned char)); - if (rle) - myfread = rle_fread; - else - myfread = std_fread; - - wbytes = width * pelbytes; - badread = 0; - - npels = width * height; - bsize = wbytes * height; - - /* Suck in the data one height at a time. */ - if (badread) - pels = 0; - else - pels = (*myfread) (image.bitmap, bpp, npels, fp); - - if (pels != npels) - { - if (!badread) - { - /* Probably premature end of file. */ - WARNINGP1 ("TGA: error reading; ftell == ", ftell (fp)); - badread = 1; - } - - - /* Fill the rest of this tile with zeros. */ - memset (image.bitmap + (pels * bpp), 0, ((npels - pels) * bpp)); - } - /* If we have indexed alphas, then set them. */ - if (nalphas) - { - /* Start at the end of the buffer, and work backwards. */ - k = (npels - 1) * bpp; - for (j = bsize - pelbytes; j >= 0; j -= pelbytes) - { - /* Find the alpha for this index. */ - image.bitmap[j + 1] = alphas[image.bitmap[k]]; - image.bitmap[j] = image.bitmap[k --]; - } - } - - if (itype == GRAY) - for (j = bsize/3 - 1; j >= 0; j -= 1) - { - /* Find the alpha for this index. */ - image.bitmap[3*j] = image.bitmap[j]; - image.bitmap[3*j+1] = image.bitmap[j]; - image.bitmap[3*j+2] = image.bitmap[j]; - } - - - if (pelbytes >= 3) - { - /* Rearrange the colors from BGR to TGA_RGB. */ - for (j = 0; j < bsize; j += pelbytes) - { - unsigned char tmp = image.bitmap[j]; - image.bitmap[j] = image.bitmap[j + 2]; - image.bitmap[j + 2] = tmp; - } - } - - - - if (horzrev || vertrev) - { - unsigned char *tmp; - if (vertrev) - { - /* We need to mirror only vertically. */ - for (j = 0; j < bsize; j += wbytes) - memcpy (buffer + j, - image.bitmap + bsize - (j + wbytes), wbytes); - } - else if (horzrev) - { - /* We need to mirror only horizontally. */ - for (j = 0; j < bsize; j += wbytes) - for (k = 0; k < wbytes; k += pelbytes) - memcpy (buffer + k + j, - image.bitmap + (j + wbytes) - (k + pelbytes), pelbytes); - } - else - { - /* Completely reverse the pixels in the buffer. */ - for (j = 0; j < bsize; j += pelbytes) - memcpy (buffer + j, - image.bitmap + bsize - (j + pelbytes), pelbytes); - } - - /* Swap the buffers because we modified them. */ - tmp = buffer; - buffer = image.bitmap; - image.bitmap = tmp; - } - - if (fgetc (fp) != EOF) - WARNINGP ("TGA: too much input data, ignoring extra..."); - - free (buffer); - - if (hdr->colorMapType == 1) - { - unsigned char *temp, *temp2, *temp3; - unsigned char index; - int xpos, ypos; - - temp2 = temp = image.bitmap; - image.bitmap = temp3 = (unsigned char *) malloc (width * height * 3 * sizeof (unsigned char)); - - for (ypos = 0; ypos < height; ypos++) - { - for (xpos = 0; xpos < width; xpos++) - { - index = *temp2++; - *temp3++ = cmap[3*index+0]; - *temp3++ = cmap[3*index+1]; - *temp3++ = cmap[3*index+2]; - } - } - free (temp); - free (cmap); - } - - if (alphas) - free (alphas); - - return image; -} /* read_image */ |