Advertisement
Guest User

Untitled

a guest
Sep 13th, 2024
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.10 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <fcntl.h>
  3.  
  4. /**
  5.  * Parse TGA format into pixels. Returns NULL or error, otherwise the returned data looks like
  6.  *   ret[0] = width of the image
  7.  *   ret[1] = height of the image
  8.  *   ret[2..] = 32 bit ARGB pixels (blue channel in the least significant byte, alpha channel in the most)
  9.  */
  10. unsigned int *tga_parse(unsigned char *ptr, int size)
  11. {
  12.     unsigned int *data;
  13.     int i, j, k, x, y, w = (ptr[13] << 8) + ptr[12], h = (ptr[15] << 8) + ptr[14], o = (ptr[11] << 8) + ptr[10];
  14.     int m = ((ptr[1]? (ptr[7]>>3)*ptr[5] : 0) + 18);
  15.  
  16.     if(w<1 || h<1) return NULL;
  17.  
  18.     data = (unsigned int*)malloc((w*h+2)*sizeof(unsigned int));
  19.     if(!data) return NULL;
  20.  
  21.     switch(ptr[2]) {
  22.         case 1:
  23.             if(ptr[6]!=0 || ptr[4]!=0 || ptr[3]!=0 || (ptr[7]!=24 && ptr[7]!=32)) { free(data); return NULL; }
  24.             for(y=i=0; y<h; y++) {
  25.                 k = ((!o?h-y-1:y)*w);
  26.                 for(x=0; x<w; x++) {
  27.                     j = ptr[m + k++]*(ptr[7]>>3) + 18;
  28.                     data[2 + i++] = ((ptr[7]==32?ptr[j+3]:0xFF) << 24) | (ptr[j+2] << 16) | (ptr[j+1] << 8) | ptr[j];
  29.                 }
  30.             }
  31.             break;
  32.         case 2:
  33.             if(ptr[5]!=0 || ptr[6]!=0 || ptr[1]!=0 || (ptr[16]!=24 && ptr[16]!=32)) { free(data); return NULL; }
  34.             for(y=i=0; y<h; y++) {
  35.                 j = ((!o?h-y-1:y)*w*(ptr[16]>>3));
  36.                 for(x=0; x<w; x++) {
  37.                     data[2 + i++] = ((ptr[16]==32?ptr[j+3]:0xFF) << 24) | (ptr[j+2] << 16) | (ptr[j+1] << 8) | ptr[j];
  38.                     j += ptr[16]>>3;
  39.                 }
  40.             }
  41.             break;
  42.         case 9:
  43.             if(ptr[6]!=0 || ptr[4]!=0 || ptr[3]!=0 || (ptr[7]!=24 && ptr[7]!=32)) { free(data); return NULL; }
  44.             y = i = 0;
  45.             for(x=0; x<w*h && m<size;) {
  46.                 k = ptr[m++];
  47.                 if(k > 127) {
  48.                     k -= 127; x += k;
  49.                     j = ptr[m++]*(ptr[7]>>3) + 18;
  50.                     while(k--) {
  51.                         if(!(i%w)) { i=((!o?h-y-1:y)*w); y++; }
  52.                         data[2 + i++] = ((ptr[7]==32?ptr[j+3]:0xFF) << 24) | (ptr[j+2] << 16) | (ptr[j+1] << 8) | ptr[j];
  53.                     }
  54.                 } else {
  55.                     k++; x += k;
  56.                     while(k--) {
  57.                         j = ptr[m++]*(ptr[7]>>3) + 18;
  58.                         if(!(i%w)) { i=((!o?h-y-1:y)*w); y++; }
  59.                         data[2 + i++] = ((ptr[7]==32?ptr[j+3]:0xFF) << 24) | (ptr[j+2] << 16) | (ptr[j+1] << 8) | ptr[j];
  60.                     }
  61.                 }
  62.             }
  63.             break;
  64.         case 10:
  65.             if(ptr[5]!=0 || ptr[6]!=0 || ptr[1]!=0 || (ptr[16]!=24 && ptr[16]!=32)) { free(data); return NULL; }
  66.             y = i = 0;
  67.             for(x=0; x<w*h && m<size;) {
  68.                 k = ptr[m++];
  69.                 if(k > 127) {
  70.                     k -= 127; x += k;
  71.                     while(k--) {
  72.                         if(!(i%w)) { i=((!o?h-y-1:y)*w); y++; }
  73.                         data[2 + i++] = ((ptr[16]==32?ptr[m+3]:0xFF) << 24) | (ptr[m+2] << 16) | (ptr[m+1] << 8) | ptr[m];
  74.                     }
  75.                     m += ptr[16]>>3;
  76.                 } else {
  77.                     k++; x += k;
  78.                     while(k--) {
  79.                         if(!(i%w)) { i=((!o?h-y-1:y)*w); y++; }
  80.                         data[2 + i++] = ((ptr[16]==32?ptr[m+3]:0xFF) << 24) | (ptr[m+2] << 16) | (ptr[m+1] << 8) | ptr[m];
  81.                         m += ptr[16]>>3;
  82.                     }
  83.                 }
  84.             }
  85.             break;
  86.         default:
  87.             free(data); return NULL;
  88.     }
  89.     data[0] = w;
  90.     data[1] = h;
  91.     return data;
  92. }
  93.  
  94.  
  95. void main()
  96. {
  97.     int fd;
  98.     int i;
  99.     unsigned int *data;
  100.     fd = open("/home/bunny/Raam/source/build/raam_logo.tga", O_RDWR, 0600);
  101.  
  102.     char raam_logo[5242924];
  103.  
  104.     if (read(fd, raam_logo, 5242924) == -1)
  105.         printf("could not read raam_lgo.tga!\n");
  106.     else
  107.         printf("read raam_logo.tga!\n");
  108.  
  109.     data = tga_parse(&raam_logo, 32);
  110.  
  111.     for(i=0; i<1280*1024+2; i++) {
  112.         printf("%d", data[i]);
  113.     }
  114.  
  115.     close(fd);
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement