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

📄 normal.cpp

📁 Sunplus DVD 字体文件查看修改工具,只针对Font_ori.c文件!使用方便,可以编译成支持Unicode的软件!
💻 CPP
字号:

#include "stdafx.h"
#include "normal.h"

//=================================================================================================
//	转换字符为数据
//=================================================================================================
int StringToInt(CString &s)
{
	static int iRet = 0;
	static int i = 2;
	static int c = 0;

	iRet = 0;
	c = 0;
	i = 2;

	if(s[0] != '0')
		return 0;

	if(s[1] != 'X' && s[1] != 'x')
		return 0;

	for(i =  2; (i < (2 + 4) && i < s.GetLength()); i++)
	{
		c = s[i];
		iRet <<= 4;
		iRet |= CheckCharVal(c);
	}
	return iRet;
}
//=================================================================================================
//	字符的值
//=================================================================================================
int CheckCharVal(int c)
{
	if(c >= '0' && c<= '9')			return c-'0';
	else if(c >= 'a' && c<= 'z')	return c-'a'+10;
	else if(c >= 'A' && c<= 'Z')	return c-'A'+10;
	else							return 0;
}

int IsHexChar(int c)
{
	if(c >= '0' && c<= '9')				return 1;
	else if(c >= 'a' && c<= 'z')		return 1;
	else if(c >= 'A' && c<= 'Z')		return 1;
	else								return 0;
}

//=================================================================================================
//	查找字符
//=================================================================================================
int FindItem(CStringArray &arr,CString &s)
{
	static int  i = 0;

	for(i = 0;i < arr.GetSize();i ++)
	{
		if(s.Compare(arr[i]) == 0)
			return i;
	}

	return (-1);
}

//=================================================================================================
//	是否十六进位数
//=================================================================================================
BYTE IsHexData(CString &pString)
{
	static int i = 2;
	static int c = 0;

	c = 0;
	i = 2;

	if(pString[0] != '0' || (pString[1] != 'x' && pString[1] != 'X'))
		return 0;

	while(i < pString.GetLength())
	{
		c = pString[i]; 
		if(c >= 'a' && c <= 'z')
		{
		}
		else if(c >= 'A' && c <= 'Z')
		{
		}
		else if(c >= '0' && c <= '9')
		{
		}
		else if(c)
		{
			return 0;
		}
		i ++;
	}
	return 1;
}

//=================================================================================================
//	查找字符
//=================================================================================================
CString FindWord(FILE *vfp)
{
	CString ret;

	static int iFndStep;
	static BYTE ch;

	iFndStep = FND_STEP_FIRST;
	ch = fgetc(vfp);

	while(!feof(vfp) && iFndStep != FND_STEP_END)
	{
		if(ch >= '0' && ch <= '9')
		{
			iFndStep = FND_STEP_ADD_CHAR;
		}
		else if(ch >='a' && ch <= 'z')
		{
			iFndStep = FND_STEP_ADD_CHAR;
		}
		else if(ch >='A' && ch <= 'Z')
		{
			iFndStep = FND_STEP_ADD_CHAR;
		}
		else if(ch == '_')
		{
			iFndStep = FND_STEP_ADD_CHAR;
		}
		else
		{
			if(iFndStep == FND_STEP_ADD_CHAR)
			{
				iFndStep = FND_STEP_END;
			}
			else
			{
				switch(ch)
				{
				case '{':	case '}':
				case ';':	case ':':
				case '[':	case ']':
					//	找到符号马上返回
					iFndStep = FND_STEP_SIGN;
					ret += ch;
					return ret;
				default:
					break;
				}
			}
		}

		//	当前字符无效,查找下一个
		if(iFndStep == FND_STEP_FIRST)
		{
			ch = fgetc(vfp);
		}
		//	当前字符有效,急需查看下一个
		else if (iFndStep == FND_STEP_ADD_CHAR)
		{
			ret += ch;
			ch = fgetc(vfp);
		}
	}
	return ret;
}

//=================================================================================================
//	读取文件字符
//=================================================================================================
int ReadFileChar(FILE *vfp)
{
	static int flag = FLAG_NORMAL;
	static int c = 0;
	static int prev_c = 0;

	//	保留上次的
	if(flag == FLAG_PREV_CHAR)
	{
		flag = FLAG_NORMAL;
		return c;
	}
	
	if (feof(vfp))
		return 0;

	//	读字符
	prev_c = c;
	c = fgetc(vfp);

	//	单引号模式处理
	if(flag == FLAG_SINGLE_DOT)
	{
		if(c == '\'')	
			flag = FLAG_NORMAL;
	}
	//	双引号模式处理
	else if(flag == FLAG_DOUBLE_DOT)
	{
		if(c == '"')		
			flag = FLAG_NORMAL;
	}
	//	单引号模式开始
	else if(c == '\'')
	{
		flag = FLAG_SINGLE_DOT;
	}
	//	双引号模式开始
	else if(c == '"')
	{
		flag = FLAG_DOUBLE_DOT;
	}
	//	是否是注释?
	else if (c == '/')
	{
		prev_c = c;
		c = fgetc(vfp);

		//	段注释处理
		if(prev_c == '/' && c == '*')
		{
			prev_c = c;
			c = fgetc(vfp);

			do
			{
				prev_c = c;
				c = fgetc(vfp);
			}
			while(!feof(vfp) && !(prev_c == '*' && c == '/'));

			if(!feof(vfp))
			{
				prev_c = c;
				c = fgetc(vfp);
			}
			else
			{
				c = 0;
			}

		}//	行注释处理
		else if(prev_c == '/' && c == '/')
		{
			do
			{
				prev_c = c;
				c = fgetc(vfp);
			}while(!feof(vfp) && (c != '\n' && c!='\r'));
		}
		else
		{
			//	并非注释,保留到下次返回!
			flag = FLAG_PREV_CHAR;
			return prev_c;
		}
	}
	return c;
}

//================================================================================
//	读取缓冲行	(过滤掉注释代码,连接换行标志代码!)
//================================================================================
int ReadLineBuffer(FILE *vfp,BYTE vBuffer[],int vBufferCount)
{
	static int iLevel = 0;
	static int iPrevLevel = 0;
	static int iSpaceCount = 0;
	static int iFirstChar = 0;
	static int prev_c = 0;
	static int iLastSpaceLine = 0;
	static int flag = FLAG_NORMAL;
	static int i = 0;
	static int c = 0;

labReRead:

	i = iSpaceCount = iFirstChar = 0;

	//	添加空格
	while(i < iLevel && i < vBufferCount)
		vBuffer[i++] = '\t';
	
	//	前面的等级
	iPrevLevel = iLevel;

	//	没有结束!
	while(!feof(vfp))
	{
		prev_c = c;
		c = ReadFileChar(vfp);

		//	读写制表符号
		if(c == '\t')	
			c = ' ';

		if(flag == FLAG_NORMAL)	
		{
			if((c == ' ' || c == '\t') && 
			   (prev_c == ' ' ||
				prev_c == '\t'||
				prev_c == ',' ||
				prev_c == '=' ||
				prev_c == '~' ||
				prev_c == '^' ||
				prev_c == '#' ||
				prev_c == '+' ||
				prev_c == '-' ||
				prev_c == '*' ||
				prev_c == '%' ||
				prev_c == '>' ||
				prev_c == '<' ||
				prev_c == '|' ||
				prev_c == '!' ||
				prev_c == '&' ||
				prev_c == ';' ||
				prev_c == ':' ||
				prev_c == '[' ||
				prev_c == ']' ||
				prev_c == '(' ||
				prev_c == ')'))
					continue;
		}

		if(!feof(vfp) && i < vBufferCount)
			vBuffer[i++] = c;

		if(feof(vfp))
		{
			break;
		}
		else if(i >= vBufferCount)
		{
			break;
		}
		else if(c == '\n')
		{
			break;
		}
		else if(flag == FLAG_SINGLE_DOT)
		{
			if(c == '\'')	flag = FLAG_NORMAL;
		}
		else if(flag == FLAG_DOUBLE_DOT)
		{
			if(c == '"')	flag = FLAG_NORMAL;
		}
		else if(c == '\'')
		{
			flag = FLAG_SINGLE_DOT;
		}
		else if(c == '"')
		{
			flag = FLAG_DOUBLE_DOT;
		}
		else if(c == '{' && iLevel < 100)
		{
			iLevel++;
		}
		else if(c == '}' && iLevel > 0)
		{
			iLevel--;
		}
	}

	//	结尾符号
	vBuffer[i] = 0;

	//	缩进调整
	if(iPrevLevel > iLevel && iLevel >= 0)
	{
		int j = 0, k = 0;
		for(j = iLevel,k = iPrevLevel ;k <= i;j++,k++)
			vBuffer[j] = vBuffer[k];
	}

	if(!feof(vfp))
	{
		//	过滤空行和
		while((vBuffer[iSpaceCount] == ' ' || vBuffer[iSpaceCount] == '\t'))
			iSpaceCount++;

		//	是否是空行
		if((vBuffer[iSpaceCount] == '\r'|| vBuffer[iSpaceCount] == '\n'))
		{
			//	空行累计
			iLastSpaceLine ++;

			//	连续空行多就过滤
			if ( iLastSpaceLine > 1)
				goto labReRead;
		}
		else
		{
			//	没有空行
			iLastSpaceLine = 0;
		}
	}
	return i;
}

