TEXTURE.C
上传用户:kwdpyr1020
上传日期:2022-08-09
资源大小:1363k
文件大小:6k
源码类别:

OpenGL

开发平台:

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.     } else {
  137. image->rowStart = NULL;
  138. image->rowSize = NULL;
  139.     }
  140.     return image;
  141. }
  142. static void
  143. ImageClose(ImageRec *image) {
  144.     fclose(image->file);
  145.     free(image->tmp);
  146.     free(image->tmpR);
  147.     free(image->tmpG);
  148.     free(image->tmpB);
  149.     free(image->rowSize);
  150.     free(image->rowStart);
  151.     free(image);
  152. }
  153. static void
  154. ImageGetRow(ImageRec *image, unsigned char *buf, int y, int z) {
  155.     unsigned char *iPtr, *oPtr, pixel;
  156.     int count;
  157.     if ((image->type & 0xFF00) == 0x0100) {
  158. fseek(image->file, (long)image->rowStart[y+z*image->ysize], SEEK_SET);
  159. fread(image->tmp, 1, (unsigned int)image->rowSize[y+z*image->ysize],
  160.       image->file);
  161. iPtr = image->tmp;
  162. oPtr = buf;
  163. for (;;) {
  164.     pixel = *iPtr++;
  165.     count = (int)(pixel & 0x7F);
  166.     if (!count) {
  167. return;
  168.     }
  169.     if (pixel & 0x80) {
  170. while (count--) {
  171.     *oPtr++ = *iPtr++;
  172. }
  173.     } else {
  174. pixel = *iPtr++;
  175. while (count--) {
  176.     *oPtr++ = pixel;
  177. }
  178.     }
  179. }
  180.     } else {
  181. fseek(image->file, 512+(y*image->xsize)+(z*image->xsize*image->ysize),
  182.       SEEK_SET);
  183. fread(buf, 1, image->xsize, image->file);
  184.     }
  185. }
  186. unsigned *
  187. read_texture(char *name, int *width, int *height, int *components) {
  188.     unsigned *base, *lptr;
  189.     unsigned char *rbuf, *gbuf, *bbuf, *abuf;
  190.     ImageRec *image;
  191.     int y;
  192.     image = ImageOpen(name);
  193.     
  194.     if(!image)
  195. return NULL;
  196.     (*width)=image->xsize;
  197.     (*height)=image->ysize;
  198.     (*components)=image->zsize;
  199.     base = (unsigned *)malloc(image->xsize*image->ysize*sizeof(unsigned));
  200.     rbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
  201.     gbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
  202.     bbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
  203.     abuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
  204.     if(!base || !rbuf || !gbuf || !bbuf)
  205.       return NULL;
  206.     lptr = base;
  207.     for(y=0; y<image->ysize; y++) {
  208. if(image->zsize>=4) {
  209.     ImageGetRow(image,rbuf,y,0);
  210.     ImageGetRow(image,gbuf,y,1);
  211.     ImageGetRow(image,bbuf,y,2);
  212.     ImageGetRow(image,abuf,y,3);
  213.     rgbatorgba(rbuf,gbuf,bbuf,abuf,(unsigned char *)lptr,image->xsize);
  214.     lptr += image->xsize;
  215. } else if(image->zsize==3) {
  216.     ImageGetRow(image,rbuf,y,0);
  217.     ImageGetRow(image,gbuf,y,1);
  218.     ImageGetRow(image,bbuf,y,2);
  219.     rgbtorgba(rbuf,gbuf,bbuf,(unsigned char *)lptr,image->xsize);
  220.     lptr += image->xsize;
  221. } else if(image->zsize==2) {
  222.     ImageGetRow(image,rbuf,y,0);
  223.     ImageGetRow(image,abuf,y,1);
  224.     latorgba(rbuf,abuf,(unsigned char *)lptr,image->xsize);
  225.     lptr += image->xsize;
  226. } else {
  227.     ImageGetRow(image,rbuf,y,0);
  228.     bwtorgba(rbuf,(unsigned char *)lptr,image->xsize);
  229.     lptr += image->xsize;
  230. }
  231.     }
  232.     ImageClose(image);
  233.     free(rbuf);
  234.     free(gbuf);
  235.     free(bbuf);
  236.     free(abuf);
  237.     return (unsigned *) base;
  238. }