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

GIS编程

开发平台:

Visual C++

  1. /*
  2.  *  Simple SGI .rgb (IRIS RGB) image file reader ripped off from
  3.  *  texture.c (written by David Blythe).  See the SIGGRAPH '96
  4.  *  Advanced OpenGL course notes.
  5.  */
  6. /* includes */
  7. #include <stdio.h>
  8. #include <stdlib.h> 
  9. #include <string.h>
  10. #include <assert.h>
  11. #include "gltx.h"
  12. /* private typedefs */
  13. typedef struct _rawImageRec {
  14.     unsigned short imagic;
  15.     unsigned short type;
  16.     unsigned short dim;
  17.     unsigned short sizeX, sizeY, sizeZ;
  18.     unsigned long min, max;
  19.     unsigned long wasteBytes;
  20.     char name[80];
  21.     unsigned long colorMap;
  22.     FILE *file;
  23.     unsigned char *tmp, *tmpR, *tmpG, *tmpB;
  24.     unsigned long rleEnd;
  25.     GLuint *rowStart;
  26.     GLint *rowSize;
  27. } rawImageRec;
  28. /* private functions */
  29. static void ConvertShort(unsigned short *array, unsigned int length)
  30. {
  31.     unsigned short b1, b2;
  32.     unsigned char *ptr;
  33.     ptr = (unsigned char *)array;
  34.     while (length--) {
  35. b1 = *ptr++;
  36. b2 = *ptr++;
  37. *array++ = (b1 << 8) | (b2);
  38.     }
  39. }
  40. static void ConvertLong(GLuint *array, unsigned int length)
  41. {
  42.     unsigned long b1, b2, b3, b4;
  43.     unsigned char *ptr;
  44.     ptr = (unsigned char *)array;
  45.     while (length--) {
  46. b1 = *ptr++;
  47. b2 = *ptr++;
  48. b3 = *ptr++;
  49. b4 = *ptr++;
  50. *array++ = (b1 << 24) | (b2 << 16) | (b3 << 8) | (b4);
  51.     }
  52. }
  53. static rawImageRec *RawImageOpen(char *fileName)
  54. {
  55.     union {
  56. int testWord;
  57. char testByte[4];
  58.     } endianTest;
  59.     rawImageRec *raw;
  60.     GLenum swapFlag;
  61.     int x;
  62.     endianTest.testWord = 1;
  63.     if (endianTest.testByte[0] == 1) {
  64. swapFlag = GL_TRUE;
  65.     } else {
  66. swapFlag = GL_FALSE;
  67.     }
  68.     raw = (rawImageRec *)malloc(sizeof(rawImageRec));
  69.     if (raw == NULL) {
  70. return NULL;
  71.     }
  72.     if ((raw->file = fopen(fileName, "rb")) == NULL) {
  73. return NULL;
  74.     }
  75.     fread(raw, 1, 12, raw->file);
  76.     if (swapFlag) {
  77. ConvertShort(&raw->imagic, 6);
  78.     }
  79.     raw->tmp = (unsigned char *)malloc(raw->sizeX*256);
  80.     raw->tmpR = (unsigned char *)malloc(raw->sizeX*256);
  81.     raw->tmpG = (unsigned char *)malloc(raw->sizeX*256);
  82.     raw->tmpB = (unsigned char *)malloc(raw->sizeX*256);
  83.     if (raw->tmp == NULL || raw->tmpR == NULL || raw->tmpG == NULL ||
  84. raw->tmpB == NULL) {
  85. return NULL;
  86.     }
  87.     if ((raw->type & 0xFF00) == 0x0100) {
  88. x = raw->sizeY * raw->sizeZ * sizeof(GLuint);
  89. raw->rowStart = (GLuint *)malloc(x);
  90. raw->rowSize = (GLint *)malloc(x);
  91. if (raw->rowStart == NULL || raw->rowSize == NULL) {
  92.     return NULL;
  93. }
  94. raw->rleEnd = 512 + (2 * x);
  95. fseek(raw->file, 512, SEEK_SET);
  96. fread(raw->rowStart, 1, x, raw->file);
  97. fread(raw->rowSize, 1, x, raw->file);
  98. if (swapFlag) {
  99.     ConvertLong(raw->rowStart, x/sizeof(GLuint));
  100.     ConvertLong((GLuint *)raw->rowSize, x/sizeof(GLint));
  101. }
  102.     }
  103.     return raw;
  104. }
  105. static void RawImageClose(rawImageRec *raw)
  106. {
  107.     fclose(raw->file);
  108.     free(raw->tmp);
  109.     free(raw->tmpR);
  110.     free(raw->tmpG);
  111.     free(raw->tmpB);
  112.     free(raw);
  113. }
  114. static void RawImageGetRow(rawImageRec *raw, unsigned char *buf, int y, int z)
  115. {
  116.   unsigned char *iPtr, *oPtr, pixel;
  117.   int count;
  118.   if ((raw->type & 0xFF00) == 0x0100) {
  119.     fseek(raw->file, (long) raw->rowStart[y+z*raw->sizeY], SEEK_SET);
  120.     fread(raw->tmp, 1, (unsigned int)raw->rowSize[y+z*raw->sizeY],
  121.   raw->file);
  122.     iPtr = raw->tmp;
  123.     oPtr = buf;
  124.     for (;;) {
  125.       pixel = *iPtr++;
  126.       count = (int)(pixel & 0x7F);
  127.       if (!count) {
  128. return;
  129.       }
  130.       if (pixel & 0x80) {
  131. while (count--) {
  132.   *oPtr++ = *iPtr++;
  133. }
  134.       } else {
  135. pixel = *iPtr++;
  136. while (count--) {
  137.   *oPtr++ = pixel;
  138. }
  139.       }
  140.     }
  141.   } else {
  142.     fseek(raw->file, 512+(y*raw->sizeX)+(z*raw->sizeX*raw->sizeY),
  143.   SEEK_SET);
  144.     fread(buf, 1, raw->sizeX, raw->file);
  145.   }
  146. }
  147. static void
  148. RawImageGetData(rawImageRec *raw, GLTXimage *image)
  149. {
  150.   unsigned char *ptr;
  151.   int i, j;
  152.   image->data = (unsigned char *)malloc((raw->sizeX+1)*(raw->sizeY+1)*4);
  153.   if (image->data == NULL) {
  154.     return;
  155.   }
  156.   ptr = image->data;
  157.   for (i = 0; i < raw->sizeY; i++) {
  158.     RawImageGetRow(raw, raw->tmpR, i, 0);
  159.     RawImageGetRow(raw, raw->tmpG, i, 1);
  160.     RawImageGetRow(raw, raw->tmpB, i, 2);
  161.     for (j = 0; j < raw->sizeX; j++) {
  162.       *ptr++ = *(raw->tmpR + j);
  163.       *ptr++ = *(raw->tmpG + j);
  164.       *ptr++ = *(raw->tmpB + j);
  165.     }
  166.   }
  167. }
  168. /* public functions */
  169. /* gltxDelete: Deletes a texture image
  170.  * 
  171.  * image - properly initialized GLTXimage structure
  172.  */
  173. void
  174. gltxDelete(GLTXimage* image)
  175. {
  176.   assert(image);
  177.   free(image->data);
  178.   free(image);
  179. }
  180. /* gltxReadRGB: Reads and returns data from an IRIS RGB image file.
  181.  *
  182.  * filename - name of the IRIS RGB file to read data from
  183.  */
  184. GLTXimage*
  185. gltxReadRGB(char *filename)
  186. {
  187.   rawImageRec *raw;
  188.   GLTXimage* image;
  189.   raw = RawImageOpen(filename);
  190.   if(!raw) {
  191.     fprintf(stderr, "gltxReadRGB() failed: can't open image file "%s".n",
  192.     filename);
  193.     return NULL;
  194.   }
  195.   image = (GLTXimage*)malloc(sizeof(GLTXimage));
  196.   if (image == NULL) {
  197.     fprintf(stderr, "gltxReadRGB() failed: insufficient memory.n");
  198.     return NULL;
  199.   }
  200.   image->width = raw->sizeX;
  201.   image->height = raw->sizeY;
  202.   image->components = raw->sizeZ;
  203.   RawImageGetData(raw, image);
  204.   RawImageClose(raw);
  205.   return image;
  206. }