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

📄 j_graphic.c

📁 基于μCGUI的嵌入式图形界面设计
💻 C
字号:
/******************************************************************************
									J_GUI
						The JJJ's Graphics Interface Library
								
					 	COPYRIGHT (c) JJJSTUDIO, 2006 BY JJJ.
                       		--  ALL RIGHTS RESERVED  --
  
   	Filename:	J_Graphic.c
   	Author	:   Jianjun Jiang 	
   	Created	:   2006/02/3
   	Website	:	http://www.jjjbbs.com
   	Modified:	NO
   	Revision: 	1.00
   	Readme	:	
******************************************************************************/

extern J_PEN  J_Pen;

void J_SetPenColor(TCOLOR Color)
{
	J_Pen.Color = Color;
}

void J_SetPenWidth(UINT8 Width)
{
	J_Pen.Width = Width;
}

void J_DrawLine(UINT32 x1,UINT32 y1,UINT32 x2,UINT32 y2)
{
	INT32   dx;						// 直线x轴差值变量
   	INT32   dy;          			// 直线y轴差值变量
   	INT8    dx_sym;					// x轴增长方向,为-1时减值方向,为1时增值方向
   	INT8    dy_sym;					// y轴增长方向,为-1时减值方向,为1时增值方向
   	INT32   dx_x2;					// dx*2值变量,用于加快运算速度
   	INT32   dy_x2;					// dy*2值变量,用于加快运算速度
   	INT32   di;						// 决策变量
      
   	dx = x2-x1;		
   	dy = y2-y1;
   
   	if(dx>0)		
   		dx_sym = 1;	
   	else if(dx<0)
   	  	dx_sym = -1;
   	else
   	{
   		J_LCDVLine(x1,y1,y2,J_Pen.Color);
      	return;
   	}

	if(dy>0)
   		dy_sym = 1;
   	else if(dy<0)
   		dy_sym = -1;
  	else
  	{
    	J_LCDHLine(x1,y1,x2,J_Pen.Color);
      	return;
   	}

   	dx = dx_sym * dx;
   	dy = dy_sym * dy;
   	dx_x2 = dx*2;
   	dy_x2 = dy*2;
   
   	//使用Bresenham法进行画直线
   	if(dx>=dy)						
   	{
   		di = dy_x2 - dx;
      	while(x1!=x2)
      	{
      		J_LCDSetPixel(x1,y1,J_Pen.Color);
         	x1 += dx_sym;
         	if(di<0)
         	{
         		di += dy_x2;		
         	}
         	else
         	{
         		di += dy_x2 - dx_x2;
            	y1 += dy_sym;
         	}
      	}
      	J_LCDSetPixel(x1,y1,J_Pen.Color);
   	}
   	else							
   	{
   		di = dx_x2 - dy;
      	while(y1!=y2)
      	{
      		J_LCDSetPixel(x1,y1,J_Pen.Color);
         	y1 += dy_sym;
         	if(di<0)
         	{
         		di += dx_x2;
         	}
         	else
         	{ 
         		di += dx_x2 - dy_x2;
            	x1 += dx_sym;
         	}
      	}
      	J_LCDSetPixel(x1,y1,J_Pen.Color);
   	} 
}

