当前位置:   article > 正文

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

include fonts

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

 

 

1、在初始化时,被选中编码节点会遍历它支持的字库,调用这些字库的初始化函数,若该字库不能使用(可能是没有字库文件、字体大小设置错误等),则将其移出链表

2、在获取字符位图时,需要调用字库的相应函数

 

以ascii_font.c为例:

设置字库结构体

  1. static T_FontOpr g_ptAsciiFontOpr = {
  2.     .pcName    = "ascii",
  3.     .FontInit  = AsciiFontInit,
  4.     .GetBitMap = AsciiGetBitMap,
  5. };

 

初始化:

ascii的字库是一个数组,初始化比较简单,只需要判断字体大小;其他的字库可能需要判断文件是否存在等

  1. static int AsciiFontInit(char *pcFontFile, int iFontSize)
  2. {
  3. if(iFontSize != 16)
  4. {
  5. DBG_PRINT("Error at AsciiFontInit : iFontSize != 16\r\n");
  6. return -1;
  7. }
  8. return 0;
  9. }

 

获取字符位图

  1. static int AsciiGetBitMap(int iCode, PT_BitMap ptBitMap)
  2. {
  3. if(iCode >= 0x80)
  4. {
  5. DBG_PRINT("Error at AsciiGetBitMap : iCode >= 0x80\r\n");
  6. return -1;
  7. }
  8. ptBitMap->iXLeft = ptBitMap->iCurOriginX;
  9. ptBitMap->iYTop = ptBitMap->iCurOriginY - 16;
  10. ptBitMap->iNextOriginX = ptBitMap->iCurOriginX + 8;
  11. ptBitMap->iNextOriginY = ptBitMap->iCurOriginY;
  12. ptBitMap->iXMax = ptBitMap->iCurOriginX + 8;
  13. ptBitMap->iYMax = ptBitMap->iCurOriginY;
  14. ptBitMap->iBpp = 1;
  15. ptBitMap->iPitch = 1;
  16. ptBitMap->pucBuf = (unsigned char *)&g_pucAsciiFontData_8x16[iCode*16];
  17. return 0;
  18. }

 

初始化注册函数:

  1. int AsciiInit(void)
  2. {
  3. return RegisterFont(&g_ptAsciiFontOpr);
  4. }

 

 

(三种字库的)完整代码:

ascii_font.c

由于ascii的数组太长,这里不将其列出,可以百度下载ascii字库,拷贝到该文件或者使用外部引用

  1. #include <config.h>
  2. #include <fonts_manager.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. static int AsciiFontInit(char *pcFontFile, int iFontSize);
  6. static int AsciiGetBitMap(int iCode, PT_BitMap ptBitMap);
  7. const unsigned char g_pucAsciiFontData_8x16[4096] = { /*********
  8. *********
  9. *********
  10. 省略
  11. *********
  12. *********
  13. *********/};
  14. static T_FontOpr g_ptAsciiFontOpr = {
  15. .pcName = "ascii",
  16. .FontInit = AsciiFontInit,
  17. .GetBitMap = AsciiGetBitMap,
  18. };
  19. static int AsciiFontInit(char *pcFontFile, int iFontSize)
  20. {
  21. if(iFontSize != 16)
  22. {
  23. DBG_PRINT("Error at AsciiFontInit : iFontSize != 16\r\n");
  24. return -1;
  25. }
  26. return 0;
  27. }
  28. static int AsciiGetBitMap(int iCode, PT_BitMap ptBitMap)
  29. {
  30. if(iCode >= 0x80)
  31. {
  32. DBG_PRINT("Error at AsciiGetBitMap : iCode >= 0x80\r\n");
  33. return -1;
  34. }
  35. ptBitMap->iXLeft = ptBitMap->iCurOriginX;
  36. ptBitMap->iYTop = ptBitMap->iCurOriginY - 16;
  37. ptBitMap->iNextOriginX = ptBitMap->iCurOriginX + 8;
  38. ptBitMap->iNextOriginY = ptBitMap->iCurOriginY;
  39. ptBitMap->iXMax = ptBitMap->iCurOriginX + 8;
  40. ptBitMap->iYMax = ptBitMap->iCurOriginY;
  41. ptBitMap->iBpp = 1;
  42. ptBitMap->iPitch = 1;
  43. ptBitMap->pucBuf = (unsigned char *)&g_pucAsciiFontData_8x16[iCode*16];
  44. return 0;
  45. }
  46. int AsciiInit(void)
  47. {
  48. return RegisterFont(&g_ptAsciiFontOpr);
  49. }

 

