linux应用程序_1_文本浏览器_3_fonts_2_各种字库

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


发布了71 篇原创文章 · 获赞 4 · 访问量 7230

猜你喜欢

转载自blog.csdn.net/floatinglong/article/details/86635050