void J_DrawLineEx(UINT32 x1,UINT32 y1,UINT32 x2,UINT32 y2)
{
	INT32   dx;						// 直线x轴差值变量
   	INT32   dy;          			// 直线y轴差值变量
   	INT8    dx_sym;					// x轴增长方向,为-1时减值方向,为1时增值方向
   	INT8    dy_sym;					// y轴增长方向,为-1时减值方向,为1时增值方向
   	INT32   dx_x2;					// dx*2值变量,用于加快运算速度
   	INT32   dy_x2;					// dy*2值变量,用于加快运算速度
   	INT32   di;						// 决策变量
   	INT32   wx,wy;					// 线宽变量
   	INT32   draw_a,draw_b;
	
	if(J_Pen.Width == 0)
		return;
   
   	dx = x2-x1;		
   	dy = y2-y1; 	
   	wx = J_Pen.Width/2;
   	wy = J_Pen.Width-wx-1;
   
   	if(dx>0)		
   		dx_sym = 1;	
   	else if(dx<0)
   	  	dx_sym = -1;
   	else
   	{
		wx = x1-wx;
        if(wx<0)	
        	wx = 0;
        wy = x1+wy;
        
        while(1)
        {
        	x1 = wx;
            J_LCDVLine(x1, y1, y2, J_Pen.Color);
            if(wx>=wy) break;
            wx++;
        }
        return;
   	}
   	
	if(dy>0)
   		dy_sym = 1;
   	else if(dy<0)
   		dy_sym = -1;
  	else
  	{         
  		wx = y1-wx;
        if(wx<0)
        	wx = 0;
        wy = y1+wy;
        
        while(1)
        {
        	y1 = wx;
            J_LCDHLine(x1,y1,x2,J_Pen.Color);
            if(wx>=wy) break;
            wx++;
         }
      	 return;
   	}
       
   	dx = dx_sym * dx;
   	dy = dy_sym * dy;
 
   	dx_x2 = dx*2;
   	dy_x2 = dy*2;
   
   	//使用Bresenham法进行画直线
   	if(dx>=dy)
   	{
   		di = dy_x2 - dx;
      	while(x1!=x2)
      	{
         	draw_a = y1-wx;
         	if(draw_a<0)
         		draw_a = 0;
         	draw_b = y1+wy;
         	J_LCDVLine(x1,draw_a,draw_b,J_Pen.Color);
            x1 += dx_sym;				
         	if(di<0)
         	{
         		di += dy_x2;
         	}
         	else
         	{
         		di += dy_x2 - dx_x2;
            	y1 += dy_sym;
         	}
      	}
      	draw_a = y1-wx;
      	if(draw_a<0)
      		draw_a = 0;
      	draw_b = y1+wy;
      	J_LCDVLine(x1,draw_a,draw_b,J_Pen.Color);
   	}
   	else
   	{
   		di = dx_x2 - dy;
      	while(y1!=y2)
      	{
      		draw_a = x1-wx;
         	if(draw_a<0)
         		draw_a = 0;
         	draw_b = x1+wy;
         	J_LCDHLine(draw_a,y1,draw_b,J_Pen.Color);
            y1 += dy_sym;
         	if(di<0)
         	{
         		di += dx_x2;
         	}
         	else
         	{
         		di += dx_x2 - dy_x2;
         		x1 += dx_sym;
         	}
      	}
      	draw_a = x1-wx;
      	if(draw_a<0)
      		draw_a = 0;
      	draw_b = x1+wy;
      	J_LCDHLine(draw_a,y1,draw_b,J_Pen.Color);
   	} 
}

void J_DrawRect(UINT32 x1,UINT32 y1,UINT32 x2,UINT32 y2)
{
	J_LCDHLine(x1,y1,x2,J_Pen.Color);
	J_LCDHLine(x1,y2,x2,J_Pen.Color);
	J_LCDVLine(x1,y1,y2,J_Pen.Color);
	J_LCDVLine(x2,y1,y2,J_Pen.Color);
}

void J_DrawRectEx(UINT32 x1,UINT32 y1,UINT32 x2,UINT32 y2)
{
	UINT32 t;
	if(x1>x2)
	{
		t = x2;
		x2 = x1;
		x1 = t;
	}
	if(y1>y2)
	{
		t = y2;
		y2 = y1;
		y1 = t;
	}
	J_DrawLineEx(x1,y1,x2,y1);
	J_DrawLineEx(x1,y2,x2,y2);
	J_DrawLineEx(x1,y1,x1,y2);
	J_DrawLineEx(x2,y1,x2,y2);
}

void J_DrawRectFill(UINT32 x1,UINT32 y1,UINT32 x2,UINT32 y2)
{
	UINT32 t;
	if(x1>x2)
	{
		t = x2;
		x2 = x1;
		x1 = t;
	}
	if(y1>y2)
	{
		t = y2;
		y2 = y1;
		y1 = t;
	}
	for(t=0;t<(y2-y1);t++)
		J_LCDHLine(x1,y1+t,x2,J_Pen.Color);	
}

⌨️ 快捷键说明

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