📄 textout.c
字号:
/******************************************************************
** 文件名:textout.c
** Copyright (c) 1998-1999 *********公司技术开发部
** 创建人:
** 日 期:2003.03.11
** 修改人:
** 日 期:2003.05.25
** 描 述:用于在屏幕上产生各种字符、数字、字符串的函数的定义
** 版 本:
******************************************************************/
#include "hddamacros.h"
#include <stdio.h>
#include "globalvar.h"
#include <math.h>
/*****************************************************************
** 函数名:PutChar
** 输 入: char c,int x,int y,int color,int nFlags
** c---字符的ASCII码
** x---字符的x坐标,如果是左对齐输出,基准点在左上角。如果是右对齐输出,基准点在右上角。
** y---字符的y坐标
** color---字符的颜色,是调色板的索引值
** nFlags---字符的属性
** 输 出: 无
** 功能描述:输出单个字符或符号
** 全局变量:g_nCharHeight,g_nCharWidth---输出字符的高和宽,本函数的返回值
** 调用模块:asmputchar()
** 作 者:
** 日 期:2003.03.11
** 修 改:
** 日 期:2003.05.25
** 版 本:
****************************************************************/
void PutChar(char c,int x,int y,int color,int nFlags)
{
int *pLib;
if(c<0||c>255)
{
//error character
}
//如果是无效字符或空格
if((pLib=g_pCharIndex[c])==0)
{
g_nCharWidth=12;
g_nCharHeight=21;
if(nFlags&BIGFONT)
{g_nCharWidth*=2;g_nCharHeight*=2;}
return;
}
//如果字符需要闪烁,并且正处于闪烁的消失期,则取得字高字宽后直接返回
if((nFlags&BLINKING)&&g_nBlinkCounter<0)
{
g_nCharHeight=*(pLib+1);
g_nCharWidth=*(pLib+2);
}
else
{
if(nFlags&BIGFONT)
asmbigchar(x,y,color,pLib,nFlags);
else
asmputchar(x,y,color,pLib,nFlags);
}
return;
}
/*****************************************************************
** 函数名:StringOut
** 输 入: char* str,int x,int y,int color,int nFlags
** str---要输出的字符串的指针
** x---字符串的x坐标,如果是左对齐或垂直输出,基准点在左上角。如果是右对齐输出,基准点在右上角。
** y---字符串的y坐标
** color---数字的颜色,是调色板的索引值
** nFlags---字符串的属性
** 输 出: 如果是左对齐输出,返回字符串右上角的x坐标
如果是右对齐输出,返回字符串左上角的x坐标
如果是垂直输出,返回字符串底部的y坐标
** 功能描述:输出一个字符串
** 全局变量:g_nCharHeight,g_nCharWidth
** 调用模块:PutChar()
** 作 者:
** 日 期:2003.03.11
** 修 改:
** 日 期:2003.05.25
** 版 本:字符串不能右对齐输出
****************************************************************/
int StringOut(char* str,int x,int y,int color,int nFlags)
{
char c;
int ntemp=0;
//如果字符串需要垂直排列
if(nFlags&VERTICALSTRING)
{
while(c=*(str++))
{
PutChar(c,x,y,color,nFlags);
y+=g_nCharHeight;
}
return y;
}
//如果字符串需要向右对齐
else if(nFlags&RIGHTALIGN)
{
//找到字符串的最后一个字符和字符的个数
while(*(str++))
{
ntemp++;
}
str-=2;
while(ntemp--)
{
PutChar(*(str--),x,y,color,nFlags);x-=g_nCharWidth;
}
}
//如果字符串需要向左对齐
else
{
while(c=*(str++))
{
PutChar(c,x,y,color,nFlags);x+=g_nCharWidth;
}
}
return x;
}
/*****************************************************************
** 函数名:Int2Str
** 输 入: int source,int x,int y,int color,int nFlags,int nbits
** source---要输出的正整数值,如果是负数取绝对值后输出
** x---数字的x坐标,如果是左对齐输出,基准点在左上角。如果是右对齐输出,基准点在右上角。
** y---数字的y坐标
** color---数字的颜色,是调色板的索引值
** nFlags---字符串的属性
** nbits---数字的位数,如大于数字的实际位数,在数字前加零。否则按实际位数输出
** 输 出: 如果是左对齐输出,返回数字右上角的x坐标
如果是右对齐输出,返回数字左上角的x坐标
如果是垂直输出,返回数字底部的y坐标
** 功能描述:输出一个正整数
** 全局变量:无
** 调用模块:StringOut()
** 作 者:
** 日 期:2003.03.11
** 修 改:
** 日 期:2003.05.25
** 版 本:
****************************************************************/
int Int2Str(int source,int x,int y,int color,int nFlags,int nbits)
{
char *p,*p1;
char str[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int temp;
//如果是负数则取绝对值
temp=source=((source>0)?source:-source);
//指向str的最后一个有效字符
p=str+19;
while(source/=10)
{
*(--p)=temp-source*10+'0';
temp=source;nbits--;
}
*(--p)=temp+'0';nbits--;
//如果nbits大于数字的实际位数,在数字前加零
for(;nbits>0;nbits--)
{
*(--p)='0';
}
return StringOut(p,x,y,color,nFlags);
}
/*****************************************************************
** 函数名:Float2Str
** 输 入: float source,int x,int y,int color,int nFlags,int nbits
** source---要输出的正浮点数值,如果是负数取绝对值后输出
** x---数字的x坐标,如果是左对齐输出,基准点在左上角。如果是右对齐输出,基准点在右上角。
** y---数字的y坐标
** color---数字的颜色,是调色板的索引值
** nFlags---字符串的属性
** nbits---小数点后要精确到的位数,如果小于等于零,精确到小数点后两位,否则按nbits的值精确
** 输 出: 如果是左对齐输出,返回数字右上角的x坐标
如果是右对齐输出,返回数字左上角的x坐标
如果是垂直输出,返回数字底部的y坐标
** 功能描述:输出一个正浮点数
** 全局变量:无
** 调用模块:Int2Str(),PutChar()
** 作 者:
** 日 期:2003.03.11
** 修 改:
** 日 期:2003.05.25
** 版 本:
****************************************************************/
int Float2Str(float source,int x,int y,int color,int nFlags,int nbits)
{
int intsource=source=((source>0)?source:-source);
//如果字符串需要垂直排列
if(nFlags&VERTICALSTRING)
{
//调用Int2Str输出source的整数部分
y=Int2Str(intsource,x,y,color,nFlags,0);
//输出小数点
PutChar('.',x,y,color,nFlags);
y+=g_nCharHeight;
//如果nbits小于等于零,精确到小数点后两位
if(nbits<=0) nbits=2;
//调用Int2Str输出source的小数部分
y=Int2Str((source-intsource)*pow(10,nbits),x,y,color,nFlags,nbits);
return y;
}
else
{
//如果是左对齐,先输出整数部分和小数点
if(!(nFlags&RIGHTALIGN))
{
//调用Int2Str输出source的整数部分
x=Int2Str(intsource,x,y,color,nFlags,0);
//输出小数点
PutChar('.',x,y,color,nFlags);
x+=g_nCharWidth;
}
//如果nbits小于等于零,精确到小数点后两位
if(nbits<=0) nbits=2;
//调用Int2Str输出source的小数部分
x=Int2Str((source-intsource)*pow(10,nbits),x,y,color,nFlags,nbits);
//如果是右对齐,还有小数点和整数部分要输出
if(nFlags&RIGHTALIGN)
{
//输出小数点
PutChar('.',x,y,color,nFlags);
x-=g_nCharWidth;
//调用Int2Str输出source的整数部分
x=Int2Str(intsource,x,y,color,nFlags,0);
}
return x;
}
}
/*****************************************************************
** 函数名:ConfigBlink
** 输 入: int exist,int vanish
** exist---一个周期中字符或图形在屏幕上出现的时间,以帧为单位
** vanish---一个周期中字符或图形在屏幕上消失的时间,以帧为单位
** 输 出: 无
** 功能描述:配置闪烁的频率
** 全局变量:blinkexisttime;blinkvanishtime;
** 调用模块:无
** 作 者:
** 日 期:2003.03.11
** 修 改:
** 日 期:2003.05.25
** 版 本:2.0
****************************************************************/
void ConfigBlink(int exist,int vanish)
{
g_nBlinkExistTime=exist;
g_nBlinkVanishTime=vanish;
return;
}
/*****************************************************************
** 函数名:GenerateCharIndex
** 输 入: 无
** 输 出: 无
** 功能描述:按字符的ASCII码值生成各字符在字符库中位置的索引
** 全局变量:
** 调用模块:无
** 作 者:
** 日 期:2003.03.11
** 修 改:
** 日 期:2003.05.25
** 版 本:2.0
****************************************************************/
void GenerateCharIndex(void)
{
int i;int* pLib=g_nCharLib;
//先把所有的索引值设为零,索引值为零表示字符库中无此字符
for(i=0;i<256;i++)
{
g_pCharIndex[i]=0;
}
//数字,字母和符号,NUMOFCHARINLIB是字符库中数字,字母和符号的总个数
for(i=0;i<NUMOFCHARINLIB;i++)
{
//每个字符的数据中的第一个是该字符数据的个数,只在建索引时要用,以后都不会再用所以索引直接指向该位置的下一个位置
//g_cCharLibIndex[i]是字符库中第i个字符的ASCII码值
g_pCharIndex[g_cCharLibIndex[i]]=pLib+1;
//指向字符库中下一个字符的开头
pLib+=*(pLib);
}
pLib=g_nChineseCharLib;
//汉字,NUMOFCHN是汉字库中汉字的个数
for(i=0;i<NUMOFCHN;i++)
{
//汉字的ASCII值从128开始顺序排列
g_pCharIndex[i+128]=pLib+1;
//指向汉字库中下一个汉字的数据的开头
pLib+=*(pLib);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -