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

📄 glib.c

📁 三星 s3c6400测试代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**
 * glib.cpp
 *
 * @Person Involved dharma			
 * @version         1.0
 */

#include <stdarg.h>
#include <string.h>
#include <stdio.h>

#include "system.h"
#include "library.h"
#include "glib.h"
#include "glib_font.h"

#define CC24_16(c)	         ( ((((c)>>19)&0x1f)<<11)|((((c)>>10)&0x3f)<< 5)|((((c)>>3)&0x1f)<<0) )

#define START_ASCII           (0x20)
#define FONT_START_LINE       (2)
#define FONT_END_LINE         (14)

#define ARGB8_ALPHA_MASK     ~(1<<7)
#define ARGB16_ALPHA_MASK    ~(1<<15)
#define ARGB24_ALPHA_MASK    ~(1<<24)

GLIB oGlib;

void GLIB_Init(u32 uFbAddr, u32 uHSize, u32 uVSize, CSPACE eBpp)
{
	GLIB_InitInstance(uFbAddr, uHSize, uVSize, eBpp);
}

void GLIB_ClearFrame(COLOR color) 
{ 
	if (oGlib.m_uPalFlag == 0)
		GLIB_ClearFrame2(oGlib.m_uColorValue[color]); 
	else
		GLIB_ClearPalFrame(color);
}

void GLIB_ClearFrame3(COLOR color, ALPHA_SEL eSel)
{ 
	GLIB_ClearFrame4(oGlib.m_uColorValue[color], eSel); 
}

void GLIB_GetColorValue(COLOR color, u32 *value)
{ 
	*value =  oGlib.m_uColorValue[color]; 
}

void GLIB_PutPixel(u32 x, u32 y, COLOR color) 
{
	if (oGlib.m_uPalFlag == 0)
		GLIB_PutPixel2(x, y, oGlib.m_uColorValue[color]); 
	else
		GLIB_PutPalData(x, y, color);
}

void GLIB_PutLine(int x1, int y1, int x2, int y2, COLOR color) 
{
	if (oGlib.m_uPalFlag == 0)
		GLIB_PutLine2(x1, y1, x2, y2, oGlib.m_uColorValue[color]);
	else
		GLIB_PutPalLine(x1, y1, x2, y2, color);
}

void GLIB_PutLine3(int nX1, int nY1, int nX2, int nY2, COLOR eColor, ALPHA_SEL eSel)
{
	GLIB_PutLine4(nX1, nY1, nX2, nY2, oGlib.m_uColorValue[eColor], eSel);
}

void GLIB_PutRectangle(int x1, int y1, int dx, int dy, COLOR color) 
{ 
	if (oGlib.m_uPalFlag == 0)
		GLIB_PutRectangle2(x1, y1, dx, dy, oGlib.m_uColorValue[color]); 
	else
		GLIB_PutPalRectangle(x1, y1, dx, dy, color); 
}

void GLIB_PutRectangle3(int x1, int y1, int dx, int dy, COLOR color, ALPHA_SEL eSel) 
{
	GLIB_PutRectangle4(x1, y1, dx, dy, oGlib.m_uColorValue[color], eSel); 	
}

void GLIB_FillRectangle(int x1, int y1, int dx, int dy, COLOR color)
{
	if (oGlib.m_uPalFlag == 0)
		GLIB_FillRectangle2(x1, y1, dx, dy, oGlib.m_uColorValue[color]);
	else
		GLIB_FillPalRectangle(x1, y1, dx, dy, color);		
}

void GLIB_FillRectangle3(int x1, int y1, int dx, int dy, COLOR color, ALPHA_SEL eSel)
{
	GLIB_FillRectangle4(x1, y1, dx, dy, oGlib.m_uColorValue[color], eSel);	
}

void GLIB_GetDimension(u32 *x, u32 *y)
{
	*x = oGlib.m_uHsz;
	*y = oGlib.m_uVsz;
}

