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

GIS编程

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h> 
  3. #include <string.h>
  4. void
  5. bwtorgba(unsigned char *b,unsigned char *l,int n) {
  6.     while(n--) {
  7. l[0] = *b;
  8. l[1] = *b;
  9. l[2] = *b;
  10. l[3] = 0xff;
  11. l += 4; b++;
  12.     }
  13. }
  14. void
  15. latorgba(unsigned char *b, unsigned char *a,unsigned char *l,int n) {
  16.     while(n--) {
  17. l[0] = *b;
  18. l[1] = *b;
  19. l[2] = *b;
  20. l[3] = *a;
  21. l += 4; b++; a++;
  22.     }
  23. }
  24. void
  25. rgbtorgba(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *l,int n) {
  26.     while(n--) {
  27. l[0] = r[0];
  28. l[1] = g[0];
  29. l[2] = b[0];
  30. l[3] = 0xff;
  31. l += 4; r++; g++; b++;
  32.     }
  33. }
  34. void
  35. rgbatorgba(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *a,unsigned char *l,int n) {
  36.     while(n--) {
  37. l[0] = r[0];
  38. l[1] = g[0];
  39. l[2] = b[0];
  40. l[3] = a[0];
  41.         l += 4; r++; g++; b++; a++;
  42.     }
  43. }
  44. typedef struct _ImageRec {
  45.     unsigned short imagic;
  46.     unsigned short type;
  47.     unsigned short dim;
  48.     unsigned short xsize, ysize, zsize;
  49.     unsigned int min, max;
  50.     unsigned int wasteBytes;
  51.     char name[80];
  52.     unsigned long colorMap;
  53.     FILE *file;
  54.     unsigned char *tmp, *tmpR, *tmpG, *tmpB;
  55.     unsigned long rleEnd;
  56.     unsigned int *rowStart;
  57.     int *rowSize;
  58. } ImageRec;
  59. static void
  60. ConvertShort(unsigned short *array, long length) {
  61.     unsigned b1, b2;
  62.     unsigned char *ptr;
  63.     ptr = (unsigned char *)array;
  64.     while (length--) {
  65. b1 = *ptr++;
  66. b2 = *ptr++;
  67. *array++ = (b1 << 8) | (b2);
  68.     }
  69. }
  70. static void
  71. ConvertLong(unsigned *array, long length) {
  72.     unsigned b1, b2, b3, b4;
  73.     unsigned char *ptr;
  74.     ptr = (unsigned char *)array;
  75.     while (length--) {
  76. b1 = *ptr++;
  77. b2 = *ptr++;
  78. b3 = *ptr++;
  79. b4 = *ptr++;
  80. *array++ = (b1 << 24) | (b2 << 16) | (b3 << 8) | (b4);
  81.     }
  82. }
  83. static ImageRec *ImageOpen(const char *fileName)
  84. {
  85.     union {
  86. int testWord;
  87. char testByte[4];
  88.     } endianTest;
  89.     ImageRec *image;
  90.     int swapFlag;
  91.     int x;
  92.     endianTest.testWord = 1;
  93.     if (endianTest.testByte[0] == 1) {
  94. swapFlag = 1;
  95.     } else {
  96. swapFlag = 0;
  97.     }
  98.     image = (ImageRec *)malloc(sizeof(ImageRec));
  99.     if (image == NULL) {
  100. fprintf(stderr, "Out of memory!n");
  101. exit(1);
  102.     }
  103.     if ((image->file = fopen(fileName, "rb")) == NULL) {
  104. perror(fileName);
  105. exit(1);
  106.     }
  107.     fread(image, 1, 12, image->file);
  108.     if (swapFlag) {
  109. ConvertShort(&image->imagic, 6);
  110.     }
  111.     image->tmp = (unsigned char *)malloc(image->xsize*256);
  112.     image->tmpR = (unsigned char *)malloc(image->xsize*256);
  113.     image->tmpG = (unsigned char *)malloc(image->xsize*256);
  114.     image->tmpB = (unsigned char *)malloc(image->xsize*256);
  115.     if (image->tmp == NULL || image->tmpR == NULL || image->tmpG == NULL ||
  116. image->tmpB == NULL) {
  117. fprintf(stderr, "Out of memory!n");
  118. exit(1);
  119.     }
  120.     if ((image->type & 0xFF00) == 0x0100) {
  121. x = image->ysize * image->zsize * sizeof(unsigned);
  122. image->rowStart = (unsigned *)malloc(x);
  123. image->rowSize = (int *)malloc(x);
  124. if (image->rowStart == NULL || image->rowSize == NULL) {
  125.     fprintf(stderr, "Out of memory!n");
  126.     exit(1);
  127. }
  128. image->rleEnd = 512 + (2 * x);
  129. fseek(image->file, 512, SEEK_SET);
  130. fread(image->rowStart, 1, x, image->file);
  131. fread(image->rowSize, 1, x, image->file);
  132. if (swapFlag) {
  133.     ConvertLong(image->rowStart, x/(int)sizeof(unsigned));
  134.     ConvertLong((unsigned *)image->rowSize, x/(int)sizeof(int));
  135. }
  136.     }
  137.     return image;
  138. }
  139. static void
  140. ImageClose(ImageRec *image) {
  141.     fclose(image->file);
  142.     free(image->tmp);
  143.     free(image->tmpR);
  144.     free(image->tmpG);
  145.     free(image->tmpB);
  146.     free(image);
  147. }
  148. static void
  149. ImageGetRow(ImageRec *image, unsigned char *buf, int y, int z) {
  150.     unsigned char *iPtr, *oPtr, pixel;
  151.     int count;
  152.     if ((image->type & 0xFF00) == 0x0100) {
  153. fseek(image->file, (long) image->rowStart[y+z*image->ysize], SEEK_SET);
  154. fread(image->tmp, 1, (unsigned int)image->rowSize[y+z*image->ysize],
  155.       image->file);
  156. iPtr = image->tmp;
  157. oPtr = buf;
  158. for (;;) {
  159.     pixel = *iPtr++;
  160.     count = (int)(pixel & 0x7F);
  161.     if (!count) {
  162. return;
  163.     }
  164.     if (pixel & 0x80) {
  165. while (count--) {
  166.     *oPtr++ = *iPtr++;
  167. }
  168.     } else {
  169. pixel = *iPtr++;
  170. while (count--) {
  171.     *oPtr++ = pixel;
  172. }
  173.     }
  174. }
  175.     } else {
  176. fseek(image->file, 512+(y*image->xsize)+(z*image->xsize*image->ysize),
  177.       SEEK_SET);
  178. fread(buf, 1, image->xsize, image->file);
  179.     }
  180. }
  181. unsigned *
  182. read_texture(char *name, int *width, int *height, int *components) {
  183.     unsigned *base, *lptr;
  184.     unsigned char *rbuf, *gbuf, *bbuf, *abuf;
  185.     ImageRec *image;
  186.     int y;
  187.     image = ImageOpen(name);
  188.     
  189.     if(!image)
  190. return NULL;
  191.     (*width)=image->xsize;
  192.     (*height)=image->ysize;
  193.     (*components)=image->zsize;
  194.     base = (unsigned *)malloc(image->xsize*image->ysize*sizeof(unsigned));
  195.     rbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
  196.     gbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
  197.     bbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
  198.     abuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
  199.     if(!base || !rbuf || !gbuf || !bbuf)
  200.       return NULL;
  201.     lptr = base;
  202.     for(y=0; y<image->ysize; y++) {
  203. if(image->zsize>=4) {
  204.     ImageGetRow(image,rbuf,y,0);
  205.     ImageGetRow(image,gbuf,y,1);
  206.     ImageGetRow(image,bbuf,y,2);
  207.     ImageGetRow(image,abuf,y,3);
  208.     rgbatorgba(rbuf,gbuf,bbuf,abuf,(unsigned char *)lptr,image->xsize);
  209.     lptr += image->xsize;
  210. } else if(image->zsize==3) {
  211.     ImageGetRow(image,rbuf,y,0);
  212.     ImageGetRow(image,gbuf,y,1);
  213.     ImageGetRow(image,bbuf,y,2);
  214.     rgbtorgba(rbuf,gbuf,bbuf,(unsigned char *)lptr,image->xsize);
  215.     lptr += image->xsize;
  216. } else if(image->zsize==2) {
  217.     ImageGetRow(image,rbuf,y,0);
  218.     ImageGetRow(image,abuf,y,1);
  219.     latorgba(rbuf,abuf,(unsigned char *)lptr,image->xsize);
  220.     lptr += image->xsize;
  221. } else {
  222.     ImageGetRow(image,rbuf,y,0);
  223.     bwtorgba(rbuf,(unsigned char *)lptr,image->xsize);
  224.     lptr += image->xsize;
  225. }
  226.     }
  227.     ImageClose(image);
  228.     free(rbuf);
  229.     free(gbuf);
  230.     free(bbuf);
  231.     free(abuf);
  232.     return (unsigned *) base;
  233. }