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

📄 gdi.c

📁 嵌入式系统ucgui图形接口源程序在arm7 s3c44b0x 开发板上的移植测试代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef _GDI_C
#define _GDI_C
#include "..\\include\\gdi.h"
#include "..\\include\\malloc.h"
#include "..\\include\\lcd.h"
#include "..\\include\\def.h"
/***************************8X8 ASCII点阵数据******************************************/
unsigned  char const ASCII[][8] ={
				   {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff},//Space
			   	   {0xC1,0xBE,0xBE,0xBE,0x80,0xBE,0xBE,0xBE},//A
				   {0xC0,0xBE,0xBE,0xC0,0xBE,0xBE,0xBE,0xC0},//B	
				   {0XC1,0XBE,0XFE,0XFE,0XFE,0XFE,0XBE,0XC1},//C	
				   {0xC0,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xC0},//D
				   {0x80,0xBE,0xFE,0xE0,0xFE,0xFE,0xBE,0x80},//E  
				   {0x80,0xBE,0xFE,0xE0,0xFE,0xFE,0xFE,0xFE},//F
				   {0xC1,0xBE,0xFE,0xFE,0x9E,0xBE,0xBE,0xC1},//G
				   {0xBE,0xBE,0xBE,0xBE,0x80,0xBE,0xBE,0xBE},//H
				   {0xF8,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xF8},//I
				   {0xDF,0xDF,0xDF,0xDF,0xDF,0xBE,0xBE,0xC1},//J
				   {0xBE,0xDE,0xEE,0xF0,0xF6,0xEE,0xDE,0xBE},//K
				   {0xF8,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0x80},//L
				   {0xBE,0x9C,0xAA,0xB6,0xBE,0xBE,0xBE,0xBE},//M
				   {0xBE,0xBC,0xBA,0xB6,0xAE,0x9E,0xBE,0xBE},//N
				   {0xC1,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xC1},//O
				   {0xC0,0xBD,0xBD,0xC1,0xFD,0xFD,0xFD,0xF8},//P
				   {0xC1,0xBE,0xBE,0xBE,0xBE,0xAE,0xC1,0xDF},//Q
				   {0xC0,0xBD,0xBD,0xC1,0xF5,0xED,0xDD,0xB8},//R
				   {0xC1,0xBE,0xFE,0xFD,0xC3,0xBF,0xBE,0xC1},//S
				   {0x80,0xB6,0xF7,0xF7,0xF7,0xF7,0xF7,0xE3},//T
				   {0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xBE,0xC1},//U
				   {0xBE,0xBE,0xBE,0xBE,0xBE,0xDD,0xEB,0xF7},//V
				   {0xBE,0xBE,0xBE,0xBE,0xBE,0xAA,0xC1,0xEB},//W
				   {0xBE,0xDD,0xEB,0xF7,0xF7,0xEB,0xDD,0xBE},//X
				   {0xBE,0xBE,0xDD,0xEB,0xF7,0xF7,0xF7,0xF7},//Y
				   {0x80,0xDE,0xEF,0xF7,0xFB,0xFD,0xBE,0x80},//Z
				   {0xFF,0xFF,0xD1,0xCE,0xDE,0xDE,0xCE,0x91},//a
				   {0xFC,0xFD,0xC5,0xB9,0xBD,0xBD,0xB9,0xC4},//b
				   {0xFF,0xFF,0xC1,0xBE,0xFE,0xFE,0xBE,0xC1},//c
				   {0x9F,0xDF,0xD1,0xCE,0xDE,0xDE,0xCE,0x91},//d
				   {0xFF,0xFF,0xC1,0xBE,0xC0,0xFE,0xBE,0xC0},//e
				   {0xC3,0xBD,0xFD,0xE1,0xFD,0xFD,0xFD,0xF8},//f
				   {0xFF,0xA1,0x9E,0xBE,0x81,0xBF,0xBE,0xC0},//g
				   {0xF8,0xFD,0xC5,0xB9,0xBD,0xBD,0xBD,0xB8},//h
				   {0xFD,0xFF,0xF8,0xFD,0xFD,0xFD,0xFD,0xF8},//i
				   {0xF7,0xFF,0xE3,0xF7,0xF7,0xF7,0xF6,0xF9},//j
				   {0xF8,0xDD,0xED,0xF5,0xF9,0xF5,0xED,0xd8},//k
				   {0xFC,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xF8},//l
				   {0xFF,0xFF,0xEA,0xD5,0xD5,0xD5,0xD5,0x94},//m
				   {0xFF,0xFF,0xE4,0xD9,0xDD,0xDD,0xDD,0x98},//n
				   {0xFF,0xFF,0xE1,0xDE,0xDE,0xDE,0xDE,0xE1},//o
				   {0xFF,0xE4,0xD9,0xDD,0xDD,0xE1,0xFD,0xF8},//p
				   {0xFF,0xC9,0xE6,0xEE,0xEE,0xE1,0xEF,0xC7},//q
				   {0xFF,0xFF,0xE4,0xD9,0xFD,0xFD,0xFD,0xF8},//r
				   {0xFF,0xFF,0xE1,0xDE,0xF1,0xEF,0xDE,0xE1},//s
				   {0xFC,0xFD,0xE0,0xFD,0xFD,0xFD,0xBD,0xC3},//t
				   {0xFF,0xFF,0xDE,0xDE,0xDE,0xDE,0xCE,0x91},//u
				   {0xFF,0xFF,0xEE,0xEE,0xEE,0xEE,0xF5,0xFB},//v
				   {0xFF,0xFF,0xBE,0xBE,0xBE,0xB6,0xA2,0xD5},//w
				   {0xFF,0xFF,0xEE,0xF5,0xFB,0xFB,0xF5,0xEE},//x
				   {0xFF,0x9E,0xDE,0xDE,0xC1,0xDF,0xDE,0xE1},//y
				   {0xFF,0xFF,0xE0,0xEE,0xF7,0xFB,0xED,0xE0},//z
				   {0xff,0xff,0xff,0x9d,0x6d,0xf3,0xff,0xff},//~
				   {0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xFE},//!
				   {0xD1,0xAE,0xA6,0xAA,0xAA,0xA6,0xBE,0xC1},//@
				   {0xDB,0xDB,0x80,0xDB,0x80,0xDB,0xDB,0xFF},//#
				   {0xF7,0xC1,0xB6,0xF6,0xC1,0xB7,0xB6,0xC1},//$
				   {0xFF,0xBD,0xDA,0xED,0xF7,0xDB,0xAD,0xDE},//%
				   {0xf7,0xeb,0xdd,0xbe,0xff,0xff,0xff,0xff},//^
				   {0xE1,0xDE,0xDE,0xE5,0x99,0xE6,0xEE,0x91},//&
				   {0xFF,0xB6,0xD5,0xE3,0x88,0xE3,0xD5,0xB6},//*
				   {0xfb,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfb},//(
				   {0xcf,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,0xcf},//)
				   {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80},//_
				   {0xFF,0xF7,0xF7,0xF7,0x80,0xF7,0xF7,0xF7},//+
				   {0xff,0xff,0x9f,0x9f,0xef,0xe7,0xe7,0xff},//`
				   {0xF9,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xF1},//1
				   {0xC1,0xBE,0xDE,0xEF,0xF7,0xFB,0xFD,0x80},//2
				   {0xC1,0xBE,0xBF,0xBF,0xC1,0xBF,0xBE,0xC1},//3
				   {0xDF,0xCF,0xD7,0xDB,0xDD,0x80,0xDF,0xDF},//4
				   {0x80,0xFE,0xFE,0xC0,0xDF,0xDF,0xDE,0xC1},//5
				   {0xC1,0xBE,0xFE,0xC0,0xBE,0xBE,0xBE,0xC1},//6
				   {0x80,0xBE,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE},//7
				   {0xC1,0xBE,0xBE,0xC1,0xBE,0xBE,0xBE,0xC1},//8
				   {0xC1,0xBE,0xBE,0xBE,0x81,0xBF,0xBE,0xC1},//9
				   {0xC1,0xBE,0x9E,0xAE,0xB6,0xBA,0xBC,0xC1},//0
				   {0xFF,0xFF,0xFF,0xFF,0xE0,0xFF,0xFF,0xFF},//-
				   {0xff,0xff,0xff,0xc1,0xff,0xc1,0xff,0xff},//=
				   {0xFF,0xF1,0xFD,0xFD,0xFE,0xFD,0xFD,0xF1},//{
				   {0xFF,0xF8,0xFB,0xFB,0xF7,0xFB,0xFB,0xF8},//}
				   {0xFF,0xFE,0xFE,0xFE,0xFF,0xFE,0xFE,0xFE},//|
				   {0xFF,0xFF,0xFE,0xFE,0xFF,0xFF,0xFE,0xFE},//:
				   {0xF5,0xFA,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},//"
				   {0xFF,0xF7,0xFB,0xFD,0xFE,0xFD,0xFB,0xF7},//<
				   {0xFF,0xFE,0xFD,0xFB,0xF7,0xFB,0xFD,0xFE},//>
				   {0xE1,0xDE,0xDE,0xEF,0xF7,0xF7,0xFF,0xF7},//?
				   {0xf8,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xf8},//[
				   {0x1f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x1f},//]
				   {0xFF,0xFE,0xFD,0xFB,0xF7,0xFB,0xFB,0xFB},//'\'
				   {0xFF,0xFF,0xFD,0xFD,0xFF,0xFF,0xFD,0xFE},//;
				   {0xff,0xff,0xf7,0xe7,0xcf,0xdf,0xff,0xff},//',
				   {0xFF,0xFF,0xFF,0xFF,0xFF,0xFD,0xFD,0xFE},//,
				   {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xFC},//.
				   {0xFF,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}///				   
				   } ;

/*******************************函数名称:GetIndex()************************************************
功能:获取指定字符在点阵表的索引
入口:
	unsigned char ccText:ASCII字符串
出口:
	成功,返回指定的索引
	失败,返回0
***************************************************************************************************************/
static unsigned char GetIndex(unsigned char ccText)
{
	const unsigned char  TAB[]={' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
					'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
					'~','!','@','#','$','%','^','&','*','(',')','_','+',
					'`','1','2','3','4','5','6','7','8','9','0','-','=',
					'{','}','|',':','"','<','>','?','[',']','\\',';','\'',',','.','/'
				   };
					
	unsigned char i;
	for(i=0;i<sizeof(TAB);i++)
		if(ccText==TAB[i]) return i;
	return 0x00;
}

/*******************************函数名称:GetTextFont()************************************************
功能:获取指定字符在点阵表的索引
入口:
	unsigned char ccText:ASCII字符串
出口:
	总是操作成功,返回指定的点阵数据
***************************************************************************************************************/
static unsigned char *GetTextFont(unsigned char ch)
{
	static unsigned char Font[8];
	unsigned char i;
	for(i=0;i<8;i++)
	Font[i]=~ASCII[GetIndex(ch)][i];
	return Font;
}


#define GetImageSize(a) (a->nWidth*a->nHeight*a->nColors/32)

