今天学习了下GB2312汉字采用点阵字库输出到屏幕显示。这里做个记录,以便回忆。
GB2312分为94个区,每个区有94个字符数据。
点阵字库一般按照顺序存放字符,判断是否GB2312数据方法 if((*lpStr) & 0x80) 如果最高位为1 就是里面的数了,汉字占用两个字符。
然后通过通过点阵字库来查找显示数据加载。
static void
GetChnFontData(
char* pBuffer,
FONT* pFont,
char* pChar
)
{
unsigned char qh,wh;
int iOffset;
//qu-wei code of chinese
qh=*(pChar)-0xa0; //GB2312从A1A1开始,这里先减去A0 下面运算再减去1 就是减去了A1。
wh=*(pChar+1)-0xa0;
if(qh>=0x10) //汉字区
{ //计算偏移量 开始偏移+字体头+汉字字符偏移
iOffset=pFont->iOffset + pFont->FontLibHeader.iSize
+ pFont->FontLibHeader.iChnOffset;
iOffset=iOffset // 0x0582 = 1410 = (6+9)*94 其中6个空闲区域 9个ascii码和其他符号的区域。
+ ((94*(qh-1)+(wh-1))-0x0582)* pFont->FontLibHeader.iChnBytes; //GB2312 有94页数据,每一页94个数
}
else
{
iOffset=pFont->iOffset + pFont->FontLibHeader.iSize
+ pFont->FontLibHeader.iChnSymOffset; //汉字区符号偏移。
iOffset=iOffset
+ (94*(qh-1)+(wh-1)) * pFont->FontLibHeader.iChnBytes;
}
shm_read(pBuffer, iOffset, pFont->FontLibHeader.iChnBytes);
}