LCD电子书项目(五)
来源:互联网 发布:linux 编译tar.gz 编辑:程序博客网 时间:2024/05/16 10:44
encoding目录下结构如下:
Makefile文件
<span style="font-size:18px;"><span style="font-size:18px;">obj-y += ascii.oobj-y += encoding_manager.oobj-y += utf-16be.oobj-y += utf-16le.oobj-y += utf-8.o </span></span>
encoding_manager.h文件
<span style="font-size:18px;">#ifndef _ENCODING_MANAGER_H#define _ENCODING_MANAGER_H#include <fonts_manager.h>#include <disp_manager.h>typedef struct EncodingOpr {char *name;int iHeadLen;PT_FontOpr ptFontOprSupportedHead;int (*isSupport)(unsigned char *pucBufHead);int (*GetCodeFrmBuf)(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);struct EncodingOpr *ptNext;}T_EncodingOpr, *PT_EncodingOpr;int RegisterEncodingOpr(PT_EncodingOpr ptEncodingOpr);void ShowEncodingOpr(void);PT_DispOpr GetDispOpr(char *pcName);PT_EncodingOpr SelectEncodingOprForFile(unsigned char *pucFileBufHead);int AddFontOprForEncoding(PT_EncodingOpr ptEncodingOpr, PT_FontOpr ptFontOpr);int DelFontOprFrmEncoding(PT_EncodingOpr ptEncodingOpr, PT_FontOpr ptFontOpr);int EncodingInit(void);int AsciiEncodingInit(void);int Utf16beEncodingInit(void);int Utf16leEncodingInit(void);int Utf8EncodingInit(void);#endif /* _ENCODING_MANAGER_H */</span>
encoding_manager.c文件
<span style="font-size:18px;"><span style="font-size:18px;">#include <config.h>#include <encoding_manager.h>#include <string.h>#include <stdlib.h>static PT_EncodingOpr g_ptEncodingOprHead;int RegisterEncodingOpr(PT_EncodingOpr ptEncodingOpr){PT_EncodingOpr ptTmp;if (!g_ptEncodingOprHead){g_ptEncodingOprHead = ptEncodingOpr;ptEncodingOpr->ptNext = NULL;}else{ptTmp = g_ptEncodingOprHead;while (ptTmp->ptNext){ptTmp = ptTmp->ptNext;}ptTmp->ptNext = ptEncodingOpr;ptEncodingOpr->ptNext = NULL;}return 0;}void ShowEncodingOpr(void){int i = 0;PT_EncodingOpr ptTmp = g_ptEncodingOprHead;while (ptTmp){printf("%02d %s\n", i++, ptTmp->name);ptTmp = ptTmp->ptNext;}}PT_EncodingOpr SelectEncodingOprForFile(unsigned char *pucFileBufHead){PT_EncodingOpr ptTmp = g_ptEncodingOprHead;while (ptTmp){if (ptTmp->isSupport(pucFileBufHead))return ptTmp;elseptTmp = ptTmp->ptNext;}return NULL;}int AddFontOprForEncoding(PT_EncodingOpr ptEncodingOpr, PT_FontOpr ptFontOpr){PT_FontOpr ptFontOprCpy;if (!ptEncodingOpr || !ptFontOpr){return -1;}else{ptFontOprCpy = malloc(sizeof(T_FontOpr));if (!ptFontOprCpy){return -1;}else{memcpy(ptFontOprCpy, ptFontOpr, sizeof(T_FontOpr));ptFontOprCpy->ptNext = ptEncodingOpr->ptFontOprSupportedHead;ptEncodingOpr->ptFontOprSupportedHead = ptFontOprCpy;return 0;}}}int DelFontOprFrmEncoding(PT_EncodingOpr ptEncodingOpr, PT_FontOpr ptFontOpr){PT_FontOpr ptTmp;PT_FontOpr ptPre;if (!ptEncodingOpr || !ptFontOpr){return -1;}else{ptTmp = ptEncodingOpr->ptFontOprSupportedHead;if (strcmp(ptTmp->name, ptFontOpr->name) == 0){/* 删除头节点 */ptEncodingOpr->ptFontOprSupportedHead = ptTmp->ptNext;free(ptTmp);return 0;}ptPre = ptEncodingOpr->ptFontOprSupportedHead;ptTmp = ptPre->ptNext;while (ptTmp){if (strcmp(ptTmp->name, ptFontOpr->name) == 0){/* 从链表里取出、释放 */ptPre->ptNext = ptTmp->ptNext;free(ptTmp);return 0;}else{ptPre = ptTmp;ptTmp = ptTmp->ptNext;}}return -1;}}int EncodingInit(void){int iError;iError = AsciiEncodingInit();if (iError){DBG_PRINTF("AsciiEncodingInit error!\n");return -1;}iError = Utf16leEncodingInit();if (iError){DBG_PRINTF("Utf16leEncodingInit error!\n");return -1;}iError = Utf16beEncodingInit();if (iError){DBG_PRINTF("Utf16beEncodingInit error!\n");return -1;}iError = Utf8EncodingInit();if (iError){DBG_PRINTF("Utf8EncodingInit error!\n");return -1;}return 0;}</span></span>
下面四个文件都是不同字体格式的解析
ascii.c文件
<span style="font-size:18px;"><span style="font-size:18px;">#include <config.h>#include <encoding_manager.h>#include <string.h>static int isAsciiCoding(unsigned char *pucBufHead);static int AsciiGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);static T_EncodingOpr g_tAsciiEncodingOpr = {.name = "ascii",.iHeadLen = 0,.isSupport = isAsciiCoding,.GetCodeFrmBuf = AsciiGetCodeFrmBuf,};static int isAsciiCoding(unsigned char *pucBufHead){const char aStrUtf8[] = {0xEF, 0xBB, 0xBF, 0};const char aStrUtf16le[] = {0xFF, 0xFE, 0};const char aStrUtf16be[] = {0xFE, 0xFF, 0};if (strncmp((const char*)pucBufHead, aStrUtf8, 3) == 0){/* UTF-8 */return 0;}else if (strncmp((const char*)pucBufHead, aStrUtf16le, 2) == 0){/* UTF-16 little endian */return 0;}else if (strncmp((const char*)pucBufHead, aStrUtf16be, 2) == 0){/* UTF-16 big endian */return 0;}else{return 1;}}static int AsciiGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode){unsigned char *pucBuf = pucBufStart;unsigned char c = *pucBuf;if ((pucBuf < pucBufEnd) && (c < (unsigned char)0x80)){/* 返回ASCII码 */*pdwCode = (unsigned int)c;return 1;}if (((pucBuf + 1) < pucBufEnd) && (c >= (unsigned char)0x80)){/* 返回GBK码 */*pdwCode = pucBuf[0] + (((unsigned int)pucBuf[1])<<8);return 2;}if (pucBuf < pucBufEnd){/* 可能文件有损坏, 但是还是返回一个码, 即使它是错误的 */*pdwCode = (unsigned int)c;return 1;}else{/* 文件处理完毕 */return 0;}}int AsciiEncodingInit(void){AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("freetype"));AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("ascii"));AddFontOprForEncoding(&g_tAsciiEncodingOpr, GetFontOpr("gbk"));return RegisterEncodingOpr(&g_tAsciiEncodingOpr);}</span></span>
utf-8.c文件
<span style="font-size:18px;"><span style="font-size:18px;">#include <config.h>#include <encoding_manager.h>#include <string.h>static int isUtf8Coding(unsigned char *pucBufHead);static int Utf8GetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);static T_EncodingOpr g_tUtf8EncodingOpr = {.name = "utf-8",.iHeadLen = 3,.isSupport = isUtf8Coding,.GetCodeFrmBuf = Utf8GetCodeFrmBuf,};static int isUtf8Coding(unsigned char *pucBufHead){const char aStrUtf8[] = {0xEF, 0xBB, 0xBF, 0};if (strncmp((const char*)pucBufHead, aStrUtf8, 3) == 0){/* UTF-8 */return 1;}else{return 0;}}/* 获得前导为1的位的个数 * 比如二进制数 11001111 的前导1有2位 * 11100001 的前导1有3位 */static int GetPreOneBits(unsigned char ucVal){int i;int j = 0;for (i = 7; i >= 0; i--){if (!(ucVal & (1<<i)))break;elsej++;}return j;}static int Utf8GetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode){#if 0 对于UTF-8编码中的任意字节B,如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符; 如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的一个字节,并且不为字符的第一个字节编码; 如果B的前两位为1,第三位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由两个字节表示; 如果B的前三位为1,第四位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示; 如果B的前四位为1,第五位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示; 因此,对UTF-8编码中的任意字节,根据第一位,可判断是否为ASCII字符; 根据前二位,可判断该字节是否为一个字符编码的第一个字节; 根据前四位(如果前两位均为1),可确定该字节为字符编码的第一个字节,并且可判断对应的字符由几个字节表示; 根据前五位(如果前四位为1),可判断编码是否有错误或数据传输过程中是否有错误。#endifint i;int iNum;unsigned char ucVal;unsigned int dwSum = 0;if (pucBufStart >= pucBufEnd){/* 文件结束 */return 0;}ucVal = pucBufStart[0];iNum = GetPreOneBits(pucBufStart[0]);if ((pucBufStart + iNum) > pucBufEnd){/* 文件结束 */return 0;}if (iNum == 0){/* ASCII */*pdwCode = pucBufStart[0];return 1;}else{ucVal = ucVal << iNum;ucVal = ucVal >> iNum;dwSum += ucVal;for (i = 1; i < iNum; i++){ucVal = pucBufStart[i] & 0x3f;dwSum = dwSum << 6;dwSum += ucVal;}*pdwCode = dwSum;return iNum;}}int Utf8EncodingInit(void){AddFontOprForEncoding(&g_tUtf8EncodingOpr, GetFontOpr("freetype"));AddFontOprForEncoding(&g_tUtf8EncodingOpr, GetFontOpr("ascii"));return RegisterEncodingOpr(&g_tUtf8EncodingOpr);}</span></span>
utf-16be.c文件
<span style="font-size:18px;"><span style="font-size:18px;">#include <config.h>#include <encoding_manager.h>#include <string.h>static int isUtf16beCoding(unsigned char *pucBufHead);static int Utf16beGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);static T_EncodingOpr g_tUtf16beEncodingOpr = {.name = "utf-16be",.iHeadLen = 2,.isSupport = isUtf16beCoding,.GetCodeFrmBuf = Utf16beGetCodeFrmBuf,};static int isUtf16beCoding(unsigned char *pucBufHead){const char aStrUtf16be[] = {0xFE, 0xFF, 0};if (strncmp((const char*)pucBufHead, aStrUtf16be, 2) == 0){/* UTF-16 big endian */return 1;}else{return 0;}}static int Utf16beGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode){if (pucBufStart + 1 < pucBufEnd){*pdwCode = (((unsigned int)pucBufStart[0])<<8) + pucBufStart[1];return 2;}else{/* 文件结束 */return 0;}}int Utf16beEncodingInit(void){AddFontOprForEncoding(&g_tUtf16beEncodingOpr, GetFontOpr("freetype"));AddFontOprForEncoding(&g_tUtf16beEncodingOpr, GetFontOpr("ascii"));return RegisterEncodingOpr(&g_tUtf16beEncodingOpr);}</span></span>
utf-16le.c文件
<span style="font-size:18px;"><span style="font-size:18px;">#include <config.h>#include <encoding_manager.h>#include <string.h>static int isUtf16leCoding(unsigned char *pucBufHead);static int Utf16leGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode);static T_EncodingOpr g_tUtf16leEncodingOpr = {.name = "utf-16le",.iHeadLen = 2,.isSupport = isUtf16leCoding,.GetCodeFrmBuf = Utf16leGetCodeFrmBuf,};static int isUtf16leCoding(unsigned char *pucBufHead){const char aStrUtf16le[] = {0xFF, 0xFE, 0};if (strncmp((const char *)pucBufHead, aStrUtf16le, 2) == 0){/* UTF-16 little endian */return 1;}else{return 0;}}static int Utf16leGetCodeFrmBuf(unsigned char *pucBufStart, unsigned char *pucBufEnd, unsigned int *pdwCode){if (pucBufStart + 1 < pucBufEnd){*pdwCode = (((unsigned int)pucBufStart[1])<<8) + pucBufStart[0];return 2;}else{/* 文件结束 */return 0;}}int Utf16leEncodingInit(void){AddFontOprForEncoding(&g_tUtf16leEncodingOpr, GetFontOpr("freetype"));AddFontOprForEncoding(&g_tUtf16leEncodingOpr, GetFontOpr("ascii"));return RegisterEncodingOpr(&g_tUtf16leEncodingOpr);}</span></span>
0 0
- LCD电子书项目(五)
- LCD电子书项目(一)
- LCD电子书项目(二)
- LCD电子书项目(三)
- LCD电子书项目(四)
- LCD电子书项目(六)
- LCD电子书项目(七)
- LCD设备驱动(五)
- 电子书《寿康宝鉴》(附白话)全文连载(五)
- Linux-2.6.20的LCD驱动分析(五)
- android项目之电子书
- 开源ios 电子书项目
- linux lcd驱动分析五
- (项目)AR电子书系统创新实训第一周(1)
- (项目)AR电子书系统创新实训第一周(2)
- (项目)AR电子书系统创新实训第四周(1)
- (项目)AR电子书系统创新实训第四周(2)
- (项目)AR电子书系统创新实训中期汇报
- 基于OpenCV 的美颜相机推送直播流
- Linux下抓包工具tcpdump使用
- redis 数据结构命令
- 数据类型和结构
- 1009. 说反话 (20)
- LCD电子书项目(五)
- bzoj2301【HAOI2011】Problem b
- Nodejs之request 和 response 对象的具体介绍
- maven基本配置及创建web项目
- 一行python实现树形结构
- java集合:ArrayList和Vector的区别
- win7 64位下如何安装配置mysql
- 1003 Hangover(数学水题)
- SpringMVC集成Hessian