/********************MASK是bit0~bit31的位掩码*******************************************************************/
static const UINT MASK[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
			   0x100,0x200,0x400,0x800,0x1000,0x2000,0x4000,0x8000,	
			   0x10000,0x20000,0x40000,0x80000,0x100000,0x200000,0x400000,0x800000,
			   0x1000000,0x2000000,0x4000000,0x8000000,0x10000000,0x20000000,0x40000000,0x80000000};
/**************************************************************************************************************/

/*****************************函数名称:SetPixel()******************************************
功能:
	对(x,y)坐标设置颜色
入口:
	hDC,HDC指针
	x,y:坐标
	color:颜色
出口:
	成功,返回原来的颜色
	失败,返回0
********************************************************************************************/
COLORREF SetPixel(HDC hDC,int x,int y,COLORREF color)
{
	UINT *buff=hDC->lpImage;
	HDC hLCD;
	COLORREF ret=0;
	int i,j,k;
	if(!hDC||!buff) return 0;
	if(x>=hDC->nWidth||y>=hDC->nHeight) return 0;
	hLCD=GetDC(NULL);
/***********以下代码在我的G32-2中是必须的,因为该LCD安装的时候刚好颠倒了,如果你的LCD没有颠倒,则在本文件前#define LCD_OK即可*/
#ifndef LCD_OK
	if(hDC==hLCD)
	{
		x=LCD_XSIZE-1-x;
		y=LCD_YSIZE-1-y;
	}

#endif
	switch(hDC->nColors)
	{
		case 1:
			color&=0x01;
			i=x/32;
			i+=(hDC->nWidth/32)*y;
			j=31-(x%32);
			ret=(buff[i]>>j)&0x01;
			buff[i]=(buff[i]&(~(MASK[j])))|(color<<j);	
			break;
		case 2:
			color&=0x03;
			i=x/16;
		 	i+=(hDC->nWidth/16)*y;
			j=30-(x%16)*2;
			ret=(buff[i]>>j)&0x01;
			for(k=j;k<j+2;k++)
				buff[i]&=~MASK[k];
			buff[i]|=(color<<j);	
			break;
		case 4:
			color&=0x0f;
			i=x/8;
			i+=(hDC->nWidth/8)*y;
		
			j=28-(x%8)*4;
			ret=(buff[i]>>j)&0x0f;
			for(k=j;k<j+4;k++)
				buff[i]&=~MASK[k];
			buff[i]|=(color<<j);	
			break;
		case 8:
			i=x/4;
			i+=(hDC->nWidth/4)*y;
			j=24-(x%4)*8;
			ret=(buff[i]>>j)&0xff;
			for(k=j;k<j+8;k++)
				buff[i]&=~MASK[k];
			buff[i]|=(color<<j);	
			break;
	}
	return ret;
}

/************************************函数名称:GetPixel()*********************************
功能:
	获取(x,y)处的象素颜色
入口:
	hDC:HDC指针
	x,y:坐标
出口:
	成功,返回正确的颜色
	失败,返回0
*****************************************************************************************/

COLORREF GetPixel(HDC hDC,int x,int y)
{
	UINT *buff=hDC->lpImage;
	HDC hLCD=GetDC(NULL);
	COLORREF ret=0;
	int i,j;
	if(!hDC||!buff) return 0;
	if(x>=hDC->nWidth||y>=hDC->nHeight) return 0;
/****注意,这里是G35-2LCD刚好倒了,所以把x,y反过来(如果你的LCD是顺的,预先#define LCD_OK即可*/
#ifndef LCD_OK
	if(hDC==hLCD)
	{
		x=LCD_XSIZE-1-x;
		y=LCD_YSIZE-1-y;
	}
#endif
/***********************************************************************************/
	switch(hDC->nColors)
	{
		case 1:
			i=x/32;
			i+=(hDC->nWidth/32)*y;
			j=31-(x%32);
			ret=(buff[i]>>j)&0x01;
			break;
		case 2:
			i=x/16;
			i+=(hDC->nWidth/16)*y;
			j=30-(x%16)*2;
			ret=(buff[i]>>j)&0x01;
			
			break;
		case 4:
			i=x/8;
			i+=(hDC->nWidth/8)*y;
			j=28-(x%8)*4;
			ret=(buff[i]>>j)&0x0f;
			break;
		case 8:
			i=x/4;
			i+=(hDC->nWidth/4)*y;
			j=24-(x%4)*8;
			ret=(buff[i]>>j)&0xff;
			break;
	}
	return ret;

}



/**********************函数名称:GetDC(HWND hWnd)********************
功能:
	返回指定窗口的HDC指针,如果hWnd为NULL,则返回整个显示器的HDC指针
入口:
	HWND hWnd,窗口指针,如果为NULL则代表的是整个显示器
出口:
	成功则返回HDC指针,失败返回NULL(内存不够或hWnd本身没有初始化HDC)
*********************************************************************/
HDC GetDC(HWND hWnd)
{
	int nSize,i;
	UINT *buffer;
/*屏幕的主HDC*/
	static HDC hLCD=NULL;
	if(hWnd==NULL)
	{
		if(hLCD) {hLCD->bLocked=1;return hLCD;}
		hLCD=(HDC)malloc(sizeof(_HDC_));
		if(!hLCD) return NULL;
		hLCD->nSize=sizeof(_HDC_);
		hLCD->nWidth=LCD_XSIZE;
		hLCD->nHeight=LCD_YSIZE;
		hLCD->nColors=LCD_DEPTH;
		hLCD->nX=0;
		hLCD->nY=0;
		hLCD->ccTextColor=255;
		hLCD->ccBkColor=0;
		hLCD->nMode=0;
		hLCD->bLocked=0;
		hLCD->bFilled=0;
/*开始建立一些对象指针(HFONT,HBRUSH等)*/
		hLCD->hFont=NULL;
		hLCD->hPen=NULL;
		nSize=GetImageSize(hLCD);
		hLCD->lpImage=(UINT*)malloc(nSize*sizeof(int));
		if(!hLCD->lpImage)
		{
			free(hLCD);
			return NULL;
		}
		buffer=hLCD->lpImage;
		while(i--) *buffer++=0x00;
		if(!Display_Init(hLCD->lpImage))
		{
			free(hLCD->lpImage);
			free(hLCD);
			return NULL;
		}
		return hLCD;
	}
	if(hWnd->hDC) hWnd->hDC->bLocked=1;
	return hWnd->hDC;	
}

#define GetWindowDC GetDC

