📄 gdi.c
字号:
#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 + -