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

📄 directdisplay.c

📁 在移植成功ucos核的基础上扩充了该操作系统的许多没有功能。如文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "..\ucos-ii\includes.h"
#include "..\inc\drv\loadfile.h"
#include "..\inc\maro.h"
#include "..\inc\drv\OSFile.h"
#include <math.h>

#include "../inc/drv/DirectDisplay.h"


U32* pDirectLCDBuffer=(U32*)0xc000000;

#if  DIRECT_DISPLAY==1

//#ifdef COLORDEPTH_GRAY

void Direct_SetPixel(PDC pdc, int x, int y, COLORREF color)
{

	U32  temp=0x00000000;
	U32*  p;
	x*=LCDWIDTH;
	x/=pdc->DrawRangex;
	y*=LCDHEIGHT;
	y/=pdc->DrawRangey;
	
	x+=pdc->DrawOrgx+pdc->WndOrgx;
	y+=pdc->DrawOrgy+pdc->WndOrgy;	

      #if  COLORDEPTH_GRAY==1		




	if(x%8==0){
          p=pDirectLCDBuffer+LCDWIDTH/8*y+x/8-1;
	   temp=color;  
		}
	else	{
	   p=pDirectLCDBuffer+LCDWIDTH/8*y+x/8;	
	   temp=color<<(8-x%8)*4;
		}
	
	if(IsInRect(&pdc->DrawRect, x, y)){
		switch(pdc->PenMode){
		case GRAPH_MODE_NORMAL:		
			if(color>0x00000000)
			*p=*p|temp;
			else if(color==0x00000000){
				switch(x%8){
				case  0:
                                   temp=temp+0xfffffff0;
					break;
				case  1:
					temp=temp+0x0fffffff;					
					break;
				case  2:
                                   temp=temp+0xf0ffffff;	
					break;
				case  3:
                                   temp=temp+0xff0fffff;	
					break;
				case  4:
                                   temp=temp+0xfff0ffff;
					break;
				case  5:
                                   temp=temp+0xffff0fff;
					break;
				case  6:
                                   temp=temp+0xfffff0ff;
					break;
				case  7:
                                   temp=temp+0xffffff0f;
					break;				
				}
				*p=*p&temp;	
				}
				
			
			break;
			
		case GRAPH_MODE_OR:
		         *p=*p|temp;
			break;

		case GRAPH_MODE_AND:
			switch(x%8){
				case  0:
                                   temp=temp+0xfffffff0;
					break;
				case  1:
					temp=temp+0x0fffffff;					
					break;
				case  2:
                                   temp=temp+0xf0ffffff;	
					break;
				case  3:
                                   temp=temp+0xff0fffff;	
					break;
				case  4:
                                   temp=temp+0xfff0ffff;
					break;
				case  5:
                                   temp=temp+0xffff0fff;
					break;
				case  6:
                                   temp=temp+0xfffff0ff;
					break;
				case  7:
                                   temp=temp+0xffffff0f;
					break;				
				}
		
		       *p=*p&temp;			   
			break;
		case GRAPH_MODE_XOR:
			*p=*p^temp;		
			break;
		case GRAPH_MODE_NOR:
		       switch(x%8){
				case  0:
                                   temp=temp+0x0000000f;
					break;
				case  1:
					temp=temp+0xf0000000;					
					break;
				case  2:
                                   temp=temp+0x0f000000;	
					break;
				case  3:
                                   temp=temp+0x00f00000;	
					break;
				case  4:
                                   temp=temp+0x000f0000;
					break;
				case  5:
                                   temp=temp+0x0000f000;
					break;
				case  6:
                                   temp=temp+0x00000f00;
					break;
				case  7:
                                   temp=temp+0x000000f0;
					break;				
				}
			   *p=*p^temp;
			break;
		}
	}
	#endif

	#if   COLORDEPTH_GRAY ==0    //单色模式
	if(IsInRect(&pdc->DrawRect, x, y)){
	if(x%32==0){////x位于32的整数倍位置
          p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32-1;
	   if(color==0){///无色
	   
	      switch(pdc->PenMode){
			case GRAPH_MODE_NORMAL:	
		                   *p=*p&0xfffffffe;
				   break;
			case GRAPH_MODE_OR:
				    *p=*p|0x00000000;
				   break;
			case GRAPH_MODE_AND:
				   *p=*p&0xfffffffe;	
				   break;
			case GRAPH_MODE_XOR:
				    *p=*p^0x00000000;		
				    break;
			case GRAPH_MODE_NOR:
				   *p=*p^0x00000000;		
				    break;
	   	}
	   	}
	    else{

			
	      switch(pdc->PenMode){
			case GRAPH_MODE_NORMAL:	
		                   *p=*p|0x00000001;
				   break;
			case GRAPH_MODE_OR:
				    *p=*p|0x00000001;
				   break;
			case GRAPH_MODE_AND:
				   *p=*p;	
				   break;
			case GRAPH_MODE_XOR:
				    *p=*p^0x00000001;		
				    break;
			case GRAPH_MODE_NOR:
				   *p=*p^0x00000001;		
				    break;
	   	}
		
	    	}
	
		}
	else	{////x位于32的非整数倍位置
	   p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32;	
	
	   if(color==0){
	   	   temp=~(0x00000001<<(32-x%32));
            switch(pdc->PenMode){
			case GRAPH_MODE_NORMAL:	
		                   *p=*p&temp;
				   break;
			case GRAPH_MODE_OR:
				    *p=*p|0x00000000;
				   break;
			case GRAPH_MODE_AND:
				   *p=*p&temp;
				   break;
			case GRAPH_MODE_XOR:
				    *p=*p^0x00000000;		
				    break;
			case GRAPH_MODE_NOR:
				   *p=*p^0x00000000;		
				    break;
            	}
		
	   	}
	   else{
	   	temp=0x00000001<<(32-x%32);
            switch(pdc->PenMode){
			case GRAPH_MODE_NORMAL:	
		                   *p=*p|temp;
				   break;
			case GRAPH_MODE_OR:
				    *p=*p|temp;
				   break;
			case GRAPH_MODE_AND:
				   *p=*p;	
				   break;
			case GRAPH_MODE_XOR:
				    *p=*p^temp;		
				    break;
			case GRAPH_MODE_NOR:
				   *p=*p^temp;		
				    break;

		
	   	}
	   	
		}

		}
		}
	
	#endif
	
}

