linux应用程序_1_文本浏览器_3_fonts_2_各种字库
1、在初始化时,被选中编码节点会遍历它支持的字库,调用这些字库的初始化函数,若该字库不能使用(可能是没有字库文件、字体大小设置错误等),则将其移出链表
2、在获取字符位图时,需要调用字库的相应函数
以ascii_font.c为例:
设置字库结构体
static T_FontOpr g_ptAsciiFontOpr = {
.pcName = "ascii",
.FontInit = AsciiFontInit,
.GetBitMap = AsciiGetBitMap,
};
初始化:
ascii的字库是一个数组,初始化比较简单,只需要判断字体大小;其他的字库可能需要判断文件是否存在等
static int AsciiFontInit(char *pcFontFile, int iFontSize)
{
if(iFontSize != 16)
{
DBG_PRINT("Error at AsciiFontInit : iFontSize != 16\r\n");
return -1;
}
return 0;
}
获取字符位图
static int AsciiGetBitMap(int iCode, PT_BitMap ptBitMap)
{
if(iCode >= 0x80)
{
DBG_PRINT("Error at AsciiGetBitMap : iCode >= 0x80\r\n");
return -1;
}
ptBitMap->iXLeft = ptBitMap->iCurOriginX;
ptBitMap->iYTop = ptBitMap->iCurOriginY - 16;
ptBitMap->iNextOriginX = ptBitMap->iCurOriginX + 8;
ptBitMap->iNextOriginY = ptBitMap->iCurOriginY;
ptBitMap->iXMax = ptBitMap->iCurOriginX + 8;
ptBitMap->iYMax = ptBitMap->iCurOriginY;
ptBitMap->iBpp = 1;
ptBitMap->iPitch = 1;
ptBitMap->pucBuf = (unsigned char *)&g_pucAsciiFontData_8x16[iCode*16];
return 0;
}
初始化注册函数:
int AsciiInit(void)
{
return RegisterFont(&g_ptAsciiFontOpr);
}
(三种字库的)完整代码:
ascii_font.c
由于ascii的数组太长,这里不将其列出,可以百度下载ascii字库,拷贝到该文件或者使用外部引用
#include <config.h>
#include <fonts_manager.h>
#include <string.h>
#include <stdio.h>
static int AsciiFontInit(char *pcFontFile, int iFontSize);
static int AsciiGetBitMap(int iCode, PT_BitMap ptBitMap);
const unsigned char g_pucAsciiFontData_8x16[4096] = { /*********
*********
*********
省略
*********
*********
*********/};
static T_FontOpr g_ptAsciiFontOpr = {
.pcName = "ascii",
.FontInit = AsciiFontInit,
.GetBitMap = AsciiGetBitMap,
};
static int AsciiFontInit(char *pcFontFile, int iFontSize)
{
if(iFontSize != 16)
{
DBG_PRINT("Error at AsciiFontInit : iFontSize != 16\r\n");
return -1;
}
return 0;
}
static int AsciiGetBitMap(int iCode, PT_BitMap ptBitMap)
{
if(iCode >= 0x80)
{
DBG_PRINT("Error at AsciiGetBitMap : iCode >= 0x80\r\n");
return -1;
}
ptBitMap->iXLeft = ptBitMap->iCurOriginX;
ptBitMap->iYTop = ptBitMap->iCurOriginY - 16;
ptBitMap->iNextOriginX = ptBitMap->iCurOriginX + 8;
ptBitMap->iNextOriginY = ptBitMap->iCurOriginY;
ptBitMap->iXMax = ptBitMap->iCurOriginX + 8;
ptBitMap->iYMax = ptBitMap->iCurOriginY;
ptBitMap->iBpp = 1;
ptBitMap->iPitch = 1;
ptBitMap->pucBuf = (unsigned char *)&g_pucAsciiFontData_8x16[iCode*16];
return 0;
}
int AsciiInit(void)
{
return RegisterFont(&g_ptAsciiFontOpr);
}
gbk_font.c
#include <config.h>
#include <fonts_manager.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
static int GbkFontInit(char *pcFontFile, int iFontSize);
static int GbkGetBitMap(int iCode, PT_BitMap ptBitMap);
static T_FontOpr g_ptGbkFontOpr = {
.pcName = "gbk",
.FontInit = GbkFontInit,
.GetBitMap = GbkGetBitMap,
};
static int g_iHzkFd;
static unsigned char *g_pucHzkMemStart;
static unsigned char *g_pucHzkMemEnd;
static int GbkFontInit(char *pcFontFile, int iFontSize)
{
struct stat ptHzkStat;
if(iFontSize != 16)
{
DBG_PRINT("Error at GbkFontInit : iFontSize != 16\r\n");
return -1;
}
g_iHzkFd = open(pcFontFile, O_RDONLY);
if(g_iHzkFd < 0)
{
DBG_PRINT("Error at GbkFontInit : g_iHzkFd < 0\r\n");
return -2;
}
fstat(g_iHzkFd, &ptHzkStat);
g_pucHzkMemStart = mmap(NULL, ptHzkStat.st_size, PROT_READ, MAP_SHARED, g_iHzkFd, 0);
if(g_pucHzkMemStart < 0)
{
DBG_PRINT("Error at GbkFontInit : g_pucHzkMemStart < 0\r\n");
return -3;
}
g_pucHzkMemEnd = g_pucHzkMemStart + ptHzkStat.st_size;
return 0;
}
static int GbkGetBitMap(int iCode,PT_BitMap ptBitMap)
{
int iArea;
int iLocate;
if(iCode & 0xffff0000) //larger than two bytes
{
DBG_PRINT("Error at GbkGetBitMap : iCode & 0xffff0000\r\n");
return -1;
}
iArea = (int)(iCode & 0xff) - 0xa1;
iLocate = (int)((iCode >> 8) & 0xff) - 0xa1 ;
if((iArea < 0) || (iLocate < 0))
{
DBG_PRINT("Error at GbkGetBitMap : iArea < 0 || iLocate < 0\r\n");
return -2;
}
ptBitMap->iXLeft = ptBitMap->iCurOriginX;
ptBitMap->iYTop = ptBitMap->iCurOriginY - 16;
ptBitMap->iXMax = ptBitMap->iCurOriginX + 16;
ptBitMap->iYMax = ptBitMap->iCurOriginY;
ptBitMap->iBpp = 1;
ptBitMap->iPitch = 2;
ptBitMap->pucBuf = g_pucHzkMemStart + (94 * iArea + iLocate) * 32;
if(ptBitMap->pucBuf > g_pucHzkMemEnd)
{
DBG_PRINT("Error at GbkGetBitMap : ptBitMap->pucBuf > g_pucHzkMemEnd\r\n");
return -3;
}
ptBitMap->iNextOriginY = ptBitMap->iCurOriginY;
ptBitMap->iNextOriginX = ptBitMap->iCurOriginX + 16;
return 0;
}
int GbkInit(void)
{
return RegisterFont(&g_ptGbkFontOpr);
}
freetype.c
#include <config.h>
#include <fonts_manager.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
static int FreetypeFontInit(char *pcFontFile, int iFontSize);
static int FreetypeGetBitMap(int iCode, PT_BitMap ptBitMap);
static FT_Library g_tLibrary;
static FT_Face g_tFace;
static FT_GlyphSlot g_tSlot;
static T_FontOpr g_tFreetypeOpr = {
.pcName = "freetype",
.FontInit = FreetypeFontInit,
.GetBitMap = FreetypeGetBitMap,
};
static int FreetypeFontInit(char *pcFontFile, int iFontSize)
{
int iError;
iError = FT_Init_FreeType(&g_tLibrary);
if(iError)
{
DBG_PRINT("freetype library init fail\r\n");
return -1;
}
iError = FT_New_Face(g_tLibrary, pcFontFile, 0, &g_tFace);
if(iError)
{
DBG_PRINT("freetype get face fail\r\n");
return -1;
}
iError = FT_Set_Pixel_Sizes(g_tFace,iFontSize,0);
if(iError)
{
DBG_PRINT("freetype set font size fail\r\n");
return -1;
}
g_tSlot = g_tFace->glyph;
return 0;
}
static int FreetypeGetBitMap(int iCode, PT_BitMap ptBitMap)
{
int iError;
iError = FT_Load_Char(g_tFace,(unsigned int) iCode, FT_LOAD_RENDER | FT_LOAD_MONOCHROME);
if(iError)
{
DBG_PRINT("freetype load unsigned char fail\r\n");
return -1;
}
ptBitMap->iXLeft = ptBitMap->iCurOriginX + g_tSlot->bitmap_left;
ptBitMap->iYTop = ptBitMap->iCurOriginY - g_tSlot->bitmap_top;
ptBitMap->iXMax = ptBitMap->iXLeft + g_tSlot->bitmap.width;
ptBitMap->iYMax = ptBitMap->iYTop + g_tSlot->bitmap.rows;
ptBitMap->iBpp = 1;
ptBitMap->iPitch = g_tSlot->bitmap.pitch;
ptBitMap->iNextOriginX = ptBitMap->iCurOriginX + g_tSlot->advance.x / 64;
ptBitMap->iNextOriginY = ptBitMap->iCurOriginY;
ptBitMap->pucBuf = (unsigned char *)g_tSlot->bitmap.buffer;
return 0;
}
int FreetypeInit(void)
{
return RegisterFont(&g_tFreetypeOpr);
}