Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Copyright (C) 2013 by Brendan G Bohannon
- Email: cr88192@gmail.com
- Copying: http://pastebin.com/iJxtZHm6
- */
- /*
- Tries to deliver moderate quality, while still trying to allow for reasonably fast encoding.
- Generally handles interpolation by treating it like a fixed-point fraction, and using this fraction to index into a table.
- */
- void BGBBTJ_BCn_EncodeBlockDXT5(byte *block,
- byte *rgba, int xstride, int ystride)
- {
- static const char idxtab[16]=
- { 0,0,0,0, 0,0,2,2, 3,3,1,1, 1,1,1,1 };
- static const char idxtab2[16]=
- { 0,0,0,0, 2,2,3,3, 4,4,5,5, 1,1,1,1 };
- byte pxa[16], pxy[16];
- int p0, p1, p2, p3, p4, p5, p6, p7;
- int l0, l1;
- int mcr, mcg, mcb, mca, mcy;
- int ncr, ncg, ncb, nca, ncy;
- int aca, acy;
- int cr, cg, cb, ca, cy;
- int i, j, k, l;
- mcr=255; mcg=255; mcb=255; mca=255; mcy=255;
- ncr= 0; ncg= 0; ncb= 0; nca= 0; ncy= 0;
- for(i=0; i<4; i++)
- for(j=0; j<4; j++)
- {
- k=(i*ystride)+(j*xstride);
- cr=rgba[k+0]; cg=rgba[k+1];
- cb=rgba[k+2]; ca=rgba[k+3];
- cy=(cr+(2*cg)+cb)>>2; //Luma
- pxa[i*4+j]=ca;
- pxy[i*4+j]=cy;
- //Find Mins/Maxs
- if(cy<mcy) { mcr=cr; mcg=cg; mcb=cb; mcy=cy; }
- if(cy>ncy) { ncr=cr; ncg=cg; ncb=cb; ncy=cy; }
- if(ca<mca) { mca=ca; }
- if(ca>nca) { nca=ca; }
- }
- aca=(mca+nca)>>1; //Median Alpha
- acy=(mcy+ncy)>>1; //Median Luma
- l0=49152/(nca-aca+1); //Fix-Point Scale (Alpha)
- l1=32768/(ncy-acy+1); //Fix-Point Scale (Luma)
- //Emit Alpha Block
- block[0]=mca;
- block[1]=nca;
- p0=idxtab2[(((pxa[ 0]-aca)*l0)>>13)+8];
- p1=idxtab2[(((pxa[ 1]-aca)*l0)>>13)+8];
- p2=idxtab2[(((pxa[ 2]-aca)*l0)>>13)+8];
- p3=idxtab2[(((pxa[ 3]-aca)*l0)>>13)+8];
- p4=idxtab2[(((pxa[ 4]-aca)*l0)>>13)+8];
- p5=idxtab2[(((pxa[ 5]-aca)*l0)>>13)+8];
- p6=idxtab2[(((pxa[ 6]-aca)*l0)>>13)+8];
- p7=idxtab2[(((pxa[ 7]-aca)*l0)>>13)+8];
- block[2]=p0|(p1<<3)|(p2<<6);
- block[3]=(p2>>2)|(p3<<1)|(p4<<4)|(p5<<7);
- block[4]=(p5>>1)|(p6<<2)|(p7<<5);
- p0=idxtab2[(((pxa[ 8]-aca)*l0)>>13)+8];
- p1=idxtab2[(((pxa[ 9]-aca)*l0)>>13)+8];
- p2=idxtab2[(((pxa[10]-aca)*l0)>>13)+8];
- p3=idxtab2[(((pxa[11]-aca)*l0)>>13)+8];
- p4=idxtab2[(((pxa[12]-aca)*l0)>>13)+8];
- p5=idxtab2[(((pxa[13]-aca)*l0)>>13)+8];
- p6=idxtab2[(((pxa[14]-aca)*l0)>>13)+8];
- p7=idxtab2[(((pxa[15]-aca)*l0)>>13)+8];
- block[5]=p0|(p1<<3)|(p2<<6);
- block[6]=(p2>>2)|(p3<<1)|(p4<<4)|(p5<<7);
- block[7]=(p5>>1)|(p6<<2)|(p7<<5);
- //Emit RGB Block
- i=((mcr<<8)&0xF800) | ((mcg<<3)&0x07E0) | ((mcb>>3)&0x001F);
- j=((ncr<<8)&0xF800) | ((ncg<<3)&0x07E0) | ((ncb>>3)&0x001F);
- block[ 8]=i; block[ 9]=i>>8;
- block[10]=j; block[11]=j>>8;
- p0=idxtab[(((pxy[ 0]-acy)*l1)>>13)+8];
- p1=idxtab[(((pxy[ 1]-acy)*l1)>>13)+8];
- p2=idxtab[(((pxy[ 2]-acy)*l1)>>13)+8];
- p3=idxtab[(((pxy[ 3]-acy)*l1)>>13)+8];
- block[12]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- p0=idxtab[(((pxy[ 4]-acy)*l1)>>13)+8];
- p1=idxtab[(((pxy[ 5]-acy)*l1)>>13)+8];
- p2=idxtab[(((pxy[ 6]-acy)*l1)>>13)+8];
- p3=idxtab[(((pxy[ 7]-acy)*l1)>>13)+8];
- block[13]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- p0=idxtab[(((pxy[ 8]-acy)*l1)>>13)+8];
- p1=idxtab[(((pxy[ 9]-acy)*l1)>>13)+8];
- p2=idxtab[(((pxy[10]-acy)*l1)>>13)+8];
- p3=idxtab[(((pxy[11]-acy)*l1)>>13)+8];
- block[14]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- p0=idxtab[(((pxy[12]-acy)*l1)>>13)+8];
- p1=idxtab[(((pxy[13]-acy)*l1)>>13)+8];
- p2=idxtab[(((pxy[14]-acy)*l1)>>13)+8];
- p3=idxtab[(((pxy[15]-acy)*l1)>>13)+8];
- block[15]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- }
- BGBBTJ_API void BGBBTJ_BCn_EncodeImageDXT5(byte *block,
- byte *rgba, int xs, int ys, int stride)
- {
- int xs1, ys1;
- int i, j;
- xs1=xs>>2; ys1=ys>>2;
- for(i=0; i<ys1; i++)
- for(j=0; j<xs1; j++)
- {
- BGBBTJ_BCn_EncodeBlockDXT5(
- block+(i*xs1+j)*16,
- rgba+(i*4*xs+j*4)*stride,
- stride, xs*stride);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement