你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱STemWin教程】第22章 TrueType矢量字体

[复制链接]
baiyongbin2009 发布时间:2015-1-31 11:26
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
$ V: v5 l1 P" ?3 w% |1 m6 {
第22章 TrueType矢量字体
2 U# Y* Q- I& n7 I$ G4 r4 Q
    本期教程跟大家讲解矢量字体的相关知识,矢量字体最大的好处就是可以任意放大或者缩小字体,而且字体的显示效果不失真。矢量字体的缺点就是不适合用在小型嵌入式系统中,极其消耗内存。
    22. 1  XBF格式字体生成方法
    22. 2 移植到开发板显示
    22. 3 总结
22.1 矢量字体介绍
    下面的内容来自百度百科和wiki百科(两个内容居然一模一样),讲的非常好,特此转载过来。
    目前主流的矢量字体格式有3种:Type1,TrueType和OpenType,这三种格式都是与平台无关的。
    Type1全称PostScript Type1,是1985年由Adobe公司提出的一套矢量字体标准,由于这个标准是基于PostScript Description Language(PDL),而PDL又是高端打印机首选的打印描述语言,所以Type1迅速流行起来。但是Type1是非开放字体,Adobe对使用Type1的公司征收高额的使用费。
    TrueType是1991年由Apple公司与Microsoft公司联合提出另一套矢量字标准。
    Type1使用三次贝塞尔曲线来描述字形,TrueType则使用二次贝塞尔曲线来描述字形。所以Type1的字体比TrueType字体更加精确美观。一个误解是,Type1字体比TrueType字体占用空间多。这是因为同样描述一个圆形,二次贝塞尔曲线只需要8个关键点和7段二次曲线;而三次贝塞尔曲线则需要12个关键点和11段三次曲线。然而实际情况是一般来说 Type1比TrueType要小10%左右。这是因为对于稍微复杂的字形,为了保持平滑,TrueType必须使用更多的关键点。由于现代大部分打印机都是使用PDL作为打印描述语言,所以Type1字体打印的时候不会产生形变,速度快;而TrueType则需要翻译成PDL,由于曲线方程的变化,还会产生一定的形变,不如Type1美观。
    这么说来,Type1应该比TrueType更具有优势,为什么如今的计算机上TrueType反而比Type1使用更广泛呢?这是因为第一:Type1由于字体方程的复杂,所以在屏幕上渲染的时候,花费的时间多,解决方案是大部分Type1字体嵌入了点阵字体,这样渲染快,但是边缘不光滑,比较难看。很多ps文档和ps转换的pdf文档都是这样,在计算机上浏览的时候字体很难看,但是打印出来很美观。TrueType则渲染比较快,可以平滑的显示在屏幕上,看上去很美观。
    第二个原因是Type1的高额使用费,使得Type1没有被所有的操作系统所支持。Windows家族只有OS/2和windows 2000及之后的版本从操作系统级别开始支持Type1。由于这个问题,Adobe只好在其所有的产品中嵌入Adobe Type Manager(ATM)作为渲染引擎。
    OpenType则是Type1与TrueType之争的最终产物。1995年,Adobe公司和Microsoft公司开始联手开发一种兼容Type1和TrueType,并且真正支持Unicode的字体,后来在发布的时候,正式命名为OpenType。OpenType可以嵌入Type1和TrueType,这样就兼有了二者的特点,无论是在屏幕上察看还是打印,质量都非常优秀。可以说OpenType是一个三赢的结局,无论是Adobe、Microsoft还是最终用户,都从OpenType中得到了好处。Windows家族从Windows 2000开始,正式支持OpenType。打开系统的字体目录(一般是C:\Windows\Fonts\或C:\Winnt\Fonts),可以看到:一个红色A的图标的是点阵字体,两个重叠的T的图标是TrueType字体,一个O的图标就是OpenType字体。
    矢量字体扩展名ttf。点阵字体的扩展名是fon.
    下面是XP系统中字体的部分截图:
22.1.png
22.2 STemWin对矢量字体的支持
    TrueType为字体开发人员提供对在各种字体高度下字体显示方式的高度控制。与位图字体(基于每个字符的位图)不同,TrueType字体基于矢量图形。矢量表示的优势在于无损的可扩展性。这意味着,每个字符在绘制前需要光栅化为位图。为避免每次绘制字符时都进行光栅化,通常用字体引擎缓存位图数据。这要求CPU速度快、RAM足够。发货时不含emWin TTF包。该项内容可在www.segger.com/link/emwin_freetype.zip下免费获得。
    emWin对TTF支持的实施基于来自David Turner、Robert Wilhelm和Werner Lembergr的FreeType字体库,该库可在www.freetype.org下免费获得。emWin对该库的使用符合GUI\TrueType\FTL. txt下的FreeType许可。emWin对该库进行了少许改编,添加了带有GUI函数的 “粘贴”层。
    TrueType矢量字体的硬件要求如下:
CPU
TTF支持仅适用于32位CPU。我们对32位CPU的定义为:sizeof(int)= 4。
ROM
TTF引擎的ROM要求大约为250 K。确切大小取决于CPU、编译器以及编译器的优化水平。
RAM
该库的RAM要求主要取决于使用的字体。TTF引擎的基本RAM要求大约为50 K。在使用GUI_TTF_CreateFont()创建GUI字体时,字体引擎会加载生成字符所需的TTF文件中定义的所有字体表。不同字体之间的表大小有所差异。创建字体额外要求的RAM量可能介于几个KB到1 MB以上之间。一般字体需要80-300 kb。取决于使用的字体文件需要多少RAM。至少,TTF引擎需要位图缓存。默认情况下,引擎使用200 K的缓存。足够大多数应用使用。TTF引擎通过非emWin函数malloc()和free()分配内存。使用TTF引擎之前,必须确保
能够运行这些函数。
    从SEGGER官网下载的矢量库主要有以下文件:
22.2.png
    TrueType相关的文件还是很多的,这里只贴了部分源码。
22.3 模拟器上面运行矢量字体
    在emWin模拟器中,官方专门做了一个例子用于运行矢量字体,程序DEMO位置如下:
