📄 our_draw16.c
字号:
y1=(xe>>(DRAW_P_SHFT_X));
//dest[xinc++] =((k_r_inc>>(SHIFR_L-16))&OUR_RGB_MASK0800)+\
// ((k_g_inc>>(SHIFR_L-8))&OUR_RGB_MASK0080)+((k_b_inc>>SHIFR_L)&OUR_RGB_MASK0008);
dest[xinc++] =((k_r_inc>>(SHIFR_L-8))&OUR_RGB_MASK500)+\
((k_g_inc>>(SHIFR_L-3))&OUR_RGB_MASK060)+((k_b_inc>>(SHIFR_L+3))&OUR_RGB_MASK005);
#if OUR_FAST_2D
for(;xinc<=y1-8;)
{
FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
}
if(xinc<=y1-4)
{
FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
}
for(;xinc<=y1;)
{
FILE_GOURAUD;
}
#else
for(;xinc<=y1;)
{
FILE_GOURAUD;
}
#endif
rs+=krs;
gs+=kgs;
bs+=kbs;
dest+=mempitch; //point to next line
xs+=ks; //next line xs
xe+=ke; //next line xe
}
}
return;
}
#else
#endif
//---------------------------------------------------------------------
else if(y2<y3)//the butt part
{
xs=((1<<SHIFR_L))/(y1-y3); //y1=y2
ks=((x1-x3))*xs; //slope 1 --> 2
ke=((x2-x3))*xs; //slope 1 --> 3
if(ks>ke) //start slope must be smaller than the end one
{
xe=((1<<SHIFR_L))/(x2-x1);
krs=(((color1&OUR_RGB_MASK0500)-(color3&OUR_RGB_MASK0500))>>16)*xs;
kre=(((color2&OUR_RGB_MASK0500)-(color1&OUR_RGB_MASK0500))>>16)*xe;
kgs=(((color1&OUR_RGB_MASK0060)-(color3&OUR_RGB_MASK0060))>>8)*xs;
kge=(((color2&OUR_RGB_MASK0060)-(color1&OUR_RGB_MASK0060))>>8)*xe;
kbs=(((color1&OUR_RGB_MASK0005)-(color3&OUR_RGB_MASK0005)))*xs;
kbe=(((color2&OUR_RGB_MASK0005)-(color1&OUR_RGB_MASK0005)))*xe;
rs=(color1&OUR_RGB_MASK0500)<<(SHIFR_L-16);
gs=(color1&OUR_RGB_MASK0060)<<(SHIFR_L-8);
bs=(color1&OUR_RGB_MASK0005)<<SHIFR_L;
xs=x1<<SHIFR_L;
xe=x2<<SHIFR_L;
}
else if(ks<ke)
{
xe=((1<<SHIFR_L))/(x1-x2);
krs=(((color2&OUR_RGB_MASK0500)-(color3&OUR_RGB_MASK0500))>>16)*xs;
kre=(((color1&OUR_RGB_MASK0500)-(color2&OUR_RGB_MASK0500))>>16)*xe;
kgs=(((color2&OUR_RGB_MASK0060)-(color3&OUR_RGB_MASK0060))>>8)*xs;
kge=(((color1&OUR_RGB_MASK0060)-(color2&OUR_RGB_MASK0060))>>8)*xe;
kbs=(((color2&OUR_RGB_MASK0005)-(color3&OUR_RGB_MASK0005)))*xs;
kbe=(((color1&OUR_RGB_MASK0005)-(color2&OUR_RGB_MASK0005)))*xe;
OUR_SWAP(ks,ke,xs);
rs=(color2&OUR_RGB_MASK0500)<<(SHIFR_L-16);
gs=(color2&OUR_RGB_MASK0060)<<(SHIFR_L-8);
bs=(color2&OUR_RGB_MASK0005)<<SHIFR_L;
xe=x1<<SHIFR_L;
xs=x2<<SHIFR_L;
}
else
{
return;
}
for(yinc=y1;yinc<y3;yinc++) //scan lines
{
k_r_inc=rs;
k_g_inc=gs;
k_b_inc=bs;
//------------------------------------------------------
xinc=xs>>SHIFR_L;
y1=(xe>>SHIFR_L);
//dest[xinc++] =((k_r_inc>>(SHIFR_L-16))&OUR_RGB_MASK0800)+\
// ((k_g_inc>>(SHIFR_L-8))&OUR_RGB_MASK0080)+((k_b_inc>>SHIFR_L)&OUR_RGB_MASK0008);
dest[xinc++] =((k_r_inc>>(SHIFR_L-8))&OUR_RGB_MASK500)+\
((k_g_inc>>(SHIFR_L-3))&OUR_RGB_MASK060)+((k_b_inc>>(SHIFR_L+3))&OUR_RGB_MASK005);
#if OUR_FAST_2D
for(;xinc<=y1-8;)
{
FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
}
if(xinc<=y1-4)
{
FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;FILE_GOURAUD;
}
for(;xinc<=y1;)
{
FILE_GOURAUD;
}
#else
for(;xinc<=y1;)
{
FILE_GOURAUD;
}
#endif
rs+=krs;
gs+=kgs;
bs+=kbs;
dest+=mempitch; //point to next line
xs+=ks; //next line xs
xe+=ke;
}
return;
}
}
#endif
//------------------------------------------------------
#define FILE_BMP16_1 {*dest_++ =\
bmp_pt[((((k_r_inc&0xffc0000)>>(SHIFR_L-bmp->bits)))+(k_b_inc>>SHIFR_L))];\
}
#define FILE_BMP16 {\
FILE_BMP16_1;\
k_r_inc+=kre;\
k_b_inc+=kbe;\
}
//------------------------------------------------------
void OUR_Draw_BMP_CLIP_PRE_2D16_Q( int x1,int y1,int z1,
int x2,int y2,int z2,
int x3,int y3,int z3,
CLR color1,
CLR color2,
CLR color3,
UCHAR *dest_buffer, int mempitch,
OUR_BMP_INFO* bmp
)
{
int xs,xe,ks,ke,xinc;
int yinc;
CLR rs,re,gs,ge,bs,be;
int krs,kre,kgs,kge,kbs,kbe;
int k_r_inc;
int k_g_inc;
int k_b_inc;
CLR16 *dest;
CLR16 *dest_;
CLR16 *bmp_pt;
/*
x1=10<<1;
y1=10<<1;
x2=10<<1;
y2=265<<1;
x3=265<<1;
y3=265<<1;
color3 = 0x000080;
color1 = 0x008080;
color2 = 0x000000;
*/
//make sure y1<y2<y3
bmp_pt=((CLR16 *)bmp->bmp_data);
if(y1>y2)
{
OUR_SWAP(y1,y2,xs);
OUR_SWAP(x1,x2,xs);
OUR_SWAP(z1,z2,xs);
OUR_SWAP(color1,color2,rs);
}
if(y1>y3)
{
OUR_SWAP(y1,y3,xs);
OUR_SWAP(x1,x3,xs);
OUR_SWAP(z1,z3,xs);
OUR_SWAP(color1,color3,rs);
}
if(y2>y3)
{
OUR_SWAP(y2,y3,xs);
OUR_SWAP(x2,x3,xs);
OUR_SWAP(z2,z3,xs);
OUR_SWAP(color2,color3,rs);
} //18t
//mempitch>>=2; //(sizeof(dest)/2);
dest = (CLR16*)dest_buffer +y1*mempitch; //point to the line of y1
#if 1
if(y1<y2 ) //the top part
{
xs=(1<<(DRAW_P_SHFT_X))/(y1-y2);
xe=(1<<(DRAW_P_SHFT_X))/(y1-y3);
//xs=-reciprocal_look[-(y1-y2)];
//xe=-reciprocal_look[-(y1-y3)];
ks=((x1-x2))*xs; //slope 1 --> 2
ke=((x1-x3))*xe; //slope 1 --> 3
xs>>=(DRAW_P_SHFT_X-SHIFR_L);
xe>>=(DRAW_P_SHFT_X-SHIFR_L);
if(ks>ke) //start slope must be smaller than the end one
{
kre=(((color1&OUR_RGB_MASK8800)-(color2&OUR_RGB_MASK8800))>>16)*xs;
krs=(((color1&OUR_RGB_MASK8800)-(color3&OUR_RGB_MASK8800))>>16)*xe;
//kge=(((color1&OUR_RGB_MASK0080)-(color2&OUR_RGB_MASK0080))>>8)*xs;
//kgs=(((color1&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*xe;
kbe=(((color1&OUR_RGB_MASK0088)-(color2&OUR_RGB_MASK0088)))*xs;
kbs=(((color1&OUR_RGB_MASK0088)-(color3&OUR_RGB_MASK0088)))*xe;
OUR_SWAP(ks,ke,xs);
}
else if(ks<ke)
{
krs=(((color1&OUR_RGB_MASK8800)-(color2&OUR_RGB_MASK8800))>>16)*xs;
kre=(((color1&OUR_RGB_MASK8800)-(color3&OUR_RGB_MASK8800))>>16)*xe;
//kgs=(((color1&OUR_RGB_MASK0080)-(color2&OUR_RGB_MASK0080))>>8)*xs;
//kge=(((color1&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*xe;
kbs=(((color1&OUR_RGB_MASK0088)-(color2&OUR_RGB_MASK0088)))*xs;
kbe=(((color1&OUR_RGB_MASK0088)-(color3&OUR_RGB_MASK0088)))*xe;
}
else
{
return;
}
#define BMP_KKKK 5
//this place must be carefull
if((ke-ks)<(1<<DRAW_P_SHFT_X))
{
xs=((1<<(SHIFT+DRAW_P_SHFT_X-SHIFR_L-2)))/((ke-ks));// 28 -- 10 -20 =18 -10
//xs=reciprocal_look[((ke-ks)>>8)]<<2;// 28 -- 10 -20 =18 -10
//---------------------------------------------
kre= (kre-krs);
if(kre>(-(1<<DRAW_P_SHFT_X)) && kre<(1<<DRAW_P_SHFT_X) )
kre=(((kre)>>5)*xs)>>(SHIFT-SHIFR_L-5-2);
else
kre=(((kre)>>10)*xs)>>(SHIFT-SHIFR_L-10-2);
//----------------------------------------------
//kge= (kge-kgs);
//if(kge>(-(1<<DRAW_P_SHFT_X)) && kge<(1<<DRAW_P_SHFT_X))
// kge=(((kge)>>5)*xs)>>(SHIFT-SHIFR_L-5-2);
//else
// kge=(((kge)>>10)*xs)>>(SHIFT-SHIFR_L-10-2);
//----------------------------------------------
kbe= (kbe-kbs);
if(kbe>(-(1<<DRAW_P_SHFT_X)) && kbe<(1<<DRAW_P_SHFT_X))
kbe=(((kbe)>>5)*xs)>>(SHIFT-SHIFR_L-5-2);
else
kbe=(((kbe)>>10)*xs)>>(SHIFT-SHIFR_L-10-2);
}
else
{
xs=((1<<(SHIFT+DRAW_P_SHFT_X-SHIFR_L)))/((ke-ks)>>3);
//xs=reciprocal_look[((ke-ks)>>18)]>>6;
//---------------------------------------------
kre= (kre-krs);
if(kre>(-(1<<DRAW_P_SHFT_X)) && kre<(1<<DRAW_P_SHFT_X))
kre=(((kre)>>5)*xs)>>(SHIFT-SHIFR_L-5+3);
else
kre=(((kre)>>10)*xs)>>(SHIFT-SHIFR_L-10+3);
//----------------------------------------------
//kge= (kge-kgs);
//if(kge>(-(1<<DRAW_P_SHFT_X)) && kge<(1<<DRAW_P_SHFT_X))
// kge=(((kge)>>5)*xs)>>(SHIFT-SHIFR_L-5+3);
//else
// kge=(((kge)>>10)*xs)>>(SHIFT-SHIFR_L-10+3);
//----------------------------------------------
kbe= (kbe-kbs);
if(kbe>(-(1<<DRAW_P_SHFT_X)) && kbe<(1<<DRAW_P_SHFT_X))
kbe=(((kbe)>>5)*xs)>>(SHIFT-SHIFR_L-5+3);
else
kbe=(((kbe)>>10)*xs)>>(SHIFT-SHIFR_L-10+3);
}
xs=(x1<<(DRAW_P_SHFT_X));
xe=(x1<<(DRAW_P_SHFT_X));
rs=(color1&OUR_RGB_MASK8800)<<(SHIFR_L-16);
//gs=(color1&OUR_RGB_MASK0080)<<(SHIFR_L-8);
bs=(color1&OUR_RGB_MASK0088)<<SHIFR_L;
//clip ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
yinc=y1;
if(y1<0)
{
if(y2>0)
{
rs-=y1*krs;
//gs-=y1*kgs;
bs-=y1*kbs;
dest-=y1*mempitch; //point to next line
xs-=y1*ks; //next line xs
xe-=y1*ke; //next line xe
yinc=0;
}
else
{
y1=y1-y2;
rs-=y1*krs;
//gs-=y1*kgs;
bs-=y1*kbs;
dest-=y1*mempitch; //point to next line
xs-=y1*ks; //next line xs
xe-=y1*ke; //next line xe
yinc=0;
goto P3;
}/**/
}
if(y2>=OUR_D_screem_h)
{
for(;yinc<OUR_D_screem_h;yinc++) //scan lines
{
//k_r_inc=rs;
//k_g_inc=gs;
//k_b_inc=bs;
k_r_inc=rs+(((kre*(xs<<12))>>20)>>8);
//k_g_inc=gs;
k_b_inc=bs+(((kbe*(xs<<12))>>20)>>8);
//------------------------------------------------------
xinc=xs>>(DRAW_P_SHFT_X);
if(xinc<0)
{
k_r_inc-=xinc*kre;
//k_g_inc-=xinc*kge;
k_b_inc-=xinc*kbe;
xinc=0;
}
y1=(xe>>(DRAW_P_SHFT_X));
dest_=dest+xinc;
if(y1>=OUR_D_screem_w)
{
y1=OUR_D_screem_w-1;
}
else if(y1>0)
{
//dest[xinc++] =((CLR16 *)bmp->bmp_data)[((((k_r_inc>>(SHIFR_L))&OUR_RGB_MASK0008)<<bmp->width)+(k_b_inc>>SHIFR_L))];
//FILE_BMP16_1;
}
(CLR16*)y1=dest+y1;
for(;dest_<=(CLR16*)y1;)
{
FILE_BMP16;
}
rs+=krs;
//gs+=kgs;
bs+=kbs;
dest+=mempitch; //point to next line
xs+=ks; //next line xs
xe+=ke; //next line xe
}
return;
}
//ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
//else if(y2>0)
{
for(;yinc<y2;yinc++) //scan lines
{
//k_r_inc=rs;
//k_g_inc=gs;
//k_b_inc=bs;
k_r_inc=rs+(((kre*(xs<<12))>>20)>>8);
//k_g_inc=gs;
k_b_inc=bs+(((kbe*(xs<<12))>>20)>>8);
//------------------------------------------------------
xinc=xs>>(DRAW_P_SHFT_X);
if(xinc<0)
{
k_r_inc-=xinc*kre;
//k_g_inc-=xinc*kge;
k_b_inc-=xinc*kbe;
xinc=0;
}
y1=(xe>>(DRAW_P_SHFT_X));
dest_=dest+xinc;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -