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

📄 glib.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
字号:
/*****************************************
  NAME: glib.c
  DESC: graphic codes
  HISTORY: 2002.03.13:draft ver 0.0
 *****************************************/

#include "def.h"
#include "lcdlib.h"
#include "glib.h"
#include "lcd.h"


void (*PutPixel)(unsigned int,unsigned int,unsigned int);
//static unsigned int vframewidth, vframeheight;
unsigned int vframewidth, vframeheight;
unsigned int *framebuffer;


void GlibInit(unsigned int displaytype, unsigned int whichframebuffer)
{
	switch(displaytype&0xf) {
		case BPP1:
			PutPixel=_PutPixel1Bit;
			break;
		case BPP2:
			PutPixel=_PutPixel2Bit;
			break;
		case BPP4:
			PutPixel=_PutPixel4Bit;
			break;
		case BPP8:
		case BPP8_NP:
			PutPixel=_PutPixel8Bit;
			break;
		case BPP16_565:
		case BPP16_5551:
			PutPixel=_PutPixel16Bit;
			break;
		case BPP24:
			PutPixel=_PutPixel24Bit;
			break;
		default:
			break;
	}
	
	switch(displaytype&0xff00) {
		case 0x1100:
		case 0x2100:	
			vframewidth=BG_VXSIZE_176220;
			vframeheight=BG_VYSIZE_176220;
			break;
		case 0x1200:
		case 0x2200:
			vframewidth=BG_VXSIZE_240320;
			vframeheight=BG_VYSIZE_240320;			
			break;
		case 0x2300:
			vframewidth=BG_VXSIZE_320240;
			vframeheight=BG_VYSIZE_320240;			
			break;
		case 0x1400:
		case 0x2400:
			vframewidth=BG_VXSIZE_640480;
			vframeheight=BG_VYSIZE_640480;			
			break;
		case 0x1800:
		case 0x2800:
			vframewidth=BG_VXSIZE_800600;
			vframeheight=BG_VYSIZE_800600;			
			break;
		case 0x4100:
			vframewidth=FG_VXSIZE_176220;
			vframeheight=FG_VYSIZE_176220;
			break;
		case 0x4200:
			vframewidth=FG_VXSIZE_240320;
			vframeheight=FG_VYSIZE_240320;
			break;
		case 0x4400:
			vframewidth=FG_VXSIZE_640480;
			vframeheight=FG_VYSIZE_640480;
			break;			
		case 0x4800:
			vframewidth=FG_VXSIZE_800600;
			vframeheight=FG_VYSIZE_800600;
			break;			
		default:
			break;			
	}

	// not using virtual frame
	if((displaytype&0xf0)==0x10 || (displaytype&0xf0)==0x20) {
		vframewidth=vframewidth/2;
		vframeheight=vframeheight/2;
	}			

	switch(whichframebuffer) {
		case BGBUFFER1:
			framebuffer=(unsigned int *)LCDFRAMEBUFFERBG1;
			break;
		case BGBUFFER2:
			framebuffer=(unsigned int *)LCDFRAMEBUFFERBG2;
			break;
		case FGBUFFER1:
			framebuffer=(unsigned int *)LCDFRAMEBUFFERFG1;
			break;
		case FGBUFFER2:
			framebuffer=(unsigned int *)LCDFRAMEBUFFERFG2;
			break;
		default:
			break;
	}	
}

void _PutPixel1Bit(unsigned int x,unsigned int y,unsigned int c)
{
	if(x<vframewidth && y<vframeheight)
		*(framebuffer+y*vframewidth/32+x/32)= (*(framebuffer+y*vframewidth/32+x/32) 
		& ~(0x80000000>>(x%32)*1))| ((c&0x00000001)<<((32-1-(x%32))*1));   
}

void _PutPixel2Bit(unsigned int x,unsigned int y,unsigned int c)
{
	if(x<vframewidth && y<vframeheight)
		*(framebuffer+y*vframewidth/16+x/16)= (*(framebuffer+y*vframewidth/16+x/16) 
		& ~(0xc0000000>>(x%16)*2))| ((c&0x00000003)<<((16-1-(x%16))*2));
}

void _PutPixel4Bit(unsigned int x,unsigned int y,unsigned int c)
{
	if(x<vframewidth && y<vframeheight)
		*(framebuffer+y*vframewidth/8+x/8)= (*(framebuffer+y*vframewidth/8+x/8) 
		& ~(0xf0000000>>(x%8)*4))| ((c&0x0000000f)<<((8-1-(x%8))*4));
}

void _PutPixel8Bit(unsigned int x,unsigned int y,unsigned int c)
{
	if(x<vframewidth && y<vframeheight)
		*(framebuffer+y*vframewidth/4+x/4)= (*(framebuffer+y*vframewidth/4+x/4) 
		& ~(0xff000000>>(x%4)*8))| ((c&0x000000ff)<<((4-1-(x%4))*8));
}

void _PutPixel16Bit(unsigned int x,unsigned int y,unsigned int c)
{
	if(x<vframewidth && y<vframeheight)
		*(framebuffer+y*vframewidth/2+x/2)= (*(framebuffer+y*vframewidth/2+x/2) 
		& ~(0xffff0000>>(x%2)*16))|((c&0x0000ffff)<<((2-1-(x%2))*16));
}

void _PutPixel24Bit(unsigned int x,unsigned int y,unsigned int c)
{
	if(x<vframewidth && y<vframeheight)
		*(framebuffer+y*vframewidth+x)=(c&0xffffff); // for serial LCD
//		*(framebuffer+y*vframewidth+x)=(c&0xfcfcfc);
}

/*  for old(r01 base) version
void _PutPixel24Bit(unsigned int x,unsigned int y,unsigned int c)
{
	if(x<vframewidth && y<vframeheight)
//		*(framebuffer+y*vframewidth+x)=((c&0xfc)>>2)|((c&0xfc00)>>4)|((c&0xfc0000)>>6); //24bpp input
		*(framebuffer+y*vframewidth+x)=((c&0x7ff)<<1)|((c&0xf800)<<2); //16bpp input for SMDK2460 r01
}
*/


void GlibRectangle(int x1,int y1,int x2,int y2,int color)
{
    GlibLine(x1,y1,x2,y1,color);
    GlibLine(x2,y1,x2,y2,color);
    GlibLine(x1,y2,x2,y2,color);
    GlibLine(x1,y1,x1,y2,color);
}


void GlibFilledRectangle(int x1,int y1,int x2,int y2,int color)
{
    int i;

    for(i=y1;i<=y2;i++)
	GlibLine(x1,i,x2,i,color);
}



// LCD display is flipped vertically
// But, think the algorithm by mathematics point.
//   3I2
//   4 I 1
//  --+--   <-8 octants  mathematical cordinate
//   5 I 8
//   6I7
void GlibLine(int x1,int y1,int x2,int y2,int color)
{
	int dx,dy,e;
	dx=x2-x1; 
	dy=y2-y1;
    
	if(dx>=0)
	{
		if(dy >= 0) // dy>=0
		{
			if(dx>=dy) // 1/8 octant
			{
				e=dy-dx/2;
				while(x1<=x2)
				{
					PutPixel(x1,y1,color);
					if(e>0){y1+=1;e-=dx;}	
					x1+=1;
					e+=dy;
				}
			}
			else		// 2/8 octant
			{
				e=dx-dy/2;
				while(y1<=y2)
				{
					PutPixel(x1,y1,color);
					if(e>0){x1+=1;e-=dy;}	
					y1+=1;
					e+=dx;
				}
			}
		}
		else		   // dy<0
		{
			dy=-dy;   // dy=abs(dy)

			if(dx>=dy) // 8/8 octant
			{
				e=dy-dx/2;
				while(x1<=x2)
				{
					PutPixel(x1,y1,color);
					if(e>0){y1-=1;e-=dx;}	
					x1+=1;
					e+=dy;
				}
			}
			else		// 7/8 octant
			{
				e=dx-dy/2;
				while(y1>=y2)
				{
					PutPixel(x1,y1,color);
					if(e>0){x1+=1;e-=dy;}	
					y1-=1;
					e+=dx;
				}
			}
		}	
	}
	else //dx<0
	{
		dx=-dx;		//dx=abs(dx)
		if(dy >= 0) // dy>=0
		{
			if(dx>=dy) // 4/8 octant
			{
				e=dy-dx/2;
				while(x1>=x2)
				{
					PutPixel(x1,y1,color);
					if(e>0){y1+=1;e-=dx;}	
					x1-=1;
					e+=dy;
				}
			}
			else		// 3/8 octant
			{
				e=dx-dy/2;
				while(y1<=y2)
				{
					PutPixel(x1,y1,color);
					if(e>0){x1-=1;e-=dy;}	
					y1+=1;
					e+=dx;
				}
			}
		}
		else		   // dy<0
		{
			dy=-dy;   // dy=abs(dy)

			if(dx>=dy) // 5/8 octant
			{
				e=dy-dx/2;
				while(x1>=x2)
				{
					PutPixel(x1,y1,color);
					if(e>0){y1-=1;e-=dx;}	
					x1-=1;
					e+=dy;
				}
			}
			else		// 6/8 octant
			{
				e=dx-dy/2;
				while(y1>=y2)
				{
					PutPixel(x1,y1,color);
					if(e>0){x1-=1;e-=dy;}	
					y1-=1;
					e+=dx;
				}
			}
		}	
	}
}


void GlibClearScr(unsigned int c)
{	
	int i,j;

	for(j=0;j<vframeheight;j++)
		for(i=0;i<vframewidth;i++)
				PutPixel(i,j,c);      
}

⌨️ 快捷键说明

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