void GLIB_InitInstance(u32 uFbAddr, u32 uHSize, u32 uVSize, CSPACE eBpp)
{
	oGlib.m_uHsz = uHSize;
	oGlib.m_uVsz = uVSize;
	oGlib.m_uBpp =
		(eBpp == RGB8 || eBpp == ARGB8) ? 8 :
		(eBpp == RGB16 || eBpp == ARGB16) ? 16 :
		(eBpp == RGB24 || eBpp == ARGB24) ? 24 : 24;

	oGlib.m_uPalDataBpp =
		(eBpp == PAL1) ? 1 :
		(eBpp == PAL2) ? 2 :
		(eBpp == PAL4) ? 4 :
		(eBpp == PAL8) ? 8 : 8;	

	oGlib.m_eCSpace = eBpp;
			
	oGlib.m_pFrameBuf = (void*)uFbAddr;
	oGlib.m_uFrameBuf = uFbAddr; /// added in GJ

	oGlib.m_uPalFlag = 0;
	oGlib.m_uCnt = 0;
	oGlib.m_ucPreData = 0;

	oGlib.m_uPrePosX = 0;
	oGlib.m_uPrePosY = 0;
	
	if (eBpp == RGB8)
	{
		oGlib.m_uColorValue[C_BLACK] = 0x00;
		oGlib.m_uColorValue[C_RED]   = 0x07<<5;
		oGlib.m_uColorValue[C_GREEN] = 0x07<<2;
		oGlib.m_uColorValue[C_BLUE]  = 0x03;
		oGlib.m_uColorValue[C_WHITE] = 0xff;
	}
	// A:1 - R:2 - G:3 - B:2
	// A's init value: 0 (A is Alpha value select bit)
	// if A is 0 then alpha_0 value of LCDC(above V3.2) is selected, else alpha_1 value is selected
	else if (eBpp == ARGB8) 
	{
		oGlib.m_uColorValue[C_BLACK] = 0x00;
		oGlib.m_uColorValue[C_RED] = 0x3<<5;
		oGlib.m_uColorValue[C_GREEN] = 0x7<<2;
		oGlib.m_uColorValue[C_BLUE] = 0x3;
		oGlib.m_uColorValue[C_WHITE] = 0x7f;
	}
	else if (eBpp == RGB16)
	{
		oGlib.m_uColorValue[C_BLACK] = 0x0;
		oGlib.m_uColorValue[C_RED]   = 0x1f<<11;
		oGlib.m_uColorValue[C_GREEN] = 0x3f<<5;
		oGlib.m_uColorValue[C_BLUE]  = 0x1f<<0;
		oGlib.m_uColorValue[C_WHITE] = 0xffff;
	}
	else if (eBpp == ARGB16) // A:1 - R:5 - G:5 - B:5 and A's init value: 0
	{
		oGlib.m_uColorValue[C_BLACK] = 0x0;
		oGlib.m_uColorValue[C_RED]   = 0x1f<<10;
		oGlib.m_uColorValue[C_GREEN] = 0x1f<<5;
		oGlib.m_uColorValue[C_BLUE]  = 0x1f<<0;
		oGlib.m_uColorValue[C_WHITE] = 0x7fff;
	}
	else if (eBpp == RGB24)
	{
		oGlib.m_uColorValue[C_BLACK] = 0x0;
		oGlib.m_uColorValue[C_RED]   = 0xff0000;
		oGlib.m_uColorValue[C_GREEN] = 0xff00;
		oGlib.m_uColorValue[C_BLUE]  = 0xff;
		oGlib.m_uColorValue[C_WHITE] = 0xffffff;
	}
	else if (eBpp == ARGB24) // A:1 - R:8 - G:8 - B:7 and A's init value: 0
	{
		oGlib.m_uColorValue[C_BLACK] = 0x0;
		oGlib.m_uColorValue[C_RED]   = 0xff<<15;
		oGlib.m_uColorValue[C_GREEN] = 0xff<<7;
		oGlib.m_uColorValue[C_BLUE]  = 0x7f;
		oGlib.m_uColorValue[C_WHITE] = 0x7fffff;
	}
	
	oGlib.m_uColorValue[C_YELLOW] = (oGlib.m_uColorValue[C_RED] | oGlib.m_uColorValue[C_GREEN]);
	oGlib.m_uColorValue[C_CYAN] = (oGlib.m_uColorValue[C_GREEN] | oGlib.m_uColorValue[C_BLUE]);
	oGlib.m_uColorValue[C_MAGENTA] = (oGlib.m_uColorValue[C_RED] | oGlib.m_uColorValue[C_BLUE]);		

	GLIB_InitFont();
}