//================================================================================
//	读取缓冲字符
//================================================================================
int ReadBuffChar(FILE *vfp,BYTE vBuffer[],int vBufferCount)
{
	static int ip = 0;

	//	缓冲处理
	if(vBuffer[ip] == 0 || ip >= vBufferCount)
	{
		//	文件没有结束就读出一行!
		if(!feof(vfp))
		{
			ReadLineBuffer(vfp,vBuffer,vBufferCount);
			ip = 0;
		}
	}
	return vBuffer[ip++];
}


//=================================================================================================
//	绘制字体阵列
//=================================================================================================
//	dc ->绘制窗口
//	x,y ->左上交坐标
//	w,h ->大小 为0时就只有
//	co ->默认字体颜色
//

#define BACKGROUND_COLOR	(0xffffff)

void DrawFont(CDC *dc,UINT cx,UINT cy,UINT cw,UINT ch,ULONG co,BYTE *arr)
{
	static unsigned int x = 0;
	static unsigned int y = 0;
	static unsigned int c = 0;
	static unsigned int font_h = 0;
	static unsigned int font_w = 0;
	
	//	设备无效!
	if(!dc)
		return;

	//	无效阵列就退出!
	if(!arr)
	{
		//	有大小就填充,高度宽度为零就退出
		if(ch|cw)
		{
			dc->FillSolidRect(cx,cy,cw,ch,BACKGROUND_COLOR);
		}
		return;
	}

	//	创建兼容环境位图
	CDC oCompactDC,*pCompactDC;
	CBitmap oBmp;

	//	取得基本信息
	font_w = arr[0];
	font_h = arr[1];

	//	无效数据就忽略.
	if((font_w | font_h ) == 0)
		return;

	//	创建兼容位图
	oCompactDC.CreateCompatibleDC(dc);
	pCompactDC = &oCompactDC;
	
	//	没有指定大小就使用字体默认大小
	if((cw|ch) == 0)
	{
		cw = font_w;
		ch = font_h;
	}

	//	创建兼容位图
	oBmp.CreateCompatibleBitmap(dc,cw,ch);

	//	装入数据
	pCompactDC->SelectObject(&oBmp);
	pCompactDC->FillSolidRect(0,0,cw,ch,BACKGROUND_COLOR);

	for(y = 0; y < font_h; y++)
	{
		for(x = 0; x < font_w;  x++)
		{
			c = arr[3  + (y * font_w + x) / 8 ];

			if(c & (0x80 >> ((y * font_w + x) % 8)))
			{
				pCompactDC->SetPixel( x, y, co);
			}
		}
	}
	
	//dc->Rectangle(cx-1,cy-1,cx+cw+1,cy+ch+1);

	//	绘制字符边框
	dc->BitBlt(cx,cy,cw,ch,pCompactDC,0,0,SRCCOPY);

	dc->Draw3dRect(cx - 1,cy - 1, font_w +2, font_h+2,pvBackColor,pvBackColor);

	//	删除位图对象
	oBmp.DeleteObject();

	//	删除显示设备环境
	pCompactDC->DeleteDC();
}

//=================================================================================================
//	检查菜单
//=================================================================================================
void CheckMenuItem(WORD idMenuArray[],BYTE idMax,BYTE id,CMenu *pMenu)
{
	int i;

	if(!pMenu)
		return;

	for(i = 0; i< idMax; i++)
	{
		pMenu->CheckMenuItem(idMenuArray[i],(i == id)?(MF_CHECKED | MF_BYCOMMAND):(MF_UNCHECKED | MF_BYCOMMAND));
	}
}

//=================================================================================================
//=	字符串转换 	"Aleck \xff \d01234" -> "Aleck ? ?"
//=================================================================================================
CString MakeFormatString(CString src)
{
	int ch,i,j;
	CString s;
	CString dst;

	for(i = 0; i < src.GetLength();i++)
	{
		ch = src[i];

		if((ch == '\\') && (src[i+1] == 'x'|| src[i+1] == 'X'))
		{
			j = 2;
			s = _T("");
			while(IsHexChar(ch = src[i+j]))
			{
				s.AppendChar(ch);
				j ++;
			}
			i += s.GetLength() + 1;
			s = _T("0x") + s;
			ch = StringToInt(s);
			dst.AppendFormat(_T("%c"),ch & 0xff);
		}
		else
		{
			dst.AppendFormat(_T("%c"),ch & 0xff);
		}
	}

	TRACE(_T("\n%s\n\n"),dst);

	return dst;
}

⌨️ 快捷键说明

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