/*********************函数名称:CreateDC()****************************************
功能:采用指定的参数建立HDC指针
入口:
	lpszDrive:不用,必须为NULL
	lpszDevice:不用,必须为NULL
	lpszOutput:不用,必须为NULL
	lpMode:指定HDC的初始化格式(长度,宽度,颜色数目),不能为NULL
出口:
	成功,返回建立好的HDC指针
	失败,返回NULL
*********************************************************************************/
HDC CreateDC(LPSTR lpszDrive,LPSTR lpszDevice,LPSTR lpszOutput,DEVMODE *lpMode)
{
	HDC hDC;
	int nSize;
	UINT *buffer;
	if(lpszDrive||lpszDevice||lpszOutput||!lpMode) return NULL;
	while(lpMode->nWidth%8) lpMode->nWidth++;
	while(lpMode->nHeight%8) lpMode->nHeight++;
	hDC=(HDC)malloc(sizeof(_HDC_));
	if(!hDC) return NULL;
	hDC->nSize=sizeof(_HDC_);
	hDC->nWidth=lpMode->nWidth;
	hDC->nHeight=lpMode->nHeight;
	hDC->nColors=lpMode->nColors;
	hDC->bLocked=0;
	hDC->bFilled=0;
	hDC->hFont=NULL;
	hDC->hPen=NULL;
	hDC->ccTextColor=255;
	hDC->ccBkColor=0;
	nSize=GetImageSize(hDC);
	hDC->lpImage=(UINT*)malloc(nSize*sizeof(int));
	if(!hDC->lpImage)
	{
		free(hDC);
		return NULL;
	}
	buffer=hDC->lpImage;
	while(nSize--) *buffer++=0x00;
	return hDC;
}

/****************************函数名称:DeleteDC()*******************
功能:删除HDC,释放内存
入口:HDC hDC,有效的HDC指针
出口:
	成功,返回1
	失败,返回0
********************************************************************/
BOOL DeleteDC(HDC hDC)
{
	if(!hDC) return 0;
	if(hDC->lpImage)
		free(hDC->lpImage);
	free(hDC);
	return 1;
}	

/***************************函数名称:ReleaseDC()*********************
功能:释放窗口的HDC
入口:
	hWnd,窗口指针
	hDC,窗口DC
出口:
	成功,返回1
	失败,返回0
**********************************************************************/
BOOL ReleaseDC(HWND hWnd,HDC hDC)
{
	if(!hWnd) return 0;
	if(!hDC) return 0;
	hDC->bLocked=0;
	return 1;
}

/***************************函数名称:TextOut()*********************
功能:在指定的RECT显示文字
入口:
	HDC hDC,HDC指针
	int x,起始x坐标
	int y,起始y坐标
	LPSTR lpszText,文字指针
	int ccCout,文字个数
出口:
	成功,返回文字的高度(现在只支持8X8的文字,所以返回是8)
	失败,返回0
********************************************************************/


int TextOut(HDC hDC,int x,int y,LPSTR lpszText,int ccCount)
{
	unsigned char *Font;
	UINT i=x,j=y;
	UINT k,m;
	UINT xScale=2,yScale=2;
	if(!hDC||!lpszText) return 0;
	if(hDC->hFont)
	{
		if(hDC->hFont->nXScale>=1) xScale=hDC->hFont->nXScale;
		if(hDC->hFont->nYScale>=1) yScale=hDC->hFont->nYScale;
	}

	while(*lpszText)
	{
		if(*lpszText=='\r') x=0;
		else if(*lpszText=='\n') y+=8*yScale;
		else if(*lpszText=='\t') x+=32*xScale;
		else
		{
		if(x>=hDC->nWidth) 
		{
			x=0;
			y+=8*yScale;
		}
		if(y>=hDC->nHeight)
		{
			break;
		}	
		Font=GetTextFont(*(lpszText));
		for(i=0;i<8;i++)
		{
			for(m=0;m<yScale;m++)
			{
	  			for(j=0;j<8;j++)
	   			{
					for(k=0;k<xScale;k++)
					{
		 				if(Font[i]&MASK[j]) SetPixel(hDC,x+j*xScale+k,y+i*yScale+m,hDC->ccTextColor);
						else if(hDC->nMode==OPAQUE) SetPixel(hDC,x+j*xScale+k,y+i*yScale+m,hDC->ccBkColor);
	   				}
				}
			}
		}
		x+=8*xScale;
		}
		lpszText++;
	}		

	return 8;
}

/**************************函数名称:GetTextColor()*********************
功能:返回指定HDC的文字颜色
入口:

⌨️ 快捷键说明

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