void GLIB_SetPalDataFormat(CSPACE ePalDataFormat)
{
	oGlib.m_uPalFlag = 1;
	
	if (oGlib.m_uPalDataBpp == 1)
	{
		if(ePalDataFormat == RGB8)
		{
			oGlib.m_uColorValue[C_BLACK] = 0x00;
			oGlib.m_uColorValue[C_RED]   = 0x07<<5;
		}
		else if(ePalDataFormat == RGB16)
		{
			oGlib.m_uColorValue[C_BLACK] = 0x0;
			oGlib.m_uColorValue[C_RED]   = 0x1f<<11;			
		}
		else if(ePalDataFormat == RGB24)
		{
			oGlib.m_uColorValue[C_BLACK] = 0x0;
			oGlib.m_uColorValue[C_RED] = 0xff0000;					
		}
		else
		{
			Assert(0);
		}
	}
	else if (oGlib.m_uPalDataBpp == 2)
	{
		if(ePalDataFormat == RGB8)
		{
			oGlib.m_uColorValue[C_BLACK] = 0x00;
			oGlib.m_uColorValue[C_RED]   = 0x07<<5;
			oGlib.m_uColorValue[C_GREEN] = 0x07<<2;
			oGlib.m_uColorValue[C_BLUE]  = 0x03;			
		}
		else if(ePalDataFormat == RGB16)
		{
			oGlib.m_uColorValue[C_BLACK] = 0x0;
			oGlib.m_uColorValue[C_RED]   = 0x1f<<11;
			oGlib.m_uColorValue[C_GREEN] = 0x3f<<5;
			oGlib.m_uColorValue[C_BLUE]  = 0x1f<<0;
		}
		else if(ePalDataFormat == RGB24)
		{
			oGlib.m_uColorValue[C_BLACK] = 0x0;
			oGlib.m_uColorValue[C_RED]   = 0xff0000;
			oGlib.m_uColorValue[C_GREEN] = 0xff00;
			oGlib.m_uColorValue[C_BLUE]  = 0xff;
		}
		else
		{
			Assert(0);
		}
		
	}
	else if ( (oGlib.m_uPalDataBpp == 4) || (oGlib.m_uPalDataBpp == 8) )
	{
		if(ePalDataFormat == RGB8)
		{
			oGlib.m_uColorValue[C_BLACK] = 0x00;
			oGlib.m_uColorValue[C_RED]   = 0x07<<5;
			oGlib.m_uColorValue[C_GREEN] = 0x07<<2;
			oGlib.m_uColorValue[C_BLUE]  = 0x03;
			oGlib.m_uColorValue[C_WHITE] = 0xff;
		}
		else if(ePalDataFormat == RGB16)
		{
			oGlib.m_uColorValue[C_BLACK] = 0x0;
			oGlib.m_uColorValue[C_RED]   = 0x1f<<11;
			oGlib.m_uColorValue[C_GREEN] = 0x3f<<5;
			oGlib.m_uColorValue[C_BLUE]  = 0x1f<<0;
			oGlib.m_uColorValue[C_WHITE] = 0xffff;
		}
		else if(ePalDataFormat == RGB24)
		{
			oGlib.m_uColorValue[C_BLACK] = 0x0;
			oGlib.m_uColorValue[C_RED]   = 0xff0000;
			oGlib.m_uColorValue[C_GREEN] = 0xff00;
			oGlib.m_uColorValue[C_BLUE]  = 0xff;
			oGlib.m_uColorValue[C_WHITE] = 0xffffff;
		}
		else
		{
			Assert(0);
		}
	}
	else
	{
		Assert(0);
	}

	oGlib.m_uColorValue[C_YELLOW] = (oGlib.m_uColorValue[C_RED] | oGlib.m_uColorValue[C_GREEN]);
	oGlib.m_uColorValue[C_CYAN] = (oGlib.m_uColorValue[C_GREEN] | oGlib.m_uColorValue[C_BLUE]);
	oGlib.m_uColorValue[C_MAGENTA] = (oGlib.m_uColorValue[C_RED] | oGlib.m_uColorValue[C_BLUE]);		
	
}

void GLIB_GetPalDataFormat(COLOR eColorIdx, u32 *uColorVal)
{
	*uColorVal = oGlib.m_uColorValue[eColorIdx];
}

void GLIB_PutPixel2(u32 x, u32 y, u32 cvalue)
{
	if (oGlib.m_uBpp == 8)
	{
		*((u8 *)(oGlib.m_pFrameBuf)+oGlib.m_uHsz*(y)+(x)) = (u8)cvalue;
	}
	else if (oGlib.m_uBpp == 16)
	{
		*((u16 *)(oGlib.m_pFrameBuf)+oGlib.m_uHsz*(y)+(x)) = (u16)cvalue;

	}
	else if (oGlib.m_uBpp == 18 || oGlib.m_uBpp == 24)
	{
		*((u32 *)(oGlib.m_pFrameBuf)+oGlib.m_uHsz*(y)+(x)) = cvalue;
	}
}

