汉字显示

今天学习了下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);
}

你可能感兴趣的:(汉字显示)