void Direct_ClearScreen()
{
    #if   COLORDEPTH_GRAY ==1
	memset(pDirectLCDBuffer,0,LCDWIDTH*LCDHEIGHT/2);
	#endif
	
    #if   COLORDEPTH_GRAY ==0
	memset(pDirectLCDBuffer,0,LCDWIDTH*LCDHEIGHT/8);
	#endif
}

void Direct_SetPixelOR(PDC pdc, int x, int y, COLORREF color)
{
       U32  temp=0x00000000;
	U32*  p;
	x*=LCDWIDTH;
	x/=pdc->DrawRangex;
	y*=LCDHEIGHT;
	y/=pdc->DrawRangey;
	
	x+=pdc->DrawOrgx+pdc->WndOrgx;
	y+=pdc->DrawOrgy+pdc->WndOrgy;	
	
#if   COLORDEPTH_GRAY ==1    //灰度模式
	p=pDirectLCDBuffer+LCDWIDTH/8*y+x/8;
	temp=color<<(8-x%8)*4;
	*p=*p|temp;
#endif



#if   COLORDEPTH_GRAY ==0    //单色模式

	if(x%32==0){////x位于32的整数倍位置
          p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32-1;
	   if(color==0)///无色  
	      *p=*p|0x00000000;	 	
	    else	      
	      *p=*p|0x00000001;	   	
		}
	else	{////x位于32的非整数倍位置
	   p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32;	
	
	   if(color==0)
	   	    *p=*p|0x00000000;		   	
	   else{
	   	temp=0x00000001<<(32-x%32);         
		 *p=*p|temp;
		}
	   	
		}		
		
#endif
	
}
void Direct_SetPixelAND(PDC pdc, int x, int y, COLORREF color)
{
       U32  temp=0x00000000;
	U32*  p;
	x*=LCDWIDTH;
	x/=pdc->DrawRangex;
	y*=LCDHEIGHT;
	y/=pdc->DrawRangey;
	
	x+=pdc->DrawOrgx+pdc->WndOrgx;
	y+=pdc->DrawOrgy+pdc->WndOrgy;	
	
#if   COLORDEPTH_GRAY ==1    //灰度模式

	p=pDirectLCDBuffer+LCDWIDTH/8*y+x/8;
       temp=color<<(8-x%8)*4;
	switch(x%8){
		case  0:
	                       temp=temp+0xfffffff0;
			break;
		case  1:
			temp=temp+0x0fffffff;					
			break;
		case  2:
	                       temp=temp+0xf0ffffff;	
			break;
		case  3:
	                       temp=temp+0xff0fffff;	
			break;
		case  4:
	                       temp=temp+0xfff0ffff;
			break;
		case  5:
	                       temp=temp+0xffff0fff;
			break;
		case  6:
	                       temp=temp+0xfffff0ff;
			break;
		case  7:
	                       temp=temp+0xffffff0f;
			break;				
		}

	   *p=*p&temp;	
#endif


#if   COLORDEPTH_GRAY ==0    //单色模式

	if(x%32==0){////x位于32的整数倍位置
          p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32-1;
	   if(color==0)///无色  
	         *p=*p&0xfffffffe;	
	    else	      
	         *p=*p;	
		}
	else	{////x位于32的非整数倍位置
	   p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32;	
	
	   if(color==0){
	   	   temp=~(0x00000001<<(32-x%32));  
	   	    *p=*p&temp;	
	   	}
	   else{   
	   	temp=0x00000001<<(32-x%32);  
		  *p=*p;  	
		}

		}
		
#endif   


}
void Direct_SetPixelXOR(PDC pdc, int x, int y, COLORREF color)
{
       U32  temp=0x00000000;
	U32*  p;
	x*=LCDWIDTH;
	x/=pdc->DrawRangex;
	y*=LCDHEIGHT;
	y/=pdc->DrawRangey;
	
	x+=pdc->DrawOrgx+pdc->WndOrgx;
	y+=pdc->DrawOrgy+pdc->WndOrgy;	

	
#if   COLORDEPTH_GRAY ==1    //灰度模式


	p=pDirectLCDBuffer+LCDWIDTH/8*y+x/8;
       temp=color<<(8-x%8)*4;
	*p=*p^temp;	

#endif

#if   COLORDEPTH_GRAY ==0    //单色模式

	if(x%32==0){////x位于32的整数倍位置
          p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32-1;
	   if(color==0)///无色  
	         *p=*p^0x00000000;	
	    else	      
	         *p=*p^0x00000001;	
		}
	else	{////x位于32的非整数倍位置
	   p=pDirectLCDBuffer+LCDWIDTH/32*y+x/32;	
	
	     if(color==0){
	   	   temp=~(0x00000001<<(32-x%32));  
	   	    *p=*p&temp;	
	   	}
	   else{   
	   	temp=0x00000001<<(32-x%32);  
		  *p=*p^temp;  	
		}
		}		
		
#endif   

	
}

void Direct_MoveTo(PDC pdc, int x, int y)
{
	pdc->DrawPointx=x;
	pdc->DrawPointy=y;
}


void Direct_LineTo(PDC pdc, int x, int y)
{
       int i,j;
	int x1,x2,y1,y2;
	INT8U err;

//	OSSemPend(Lcd_Disp_Sem,0, &err);
	if(pdc->DrawPointx==x){	//画垂直线
		if(pdc->DrawPointy<y){
			for(i=pdc->DrawPointy-(pdc->PenWidth-1)/2;i<=y+pdc->PenWidth/2;i++){
				for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){
					Direct_SetPixel(pdc,x+j,i,pdc->PenColor);
				}
			}
		}
		else{
			for(i=pdc->DrawPointy+pdc->PenWidth/2;i>=y-(pdc->PenWidth-1)/2;i--){
				for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){
					Direct_SetPixel(pdc,x+j,i,pdc->PenColor);
				}
			}
		}
		pdc->DrawPointy=y;

		return;
	}

	if(pdc->DrawPointy==y){	//画水平线
		if(pdc->DrawPointx<x){
			for(i=pdc->DrawPointx-(pdc->PenWidth-1)/2;i<=x+pdc->PenWidth/2;i++){
				for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){
				       Direct_SetPixel(pdc,i,y+j,pdc->PenColor);
				}
			}
		}
		else{
			for(i=pdc->DrawPointx+pdc->PenWidth/2;i>=x-(pdc->PenWidth-1)/2;i--){
				for(j=-(pdc->PenWidth-1)/2;j<=pdc->PenWidth/2;j++){
					Direct_SetPixel(pdc,i,y+j,pdc->PenColor);
				}
			}
		}
		pdc->DrawPointx=x;

		return;
	}
	
	for(i=-(pdc->PenWidth-1)/2;i<=pdc->PenWidth/2;i++){
		x1=pdc->DrawPointx+(i+1)/2;
		x2=x+(i+1)/2;
		y1=(pdc->DrawPointx-x)*i/2/(y-pdc->DrawPointy)+pdc->DrawPointy;
		y2=(pdc->DrawPointx-x)*i/2/(y-pdc->DrawPointy)+y;
		Direct_DrawSBresenham_Line(pdc,x1,y1,x2,y2);
	}

	pdc->DrawPointx=x;
	pdc->DrawPointy=y;

}


void Direct_DrawSBresenham_Line(PDC pdc, int x1, int y1,int x2, int y2)
{
	int x, y,dx,dy;
	int e,i;
	dx=x2-x1;
	dy=y2-y1;
	x=x1;	y=y1;

	if ( ABS(dx) >= ABS(dy) ){
		if ( dx >= 0 &&  dy>=0 ){
			e = -dx;
			for ( i = 0; i <= dx; i++ )	{
				Direct_SetPixel(pdc,x++,y,pdc->PenColor);
				e += 2 * dy;
				if (e >= 0)	{
					y = y + 1;
					e -= 2 * dx;
				}
			}
		}
		else if( dx < 0 &&  dy<0 ){
			e = -dx;
			for ( i = 0; i >= dx; i-- ){
				Direct_SetPixel(pdc,x--,y,pdc->PenColor);
				e += 2 * dy;
				if (e <= 0)	{
					y = y - 1;
					e -=  2 * dx;
				}
			}
		}
		else if(dx>=0 && dy<=0){
			e = dx;
			for ( i = 0; i <= dx; i++ ){
				Direct_SetPixel(pdc,x++,y,pdc->PenColor);
				e +=  2 * dy;
				if (e <= 0)	{
					y = y - 1;
					e +=  2 * dx;
				}
			}
		}
		else{	//dx<0 && dy>0
			e = dx;
			for ( i = 0; i >= dx; i-- ){
				Direct_SetPixel(pdc,x--,y,pdc->PenColor);
				e +=  2 * dy;
				if (e >= 0)	{
					y = y + 1;
					e +=  2 * dx;
				}
			}
		}
	}
	else{
		if ( dx >= 0 &&  dy>=0 ){
			e = -dy;
			for ( i = 0; i <= dy; i++ )	{
				Direct_SetPixel(pdc,x,y++,pdc->PenColor);
				e +=  2 * dx;
				if (e >= 0)	{
					x = x + 1;
					e -=  2 * dy;
				}
			}
		}
		else if( dx < 0 &&  dy<0 ){
			e = -dy;
			for ( i = 0; i >= dy; i-- ){
				Direct_SetPixel(pdc,x,y--,pdc->PenColor);
				e +=  2 * dx;
				if (e <= 0)	{
					x = x - 1;
					e -=  2 * dy;
				}
			}
		}
		else if(dx<=0 && dy>=0){
			e = dy;
			for ( i = 0; i <= dy; i++ ){
				Direct_SetPixel(pdc,x,y++,pdc->PenColor);
				e +=  2 * dx;
				if (e <= 0)	{
					x = x - 1;
					e +=  2 * dy;
				}
			}
		}
		else{	//dx>0 && dy<0
			e = dy;
			for ( i = 0; i >= dy; i-- ){
				Direct_SetPixel(pdc,x,y--,pdc->PenColor);
				e +=  2 * dx;
				if (e >= 0)	{
					x = x + 1;
					e +=  2 * dy;
				}
			}
		}
	}
}