void GLIB_PutPalData(int nPosX, int nPosY, u32 uData)
{
	if (oGlib.m_uPalDataBpp == 8)
	{
		*((u8 *)(oGlib.m_pFrameBuf)+oGlib.m_uHsz*(nPosY)+(nPosX)) = (u8)uData;		
	}
	else if(oGlib.m_uPalDataBpp != 8)
	{
		Assert(0);
	}
}

void GLIB_PutRectangle2(int x1, int y1, int dx, int dy, u32 cvalue)
{
	u32 x2 = x1+dx-1;
	u32 y2 = y1+dy-1;
	
	GLIB_PutLine2(x1,y1,x2,y1,cvalue);
	GLIB_PutLine2(x2,y1,x2,y2,cvalue);
	GLIB_PutLine2(x1,y2,x2,y2,cvalue);
	GLIB_PutLine2(x1,y1,x1,y2,cvalue);
}

void GLIB_PutRectangle4(int x1, int y1, int dx, int dy, u32 cvalue, ALPHA_SEL eSel)
{
	u32 x2 = x1+dx-1;
	u32 y2 = y1+dy-1;
	
	GLIB_PutLine4(x1,y1,x2,y1,cvalue, eSel);
	GLIB_PutLine4(x2,y1,x2,y2,cvalue, eSel);
	GLIB_PutLine4(x1,y2,x2,y2,cvalue, eSel);
	GLIB_PutLine4(x1,y1,x1,y2,cvalue, eSel);
}

void GLIB_PutPalRectangle(int nPosX1, int nPosY1, int nHSz, int nVSz, u32 uData)
{
	u32 uPosX2 = nPosX1+nHSz-1;
	u32 uPosY2 = nPosY1+nVSz-1;

	GLIB_PutPalLine(nPosX1, nPosY1, uPosX2, nPosY1, uData);
	GLIB_PutPalLine(uPosX2, nPosY1, uPosX2, uPosY2, uData);
	GLIB_PutPalLine(nPosX1, uPosY2, uPosX2, uPosY2, uData);
	GLIB_PutPalLine(nPosX1, nPosY1, nPosX1, uPosY2, uData);
}

void GLIB_FillRectangle2(int x1, int y1, int dx, int dy, u32 cvalue)
{
	int i;
	u32 x2 = x1+dx-1;
	u32 y2 = y1+dy-1;
	
	for(i=y1;i<=y2;i++)
		GLIB_PutLine2(x1,i,x2,i,cvalue);
}

void GLIB_FillRectangle4(int x1, int y1, int dx, int dy, u32 cvalue, ALPHA_SEL eSel)
{
	int i;
	u32 x2 = x1+dx-1;
	u32 y2 = y1+dy-1;
	
	for(i=y1;i<=y2;i++)
		GLIB_PutLine4(x1, i, x2, i, cvalue, eSel);
}

void GLIB_FillPalRectangle(int nPosX1, int nPosY1, int nHSz, int nVSz, u32 uData)
{
	int i;
	u32 uPosX2 = nPosX1+nHSz-1;
	u32 uPosY2 = nPosY1+nVSz-1;
	
	for(i=nPosY1;i<=uPosY2;i++)
		GLIB_PutPalLine(nPosX1,i,uPosX2,i,uData);
}
// LCD display is flipped vertically
// But, think the algorithm by mathematics point.
//   3 I 2
//   4 I 1
//   --+--   <-8 octants  mathematical cordinate
//   5 I 8
//   6 I 7
void GLIB_PutLine2(int x1, int y1, int x2, int y2, u32 cvalue)
{

	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)
				{
					GLIB_PutPixel2(x1,y1,cvalue);
					if(e>0){y1+=1;e-=dx;}
					x1+=1;
					e+=dy;
				}
			}
			else		// 2/8 octant
			{
				e=dx-dy/2;
				while(y1<=y2)
				{
					GLIB_PutPixel2(x1,y1,cvalue);
					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)
				{
					GLIB_PutPixel2(x1,y1,cvalue);
					if(e>0){y1-=1;e-=dx;}
					x1+=1;
					e+=dy;
				}
			}
			else		// 7/8 octant
			{
				e=dx-dy/2;
				while(y1>=y2)
				{
					GLIB_PutPixel2(x1,y1,cvalue);
					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)
				{
					GLIB_PutPixel2(x1,y1,cvalue);
					if(e>0){y1+=1;e-=dx;}
					x1-=1;
					e+=dy;
				}
			}
			else		// 3/8 octant
			{
				e=dx-dy/2;
				while(y1<=y2)
				{
					GLIB_PutPixel2(x1,y1,cvalue);
					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;

⌨️ 快捷键说明

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