⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 our_draw16.c

📁 mtk 3d 菜单演示,可以用于mt6225/mt6226等以上平台.
💻 C
📖 第 1 页 / 共 5 页
字号:
				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
			}
		}
P3:	
		if(y2<y3)						//the butt part
		{	
			y1=(1<<(DRAW_P_SHFT_X))/(y2-y3);
			//y1=-reciprocal_look[-(y2-y3)];
			x1=((x2-x3))*y1;
			y1>>=(DRAW_P_SHFT_X-SHIFR_L);
			if(x1>ke)
			{
				ks=x1;

				krs=(((color2&OUR_RGB_MASK8800)-(color3&OUR_RGB_MASK8800))>>16)*y1;			
				//kgs=(((color2&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*y1;				
				kbs=(((color2&OUR_RGB_MASK0088)-(color3&OUR_RGB_MASK0088)))*y1;
			}
			else
			{
				ke=x1;
			}
			//ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
			if(y2<0)
			{
				rs-=y2*krs;			
				//gs-=y2*kgs;			
				bs-=y2*kbs;
				
				dest-=y2*mempitch;			//point to next line
				xs-=y2*ks;					//next line xs
				xe-=y2*ke;					//next line xe
				
			}/**/
			if(y3>OUR_D_screem_h-1)
			{
				y3=OUR_D_screem_h-1;
			}
			//ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
			for(;yinc<=y3;yinc++)
			{			
				//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;
	}
#else

#endif
	//---------------------------------------------------------------------
	else if(y2<y3)//the butt part
	{		
		
		xs=((1<<SHIFR_L))/(y1-y3);	//y1=y2
		//xs=-reciprocal_look[-(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_MASK8800)-(color3&OUR_RGB_MASK8800))>>16)*xs;
			kre=(((color2&OUR_RGB_MASK8800)-(color1&OUR_RGB_MASK8800))>>16)*xe;
			
			//kgs=(((color1&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*xs;
			//kge=(((color2&OUR_RGB_MASK0080)-(color1&OUR_RGB_MASK0080))>>8)*xe;
			
			kbs=(((color1&OUR_RGB_MASK0088)-(color3&OUR_RGB_MASK0088)))*xs;
			kbe=(((color2&OUR_RGB_MASK0088)-(color1&OUR_RGB_MASK0088)))*xe;
			
			rs=(color1&OUR_RGB_MASK8800)<<(SHIFR_L-16);			
			//gs=(color1&OUR_RGB_MASK0080)<<(SHIFR_L-8);			
			bs=(color1&OUR_RGB_MASK0088)<<SHIFR_L;

			xs=x1<<SHIFR_L;
			xe=x2<<SHIFR_L;
		}	
		else if(ks<ke)	
		{
			xe=((1<<SHIFR_L))/(x1-x2);	
			krs=(((color2&OUR_RGB_MASK8800)-(color3&OUR_RGB_MASK8800))>>16)*xs;
			kre=(((color1&OUR_RGB_MASK8800)-(color2&OUR_RGB_MASK8800))>>16)*xe;
			
			//kgs=(((color2&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*xs;
			//kge=(((color1&OUR_RGB_MASK0080)-(color2&OUR_RGB_MASK0080))>>8)*xe;
			
			kbs=(((color2&OUR_RGB_MASK0088)-(color3&OUR_RGB_MASK0088)))*xs;
			kbe=(((color1&OUR_RGB_MASK0088)-(color2&OUR_RGB_MASK0088)))*xe;
			
			OUR_SWAP(ks,ke,xs);			
			
			rs=(color2&OUR_RGB_MASK8800)<<(SHIFR_L-16);			
			//gs=(color2&OUR_RGB_MASK0080)<<(SHIFR_L-8);			
			bs=(color2&OUR_RGB_MASK0088)<<SHIFR_L;

			xe=x1<<SHIFR_L;
			xs=x2<<SHIFR_L;
		}
		else
		{
			return;
		}
		//clip
		if(y1<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
			y1=0;
		}
		if(y3>=OUR_D_screem_h)	
		{
			y3=OUR_D_screem_h;
		}
		for(yinc=y1;yinc<y3;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>>SHIFR_L;
			y1=(xe>>SHIFR_L);
			if(xinc<0)
			{
				k_r_inc-=xinc*kre;
				//k_g_inc-=xinc*kge;
				k_b_inc-=xinc*kbe;
				xinc=0;
			}
			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;	
		}		
		return;
	}
		
}



//				k_g_inc+=kge;\
//------------------------------------------------------*bmp->width&OUR_RGB_MASK0088
#define FILE_BMP	{\
    dest[xinc++] =((CLR16 *)bmp->bmp_data)[((((k_r_inc>>(SHIFR_L)))<<(bmp->bits))+(k_b_inc>>SHIFR_L))];\
    \
    k_r_inc+=kre;\
    k_b_inc+=kbe;\
}

//------------------------------------------------------
void OUR_Draw_BMP_CLIP_PRE_2D16(	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,bs,be;
    int krs,kre,kbs,kbe;
    int  k_r_inc;
    //int  k_g_inc;gs,ge,kgs,kge,
    int  k_b_inc;
    CLR16 *dest;
    /*
    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
    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);	
        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;
            //for z
            //kge=((z1-z2))*xs;
            //kgs=((z1-z3))*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;
            //for z
            //kgs=((z1-z2))*xs;
            //kge=((z1-z3))*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
            //---------------------------------------------
            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);
            //---------------------------------------------
            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=z1;		
        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
            {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -