loadlum.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:4k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* texture.c - by David Blythe, SGI */
  2. /* load_luminace is a simplistic routine for reading an SGI .bw image file. */
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "loadlum.h"
  7. typedef struct _ImageRec {
  8.   unsigned short imagic;
  9.   unsigned short type;
  10.   unsigned short dim;
  11.   unsigned short xsize, ysize, zsize;
  12.   unsigned int min, max;
  13.   unsigned int wasteBytes;
  14.   char name[80];
  15.   unsigned long colorMap;
  16.   FILE *file;
  17.   unsigned char *tmp;
  18.   unsigned long rleEnd;
  19.   unsigned int *rowStart;
  20.   int *rowSize;
  21. } ImageRec;
  22. static void
  23. ConvertShort(unsigned short *array, unsigned int length)
  24. {
  25.   unsigned short b1, b2;
  26.   unsigned char *ptr;
  27.   ptr = (unsigned char *) array;
  28.   while (length--) {
  29.     b1 = *ptr++;
  30.     b2 = *ptr++;
  31.     *array++ = (b1 << 8) | (b2);
  32.   }
  33. }
  34. static void
  35. ConvertUint(unsigned *array, unsigned int length)
  36. {
  37.   unsigned int b1, b2, b3, b4;
  38.   unsigned char *ptr;
  39.   ptr = (unsigned char *) array;
  40.   while (length--) {
  41.     b1 = *ptr++;
  42.     b2 = *ptr++;
  43.     b3 = *ptr++;
  44.     b4 = *ptr++;
  45.     *array++ = (b1 << 24) | (b2 << 16) | (b3 << 8) | (b4);
  46.   }
  47. }
  48. static ImageRec *
  49. ImageOpen(char *fileName)
  50. {
  51.   union {
  52.     int testWord;
  53.     char testByte[4];
  54.   } endianTest;
  55.   ImageRec *image;
  56.   int swapFlag, x;
  57.   endianTest.testWord = 1;
  58.   if (endianTest.testByte[0] == 1)
  59.     swapFlag = 1;
  60.   else
  61.     swapFlag = 0;
  62.   image = (ImageRec *) malloc(sizeof(ImageRec));
  63.   if (image == NULL) {
  64.     fprintf(stderr, "Out of memory!n");
  65.     exit(1);
  66.   }
  67.   if ((image->file = fopen(fileName, "rb")) == NULL) {
  68.     perror(fileName);
  69.     exit(1);
  70.   }
  71.   fread(image, 1, 12, image->file);
  72.   if (swapFlag)
  73.     ConvertShort(&image->imagic, 6);
  74.   image->tmp = (unsigned char *) malloc(image->xsize * 256);
  75.   if (image->tmp == NULL) {
  76.     fprintf(stderr, "Out of memory!n");
  77.     exit(1);
  78.   }
  79.   if ((image->type & 0xFF00) == 0x0100) {
  80.     x = image->ysize * image->zsize * (int) sizeof(unsigned);
  81.     image->rowStart = (unsigned *) malloc(x);
  82.     image->rowSize = (int *) malloc(x);
  83.     if (image->rowStart == NULL || image->rowSize == NULL) {
  84.       fprintf(stderr, "Out of memory!n");
  85.       exit(1);
  86.     }
  87.     image->rleEnd = 512 + (2 * x);
  88.     fseek(image->file, 512, SEEK_SET);
  89.     fread(image->rowStart, 1, x, image->file);
  90.     fread(image->rowSize, 1, x, image->file);
  91.     if (swapFlag) {
  92.       ConvertUint(image->rowStart, x / (int) sizeof(unsigned));
  93.       ConvertUint((unsigned *) image->rowSize, x / (int) sizeof(int));
  94.     }
  95.   }
  96.   return image;
  97. }
  98. static void
  99. ImageClose(ImageRec * image)
  100. {
  101.   fclose(image->file);
  102.   free(image->tmp);
  103.   free(image);
  104. }
  105. static void
  106. ImageGetRow(ImageRec * image, unsigned char *buf, int y, int z)
  107. {
  108.   unsigned char *iPtr, *oPtr, pixel;
  109.   int count;
  110.   if ((image->type & 0xFF00) == 0x0100) {
  111.     fseek(image->file, (long) image->rowStart[y + z * image->ysize], SEEK_SET);
  112.     fread(image->tmp, 1, (unsigned int) image->rowSize[y + z * image->ysize],
  113.       image->file);
  114.     iPtr = image->tmp;
  115.     oPtr = buf;
  116.     for (;;) {
  117.       pixel = *iPtr++;
  118.       count = (int) (pixel & 0x7F);
  119.       if (!count)
  120.         return;
  121.       if (pixel & 0x80) {
  122.         while (count--)
  123.           *oPtr++ = *iPtr++;
  124.       } else {
  125.         pixel = *iPtr++;
  126.         while (count--)
  127.           *oPtr++ = pixel;
  128.       }
  129.     }
  130.   } else {
  131.     fseek(image->file, 512 + (y * image->xsize) + (z * image->xsize * image->ysize),
  132.       SEEK_SET);
  133.     fread(buf, 1, image->xsize, image->file);
  134.   }
  135. }
  136. unsigned char *
  137. load_luminance(char *name, int *width, int *height, int *components)
  138. {
  139.   unsigned char *base, *lptr;
  140.   ImageRec *image;
  141.   int y;
  142.   image = ImageOpen(name);
  143.   if (!image)
  144.     return NULL;
  145.   if (image->zsize != 1)
  146.     return NULL;
  147.   *width = image->xsize;
  148.   *height = image->ysize;
  149.   *components = image->zsize;
  150.   base = (unsigned char *)
  151.     malloc(image->xsize * image->ysize * sizeof(unsigned char));
  152.   if (!base)
  153.     return NULL;
  154.   lptr = base;
  155.   for (y = 0; y < image->ysize; y++) {
  156.     ImageGetRow(image, lptr, y, 0);
  157.     lptr += image->xsize;
  158.   }
  159.   ImageClose(image);
  160.   return base;
  161. }