📄 core_vga.c
字号:
{ // 半角字
if( Bq==0x20 ) { xfrom+=16;}
else if( Bq=='\n' || Bq=='\r' ) { xfrom=x; yfrom+=16;}
else if( Bq=='\t' ) { xfrom+=64;}
else //if( Bq>0x20 && Bq<0x7B )
{
fOffset=(Bq+0x9B);
fOffset<<=5;
fseek(fpGB16, fOffset, SEEK_SET);
fread(buffer, 32L, 1, fpGB16);
for(t=0,m=0; t<16; t++)
{
for(k=0; k<8; k++)
{
if( buffer[m]&(0x80>>k) )
{ PutPixel(xfrom+k, yfrom+t, r, g, b);}
}
m++;
for(k=0; k<8; k++)
{
if( buffer[m]&(0x80>>k) )
{ PutPixel(xfrom+8+k, yfrom+t, r, g, b);}
}
m++;
}
xfrom+=16;
if( !Bw ) { break;}
}
}
}
}
/***
放大显示字库文件中的全角字体
(主要应用于中文和全角表示的英文字母和数字显示)
size=(16*hX)*(16*vX).
***/
void ShowGB2312X(int x, int y, int hX, int vX, char *ptr, int r, int g, int b)
{
long lOffSet;
int hXLoop,vXLoop;
int xNew,yNew,hLoop,vLoop,pLoop;
unsigned char buffer[32];
unsigned char uQcode,uWcode;
xNew=x;
yNew=y;
while(*ptr)
{
uQcode=*ptr++;
uWcode=*ptr;
if(uQcode>=0xa1 && uWcode>=0xa1)
{ //输入的内容是全角字
ptr++;
uQcode=uQcode-0xa1;
uWcode=uWcode-0xa1;
lOffSet=(long)uQcode*94L+(long)uWcode;
lOffSet*=32L;
memset(buffer, 0, 32);
fseek(fpGB16, lOffSet, SEEK_SET);
fread(buffer, 32, 1, fpGB16);
for(vLoop=0; vLoop<16; vLoop++)
{
for(pLoop=0; pLoop<2; pLoop++)
{
for(hLoop=0; hLoop<8; hLoop++)
{
if( buffer[vLoop*2+pLoop]&(0x80>>hLoop) )
{
for(hXLoop=0; hXLoop<hX; hXLoop++)
{
for(vXLoop=0; vXLoop<vX; vXLoop++)
{
PutPixel(xNew+8*pLoop*hX+hXLoop+hLoop*hX,
yNew+vLoop*vX+vXLoop, r, g, b);
}
}
}
}
}
}
xNew+=16*hX;
}
else
{ //输入的内容是半角字
switch(uQcode)
{
case 32:
xNew+=16*hX;
break;
case '\r':
if(uWcode>=0x30 && uWcode<=0x39)
{ xNew+=16*(uWcode-0x30);
ptr++;}
break;
case '\n':
xNew=x;
yNew+=16*vX;
break;
case '\t':
xNew+=64*hX; //4*16;
break;
default:
uQcode+=0x9b;
lOffSet=(long)uQcode*32L;
fseek(fpGB16, lOffSet, SEEK_SET);
fread(buffer, 32, 1, fpGB16);
for(vLoop=0; vLoop<16; vLoop++)
{
for(pLoop=0; pLoop<2; pLoop++)
{
for(hLoop=0; hLoop<8; hLoop++)
{
if( buffer[vLoop*2+pLoop]&(0x80>>hLoop) )
{
for(hXLoop=0; hXLoop<hX; hXLoop++)
{
for(vXLoop=0; vXLoop<vX; vXLoop++)
{
PutPixel(xNew+8*pLoop*hX+hXLoop+hLoop*hX,
yNew+vLoop*vX+vXLoop, r, g, b);
}
}
}
}
}
}
xNew+=16*hX;
if(uWcode==0)
{ goto ELabel_ShowGB2312X;}
break;
}
}
}
ELabel_ShowGB2312X:;
}
/***
显示24*24的图标
***/
void ShowICO2424(const int ID, const int x, const int y)
{
int t,k,m=0,n=0;
if( (ID<1) || (ID>4) ) { return;}
fseek(fpICO2424, (ID-1)*1824L, SEEK_SET);
fread(lpImageData, 1728L, 1, fpICO2424);
fread(lpImageMask, 96L, 1, fpICO2424);
for(t=0; t<24; t++,m+=2)
{ // 行
for(k=0; k<8; k++,n+=3)
{
if( !(lpImageMask[m]&(0x80>>k)) )
{ PutPixel(x+k, y+23-t, lpImageData[n], lpImageData[n+1], lpImageData[n+2]);}
}
m++;
for(k=0; k<8; k++,n+=3)
{
if( !(lpImageMask[m]&(0x80>>k)) )
{ PutPixel(x+8+k, y+23-t, lpImageData[n], lpImageData[n+1], lpImageData[n+2]);}
}
m++;
for(k=0; k<8; k++,n+=3)
{
if( !(lpImageMask[m]&(0x80>>k)) )
{ PutPixel(x+16+k, y+23-t, lpImageData[n], lpImageData[n+1], lpImageData[n+2]);}
}
}
}
/***
描述: 图标调度函数32*32 SIZE
参数: i图标编号; x,y起点坐标
ID描述:
1 整机手动 ;2 整机自动
3 整机智能关 ;4 整机智能开
5 报警关 ;6 报警开
7 纵向手动 ;8 纵向自动
9 横向手动 ;10 横向自动
11 波门锁定 ;12 波门解锁
13 1倍比例放大 ;14 2倍比例放大 ;15 4倍比例放大
16 本组智能关 ;17 本组智能开
***/
void ShowICO3232(const int ID, const int x, const int y)
{
int t,k;
long lOffset=0L;
if( (ID<1) || (ID>17) ) { return;}
fseek(fpICO3232, 3200L*(ID-1), SEEK_SET);
fread(lpImageData, 3072L, 1, fpICO3232);
fread(lpImageMask, 128L, 1, fpICO3232);
for(lOffset=0L,t=0; t<32; t++)
{
for(k=0; k<32; k++)
{
if( !(lpImageMask[(t<<2)+(k>>3)]&(0x80>>(k&0x07))) )
{ PutPixel(x+k, y+31-t, lpImageData[lOffset], lpImageData[lOffset+1], lpImageData[lOffset+2]);}
lOffset+=3L;
}
}
}
/***
图标调度函数
88*40 SIZE
***/
void ShowICO8840(const int ID, const int x, const int y)
{
int t,k;
long lOffset=0L;
if( (ID<1) || (ID>11) ) { return;}
fseek(fpICO8840, (ID-1)*11040L, SEEK_SET);
fread(lpImageData, 10560L, 1, fpICO8840);
fread(lpImageMask, 480L, 1, fpICO8840);
for(lOffset=0L,t=0; t<40; t++)
{
for(k=0; k<88; k++)
{
if( !(lpImageMask[(t<<3)+(t<<2)+(k>>3)]&(0x80>>(k&0x07))) )
{ PutPixel(x+k, y+39-t, lpImageData[lOffset], lpImageData[lOffset+1], lpImageData[lOffset+2]);}
lOffset+=3L;
}
}
}
/***
图标调度函数
w*h = 40*64
***/
void ShowICO4064(const int ID, const int x, const int y)
{
int t,k;
long lOffset=0L;
if( ID==1 )
{ lOffset=7296L;}
else if( ID==2 )
{ lOffset=7296L+8192L;}
else
{ return;}
fseek(fpICO2424, lOffset, SEEK_SET);
fread(lpImageData, 7680L, 1, fpICO2424);
fread(lpImageMask, 512L, 1, fpICO2424);
for(lOffset=0L,t=0; t<64; t++)
{
for(k=0; k<40; k++)
{
if( !(lpImageMask[(t<<3)+(k>>3)]&(0x80>>(k&0x07))) )
{ PutPixel(x+k, y+63-t, lpImageData[lOffset], lpImageData[lOffset+1], lpImageData[lOffset+2]);}
lOffset+=3L;
}
}
}
/***
3D外框线
不填充框线包围的区域
***/
void Rect(int x, int y, int w, int h, unsigned char inSTL)
{
int clrLT=255,clrRB=0;
if( inSTL )
{ clrLT=0; clrRB=255;}
MoveTo(x, y+h);
LineTo(x, y, clrLT, clrLT, clrLT);
LineTo(x+w, y, clrLT, clrLT, clrLT);
MoveTo(x, y+h);
LineTo(x+w, y+h, clrRB, clrRB, clrRB);
LineTo(x+w, y, clrRB, clrRB, clrRB);
}
/***
编辑框控件
特别声明: bSTL;
bit7bit6 表示背景颜色
= 00白色; 01蓝色; 10灰色; 11浅蓝色.
bit4表示字体的颜色
= 0黑色; 1红色 (但是如果背景颜色选择蓝色则字体默认成白色)
bit3特别字体声明
= 0正常字体; 1全角表示的西文字体
bit2内部字体对齐方式
= 0居中对齐; 1居右对齐
bit1中文英文区别标志
= 0英文; 1中文
bit0是否有文字显示
= 0没有文字; 1有文字显示 (为1时, 要求ptr尽量不为NULL)
***/
typedef struct {
unsigned char r,g,b;
} RGB;
void Edit(int x, int y, int w, int h, const unsigned char bSTL, char *ptr)
{
int xfrom=x,yfrom=y+((h-16)>>1);
RGB rgbBk,rgbFr;
unsigned char tSTL;
Rect(x, y, w, h, 1); // 外边框
tSTL=((bSTL>>6)&0x03); // 背景颜色
if( tSTL==3 )
{ // 浅蓝色
rgbFr.r=rgbFr.g=0; rgbFr.b=255;
rgbBk.r=255; rgbBk.g=170; rgbBk.b=100;
}
else if( tSTL==2 )
{ // 灰色
rgbBk.r=rgbBk.g=rgbBk.b=180;
rgbFr.r=rgbFr.g=rgbFr.b=0;
}
else if( tSTL==1 )
{ // 蓝色
rgbFr.r=rgbFr.g=rgbFr.b=255;
rgbBk.r=255; rgbBk.g=rgbBk.b=50;
}
else
{ // 白色
rgbFr.r=rgbFr.g=rgbFr.b=0;
rgbBk.r=rgbBk.g=rgbBk.b=255;
}
Bar(x+1, y+1, x+w-1, y+h-1, rgbBk.r, rgbBk.g, rgbBk.b);
if( (bSTL&0x01) && (ptr!=NULL) )
{ // 文本显示
if( bSTL&0x04 )
{ // 右对齐
if( bSTL&0x02 )
{ xfrom+=(w-GetBuffLen(ptr)*16-5);}
else
{ xfrom+=(w-GetBuffLen(ptr)*8-5);}
}
else
{ // 居中
if( bSTL&0x02 )
{ xfrom+=((w-GetBuffLen(ptr)*16)>>1);}
else
{ xfrom+=((w-GetBuffLen(ptr)*8)>>1);}
}
if( bSTL&0x02 )
{ ShowGB2312(xfrom, yfrom, ptr, rgbFr.r, rgbFr.g, rgbFr.b);}
else
{ ShowASCMem(xfrom, yfrom, ptr, rgbFr.r, rgbFr.g, rgbFr.b);}
}
}
/***
Func: 按钮控件(XP-Style)
Paramters:
x,y : left-top coordinates of square bar.
w,h: size of square bar.
style: 1=press-down; 0=press-up.
Returns:
NULL
***/
void XPButton(int x, int y, int w, int h, const unsigned char style)
{
int tcorLT,tcorRB;
if(style)
{ //PressDown
xpbar(x+2, y+2, w-4, h-4, 1);
tcorLT=128; tcorRB=255;
}
else
{ //UpPress
xpbar(x+2, y+2, w-4, h-4, 0);
tcorLT=255; tcorRB=128;
}
//left-top border
MoveTo(x, y+h);
LineTo(x, y, tcorLT, tcorLT, tcorLT);
LineTo(x+w, y, tcorLT, tcorLT, tcorLT);
MoveTo(x+1, y+h);
LineTo(x+1, y+1, tcorLT, tcorLT, tcorLT);
LineTo(x+w-1, y+1, tcorLT, tcorLT, tcorLT);
//right-bottom border
MoveTo(x, y+h);
LineTo(x+w, y+h, tcorRB, tcorRB, tcorRB);
LineTo(x+w, y, tcorRB, tcorRB, tcorRB);
MoveTo(x+1, y+h-1);
LineTo(x+w-1, y+h-1, tcorRB, tcorRB, tcorRB);
LineTo(x+w-1, y+1, tcorRB, tcorRB, tcorRB);
}
/***
描述: 按钮控件
参数: x,y控件起点坐标; w,h控件的宽度和高度; style显示风格和文本显示限制风格; ptr内部文本内容
说明:
style风格包含如下定义:
bit7表示显示字体是否放大 1字体放大(此时要求bit1必须为0)
bit4表示按钮属于按下还是弹起 0弹起 ; 1按下.
bit2表示激活还是禁用 0激活 ; 1禁用.
bit1中文英文区别标志 0英文 ; 1中文
bit0是否有文字显示 0没有文字 1有文字显示 (为1时, 要求ptr尽量不为NULL)
***/
void Button(int x, int y, int w, int h, const unsigned char style, char *ptr, int r, int g, int b)
{
int xfont,yfont;
int fr=0,fg=0,fb=0;
int tcorLT=0,tcorRB=0;
#ifndef XP_STYLE
Bar(x, y, x+w, y+h, r, g, b);
#endif
if(style&0x10)
{ //press down
#ifdef XP_STYLE
xpbar(x, y, w, h, 1); //xp style bar
#endif
tcorLT=0; tcorRB=255;
fr=5; fg=23; fb=186;
}
else
{ //up press
#ifdef XP_STYLE
xpbar(x, y, w, h, 0); //xp style bar
#endif
tcorLT=255; tcorRB=0;
}
//left-top border
MoveTo(x, y+h);
LineTo(x, y, tcorLT, tcorLT, tcorLT);
LineTo(x+w, y, tcorLT, tcorLT, tcorLT);
//right-bottom border
MoveTo(x, y+h);
LineTo(x+w, y+h, tcorRB, tcorRB, tcorRB);
LineTo(x+w, y, tcorRB, tcorRB, tcorRB);
//
if( (style&0x01) && ptr!=NULL )
{ //有文字
xfont=x+(w-(int)strlen(ptr)*8)/2;
yfont=y+(h-16)/2;
if(style&0x02)
{ //全角
if(style&0x04)
{ //禁止
ShowGB2312(xfont+1, yfont+1, ptr, 255, 255, 255);
ShowGB2312(xfont, yfont, ptr, 128, 128, 128);
}
else //正常
{ ShowGB2312(xfont, yfont, ptr, fr, fg, fb);}
}
else
{ //半角
if(style&0x04)
{ //禁止
if(style&0x80)
{ //放大
yfont-=8;
ShowASCMemX(xfont+1, yfont+1, 1, 2, ptr, 255, 255, 255);
ShowASCMemX(xfont, yfont, 1, 2, ptr, 128, 128, 128);
}
else
{
ShowASCMem(xfont+1, yfont+1, ptr, 255, 255, 255);
ShowASCMem(xfont, yfont, ptr, 128, 128, 128);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -