Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

vaguely fast DXT1 encoder.

By: cr88192 on Feb 6th, 2013  |  syntax: C  |  size: 2.20 KB  |  views: 47  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  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. }