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
- */
- void BGBBTJ_BCn_EncodeBlockDXT1A(byte *block,
- byte *rgba, int xstride, int ystride)
- {
- static char idxtaba[16]=
- { 0,0,0,0, 0,0,2,2, 3,3,1,1, 1,1,1,1 };
- static char idxtabb[16]=
- { 1,1,1,1, 1,1,3,3, 2,2,0,0, 0,0,0,0 };
- static char idxtabc[16]=
- { 0,0,0,0, 0,0,2,2, 2,2,1,1, 1,1,1,1 };
- static char idxtabd[16]=
- { 1,1,1,1, 1,1,2,2, 2,2,0,0, 0,0,0,0 };
- byte pxa[16], pxy[16];
- char *idxtab;
- int p0, p1, p2, p3, p4, p5, p6, p7;
- int l0, l1, l2, l3a, l3b;
- int mcr, mcg, mcb, mca, mcy;
- int ncr, ncg, ncb, nca, ncy;
- int acr, acg, acb, 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;
- acr= 0; acg= 0; acb= 0; aca= 0; acy= 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; }
- acr+=cr; acg+=cg;
- acb+=cb; acy+=cy;
- }
- #if 1
- acr=(acr+8)>>4;
- acg=(acg+8)>>4;
- acb=(acb+8)>>4;
- acy=(acr+(2*acg)+acb)>>2;
- l=(256*mcy)/(acy+1);
- cr=(acr*l+128)>>8;
- cg=(acg*l+128)>>8;
- cb=(acb*l+128)>>8;
- mcr=(mcr+cr)>>1;
- mcg=(mcg+cg)>>1;
- mcb=(mcb+cb)>>1;
- l=(256*ncy)/(acy+1);
- cr=(acr*l+128)>>8;
- cg=(acg*l+128)>>8;
- cb=(acb*l+128)>>8;
- ncr=(ncr+cr)>>1;
- ncg=(ncg+cg)>>1;
- ncb=(ncb+cb)>>1;
- #endif
- #if 1
- mcr=((mcr+3)>>3)<<3;
- mcg=((mcg+1)>>2)<<2;
- mcb=((mcb+3)>>3)<<3;
- ncr=((ncr+5)>>3)<<3;
- ncg=((ncg+3)>>2)<<2;
- ncb=((ncb+5)>>3)<<3;
- mcr=(mcr<0)?0:((mcr>255)?255:mcr);
- mcg=(mcg<0)?0:((mcg>255)?255:mcg);
- mcb=(mcb<0)?0:((mcb>255)?255:mcb);
- ncr=(ncr<0)?0:((ncr>255)?255:ncr);
- ncg=(ncg<0)?0:((ncg>255)?255:ncg);
- ncb=(ncb<0)?0:((ncb>255)?255:ncb);
- #endif
- 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)
- l2=65536-2048;
- if(nca<128)
- {
- //Fully Transparent Block
- i=((acr<<8)&0xF800) | ((acg<<3)&0x07E0) | ((acb>>3)&0x001F);
- block[0]=i; block[1]=i>>8;
- block[2]=i; block[3]=i>>8;
- block[4]=255; block[5]=255;
- block[6]=255; block[7]=255;
- }else if((mcr==ncr) && (mcg==ncg) && (mcb==ncb) && (mca==nca))
- {
- //Flat Color Block
- i=((mcr<<8)&0xF800) | ((mcg<<3)&0x07E0) | ((mcb>>3)&0x001F);
- j=((ncr<<8)&0xF800) | ((ncg<<3)&0x07E0) | ((ncb>>3)&0x001F);
- if(j<=i)
- {
- block[0]=i; block[1]=i>>8;
- block[2]=j; block[3]=j>>8;
- }else
- {
- block[0]=j; block[1]=j>>8;
- block[2]=i; block[3]=i>>8;
- }
- if(i!=j)
- {
- block[4]=(2<<6)|(3<<4)|(2<<2)|3;
- block[5]=(3<<6)|(2<<4)|(3<<2)|2;
- block[6]=(2<<6)|(3<<4)|(2<<2)|3;
- block[7]=(3<<6)|(2<<4)|(3<<2)|2;
- }else
- {
- block[4]=0; block[5]=0;
- block[6]=0; block[7]=0;
- }
- }else if(mca>=128)
- {
- //Emit RGB Block (Opaque)
- l1=(32768-6144)/(ncy-acy+1); //Fix-Point Scale (Luma)
- l3a=65536-1024;
- l3b=65536+1024;
- i=((mcr<<8)&0xF800) | ((mcg<<3)&0x07E0) | ((mcb>>3)&0x001F);
- j=((ncr<<8)&0xF800) | ((ncg<<3)&0x07E0) | ((ncb>>3)&0x001F);
- if(j<i)
- {
- block[0]=i; block[1]=i>>8;
- block[2]=j; block[3]=j>>8;
- idxtab=idxtaba;
- }else if(i<j)
- {
- block[0]=j; block[1]=j>>8;
- block[2]=i; block[3]=i>>8;
- idxtab=idxtabb;
- }else
- {
- block[0]=i; block[1]=i>>8;
- block[2]=j; block[3]=j>>8;
- idxtab=idxtabc;
- }
- p0=idxtab[((pxy[ 0]-acy)*l1+l3a)>>13];
- p1=idxtab[((pxy[ 1]-acy)*l1+l3b)>>13];
- p2=idxtab[((pxy[ 2]-acy)*l1+l3a)>>13];
- p3=idxtab[((pxy[ 3]-acy)*l1+l3b)>>13];
- block[4]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- p0=idxtab[((pxy[ 4]-acy)*l1+l3b)>>13];
- p1=idxtab[((pxy[ 5]-acy)*l1+l3a)>>13];
- p2=idxtab[((pxy[ 6]-acy)*l1+l3b)>>13];
- p3=idxtab[((pxy[ 7]-acy)*l1+l3a)>>13];
- block[5]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- p0=idxtab[((pxy[ 8]-acy)*l1+l3a)>>13];
- p1=idxtab[((pxy[ 9]-acy)*l1+l3b)>>13];
- p2=idxtab[((pxy[10]-acy)*l1+l3a)>>13];
- p3=idxtab[((pxy[11]-acy)*l1+l3b)>>13];
- block[6]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- p0=idxtab[((pxy[12]-acy)*l1+l3b)>>13];
- p1=idxtab[((pxy[13]-acy)*l1+l3a)>>13];
- p2=idxtab[((pxy[14]-acy)*l1+l3b)>>13];
- p3=idxtab[((pxy[15]-acy)*l1+l3a)>>13];
- block[7]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- }else
- {
- //Emit RGB Block (Alpha)
- l1=(32768-6144)/(ncy-acy+1); //Fix-Point Scale (Luma)
- l3a=65536-1024;
- l3b=65536+1024;
- i=((mcr<<8)&0xF800) | ((mcg<<3)&0x07E0) | ((mcb>>3)&0x001F);
- j=((ncr<<8)&0xF800) | ((ncg<<3)&0x07E0) | ((ncb>>3)&0x001F);
- if(i<=j)
- {
- block[0]=i; block[1]=i>>8;
- block[2]=j; block[3]=j>>8;
- idxtab=idxtabc;
- }else
- {
- block[0]=j; block[1]=j>>8;
- block[2]=i; block[3]=i>>8;
- idxtab=idxtabd;
- }
- p0=idxtab[((pxy[ 0]-acy)*l1+l3a)>>13] | (((pxa[ 0]-128)>>10)&3);
- p1=idxtab[((pxy[ 1]-acy)*l1+l3b)>>13] | (((pxa[ 1]-128)>>10)&3);
- p2=idxtab[((pxy[ 2]-acy)*l1+l3a)>>13] | (((pxa[ 2]-128)>>10)&3);
- p3=idxtab[((pxy[ 3]-acy)*l1+l3b)>>13] | (((pxa[ 3]-128)>>10)&3);
- block[4]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- p0=idxtab[((pxy[ 4]-acy)*l1+l3b)>>13] | (((pxa[ 4]-128)>>10)&3);
- p1=idxtab[((pxy[ 5]-acy)*l1+l3a)>>13] | (((pxa[ 5]-128)>>10)&3);
- p2=idxtab[((pxy[ 6]-acy)*l1+l3b)>>13] | (((pxa[ 6]-128)>>10)&3);
- p3=idxtab[((pxy[ 7]-acy)*l1+l3a)>>13] | (((pxa[ 7]-128)>>10)&3);
- block[5]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- p0=idxtab[((pxy[ 8]-acy)*l1+l3a)>>13] | (((pxa[ 8]-128)>>10)&3);
- p1=idxtab[((pxy[ 9]-acy)*l1+l3b)>>13] | (((pxa[ 9]-128)>>10)&3);
- p2=idxtab[((pxy[10]-acy)*l1+l3a)>>13] | (((pxa[10]-128)>>10)&3);
- p3=idxtab[((pxy[11]-acy)*l1+l3b)>>13] | (((pxa[11]-128)>>10)&3);
- block[6]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- p0=idxtab[((pxy[12]-acy)*l1+l3b)>>13] | (((pxa[12]-128)>>10)&3);
- p1=idxtab[((pxy[13]-acy)*l1+l3a)>>13] | (((pxa[13]-128)>>10)&3);
- p2=idxtab[((pxy[14]-acy)*l1+l3b)>>13] | (((pxa[14]-128)>>10)&3);
- p3=idxtab[((pxy[15]-acy)*l1+l3a)>>13] | (((pxa[15]-128)>>10)&3);
- block[7]=(p3<<6)|(p2<<4)|(p1<<2)|p0;
- }
- }
- BGBBTJ_API void BGBBTJ_BCn_EncodeImageDXT1(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_EncodeBlockDXT1A(
- block+(i*xs1+j)*8,
- rgba+(i*4*xs+j*4)*stride,
- stride, xs*stride);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement