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

📄 directdisplay.c

📁 ucos-II+移植到arm+s3c2410的全套代码
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "../ucos-ii/includes.h"
#include "../inc/sys/loadfile.h"
#include "../inc/macro.h"
#include "../src/fs/OSFile.h"
#include <math.h>

#include "DirectDisplay.h"

#if USE_MINIGUI==0

void Direct_DrawSBresenham_Line(PDC pdc, int x1, int y1,int x2, int y2);

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;

⌨️ 快捷键说明

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