gbk_font.c

  1. #include <config.h>
  2. #include <fonts_manager.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <sys/mman.h>
  9. static int GbkFontInit(char *pcFontFile, int iFontSize);
  10. static int GbkGetBitMap(int iCode, PT_BitMap ptBitMap);
  11. static T_FontOpr g_ptGbkFontOpr = {
  12. .pcName = "gbk",
  13. .FontInit = GbkFontInit,
  14. .GetBitMap = GbkGetBitMap,
  15. };
  16. static int g_iHzkFd;
  17. static unsigned char *g_pucHzkMemStart;
  18. static unsigned char *g_pucHzkMemEnd;
  19. static int GbkFontInit(char *pcFontFile, int iFontSize)
  20. {
  21. struct stat ptHzkStat;
  22. if(iFontSize != 16)
  23. {
  24. DBG_PRINT("Error at GbkFontInit : iFontSize != 16\r\n");
  25. return -1;
  26. }
  27. g_iHzkFd = open(pcFontFile, O_RDONLY);
  28. if(g_iHzkFd < 0)
  29. {
  30. DBG_PRINT("Error at GbkFontInit : g_iHzkFd < 0\r\n");
  31. return -2;
  32. }
  33. fstat(g_iHzkFd, &ptHzkStat);
  34. g_pucHzkMemStart = mmap(NULL, ptHzkStat.st_size, PROT_READ, MAP_SHARED, g_iHzkFd, 0);
  35. if(g_pucHzkMemStart < 0)
  36. {
  37. DBG_PRINT("Error at GbkFontInit : g_pucHzkMemStart < 0\r\n");
  38. return -3;
  39. }
  40. g_pucHzkMemEnd = g_pucHzkMemStart + ptHzkStat.st_size;
  41. return 0;
  42. }
  43. static int GbkGetBitMap(int iCode,PT_BitMap ptBitMap)
  44. {
  45. int iArea;
  46. int iLocate;
  47. if(iCode & 0xffff0000) //larger than two bytes
  48. {
  49. DBG_PRINT("Error at GbkGetBitMap : iCode & 0xffff0000\r\n");
  50. return -1;
  51. }
  52. iArea = (int)(iCode & 0xff) - 0xa1;
  53. iLocate = (int)((iCode >> 8) & 0xff) - 0xa1 ;
  54. if((iArea < 0) || (iLocate < 0))
  55. {
  56. DBG_PRINT("Error at GbkGetBitMap : iArea < 0 || iLocate < 0\r\n");
  57. return -2;
  58. }
  59. ptBitMap->iXLeft = ptBitMap->iCurOriginX;
  60. ptBitMap->iYTop = ptBitMap->iCurOriginY - 16;
  61. ptBitMap->iXMax = ptBitMap->iCurOriginX + 16;
  62. ptBitMap->iYMax = ptBitMap->iCurOriginY;
  63. ptBitMap->iBpp = 1;
  64. ptBitMap->iPitch = 2;
  65. ptBitMap->pucBuf = g_pucHzkMemStart + (94 * iArea + iLocate) * 32;
  66. if(ptBitMap->pucBuf > g_pucHzkMemEnd)
  67. {
  68. DBG_PRINT("Error at GbkGetBitMap : ptBitMap->pucBuf > g_pucHzkMemEnd\r\n");
  69. return -3;
  70. }
  71. ptBitMap->iNextOriginY = ptBitMap->iCurOriginY;
  72. ptBitMap->iNextOriginX = ptBitMap->iCurOriginX + 16;
  73. return 0;
  74. }
  75. int GbkInit(void)
  76. {
  77. return RegisterFont(&g_ptGbkFontOpr);
  78. }

 

freetype.c

  1. #include <config.h>
  2. #include <fonts_manager.h>
  3. #include <ft2build.h>
  4. #include FT_FREETYPE_H
  5. #include FT_GLYPH_H
  6. static int FreetypeFontInit(char *pcFontFile, int iFontSize);
  7. static int FreetypeGetBitMap(int iCode, PT_BitMap ptBitMap);
  8. static FT_Library g_tLibrary;
  9. static FT_Face g_tFace;
  10. static FT_GlyphSlot g_tSlot;
  11. static T_FontOpr g_tFreetypeOpr = {
  12. .pcName = "freetype",
  13. .FontInit = FreetypeFontInit,
  14. .GetBitMap = FreetypeGetBitMap,
  15. };
  16. static int FreetypeFontInit(char *pcFontFile, int iFontSize)
  17. {
  18. int iError;
  19. iError = FT_Init_FreeType(&g_tLibrary);
  20. if(iError)
  21. {
  22. DBG_PRINT("freetype library init fail\r\n");
  23. return -1;
  24. }
  25. iError = FT_New_Face(g_tLibrary, pcFontFile, 0, &g_tFace);
  26. if(iError)
  27. {
  28. DBG_PRINT("freetype get face fail\r\n");
  29. return -1;
  30. }
  31. iError = FT_Set_Pixel_Sizes(g_tFace,iFontSize,0);
  32. if(iError)
  33. {
  34. DBG_PRINT("freetype set font size fail\r\n");
  35. return -1;
  36. }
  37. g_tSlot = g_tFace->glyph;
  38. return 0;
  39. }
  40. static int FreetypeGetBitMap(int iCode, PT_BitMap ptBitMap)
  41. {
  42. int iError;
  43. iError = FT_Load_Char(g_tFace,(unsigned int) iCode, FT_LOAD_RENDER | FT_LOAD_MONOCHROME);
  44. if(iError)
  45. {
  46. DBG_PRINT("freetype load unsigned char fail\r\n");
  47. return -1;
  48. }
  49. ptBitMap->iXLeft = ptBitMap->iCurOriginX + g_tSlot->bitmap_left;
  50. ptBitMap->iYTop = ptBitMap->iCurOriginY - g_tSlot->bitmap_top;
  51. ptBitMap->iXMax = ptBitMap->iXLeft + g_tSlot->bitmap.width;
  52. ptBitMap->iYMax = ptBitMap->iYTop + g_tSlot->bitmap.rows;
  53. ptBitMap->iBpp = 1;
  54. ptBitMap->iPitch = g_tSlot->bitmap.pitch;
  55. ptBitMap->iNextOriginX = ptBitMap->iCurOriginX + g_tSlot->advance.x / 64;
  56. ptBitMap->iNextOriginY = ptBitMap->iCurOriginY;
  57. ptBitMap->pucBuf = (unsigned char *)g_tSlot->bitmap.buffer;
  58. return 0;
  59. }
  60. int FreetypeInit(void)
  61. {
  62. return RegisterFont(&g_tFreetypeOpr);
  63. }

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/48530
推荐阅读
相关标签
  

闽ICP备14008679号