22.3.png
这个DEMO程序的代码如下:
  1. #ifndef SKIP_TEST
    ! ^+ I) W; Q& S" A, K- h

  2. ; b' X; e. c/ r6 r
  3. #include <windows.h>
    / D0 z6 @, f1 ^$ d% a! O& w
  4. #include <stdio.h>0 ]4 ~2 h% R  M# z# K" S
  5. #include "GUI.h"
    ( l0 ]/ {) }3 }9 A3 c/ l

  6. $ h7 |0 w2 N% t
  7. /*********************************************************************2 D  D) J/ _7 T. Y- P% ~
  8. *
    2 C" ^% _1 J: M, c3 v* G
  9. *       Static data
    9 ?6 `- B4 q2 e
  10. *
    - G) c2 C3 `. k
  11. **********************************************************************+ n. \9 U( z# X0 x8 h+ J# K  I
  12. */
    + x6 }$ ^5 ?! Y) h  M
  13. static unsigned     _aHeight  [] = {16, 20, 32, 48};   // Array of heights used to show text
    5 R) v; Q4 ~( E# F
  14. static GUI_TTF_CS   _aCS      [GUI_COUNTOF(_aHeight)]; // Each GUI font needs its own GUI_TTF_CS structure4 M" t5 K3 O3 n3 f9 w; ]
  15. static GUI_FONT     _aFont    [GUI_COUNTOF(_aHeight)]; // Array of GUI fonts
    2 Q- s2 M  R% Z0 {8 B
  16. static char         _acFamily [200];
    & R' z) h. s% m* H) L
  17. static char         _acStyle  [200];
    9 _$ t4 C5 s4 F

  18. ; t! J- @; v7 b
  19. /*********************************************************************+ N4 f2 B3 j5 i' g/ x9 u
  20. *
    ! p9 J5 ]3 W8 ]
  21. *       Static code/ n1 P. {1 y6 O& S
  22. *
    ! j5 n5 `& d* _5 x9 U
  23. **********************************************************************
    7 ^0 t& x- ~8 l" [% D
  24. */
    9 B7 _' V1 A) I. _5 l$ K3 d2 m1 U8 [
  25. /*********************************************************************
    - b5 d- T. a7 q: ]5 K1 ~( H4 |( f
  26. *
    + h# P" m5 ^8 ]/ F- _
  27. *       _ShowText; }* M4 C# E) K$ E9 L6 Z
  28. */
    - x" I" C. F  u, Y1 E
  29. static void _ShowText(void) {(1)- ]: x& m1 _; y4 o9 [
  30.   int i;
    # U5 J* \* B% j* B+ G: o

  31. 3 K( m) }/ R/ L
  32.   GUI_Clear();
    / x9 U. }2 {. p& Z
  33.   i = 0;! ~! M" ?; r5 |& \/ x
  34.   GUI_TTF_GetFamilyName(&_aFont[i], _acFamily, sizeof(_acFamily));(2)) }+ k. k+ ~! g; t# R2 O9 C
  35.   GUI_TTF_GetStyleName(&_aFont[i],  _acStyle,  sizeof(_acStyle));& ~2 I8 p7 D* L, [
  36.   GUI_SetFont(&GUI_Font20_1);
    $ F- U! M3 x- a% C9 z
  37.   GUI_DispString(_acFamily);7 m$ l* v+ a+ m6 N: g
  38.   GUI_DispString(", ");
    * n1 m" ~: r3 Z. A; U
  39.   GUI_DispString(_acStyle);: V3 M. E0 x! I' F; N
  40.   GUI_DispNextLine();7 o1 _& W. y& w6 a( O# _$ D
  41.   GUI_DrawHLine(GUI_GetDispPosY(), 0, 0xfff);
    8 ]1 b" g  L4 b0 q5 n
  42.   GUI_SetFont(&_aFont[i]);
    2 V! {, {8 r/ Q9 Q/ F3 D
  43.   GUI_DispString("abcdefghijklmnopqrstuvwxyz\n");
    8 N% a$ W6 o  {) d, `
  44.   GUI_DispString("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
    * B6 R9 n4 P) g0 b
  45.   GUI_DispString("123456789.:,;(:*!?')\n");
    6 o) K6 ~0 m1 Y6 _6 `- @
  46.   GUI_DrawHLine(GUI_GetDispPosY(), 0, 0xfff);
    9 d! j7 `' H; a6 `- U' |( ~$ Y
  47.   for (i = 0; i < GUI_COUNTOF(_aHeight); i++) {( G1 M2 m9 ?' p5 D" C% w
  48.     GUI_SetFont(&_aFont[i]);
    ( p; X3 c7 b# T, X8 o, y( |0 s9 v
  49.     GUI_DispString("The quick brown fox jumps over the lazy dog. 1234567890\n");
    " _- X; F  m+ V  Z' D, c& m: v1 D
  50.   }- v+ [; [* i" j; J( [8 b& U
  51.   GUI_Delay(1000);1 r. S( t" w) S
  52. }
    & j7 U1 \, x. S, n

  53. , g* i  Y% X% k; O
  54. /*********************************************************************
    * `3 U' Z" ?& K- X) M7 h
  55. *
    % Z9 j: E% L  h9 h( ~  P
  56. *       _CreateFonts8 I+ N( \5 y& i, _
  57. */6 A' t9 L4 p3 p% l( y) P
  58. static int _CreateFonts(const U8 * pData, U32 NumBytes) {(3)
    & k$ w) }# L5 ^5 T2 g
  59.   int i;
    ' Q1 ?/ w/ i& `
  60.   GUI_TTF_DATA TTF_Data;        // Only one GUI_TTF_DATA structure is used per font face
    - }- _6 [& O7 Z- r9 S* h& R; V

  61. ( F# P8 _  S3 u
  62.   TTF_Data.pData    = pData;    // Set pointer to file data# u/ W7 ?4 _+ H4 D1 e0 w
  63.   TTF_Data.NumBytes = NumBytes; // Set size of file
    ! }: j' Y' D; X+ R. D; F; p9 g
  64.   for (i = 0; i < GUI_COUNTOF(_aHeight); i++) {. V, O# Q# a# h* i8 g6 ^: t
  65.     //; P$ ^" K& X/ P1 G
  66.     // Initialize GUI_TTF_CS members5 W- S4 `/ q; m+ o% v1 K; s
  67.     //! a2 I5 R5 Q' d+ P
  68.     _aCS[i].PixelHeight = _aHeight[i];
    8 t. b8 B* e& [4 v
  69.     _aCS[i].pTTF        = &TTF_Data;
    ; U. F) x. O( y) z8 z
  70.     //: C7 a( X- R  ~; f7 W
  71.     // Create GUI font6 ]( Z. R3 J& h1 J( |. m) D; v! C
  72.     //6 o, g' O( Y  s4 U) [0 W1 U
  73.     if (GUI_TTF_CreateFont(&_aFont[i], &_aCS[i])) {(4)6 G, m% D1 y9 z" R1 ^8 Z9 j2 J
  74.       return 1;! o6 Z  ?. F& D7 R. ]% p4 K8 ~
  75.     }6 M6 m, {, \2 M
  76.   }
    1 |7 P- N5 z" u5 g# ]! Y
  77.   return 0;
    $ \# t. b. T5 q9 u7 z1 F" P2 W, r
  78. }
    " \  w5 b$ F& i) G$ Y1 ?# ^# q
  79. ; o) y) f+ K( _% Y" d
  80. /*********************************************************************% }1 ?, y" O8 ?5 n, L: R  Y- ^
  81. *5 l, b9 s( `% ?' h/ w8 U! M; \
  82. *       _cbFontDemo5 t: z) r& [7 `1 y) a
  83. *7 r6 |. e# `0 A
  84. * Function description( _0 N7 K) m! s$ }
  85. *   The function uses the given pointer to a true type font for creating; U* U/ e4 W) O4 v0 q2 V
  86. *   a couple of GUI fonts and showing the outline of the TTF font.! @, V0 Q% _3 ]# v$ a
  87. *# I, a$ T# U- C' S( a* A
  88. * Parameters:4 Z2 T2 C6 Y. ~
  89. *   pData    - Location of font file% i* X  R) q7 t
  90. *   NumBytes - Size of font file2 W* U7 J8 j% N& ]5 K9 V) ]& \
  91. */: o7 Y2 R- w  r* p- Y5 X& C/ y
  92. static void _cbFontDemo(const U8 * pData, U32 NumBytes) {(5)
    : _, q$ I5 I  S+ Z% q( f$ U+ i
  93.   _CreateFonts(pData, NumBytes); // Create fonts- ?5 y! k  Z/ K8 J
  94.   _ShowText();                   // Show some text
      \' x. `0 g+ a: Z- K4 t/ F% D! p7 F' K
  95.   GUI_TTF_DestroyCache();        // Clear the TTF cache, u' m! X/ F: d: W
  96. }. y6 I6 D7 H' d$ V% h# u! N

  97. $ V! c$ |. L( O, l  B4 S. _* i  P
  98. /*********************************************************************. |0 P* j' f# c, Z5 {
  99. *
    + p/ _. x- D& l$ Y- ~& q
  100. *       _IterateOverAllFiles! A  d% a" u1 J7 Y" u
  101. *  c: ?$ U# v# d  k! S& z
  102. * Function description& r+ G- ?9 Q" i+ j. q) ~7 E# {
  103. *   The function iterates over all files of the given folder and the1 }+ o( _3 }8 L; t0 y) h
  104. *   given mask, reads the contents of the file and calls the function7 y5 v, q6 ^( P$ B* f, A2 }
  105. *   pfDoSomething() with location and size of file data.
    6 u# t* {0 ^& g5 @; |  Q
  106. *   Can be used under Win32 environment only.3 U7 O* Q6 C" j! c0 D
  107. */
    * P4 y$ m! @4 G
  108. static void _IterateOverAllFiles(const char * sFolder, const char * sMask, void (* pfDoSomething)(const U8 * pData, U32 NumBytes)) {(6)' c: _0 k1 r  ^' ?% ]
  109.   GUI_RECT Rect = {0, 10, 1000, 1000};
    / R) G5 r0 }+ {* B
  110.   char              acMask[_MAX_PATH];: O" p  C( t0 a+ R- P4 Q
  111.   char              acFile[_MAX_PATH];1 R' w+ w, M# @& x4 k: A& y" \
  112.   WIN32_FIND_DATA   Context;2 r4 t) {5 c3 a
  113.   HANDLE            hFind;
    8 g' H  b( V1 n/ V& H7 y
  114.   HANDLE            hFile;" R1 C' x( x  V. g/ G
  115.   U8              * pData;
    2 h2 x, f% d5 d5 T0 P
  116.   DWORD             NumBytes;
      F) j$ T/ W. u. I- B; g, I
  117.   DWORD             NumBytesRead;
    ( k6 D, @* |4 ^+ V4 V

  118. , H$ M8 Y7 t" ?) B* {% E& Q
  119.   sprintf(acMask, "%s\\%s", sFolder, sMask);( `' k+ b5 ^$ [3 ?7 p2 H' @
  120.   hFind = FindFirstFile(acMask, &Context);) o4 o, p! \$ N+ Z
  121.   if (hFind != INVALID_HANDLE_VALUE) {* b! P9 P& @5 y! F
  122.     do {
    5 `' ^2 y- S) Q: H& R
  123.       sprintf(acFile, "%s\\%s", sFolder, Context.cFileName);' \1 f0 O, w  Y. V! o
  124.       hFile = CreateFile(acFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);* ?3 f0 r+ h* ^. l5 `6 x/ O+ W) @
  125.       if (hFile != INVALID_HANDLE_VALUE) {) p% B4 c: [' R) g& T$ J# K
  126.         NumBytes = GetFileSize(hFile, NULL);
    ; a" C9 M  A: W
  127.         pData = (U8 *)malloc(NumBytes);4 ^; u' R7 t" x& o2 b  F& e
  128.         ReadFile(hFile, pData, NumBytes, &NumBytesRead, NULL);
    * G1 M4 }) {0 ?1 d+ ?& e# o# G
  129.         pfDoSomething(pData, NumBytes);; _$ ?6 J& T4 c/ l: N4 p0 _8 e
  130.         free(pData);& Y, N' r  k3 B! m
  131.       }. L- g# I# w1 c# L* e
  132.       CloseHandle(hFile);  e0 [! a( G2 _' @( _6 p; c
  133.     } while (FindNextFile(hFind, &Context));7 i9 ]) d- R( u: e
  134.   }) L0 R: O5 i  V6 D8 O( ^
  135. }
    ( X# H+ _! F. ~' D
  136. # X3 [9 S' X) [
  137. /*********************************************************************0 l4 ?2 n( z( R$ }5 l& {  M$ g7 ?
  138. *
    - p( e6 w' J4 S2 b! e
  139. *       Public code. ]1 J0 _2 s& [
  140. *
    ; `; `" ~7 |$ \, @% O& ]7 W
  141. **********************************************************************7 z2 w+ ?" O# v; K: }
  142. */
    ( f( u$ g' |7 u, n. c- |! g
  143. /*********************************************************************
    & K1 A. m. D. t4 k" B
  144. *; l5 R6 m6 N2 m; `) \% }
  145. *       MainTask! r- u7 A. v5 b. T$ Q; S% y
  146. */
    % `( a! H- R7 g) X7 P. h/ H
  147. void MainTask(void) {' E+ ?& V: Q1 T9 E2 [9 W
  148.   char acPath[200];
    5 }1 [9 _, H; Z' s0 S" u
  149. 3 d* a# N1 }$ x1 [; Q
  150.   GUI_Init();
    / s" ~8 T" x3 y9 ]( E. I+ X# ]* V
  151.   //
    % U' ?# {/ {4 u" i% d
  152.   // Set colors and text mode
    . N; [5 z9 w9 f+ I
  153.   //  ?3 b7 t! l; e8 Q/ x
  154.   GUI_SetBkColor(GUI_WHITE);
    8 C( E+ N. q; E7 V; Q" k
  155.   GUI_SetColor(GUI_BLACK);
    / H1 G: P  e  N& a& Z
  156.   GUI_SetTextMode(GUI_TM_TRANS);
    5 \% y* H  t$ C, J- [8 N+ B
  157.   //9 w# x9 [6 A* z; H% f0 P
  158.   // Get windows system directory and extend it with '\Font'(7)9 |* R7 E; F1 V, t, t/ f# K
  159.   //
    ) o9 q) g" O* W) Z& Y+ R" m% K! i0 d
  160.   GetWindowsDirectory(acPath, sizeof(acPath));8 E+ [" Y, |6 K( w& a
  161.   strcat(acPath, "\\Fonts");" y/ H4 s/ p: Y1 y+ ^
  162.   //, c) q8 y! O* F/ A& V; M9 e& N
  163.   // Iterate over files and call _cbFontDemo for each file: w; s9 V8 |& g  p
  164.   //6 `8 X! x5 T( |/ s6 k  Q1 l
  165.   while (1) {
    0 f$ ~  C8 V9 E+ N# n* ~5 n
  166.     _IterateOverAllFiles(acPath, "*.ttf", _cbFontDemo);
    " y+ Q4 z7 ^( C: F
  167.   }
    8 z+ N8 c& M7 g7 I2 O, b
  168. }
    7 A% u& c) k) h7 b% [- M

  169. ) a( h) G' ~% w0 g; _1 E$ I1 D' ~
  170. #endif
复制代码
1. 这个函数用于文本显示。
2. 函数:GUI_TTF_GetFamilyName 将返回字体文件中定义的字体系列名称
    函数:GUI_TTF_GetStyleName  此函数将返回字体文件中定义的样式名称 (粗体、常规等)
3. 用于字体的创建,注意字体的创建方法
4. 用于实现字体创建的函数,函数中两个成员介绍如下:
    GUI_TTF_CS
数据类型
元素
描述
GUI_TTF_DATA *
pTTF
指向包含要使用的字体文件位置和大小的GUI_TTF_DATA结构
PixelHeight
PixelHeight
新字体的像素高度。表示字形 “g”和 “f”之间周围矩形的高度。请注意,这并非两行文本之间的距离。换句话说,GUI_GetFontSizeY()返回的值与此值并不完全相同。
FaceIndex
FaceIndex
有些字体文件可能包含多种字体风格。对于多种风格,此索引指定使用基于零的风格索引来创建字体。通常为0。
    GUI_TTF_DATA
数据类型
元素
描述
const void *
pData
指向可寻址存储器区域中的TTF字体文件。
NumBytes
NumBytes
文件的大小 (字节)。
5. 字体演示主要运行的程序。注意函数GUI_TTF_DestroyCache 用于释放TTF缓存系统分配的所有内存并解除该缓存。
6. 通过这个程序实现电脑系统中矢量字体的轮番显示。
7. 获取电脑系统中字体存储的路径。
实际显示效果如下(这里只贴了一个截图)
22.4.png
- l# J) |% u% T, H
赞 收藏 1 评论15 发布时间:2015-1-31 11:26

举报

15个回答
baiyongbin2009 回答时间:2015-1-31 11:27:26
本帖最后由 baiyongbin2009 于 2015-1-31 11:29 编辑 ! s3 ?- e' r) K' x$ c

2 c4 i2 \) C' |, O! G3 v* L' E% G22.4 移植到开发板上显示" L( w* k' `+ ~' W, }# N, b3 V
; j; J7 j9 @4 }; m4 q) H
22.4.1 第一步:从官网下载矢量库22.4.2 第二步:添加到emWin工程中(MDK)
22.5.png
    添加上后需要再添加相应的工程路径:
22.6.png
22.4.3 第三步:修改Heap的大小
    由于要使用非emWin自带的molloc和free函数,下面是修改的位置和大小:
22.7.png
    这个地方一定得大点,要不字体无法显示。
22.4.4 第四步:主程序
  1. /*
    ' ~5 c" B& f' C$ Z3 l0 E. ]
  2. *********************************************************************************************************$ ]0 B( z: V9 H6 \8 B) Q) C7 U% X
  3. *        函 数 名: MainTask
    $ m2 Z* u  s& Y$ @
  4. *        功能说明: GUI主函数
    9 z6 L. c/ b: m' n0 l* U
  5. *        形 参:无
    4 F7 T  b4 b1 M0 e
  6. *        返 回 值: 无
    , ^! A3 m1 S; j, B
  7. *********************************************************************************************************8 R* g/ h: o: c( `
  8. */# w, c6 I% S3 \$ v
  9. void MainTask(void)
    ( e/ M/ g* T8 Y2 H! J; s
  10. {+ f, |2 S9 j+ v% b
  11. OS_ERR err;: j$ H$ O" l3 y' w" u
  12. char *_acBuffer;
    3 J& B  c' Q6 A3 }, [( P9 t1 E
  13. GUI_TTF_CS Cs0, Cs1, Cs2, Cs3;1 W" E% Y8 D+ _' M( x( l: S
  14. GUI_TTF_DATA Data;
    ( J2 Z: E% w* _; Q3 R4 h
  15. GUI_FONT Font0, Font1, Font2, Font3;  y2 N( Q" ]& ~' ?! g$ [
  16. GUI_HMEM hMem;
    ; A, ^% s, I) g/ r8 J+ Y8 ?
  17. " \- K0 b! w* \
  18. GUI_Init();
    & C0 o+ g9 A, j$ J
  19. GUI_SetBkColor(GUI_BLACK);
    + k, O2 }* ^& f. \
  20. GUI_SetColor(GUI_RED);
    0 {- B; m6 X" w* ]3 {8 I

  21. ' S0 p4 A( t) c
  22. /* 申请一块内存空间 并且将其清零 */ (1)
    1 g6 D6 W) G* e8 \
  23. hMem = GUI_ALLOC_AllocZero(1024*1500);( f4 M4 |) y/ J4 k% G  ~8 e% A8 d
  24. /* 将申请到内存的句柄转换成指针类型 */
    - I9 M8 W" ^' }
  25. _acBuffer = GUI_ALLOC_h2p(hMem);
    9 b. Z5 C8 b" I  V2 u& l- ~0 }
  26. /* 打开文件 */
    4 W+ ~% q" J& Q; o8 N: |
  27. OSSchedLock(&err);
    5 N1 n# M2 ?% _: `
  28. result = f_open(&file, "seg.ttf", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS); (2)
    # R. N, V# t4 a( E% V" S$ Z. q
  29. result = f_read(&file, _acBuffer, file.fsize, &bw);/ h! J( }: x! a7 f! B
  30. OSSchedUnlock(&err);
    ! i; O6 f: X! c! F; R
  31. % o% Z/ d$ m' \2 @
  32. /* Set parameters for accessing the font file */
    $ Z3 y0 x4 o' O6 \1 o% S8 Y
  33. Data.pData = _acBuffer; /* Address */
    $ Y9 |6 h) g4 H* h. h
  34. Data.NumBytes = file.fsize; /* Size */( F: C! Z. o/ }( M# _3 B7 ?
  35. $ H7 `2 S; q! }. Q( q
  36. /* Set creation parameters of first font */& j5 C3 v3 _! e) D3 P3 H9 W5 S
  37. Cs0.pTTF = &Data; /* Use address of GUI_TTF_DATA */1 ]4 i$ ]" [; y. P' P+ Y4 U
  38. Cs0.PixelHeight = 24; /* Pixel height */(3)
    ( x+ h1 _+ U  p! Q
  39. Cs0.FaceIndex = 0; /* Initialize to 0 */
      y( n3 |7 C8 W$ _- d* |9 T# E
  40. /* Set creation parameters of second font */8 {) Q  p2 `' X1 d; s
  41. Cs1.pTTF = &Data; /* Use address of GUI_TTF_DATA */
    8 N' R5 k3 ]2 l6 d; ]7 J# }  Q
  42. Cs1.PixelHeight = 48; /* Pixel height */5 c3 S) b6 g3 a. @& b/ |
  43. Cs1.FaceIndex = 0; /* Initialize to 0 */3 Z+ Y0 V+ p% \
  44. /* Set creation parameters of first font */
    8 ]0 j3 E3 ~" _
  45. Cs2.pTTF = &Data; /* Use address of GUI_TTF_DATA */& p7 `% g7 q' w' a: W
  46. Cs2.PixelHeight = 96; /* Pixel height */
    . [; R# z! \! i7 p) H4 p
  47. Cs2.FaceIndex = 0; /* Initialize to 0 */2 H3 g& L; \. f9 k; E/ @
  48. /* Set creation parameters of second font */% i( ~: T# P* t8 |$ S. _
  49. Cs3.pTTF = &Data; /* Use address of GUI_TTF_DATA */2 w. O: P# n0 R& D5 J  z9 @; X4 X
  50. Cs3.PixelHeight = 144; /* Pixel height */
    5 T; [, s" U$ m9 ?& s. X7 Z$ |
  51. Cs3.FaceIndex = 0; /* Initialize to 0 */
    " E# R, f7 ^7 I
  52. /* Create 4 fonts */( x/ |3 o' V& g4 V
  53. GUI_TTF_CreateFont(&Font0, &Cs0);(4); O* c' `$ l! [! B' T# R8 w8 G
  54. GUI_TTF_CreateFont(&Font1, &Cs1);
    $ h( d" N6 R( `! H' F
  55. GUI_TTF_CreateFont(&Font2, &Cs2);% m7 k! I  Q; ?
  56. GUI_TTF_CreateFont(&Font3, &Cs3);
    ; G- ^/ i6 X" W( h% \
  57. /* Draw something using the fonts */# \% f" i& S8 r2 o7 E
  58. GUI_SetFont(&Font0);) C% Z0 o; h  y0 Q* W
  59. GUI_DispStringAt("ABC1234", 0, 0);6 B1 `5 M) @2 [8 ?7 b
  60. GUI_SetFont(&Font1);% n6 K! `- E0 G5 h9 y! A
  61. GUI_DispStringAt("ABC1234", 0, 24);/ y: L, b7 s6 i) x/ B
  62. GUI_SetFont(&Font2);
    5 w) X2 \/ o1 G8 p
  63. GUI_DispStringAt("ABC1234", 0, 24+48);& c- d; d, z: \! a6 |) n0 G
  64. GUI_SetFont(&Font3);2 Y1 x8 ~+ n. B( }1 `. {
  65. GUI_DispStringAt("ABC1234", 0, 24+48+96);/ a' d6 {1 J; c8 @8 }
  66. GUI_DispStringAt("ARMFLY", 0, 24+48+96+144);
    $ ]6 z! w5 g4 e  Z! m" H
  67. while(1)
    8 M  A" v5 d: k8 e/ j$ e
  68. {
    % z$ f' r3 y# q6 O5 K1 J
  69. GUI_Delay(100);
    ) c* `/ y8 b4 L/ ~
  70. }) N, a/ ?& t7 w$ d
  71. : m) D+ j/ ^: H( {% @$ m1 [
  72. }
复制代码
1. 申请动态内存用于加载字库。
2. 将矢量字体从SD卡中加载到外接SRAM中。
3. 设置矢量字体点阵大小。
4. 创建四种大小的矢量字体。
22.4.5 第五步:矢量字体放到SD卡中
    由于汉字的矢量字体比较大,使用2MB的SRAM空间不够,这里使用从网上下载的米字体做为显示。
22.8.png
    放到SD卡后,在屏上的实际显示效果如下:
22.9.png
     特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示。
22.5 总结
    矢量字体就跟大家讲这么多,更多的知识可以研究下源码的实现。关于字体的显示截至到本期教程就算结束了。

2 I$ h  f* a; K/ q4 ^5 B3 K2 v. @
5 G" U0 G! |5 b+ M
时光碎了天 回答时间:2015-1-31 11:51:16
感觉很不错的
20091217083309-1058990770.jpg
MouseCat 回答时间:2015-1-31 12:17:18
强悍啊,收藏了
cxtarm 回答时间:2015-1-31 12:30:12
强悍 弃天帝签名.jpg
0 i# g7 K8 _* @
wyxy163@126.com 回答时间:2015-1-31 12:51:22
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-1-31 12:51:38
提示: 作者被禁止或删除 内容自动屏蔽
党国特派员 回答时间:2015-1-31 14:10:15
下来学习了
beian10 回答时间:2015-2-1 13:35:43
mark0668 回答时间:2015-6-28 23:18:22
谢谢分享,学习学习
yubinwu_3004964 回答时间:2015-10-15 20:15:38
做下记录,文章很有参考价值
wolfgang 回答时间:2015-10-15 22:35:22
强悍啊,收藏了
9robot 回答时间:2015-10-16 12:02:36
谢谢分享!!!
ruilimeng 回答时间:2015-10-21 11:45:36
好教程,谢谢分享。
eshui 回答时间:2015-10-21 11:54:11
非常不错!顶一个!!!
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版