赞
踩
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的数组太长,这里不将其列出,可以百度下载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);
- }
-

- #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);
- }
-

- #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);
- }
-
-

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。