Advertisement
cr88192

vaguely fast DXT1 encoder.

Feb 6th, 2013
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.20 KB | None | 0 0
  1. /*
  2. Copyright (C) 2013 by Brendan G Bohannon
  3. Email: cr88192@gmail.com
  4. Copying: http://pastebin.com/iJxtZHm6
  5.  */
  6.  
  7. void BGBBTJ_BCn_EncodeBlockDXT1F(byte *block,
  8.     byte *rgba, int xstride, int ystride, int nclr)
  9. {
  10.     byte clr0[4], clr1[4];
  11.     byte pxy[16];
  12.     int p0, p1, p2, p3;
  13.     int mcr, mcg, mcb, mcy;
  14.     int ncr, ncg, ncb, ncy;
  15.     int acr, acg, acb;
  16.     int cr, cg, cb, cy, acy;
  17.     int i, j, k;
  18.    
  19.     mcr=255; mcg=255; mcb=255; mcy=255;
  20.     ncr=  0; ncg=  0; ncb=  0; ncy=  0;
  21.     acr=  0; acg=  0; acb=  0;
  22.  
  23.     for(i=0; i<4; i++)
  24.         for(j=0; j<4; j++)
  25.     {
  26.         k=(i*ystride)+(j*xstride);
  27.         cr=rgba[k+0];
  28.         cg=rgba[k+1];
  29.         cb=rgba[k+2];
  30.         cy=(cr+2*cg+cb)>>2;
  31.         pxy[i*4+j]=cy;
  32.  
  33.         if(cy<mcy) { mcr=cr; mcg=cg; mcb=cb; mcy=cy; }
  34.         if(cy>ncy) { ncr=cr; ncg=cg; ncb=cb; ncy=cy; }
  35.         acr+=cr;
  36.         acg+=cg;
  37.         acb+=cb;
  38.     }
  39.    
  40.     acr=acr>>4;
  41.     acg=acg>>4;
  42.     acb=acb>>4;
  43.  
  44.     clr0[0]=(mcr*11+acr*5)>>4;
  45.     clr0[1]=(mcg*11+acg*5)>>4;
  46.     clr0[2]=(mcb*11+acb*5)>>4;
  47.     clr1[0]=(ncr*11+acr*5)>>4;
  48.     clr1[1]=(ncg*11+acg*5)>>4;
  49.     clr1[2]=(ncb*11+acb*5)>>4;
  50.  
  51.     block[0]=((clr0[1]<<3)&0xE0) | (clr0[2]>>3);
  52.     block[1]=(clr0[0]&0xF8) | (clr0[1]>>5);
  53.     block[2]=((clr1[1]<<3)&0xE0) | (clr1[2]>>3);
  54.     block[3]=(clr1[0]&0xF8) | (clr1[1]>>5);
  55.    
  56.     clr0[3]=(clr0[0]+2*clr0[1]+clr0[2])>>2;
  57.     clr1[3]=(clr1[0]+2*clr1[1]+clr1[2])>>2;
  58.  
  59.     acy=(clr0[3]+clr1[3])>>1;
  60.  
  61.     p0=-((acy-pxy[ 0])>>16);
  62.     p1=-((acy-pxy[ 1])>>16);
  63.     p2=-((acy-pxy[ 2])>>16);
  64.     p3=-((acy-pxy[ 3])>>16);
  65.     block[4]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
  66.     p0=-((acy-pxy[ 4])>>16);
  67.     p1=-((acy-pxy[ 5])>>16);
  68.     p2=-((acy-pxy[ 6])>>16);
  69.     p3=-((acy-pxy[ 7])>>16);
  70.     block[5]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
  71.     p0=-((acy-pxy[ 8])>>16);
  72.     p1=-((acy-pxy[ 9])>>16);
  73.     p2=-((acy-pxy[10])>>16);
  74.     p3=-((acy-pxy[11])>>16);
  75.     block[6]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
  76.     p0=-((acy-pxy[12])>>16);
  77.     p1=-((acy-pxy[13])>>16);
  78.     p2=-((acy-pxy[14])>>16);
  79.     p3=-((acy-pxy[15])>>16);
  80.     block[7]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
  81. }
  82.  
  83. BGBBTJ_API void BGBBTJ_BCn_EncodeImageDXT1F(byte *block,
  84.     byte *rgba, int xs, int ys, int stride)
  85. {
  86.     int xs1, ys1;
  87.     int i, j;
  88.    
  89.     xs1=xs>>2; ys1=ys>>2;
  90.     for(i=0; i<ys1; i++)
  91.         for(j=0; j<xs1; j++)
  92.     {
  93.         BGBBTJ_BCn_EncodeBlockDXT1F(
  94.             block+(i*xs1+j)*8,
  95.             rgba+(i*4*xs+j*4)*stride,
  96.             stride, xs*stride, 3);
  97.     }
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement