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

📄 our_draw32.c

📁 这是一个简单的3d动画mmi,这是模拟器上的
💻 C
📖 第 1 页 / 共 4 页
字号:
            kbe=(((kbe-kbs)>>5)*xs)>>(SHIFT-SHIFR_L-5-4);
        }
        else
        {
            xs=((1<<(SHIFT)))/((ke-ks)>>GND_KKKK);
            kre=(((kre-krs)>>5)*xs)>>(SHIFT-SHIFR_L-5+GND_KKKK);		
            kge=(((kge-kgs)>>5)*xs)>>(SHIFT-SHIFR_L-5+GND_KKKK);		
            kbe=(((kbe-kbs)>>5)*xs)>>(SHIFT-SHIFR_L-5+GND_KKKK);
        }/**/
        xs=(x1<<(DRAW_P_SHFT_X));
        xe=(x1<<(DRAW_P_SHFT_X));
        
        rs=(color1&OUR_RGB_MASK0800)<<(SHIFR_L-16);		
        gs=(color1&OUR_RGB_MASK0080)<<(SHIFR_L-8);		
        bs=(color1&OUR_RGB_MASK0008)<<SHIFR_L;
        for(yinc=y1;yinc<y2;yinc++)		//scan lines
        {	
            k_r_inc=rs;
            k_g_inc=gs;
            k_b_inc=bs;
            //------------------------------------------------------	
            xinc=xs>>(DRAW_P_SHFT_X);
            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);
            for(;xinc<=y1;)	
            {
                FILE_GOURAUD32;
            }	
            rs+=krs;			
            gs+=kgs;			
            bs+=kbs;
            
            dest+=mempitch;			//point to next line
            xs+=ks;					//next line xs
            xe+=ke;					//next line xe
        }
        if(y2<y3)						//the butt part
        {	
            y1=(1<<(DRAW_P_SHFT_X))/(y2-y3);
            x1=((x2-x3))*y1;
            y1>>=(DRAW_P_SHFT_X-SHIFR_L);
            if(x1>ke)
            {
                ks=x1;
                
                krs=(((color2&OUR_RGB_MASK0800)-(color3&OUR_RGB_MASK0800))>>16)*y1;			
                kgs=(((color2&OUR_RGB_MASK0080)-(color3&OUR_RGB_MASK0080))>>8)*y1;				
                kbs=(((color2&OUR_RGB_MASK0008)-(color3&OUR_RGB_MASK0008)))*y1;
            }
            else
            {
                ke=x1;
            }
            for(;yinc<=y3;yinc++)
            {			
                k_r_inc=rs;
                k_g_inc=gs;
                k_b_inc=bs;
                //------------------------------------------------------
                xinc=xs>>(DRAW_P_SHFT_X);
                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);
                for(;xinc<=y1;)	
                {
                    FILE_GOURAUD32;
                }
                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_MASK0800)-(color3&OUR_RGB_MASK0800))>>16)*xs;
        kre=(((color2&OUR_RGB_MASK0800)-(color1&OUR_RGB_MASK0800))>>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_MASK0008)-(color3&OUR_RGB_MASK0008)))*xs;
        kbe=(((color2&OUR_RGB_MASK0008)-(color1&OUR_RGB_MASK0008)))*xe;
        
        rs=(color1&OUR_RGB_MASK0800)<<(SHIFR_L-16);			
        gs=(color1&OUR_RGB_MASK0080)<<(SHIFR_L-8);			
        bs=(color1&OUR_RGB_MASK0008)<<SHIFR_L;
        
        xs=x1<<SHIFR_L;
        xe=x2<<SHIFR_L;
    }	
    else if(ks<ke)	
    {
        xe=((1<<SHIFR_L))/(x1-x2);	
        krs=(((color2&OUR_RGB_MASK0800)-(color3&OUR_RGB_MASK0800))>>16)*xs;
        kre=(((color1&OUR_RGB_MASK0800)-(color2&OUR_RGB_MASK0800))>>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_MASK0008)-(color3&OUR_RGB_MASK0008)))*xs;
        kbe=(((color1&OUR_RGB_MASK0008)-(color2&OUR_RGB_MASK0008)))*xe;
        
        OUR_SWAP(ks,ke,xs);			
        
        rs=(color2&OUR_RGB_MASK0800)<<(SHIFR_L-16);			
        gs=(color2&OUR_RGB_MASK0080)<<(SHIFR_L-8);			
        bs=(color2&OUR_RGB_MASK0008)<<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);
        for(;xinc<=y1;)	
        {
            FILE_GOURAUD32;
        }
        rs+=krs;			
        gs+=kgs;			
        bs+=kbs;
        
        dest+=mempitch;			//point to next line
        xs+=ks;					//next line xs
        xe+=ke;	
    }		
    return;
}

}
//------------------------------------------------------

//------------------------------------------------------
#define FILE_BMP32 	{\
    dest[xinc++] =bmp->bmp_data[((((k_r_inc>>(SHIFR_L))&OUR_RGB_MASK0008)<<bmp->width)+(k_b_inc>>SHIFR_L))];\
    \
    k_r_inc+=kre;\
    k_g_inc+=kge;\
    k_b_inc+=kbe;\
}
//------------------------------------------------------
void OUR_Draw_BMP_2D32(	int x1,int y1,
                       int x2,int y2,
                       int x3,int y3,
                       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;
    CLR *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(color1,color2,rs);
    }
    if(y1>y3)
    {
        OUR_SWAP(y1,y3,xs);
        OUR_SWAP(x1,x3,xs);
        OUR_SWAP(color1,color3,rs);
    }
    if(y2>y3)
    {
        OUR_SWAP(y2,y3,xs);
        OUR_SWAP(x2,x3,xs);
        OUR_SWAP(color2,color3,rs);
    }								//18t
    
    //mempitch>>=2;					//(sizeof(dest)/2);
    dest = (CLR*)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;
            
            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
            //---------------------------------------------
            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=(color1&OUR_RGB_MASK0080)<<(SHIFR_L-8);		
        bs=(color1&OUR_RGB_MASK0088)<<SHIFR_L;
        for(yinc=y1;yinc<y2;yinc++)		//scan lines
        {	
            k_r_inc=rs;
            k_g_inc=gs;
            k_b_inc=bs;
            //------------------------------------------------------	
            xinc=xs>>(DRAW_P_SHFT_X);
            y1=(xe>>(DRAW_P_SHFT_X));
            dest[xinc++] =bmp->bmp_data[((((k_r_inc>>(SHIFR_L))&OUR_RGB_MASK0008)<<bmp->width)+(k_b_inc>>SHIFR_L))];
            for(;xinc<=y1;)	
            {
                FILE_BMP32;
            }		
            rs+=krs;			
            gs+=kgs;			
            bs+=kbs;
            
            dest+=mempitch;			//point to next line
            xs+=ks;					//next line xs
            xe+=ke;					//next line xe
        }
        if(y2<y3)						//the butt part
        {	
            y1=(1<<(DRAW_P_SHFT_X))/(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;
            }
            for(;yinc<=y3;yinc++)
            {			
                k_r_inc=rs;
                k_g_inc=gs;

⌨️ 快捷键说明

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