You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
5.1 KiB
C++
153 lines
5.1 KiB
C++
#include "StdAfx.h"
|
|
#include "FontLaipu.h"
|
|
#include "FontTypeMgr.h"
|
|
|
|
|
|
CFontLaipu::CFontLaipu(void)
|
|
{
|
|
}
|
|
CFontLaipu::~CFontLaipu(void)
|
|
{
|
|
}
|
|
void CFontLaipu::Initialize()
|
|
{
|
|
//先获得FONT 文件夹的目录--------------------------------------------------------
|
|
CString sPath;
|
|
GetModuleFileName(NULL,sPath.GetBufferSetLength(1023),1024); //读取程序当前目录
|
|
sPath.ReleaseBuffer();
|
|
int nPos;
|
|
nPos = sPath.ReverseFind('\\');
|
|
sPath = sPath.Left(nPos);
|
|
CString str = sPath + "\\font";
|
|
//在font 文件夹查找sl 后缀的文件-------------------------------------------------
|
|
int idx = 0;
|
|
CFileFind finder;
|
|
BOOL bWorking = finder.FindFile(str + "/*.*");//m_path为指定的文件夹
|
|
while (bWorking)//遍历文件夹
|
|
{
|
|
bWorking = finder.FindNextFile();
|
|
CString name = finder.GetFileName();
|
|
CString extend = name.Right(name.GetLength() - name.ReverseFind('.') - 1);//取得扩展名
|
|
if(!finder.IsDots())
|
|
{
|
|
if(extend == "SL" || extend == "sl")
|
|
{
|
|
AddTypeName(name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
void CFontLaipu::CreatCharVec(char *pChar,vector<PointType> &PonitVec)
|
|
{
|
|
CreatCharVecExt(*pChar,PonitVec);
|
|
}
|
|
//在莱普的字库中提取AsciiCode 对应的数据(Offset是连续两个字符之间的间隔)
|
|
void CFontLaipu::CreatCharVecExt(unsigned char AsciiCode,vector<PointType> &PonitVec)
|
|
{
|
|
CFontTypeMgr &pFontTypeMgr = CFontTypeMgr::Instance();
|
|
//获取当前字体文件路径
|
|
CString str = pFontTypeMgr.GetFontPath(GetCurFontName());
|
|
char filepath[1024];
|
|
strcpy(filepath,(LPSTR)(LPCTSTR)str);
|
|
//打开字库文件
|
|
CFile file;
|
|
if(file.Open(filepath,CFile::modeRead|CFile::typeBinary))
|
|
{
|
|
int FileLen = file.GetLength()+1;
|
|
char *pBuf=new char[FileLen];
|
|
memset(pBuf,0,FileLen*sizeof(char));
|
|
file.SeekToBegin();//指针移到文件头
|
|
file.Read(pBuf, FileLen*sizeof(char));//读取到内存中
|
|
|
|
//找到存储地址的开始位置
|
|
unsigned long AddrOffset = AsciiCode*3;
|
|
unsigned long AddrStart = 0;//数据的起始位置
|
|
unsigned char ch;
|
|
ch = pBuf[AddrOffset];
|
|
AddrStart = ch;
|
|
ch = pBuf[AddrOffset+1];
|
|
AddrStart += ch*256;
|
|
ch = pBuf[AddrOffset+2];
|
|
AddrStart += ((long)ch*256*256);
|
|
//下标从0 开始
|
|
AddrStart --;
|
|
BOOL flg = TRUE;
|
|
BOOL bUpOrDown = FALSE;//抬笔还是落笔
|
|
//方向系数
|
|
double DirStepX[16] = {1, 1, 1, 0.5, 0, -0.5, -1, -1, -1, -1, -1, -0.5, 0, 0.5, 1, 1};
|
|
double DirStepY[16] = {0, 0.5, 1, 1, 1, 1, 1, 0.5, 0, -0.5, -1, -1, -1, -1, -1, -0.5};
|
|
|
|
int idx = 0;
|
|
PointType PointData;
|
|
//出发点
|
|
PointData.first.x = 0;
|
|
PointData.first.y = 0;
|
|
|
|
while(flg)
|
|
{
|
|
ch = pBuf[AddrStart+idx];
|
|
switch(ch)
|
|
{
|
|
case 0:
|
|
flg = FALSE;
|
|
break;
|
|
case 1://pen down
|
|
bUpOrDown = FALSE;
|
|
break;
|
|
case 2://pen up
|
|
bUpOrDown = TRUE;
|
|
break;
|
|
case 8://单次偏移
|
|
{
|
|
idx++;
|
|
int XOffset = pBuf[AddrStart+idx];
|
|
idx++;
|
|
int YOffset = pBuf[AddrStart+idx];
|
|
PointData.first.x += XOffset;
|
|
PointData.first.y += YOffset;
|
|
PointData.second = bUpOrDown;
|
|
PonitVec.push_back(PointData);
|
|
}
|
|
break;
|
|
case 9://连续偏移
|
|
{
|
|
idx++;
|
|
int XOffset = pBuf[AddrStart+idx];
|
|
idx++;
|
|
int YOffset = pBuf[AddrStart+idx];
|
|
while(XOffset != 0 || YOffset != 0)
|
|
{
|
|
PointData.first.x += XOffset;
|
|
PointData.first.y += YOffset;
|
|
PointData.second = bUpOrDown;
|
|
PonitVec.push_back(PointData);
|
|
|
|
idx++;
|
|
XOffset = pBuf[AddrStart+idx];
|
|
idx++;
|
|
YOffset = pBuf[AddrStart+idx];
|
|
}
|
|
}
|
|
break;
|
|
default://小范围偏移
|
|
{
|
|
int Low4Bit,High4Bit;
|
|
High4Bit = (unsigned char)ch/16;//方向
|
|
Low4Bit = (unsigned char)ch - High4Bit*16;//步长
|
|
|
|
int XOffset = DirStepX[Low4Bit]*High4Bit;
|
|
int YOffset = DirStepY[Low4Bit]*High4Bit;
|
|
PointData.first.x += XOffset;
|
|
PointData.first.y += YOffset;
|
|
PointData.second = bUpOrDown;
|
|
PonitVec.push_back(PointData);
|
|
}
|
|
break;
|
|
}
|
|
idx++;
|
|
}
|
|
//释放文件缓冲区
|
|
delete []pBuf;
|
|
file.Close();
|
|
}
|
|
} |