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

📄 guimsg.c

📁 基于NuCleus操作系统下的一个GUI界面
💻 C
📖 第 1 页 / 共 5 页
字号:
	{
		if((x<SCR_WIDTH)&&(y<SCR_HEIGHT))
		{
			iNum = y*SCR_WIDTH + x;

			*LcdBaseAddReg =LOADLENGTHREG(iNum);

			*LcdDataReg =((pRgb->R)<<11)|((pRgb->G)<<5)|(pRgb->B);
		}
		else
			return	ERR_OVER_RANGE;
	}
	else
		return	ERR_POINTER_EMPTY;

	return	GUI_SUCCESS;
}

//这个函数仅仅更新pScreen的framebuffer中x,y座标的点,颜色为pRgb
int	DrawDot(SCR* pScreen,uint x,uint y,RGB* pRgb)
{
	uint	iNum;
	if((pScreen!=NULL)&&(pRgb!=NULL))
		{
		if((x<SCR_WIDTH)&&(y<SCR_HEIGHT))
			{
			iNum = y*SCR_WIDTH + x;
			pScreen->framebuffer[iNum].R = pRgb->R;
			pScreen->framebuffer[iNum].G = pRgb->G;
			pScreen->framebuffer[iNum].B = pRgb->B;			
			}
		else
			return	ERR_OVER_RANGE;
		}
	else
		return	ERR_POINTER_EMPTY;

	return	GUI_SUCCESS;
}
//画水平线,直接更新pScreen的framebuffer
int	DrawHLine(SCR* pScreen,uint x,uint y,uint iLen,RGB* pRgb)
{
	uint	iNum;
	uint	i;
	if((pScreen!=NULL)&&(pRgb!=NULL))
	{
		if((x<SCR_WIDTH)&&(y<SCR_HEIGHT))	
		{
			//如果线长超出屏幕,则到屏幕边为止
			for(i = x;(i<(x+iLen))&&(i<SCR_WIDTH);i++)
			{
				iNum = y*SCR_WIDTH + i;
				pScreen->framebuffer[iNum].R = pRgb->R;
				pScreen->framebuffer[iNum].G = pRgb->G;
				pScreen->framebuffer[iNum].B = pRgb->B;		
			}
		}
		else
			return	ERR_OVER_RANGE;
	}
	else
		return	ERR_POINTER_EMPTY;		

	return	GUI_SUCCESS;	
}

//画垂直线,直接更新pScreen的framebuffer
int	DrawVLine(SCR* pScreen,uint x,uint y,uint iLen,RGB* pRgb)
{
	uint	iNum;
	uint	i;
	if((pScreen!=NULL)&&(pRgb!=NULL))
	{
		if((x<SCR_WIDTH)&&(y<SCR_HEIGHT))	
		{
			//如果线长超出屏幕,则到屏幕边为止
			for(i = y;(i<(y+iLen))&&(i<SCR_HEIGHT);i++)
			{
				iNum = i*SCR_WIDTH + x;
				pScreen->framebuffer[iNum].R = pRgb->R;
				pScreen->framebuffer[iNum].G = pRgb->G;
				pScreen->framebuffer[iNum].B = pRgb->B;		
			}
		}
		else
			return	ERR_OVER_RANGE;
	}
	else
		return	ERR_POINTER_EMPTY;		

	return	GUI_SUCCESS;	
}

//画矩形框,也直接更新pScreen的framebuffer
int	DrawRect(SCR* pScreen,uint x,uint y,uint iWidth,uint iHeight,RGB* pRgb)
{
	if((pScreen!=NULL)&&(pRgb!=NULL))
	{
		DrawHLine(pScreen, x, y, iWidth, pRgb);
		DrawHLine(pScreen, x, y+iHeight-1, iWidth, pRgb);
		DrawVLine(pScreen, x, y, iHeight, pRgb);		
		DrawVLine(pScreen, x+iWidth-1, y, iHeight, pRgb);				
	}
	else
		return	ERR_POINTER_EMPTY;		

	return	GUI_SUCCESS;	
}
//填充整个矩形框,直接更新pScreen的framebuffer
int	FillRect(SCR* pScreen,uint x,uint y,uint iWidth,uint iHeight,RGB* pRgb)
{
	uint	i;
	if((pScreen!=NULL)&&(pRgb!=NULL))
	{
		for(i=0;i<iHeight;i++)
		{
			//modified by zzm
			DrawHLine(pScreen, x, y+i, iWidth, pRgb);
			//DrawVLine(pScreen, x, y+i, iWidth, pRgb);
		}
	}
	else
		return	ERR_POINTER_EMPTY;		

	return	GUI_SUCCESS;	
}

unsigned int GetOffsetGBK(unsigned char Qh, unsigned char Wh)
{
	unsigned int OffsetGBK;
	
	/*if((Qh>=0x81)&&(Qh<0xa1))
	{
		OffsetGBK=190*(Qh-0x81)+(Wh-0x40)+0x0;
		if(Wh>=0x80)
			OffsetGBK--;
		return OffsetGBK;		
	}*/
	
//	if((Qh>=0xa1)&&(Qh<0xa8))
	if(Qh>=0xa1)
	{
//		OffsetGBK=94*(Qh-0xa1)+(Wh-0xa1)+6080;
		OffsetGBK=94*((Qh-0xa1)&0x7f)+((Wh-0xa1)&0x7f);
			return OffsetGBK;		
	}
	/*x维 = (机内码字节1-0xa1) & 0x7f; 
	    y维 = (机内码字节2-0xa1) & 0x7f; 
	     求汉字在X,Y维后, 那么按照每个汉字占用32个字节, 
	     则可以得出汉字相对于字库头的偏移是 offset = (x*94 + y)*32; */
	/*
	if((Qh>=0xa8)&&(Qh<0xaa))
	{
		OffsetGBK=190*(Qh-0xa8)+(Wh-0x40)+6738;
		if(Wh>=0x80)
			OffsetGBK--;
		return OffsetGBK;		
	}
	
	if((Qh>=0xaa)&&(Qh<0xb0))
	{
		OffsetGBK=96*(Qh-0xaa)+(Wh-0x40)+7118;
		if(Wh>=0x80)
			OffsetGBK--;
		return OffsetGBK;		
	}
	
	if((Qh>=0xb0)&&(Qh<0xf8))
	{
		OffsetGBK=190*(Qh-0xb0)+(Wh-0x40)+7694;
		if(Wh>=0x80)
			OffsetGBK--;
		return OffsetGBK;		
	}
	
	if((Qh>=0xf8)&&(Qh<=0xff))
	{
		OffsetGBK=96*(Qh-0xf8)+(Wh-0x40)+21374;
		if(Wh>=0x80)
			OffsetGBK--;
		return OffsetGBK;		
	}*/
	
	return 0x00;
	
}

void WriteChinese_set(SCR* pScreen,RGB* pRgbFont,uint fontsize,uint x, uint y , unsigned char CharIndexH, unsigned char CharIndexL)
{
	
	unsigned char *CharPtr;
	unsigned char TempChar;
	unsigned char Mask;
	int i,j,iNum;
	
	
	CharPtr=(unsigned char *)((unsigned int)GBK+(unsigned int)(fontsize*2*GetOffsetGBK(CharIndexH,CharIndexL)));
	
	for(i=0;i<fontsize;i++)
	{
		Mask=0x80;
		TempChar=*CharPtr;
		CharPtr++;
		//k = 0;
		//while(k<(fontsize-8))
		//{
			for(j=0;j<8;j++)
			{
				//Dot1335(x+j,y+i,0x0,0x0,(Mask&TempChar));
				iNum = (y+i)*SCR_WIDTH +x+j; 
				if(Mask&TempChar)  //最高位为1
				{
					
					pScreen->framebuffer[iNum].R = pRgbFont->R;
					pScreen->framebuffer[iNum].G = pRgbFont->G;
					pScreen->framebuffer[iNum].B= pRgbFont->B;			
				}
				else
				{//modified by zzm
					pScreen->framebuffer[iNum].R = ~(pRgbFont->R);
					pScreen->framebuffer[iNum].G = ~(pRgbFont->G);
					pScreen->framebuffer[iNum].B= ~(pRgbFont->B);			
				}
				Mask>>=1;	
			}
			
			Mask=0x80;
			TempChar=*CharPtr;
			CharPtr++;
			//k += 8;
		//}
		for(j=0;j<(fontsize-8);j++)
		{
			//Dot1335(x+j+8,y+i,0x0,0x0,(Mask&TempChar));
			iNum = (y+i)*SCR_WIDTH +x+j+8; 
			if(Mask&TempChar)
			{
				
				pScreen->framebuffer[iNum].R = pRgbFont->R;
				pScreen->framebuffer[iNum].G = pRgbFont->G;
				pScreen->framebuffer[iNum].B= pRgbFont->B;			
			}
			else
			{//modified by zzm
				pScreen->framebuffer[iNum].R = ~(pRgbFont->R);
				pScreen->framebuffer[iNum].G = ~(pRgbFont->G);
				pScreen->framebuffer[iNum].B= ~(pRgbFont->B);			
			}
			Mask>>=1;	
		}
				
	}
	
	
}


void WriteChinese(SCR* pScreen,RGB* pRgbFont,uint fontsize,uint x, uint y , unsigned char CharIndexH, unsigned char CharIndexL)
{
	
	unsigned char *CharPtr;
	unsigned char TempChar;
	unsigned char Mask;
	int i,j,iNum;
	
	
	CharPtr=(unsigned char *)((unsigned int)GBK+(unsigned int)(fontsize*2*GetOffsetGBK(CharIndexH,CharIndexL)));
	
	for(i=0;i<fontsize;i++)
	{
		Mask=0x80;
		TempChar=*CharPtr;
		CharPtr++;
		//k = 0;
		//while(k<(fontsize-8))
		//{
			for(j=0;j<8;j++)
			{
				//Dot1335(x+j,y+i,0x0,0x0,(Mask&TempChar));
				iNum = (y+i)*SCR_WIDTH +x+j; 
				if(Mask&TempChar)  //最高位为1
				{
				
					pScreen->framebuffer[iNum].R = pRgbFont->R;
					pScreen->framebuffer[iNum].G = pRgbFont->G;
					pScreen->framebuffer[iNum].B= pRgbFont->B;			
				}
				else
				{
					pScreen->framebuffer[iNum].R = 0x00;
					pScreen->framebuffer[iNum].G = 0xff;
					pScreen->framebuffer[iNum].B= 0x1f;
				}
				Mask>>=1;	
			}
			
			Mask=0x80;
			TempChar=*CharPtr;
			CharPtr++;
			//k += 8;
		//}
		for(j=0;j<(fontsize-8);j++)
		{
			//Dot1335(x+j+8,y+i,0x0,0x0,(Mask&TempChar));
			iNum = (y+i)*SCR_WIDTH +x+j+8; 
			if(Mask&TempChar)
			{
				
				pScreen->framebuffer[iNum].R = pRgbFont->R;
				pScreen->framebuffer[iNum].G = pRgbFont->G;
				pScreen->framebuffer[iNum].B= pRgbFont->B;			
			}
			else
			{
				pScreen->framebuffer[iNum].R = 0x00;
				pScreen->framebuffer[iNum].G = 0xff;
				pScreen->framebuffer[iNum].B= 0x1f;
			}
			Mask>>=1;	
		}
				
	}
	
	
}
void WriteAsci_set(SCR* pScreen,RGB* pRgbFont,uint fontsize,uint x, uint y , unsigned char CharIndex)
{
	unsigned char *CharPtr;
	unsigned char TempChar;
	unsigned char Mask;
	int i,j,iNum;
	
	
	CharPtr=(unsigned char *)((unsigned int)Asci+(unsigned int)(fontsize*2*(CharIndex)));
	
	//注意fontsize<8和>16的问题
	for(i=0;i<fontsize;i++)
	{
		Mask=0x80;
		TempChar=*CharPtr;
		CharPtr+=2;//跳过一个字节
		for(j=0;j<fontsize/2;j++)
		{
			//Dot1335(x+j,y+i,0x0,0x0,(Mask&TempChar));
			iNum = (y+i)*SCR_WIDTH +x+j; 			
			if(Mask&TempChar)
			{
				//iNum = (y+i)*SCR_WIDTH +x+j; 
				pScreen->framebuffer[iNum].R = pRgbFont->R;
				pScreen->framebuffer[iNum].G = pRgbFont->G;
				pScreen->framebuffer[iNum].B = pRgbFont->B;			
			}
			else
			{//modified by zzm
				pScreen->framebuffer[iNum].R = ~(pRgbFont->R);
				pScreen->framebuffer[iNum].G = ~(pRgbFont->G);
				pScreen->framebuffer[iNum].B= ~(pRgbFont->B);			
			}
			Mask>>=1;	
		}
				
	}
	
}

void WriteAsci(SCR* pScreen,RGB* pRgbFont,uint fontsize,uint x, uint y , unsigned char CharIndex)
{
	unsigned char *CharPtr;
	unsigned char TempChar;
	unsigned char Mask;
	int i,j,iNum;
	
	
	CharPtr=(unsigned char *)((unsigned int)Asci+(unsigned int)(fontsize*2*(CharIndex)));
	
	//注意fontsize<8和>16的问题
	for(i=0;i<fontsize;i++)
	{
		Mask=0x80;
		TempChar=*CharPtr;
		CharPtr+=2;//跳过一个字节
		for(j=0;j<fontsize/2;j++)
		{
			//Dot1335(x+j,y+i,0x0,0x0,(Mask&TempChar));
			iNum = (y+i)*SCR_WIDTH +x+j; 			
			if(Mask&TempChar)
			{
				//iNum = (y+i)*SCR_WIDTH +x+j; 
				pScreen->framebuffer[iNum].R = pRgbFont->R;
				pScreen->framebuffer[iNum].G = pRgbFont->G;
				pScreen->framebuffer[iNum].B = pRgbFont->B;			
			}
			else
			{
				pScreen->framebuffer[iNum].R = 0x00;
				pScreen->framebuffer[iNum].G = 0xff;
				pScreen->framebuffer[iNum].B= 0x1f;
			}
			Mask>>=1;	
		}
				
	}
	
}

/*
//注意fontsize必须大于8  
void WriteChinese(SCR* pScreen,RGB* pRgbFont,uint fontsize,uint x, uint y , unsigned char CharIndexH, unsigned char CharIndexL)
{
	
	unsigned char *CharPtr;
	unsigned char TempChar;
	unsigned char Mask;
	int i,j,iNum;
	
	
	CharPtr=(unsigned char *)((unsigned int)GBK1212+
		      (unsigned int)(24*GetOffetGBK(CharIndexH,CharIndexL)));
	//CharIndexH=Next0=*RawText;
	//CharIndexL=Next1=*(RawText+1);
	for(i=0;i<fontsize;i++)
	{
		Mask=0x80;
		TempChar=*CharPtr;
		CharPtr++;
		for(j=0;j<8;j++)
		{
			//Dot1335(x+j,y+i,0x0,0x0,(Mask&TempChar));
			if(Mask&TempChar)  //最高位为1
			{
				iNum = (y+i)*SCR_WIDTH +x+j; 
				pScreen->framebuffer[iNum].R = pRgbFont->R;
				pScreen->framebuffer[iNum].G = pRgbFont->G;
				pScreen->framebuffer[iNum].B= pRgbFont->B;			
			}
			Mask>>=1;
			//mask右移一位,下次判断次高位是否为"1"	
		}

		
		
		Mask=0x80;
		TempChar=*CharPtr;
		CharPtr++;
		for(j=0;j<(fontsize-8);j++)
		{
			//Dot1335(x+j+8,y+i,0x0,0x0,(Mask&TempChar));
			if(Mask&TempChar)
			{
				iNum = (y+i)*SCR_WIDTH +x+j+8; 
				pScreen->framebuffer[iNum].R = pRgbFont->R;
				pScreen->framebuffer[iNum].G = pRgbFont->G;
				pScreen->framebuffer[iNum].B= pRgbFont->B;			
			}
			Mask>>=1;	
		}
	}
}

void WriteAsci(SCR* pScreen,RGB* pRgbFont,uint fontsize,uint x, uint y , unsigned char CharIndex)
{
	unsigned char *CharPtr;
	unsigned char TempChar;
	unsigned char Mask;
	int i,j,iNum;
	
	
	CharPtr=(unsigned char *)((unsigned int)Asci+(unsigned int)(24*(CharIndex)));
	
	
	for(i=0;i<fontsize;i++)
	{
		Mask=0x80;
		TempChar=*CharPtr;
		CharPtr+=2;
//		for(j=0;j<7;j++)
		for(j=0;j<6;j++) //modified by zzm

⌨️ 快捷键说明

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