void Direct_FillRect(PDC pdc, int left,int top ,int right, int bottom,U32 DrawMode, U32 color)
{
	int i=0;
	int j=0;

	int  temp_left=0;
	int  temp_right=0;

	U32 temp_color=0x00000000;
	U32* p;

       pdc->PenMode=DrawMode;

	i=left;

	#if  COLORDEPTH_GRAY==1	

	
	while(i%8!=0&&i<=right){
		    for( j=top;j<=bottom;j++)
				Direct_SetPixel(pdc, i, j, color);
		    i++;
               }
	if(i==right+1)
		return;
	
	for( j=top;j<=bottom;j++)
				Direct_SetPixel(pdc, i, j, color);
	temp_left=i;

	i=right;
	while(i%8!=0){
		    for(j=top;j<=bottom;j++)
				Direct_SetPixel(pdc, i, j, color);
		    i--;
		}
			
	temp_right=i;

	if(temp_left==temp_right)
		return;
    temp_color=color|color<<4|color<<8|color<<12
	   	            |color<<16|color<<20|color<<24|color<<28;
	   
	p=pDirectLCDBuffer+LCDWIDTH/8*top+temp_left/8;
	for(i=0;i<(temp_right-temp_left)/8;i++){
		for(j=0;j<=(bottom-top);j++){
			switch(DrawMode){
				case   GRAPH_MODE_NORMAL:		
			         	if(color>0x00000000)
					*(p+LCDWIDTH/8*j+i)|=temp_color;
					else if(color==0x00000000)
					*(p+LCDWIDTH/8*j+i)&=temp_color;
					break;
					
                             case GRAPH_MODE_OR:
		                     *(p+LCDWIDTH/8*j+i)|=temp_color;
			              break;

				case GRAPH_MODE_AND:
					*(p+LCDWIDTH/8*j+i)&=temp_color;
					break;
					
                            case GRAPH_MODE_XOR:
			             *(p+LCDWIDTH/8*j+i)^=temp_color;
			             break;

				case GRAPH_MODE_NOR:
					*(p+LCDWIDTH/8*j+i)=~*(p+LCDWIDTH/8*j+i);
					break;
					
				
				}
			}		
		}
#endif


#if  COLORDEPTH_GRAY==0

	
	while(i%32!=0&&i<=right){
		    for( j=top;j<=bottom;j++)
				Direct_SetPixel(pdc, i, j, color);
		    i++;
               }
	if(i==right+1)
		return;
	
	for( j=top;j<=bottom;j++)
				Direct_SetPixel(pdc, i, j, color);
	temp_left=i;

	i=right;
	while(i%32!=0){
		    for(j=top;j<=bottom;j++)
				Direct_SetPixel(pdc, i, j, color);
		    i--;
		}
			
	temp_right=i;

	if(temp_left==temp_right)
		return;

  //     temp_color=color|color<<4|color<<8|color<<12
//	   	            |color<<16|color<<20|color<<24|color<<28;

	if(color>0)	
	       temp_color=0xffffffff;

   
	p=pDirectLCDBuffer+LCDWIDTH/32*top+temp_left/32;
	for(i=0;i<(temp_right-temp_left)/32;i++){
		for(j=0;j<=(bottom-top);j++){
			switch(DrawMode){
				case   GRAPH_MODE_NORMAL:		
			         	if(color>0x00000000)
					*(p+LCDWIDTH/32*j+i)|=temp_color;
					else if(color==0x00000000)
					*(p+LCDWIDTH/32*j+i)&=temp_color;
					break;
					
                             case GRAPH_MODE_OR:
		                     *(p+LCDWIDTH/32*j+i)|=temp_color;
			              break;

⌨️ 快捷键说明

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