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

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

[复制链接]
baiyongbin2009 发布时间:2015-1-31 11:26
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接6 f/ |8 H" \6 c- c6 {+ C
第22章 TrueType矢量字体

7 k% _+ b; |- _* H" a0 |
    本期教程跟大家讲解矢量字体的相关知识,矢量字体最大的好处就是可以任意放大或者缩小字体,而且字体的显示效果不失真。矢量字体的缺点就是不适合用在小型嵌入式系统中,极其消耗内存。
    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; L2 e3 l/ ~0 ~2 w0 _. W

  2. 9 h- {% {3 n% f8 ^# \
  3. #include <windows.h>; G# h) E0 n9 G  I+ g+ M$ Y
  4. #include <stdio.h>
    3 n3 y9 J6 f8 s0 q& U4 }, w' G
  5. #include "GUI.h"4 J/ }! q0 M% o4 c& N* D. |

  6. & A2 O9 e4 N9 u3 i- f3 c! t. W5 {! f
  7. /*********************************************************************$ i: a  P( ~1 e/ T) N+ J- G
  8. *
    0 n" n9 H: j6 o3 Z. Q; y, @
  9. *       Static data
    . [/ O$ k* K0 e& T) j
  10. *
    0 c1 l. ^- U) \# X3 d+ \7 Q
  11. **********************************************************************
    ' _1 s& `% s0 ~  _. |
  12. */
    + b8 j8 b9 z: t6 z5 ?( Y- N
  13. static unsigned     _aHeight  [] = {16, 20, 32, 48};   // Array of heights used to show text
    : i6 G, W, ^# a; a) W
  14. static GUI_TTF_CS   _aCS      [GUI_COUNTOF(_aHeight)]; // Each GUI font needs its own GUI_TTF_CS structure
    ) M8 h$ N0 b6 X) q# I" o0 L  F2 s: a
  15. static GUI_FONT     _aFont    [GUI_COUNTOF(_aHeight)]; // Array of GUI fonts
    8 W% Z9 o+ P5 S8 l8 o2 y
  16. static char         _acFamily [200];
    % O) D5 t! U" _7 ~
  17. static char         _acStyle  [200];
    . {! P, o4 L, j1 `6 G' R" q

  18. 0 v. s4 T7 X! N2 w
  19. /*********************************************************************
    2 Q2 F+ t7 y" I6 L7 l
  20. *$ P% b. q) G$ F7 O- R- i) U
  21. *       Static code
    ; Z3 ?  e8 c" W+ n- V" s
  22. *5 V& S' E+ p5 J* W1 V
  23. **********************************************************************
    . q+ z' n, Y) b0 V
  24. */8 V/ [$ k' E$ I' \) N/ w0 ~
  25. /*********************************************************************$ ^5 f6 O! _( ?8 w8 ?
  26. *5 Q* `+ j( d) \& V# n6 [
  27. *       _ShowText: B1 ]+ P5 t: e% R2 [# ?
  28. */
    6 p0 p1 \7 e2 C. N) D3 y
  29. static void _ShowText(void) {(1)
    + _6 e- }& l* [6 E/ _) u# X
  30.   int i;* F) D6 l2 }6 G3 ^1 s7 b" a
  31. 7 L6 w& n/ p9 ]3 R; a
  32.   GUI_Clear();
    " {; x5 e) I3 C; w5 U2 X
  33.   i = 0;4 x1 o; A- u+ O: ?
  34.   GUI_TTF_GetFamilyName(&_aFont[i], _acFamily, sizeof(_acFamily));(2)
      `. @, d1 k  q
  35.   GUI_TTF_GetStyleName(&_aFont[i],  _acStyle,  sizeof(_acStyle));
    3 \# B. W6 \! u; y
  36.   GUI_SetFont(&GUI_Font20_1);% O0 j9 K$ f* B3 v
  37.   GUI_DispString(_acFamily);1 A. c8 B5 }( |& ^! K2 e) ~
  38.   GUI_DispString(", ");
    " q" z+ g0 u* C7 X
  39.   GUI_DispString(_acStyle);
    2 H8 O# a) M- Z
  40.   GUI_DispNextLine();
    0 V" k' Z+ D6 r3 V; m; M
  41.   GUI_DrawHLine(GUI_GetDispPosY(), 0, 0xfff);% E" O4 G5 V3 W/ }( y+ |! K  {
  42.   GUI_SetFont(&_aFont[i]);
    % m5 I* Z5 n* o; H" \- f8 S
  43.   GUI_DispString("abcdefghijklmnopqrstuvwxyz\n");; V5 c4 W" l0 a0 c$ I/ E
  44.   GUI_DispString("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
    " u# G4 i+ k% l) r% }
  45.   GUI_DispString("123456789.:,;(:*!?')\n");- Z* M8 b  n6 @. [& \
  46.   GUI_DrawHLine(GUI_GetDispPosY(), 0, 0xfff);
    , t+ K# m8 A. x" l' A
  47.   for (i = 0; i < GUI_COUNTOF(_aHeight); i++) {; I4 n* K2 `3 }$ Q& W
  48.     GUI_SetFont(&_aFont[i]);% V2 n* l1 j, E6 ~) [7 G
  49.     GUI_DispString("The quick brown fox jumps over the lazy dog. 1234567890\n");- ~: Y( S0 ^# K+ X6 j5 B
  50.   }! \" @9 {  Y: H
  51.   GUI_Delay(1000);7 i8 J- T' k4 o" _
  52. }4 X% f0 g, k5 l; t  I, e7 Q

  53. 8 i' L' I2 H5 C+ ^9 J* A8 @3 ~  T
  54. /*********************************************************************
    " S$ \7 t3 `" A; v: _. w2 K
  55. *
    - e$ C/ e6 s$ w! B7 J. t
  56. *       _CreateFonts: ^6 \8 Y% V, h- K0 v: \# e
  57. */
    / r0 A; N2 I9 Y2 {) B4 a5 A
  58. static int _CreateFonts(const U8 * pData, U32 NumBytes) {(3)2 l" q" R; N1 K9 d- e/ a9 I3 B- L" Z
  59.   int i;, u& Y5 `3 ]. m! z2 S  t4 \+ K5 h
  60.   GUI_TTF_DATA TTF_Data;        // Only one GUI_TTF_DATA structure is used per font face* }: p5 x4 [$ k) d- V  y1 j. x
  61. - B7 [8 I+ z8 {0 u; |2 K
  62.   TTF_Data.pData    = pData;    // Set pointer to file data7 _+ q; B  J& \" g
  63.   TTF_Data.NumBytes = NumBytes; // Set size of file4 _  l- V- w) r$ ^  ^/ M5 H. ~' \
  64.   for (i = 0; i < GUI_COUNTOF(_aHeight); i++) {
    - W6 M* u3 q1 k% v. E
  65.     //
    / N0 I9 L% f% I1 D( v- R4 {
  66.     // Initialize GUI_TTF_CS members
    ! C) {/ ]  @5 @+ }$ H
  67.     //
    . r4 U& N8 B; ~  E& ^% a
  68.     _aCS[i].PixelHeight = _aHeight[i];6 s# U( J/ i+ ^; [5 y
  69.     _aCS[i].pTTF        = &TTF_Data;- H1 I' {2 w! _( s& m
  70.     //) Z3 r- v0 I; H' @% l4 j4 S3 ?
  71.     // Create GUI font
    ; O3 o5 ~6 [: C4 X0 i
  72.     //
    + o" }/ t! G% T/ G
  73.     if (GUI_TTF_CreateFont(&_aFont[i], &_aCS[i])) {(4)
    5 Y" \+ c1 o& c0 ^2 u# h
  74.       return 1;
    ' c/ ^0 s* i6 C7 x% j! N, H
  75.     }
    0 s: I! V0 o, ~. F
  76.   }
    ) y  ^/ t+ W, T2 r- p
  77.   return 0;% s; e6 G0 r, E
  78. }1 M3 b# S/ h& r

  79. ' v, n6 D( i* e+ N3 }
  80. /*********************************************************************
    7 V  _6 X$ E- b
  81. *
    5 O! R/ o& E" g
  82. *       _cbFontDemo
    . N7 ?( T4 [. i0 M) P5 }4 W. r
  83. *
    7 a) y6 B2 i7 ~
  84. * Function description& w4 Y# C1 h6 w0 `% r
  85. *   The function uses the given pointer to a true type font for creating
    0 P7 l1 S7 e& W* w$ e
  86. *   a couple of GUI fonts and showing the outline of the TTF font.
    + R% N- ~7 h9 A6 o! l7 {) I
  87. *, O3 c( x: q+ _8 j
  88. * Parameters:
    6 v" K) t. z) y& m# [
  89. *   pData    - Location of font file
    ( C" {& Q2 E: z4 ]! U
  90. *   NumBytes - Size of font file
    : r- f  H* p7 ]* G/ l& c* A
  91. */
    6 f2 G/ Z( u/ r: B" R6 I- L$ l
  92. static void _cbFontDemo(const U8 * pData, U32 NumBytes) {(5)( f0 r  c3 u, B
  93.   _CreateFonts(pData, NumBytes); // Create fonts
    6 @1 P9 X. W0 d6 J! ~
  94.   _ShowText();                   // Show some text
    ) X% |1 ?8 D- Z3 J
  95.   GUI_TTF_DestroyCache();        // Clear the TTF cache, P, e+ q1 m4 n5 {" d3 ]
  96. }+ U$ Z2 j  }0 n' t( [6 t( R. A

  97. 6 R) R# P( ]$ t8 D) K. e& v
  98. /*********************************************************************, a" n9 X2 o- C' m
  99. *
    ( n! {: I( Y5 m$ S) z  Z& P) m
  100. *       _IterateOverAllFiles; s3 C- p5 H" y0 k: K# Q" `' a! h
  101. ** ~3 T2 a" |& ?" S. [& z% ?1 j
  102. * Function description0 E5 l$ {2 y3 \: j
  103. *   The function iterates over all files of the given folder and the
    3 H) l% N! u" z8 B' G
  104. *   given mask, reads the contents of the file and calls the function
    ( {5 ~9 ?6 n" V  I1 b% P# j
  105. *   pfDoSomething() with location and size of file data.: A/ e/ B7 b: ?# g, k$ G
  106. *   Can be used under Win32 environment only.9 G# q  Z( h( D1 O4 y- {% G. s4 k1 s
  107. */! J! t2 M. ], }1 o+ _
  108. static void _IterateOverAllFiles(const char * sFolder, const char * sMask, void (* pfDoSomething)(const U8 * pData, U32 NumBytes)) {(6)
    ; M/ ?9 R' ?% |* g, I* N4 U
  109.   GUI_RECT Rect = {0, 10, 1000, 1000};8 }8 q1 n" Z  ]  h; B& C
  110.   char              acMask[_MAX_PATH];
    * F" h. o  ^. u7 \. \9 f
  111.   char              acFile[_MAX_PATH];. ^6 N3 T* j1 ]" q3 `% {1 D6 k) A
  112.   WIN32_FIND_DATA   Context;% w) |6 m& ?! X7 ~- U
  113.   HANDLE            hFind;
    " h3 p; ~2 b1 P) D: h8 {9 ~9 G
  114.   HANDLE            hFile;
    8 c7 @+ M# s9 m3 n
  115.   U8              * pData;0 E  o2 ?  \+ U
  116.   DWORD             NumBytes;# z, S* T: Z+ J! |! I( D
  117.   DWORD             NumBytesRead;
    7 h& ]$ E8 c! D

  118. 9 z* Y) `9 P4 p6 G( Y, k6 F" N
  119.   sprintf(acMask, "%s\\%s", sFolder, sMask);" |$ a3 }( i. D% m: }* w  e
  120.   hFind = FindFirstFile(acMask, &Context);" f2 P8 K' }) f4 c
  121.   if (hFind != INVALID_HANDLE_VALUE) {# m: M+ d& ~3 T8 L. y+ p
  122.     do {! f" b6 V; b6 @' O
  123.       sprintf(acFile, "%s\\%s", sFolder, Context.cFileName);. v! C& A! O$ w
  124.       hFile = CreateFile(acFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);- ]# L' }) R( e$ T& a0 ?
  125.       if (hFile != INVALID_HANDLE_VALUE) {2 ^0 V& L9 o9 D5 U  p4 V
  126.         NumBytes = GetFileSize(hFile, NULL);. }3 H. X7 T) q1 y  u' U
  127.         pData = (U8 *)malloc(NumBytes);6 X" O# l6 X1 o) e: D
  128.         ReadFile(hFile, pData, NumBytes, &NumBytesRead, NULL);
    4 p5 }; T+ a0 _8 ~9 Y. s2 A% S
  129.         pfDoSomething(pData, NumBytes);
      \: _0 j. V' f% z  b
  130.         free(pData);
    ! P$ I9 r- K2 {
  131.       }7 m$ C# i" G; O9 w8 O
  132.       CloseHandle(hFile);; R; q4 |% q$ O- q! \: C
  133.     } while (FindNextFile(hFind, &Context));
    3 V4 y8 p0 ?% l
  134.   }& b  a0 M4 x. ]. L/ f1 B( Y) ]
  135. }& I$ e$ `; e  i- P- L! P

  136. - Z* f' W* j; |* ^, U% w
  137. /*********************************************************************, P3 b2 M9 Z: {+ ^/ ^* i; [$ y; Z
  138. *
    # o$ ?( F2 h8 z- n# x0 H* Z- d/ G" _
  139. *       Public code' O3 o; J! a% g8 R
  140. *
    # I( g' ]. M- Y' C- X( b% J
  141. **********************************************************************+ m2 l# h3 @' J, y$ `) o& ~8 T
  142. */
    # Q7 Z* s( T% I
  143. /*********************************************************************: T3 H# h5 m7 Y4 M7 ^1 j
  144. *2 ?  b9 U# T/ i% O& ]" z# p5 J' E  B
  145. *       MainTask. n) u) _  h) }% H. S7 M
  146. */
    / b' `2 u, M. z: G' t/ W# E
  147. void MainTask(void) {) C% ^5 g3 Z3 d( X6 A
  148.   char acPath[200];7 l" v+ b# s' t7 y# Z" O
  149. & r. i1 I% P2 i
  150.   GUI_Init();
    - c! E+ [3 q9 B. y6 H% x
  151.   //1 f. ]8 T5 t' I: R( l" n$ Y/ \7 U, x
  152.   // Set colors and text mode2 ^* c5 ^7 N0 F3 e, m/ G
  153.   //
    & {: r! y: s. J4 p3 w9 [- M
  154.   GUI_SetBkColor(GUI_WHITE);
    4 P4 b; m& H0 F: |6 K3 O
  155.   GUI_SetColor(GUI_BLACK);
    / d6 L1 Z( c7 O' {
  156.   GUI_SetTextMode(GUI_TM_TRANS);
    : Y+ B( {9 R7 I, |  _8 z' Q, [0 v7 N
  157.   //% u2 N1 w/ ~% \
  158.   // Get windows system directory and extend it with '\Font'(7)
    3 A$ y6 g8 o  k; X/ }
  159.   //
    , b! L" U" _# W' t- _$ V  t
  160.   GetWindowsDirectory(acPath, sizeof(acPath));
    # S( Y5 H3 z* J' ]4 C6 [' z( o
  161.   strcat(acPath, "\\Fonts");" F' ~/ A, E) _8 b4 P
  162.   //" R0 g: x. Y% E& U5 W3 [
  163.   // Iterate over files and call _cbFontDemo for each file" p+ e4 V2 p/ G
  164.   //
    6 A: C/ S* O5 C
  165.   while (1) {; S/ x1 {8 Q( a6 S( E# l4 R
  166.     _IterateOverAllFiles(acPath, "*.ttf", _cbFontDemo);, ~% z8 C8 J& L% c6 c# E* ^0 U; v: j% c
  167.   }
    9 g, n/ Z7 H! j; B# @* W% l
  168. }( i: G9 {8 n8 O. R0 l3 k
  169. ! ]# T2 |0 r, q! \7 X! y
  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
% e8 C3 L  R# I5 `% b( m3 T+ A
收藏 1 评论15 发布时间:2015-1-31 11:26

举报

15个回答
baiyongbin2009 回答时间:2015-1-31 11:27:26
本帖最后由 baiyongbin2009 于 2015-1-31 11:29 编辑 8 v4 O' y7 {& q$ ^
% D# [7 J" c1 t+ Z: f
22.4 移植到开发板上显示5 f7 h2 v' {" O/ u+ }" F& O
  ^: _1 L7 F% `
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. /*
    : t4 @4 H9 O- G( [# s# B/ h
  2. *********************************************************************************************************" I& t) o3 {) h' M) w. f* v7 F
  3. *        函 数 名: MainTask
    + m5 ^, C# V8 j* h/ p1 t  r8 o/ P# Z
  4. *        功能说明: GUI主函数
    : K$ S1 G, P( O9 F# Z
  5. *        形 参:无( K4 L( e% z) S9 r0 v2 c
  6. *        返 回 值: 无8 H2 u9 `) }$ I
  7. *********************************************************************************************************
    + d  y" U! M; v) _  y: F
  8. */1 R3 `6 e9 m# r' W5 l  M
  9. void MainTask(void) 3 u/ V- ~% o' _+ V( @. Q
  10. {
    $ U& x/ v! P+ p3 W0 {9 \! g
  11. OS_ERR err;8 f2 |/ G, \5 R
  12. char *_acBuffer;4 M0 f! f7 P4 Q4 _  N
  13. GUI_TTF_CS Cs0, Cs1, Cs2, Cs3;
    ( t, q, A, p8 N7 \7 Y  g; P
  14. GUI_TTF_DATA Data;
    ' r) g! |7 _8 V( D8 w# ?
  15. GUI_FONT Font0, Font1, Font2, Font3;7 u" E9 B2 H) z% W4 T7 x
  16. GUI_HMEM hMem;
    3 x( u+ @- P8 G% Y# |' F" q8 A3 c

  17. ! l4 y9 n; K9 A, |0 u% r
  18. GUI_Init();
    6 M  R# i3 z) a
  19. GUI_SetBkColor(GUI_BLACK);" t+ A8 W+ d, N& P9 d1 p
  20. GUI_SetColor(GUI_RED);
    - ~1 b9 {3 I7 V7 H

  21. ' e4 I! R) s2 ?
  22. /* 申请一块内存空间 并且将其清零 */ (1)
    1 G6 @( C2 h/ w  o1 _
  23. hMem = GUI_ALLOC_AllocZero(1024*1500);; {% e0 v9 N$ R
  24. /* 将申请到内存的句柄转换成指针类型 */
    1 {! r4 o! b! a+ ~% N
  25. _acBuffer = GUI_ALLOC_h2p(hMem);2 _9 n; s, W0 V
  26. /* 打开文件 */
    # F! ^& m4 y5 ^$ p
  27. OSSchedLock(&err);9 F8 J+ \% H4 ?" C! F" N
  28. result = f_open(&file, "seg.ttf", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS); (2)7 T8 C- s, q  R7 X$ x# L
  29. result = f_read(&file, _acBuffer, file.fsize, &bw);
    ( t' W7 Z6 M9 u8 t; U0 k+ L+ b
  30. OSSchedUnlock(&err);
    ( N2 @3 G% i% Z- X& T

  31. . J; H, `7 ]  v2 _! ]" n2 }
  32. /* Set parameters for accessing the font file */5 q  E1 \" [- M. D, K! i/ A
  33. Data.pData = _acBuffer; /* Address */9 e4 e. _3 q8 Z8 r( t
  34. Data.NumBytes = file.fsize; /* Size */
    6 E8 U0 f: m$ Z, o

  35. ! C# _7 y; _  n7 C
  36. /* Set creation parameters of first font */
    9 T# L$ |/ d# j( q# u& ~" W1 L: n, q" p
  37. Cs0.pTTF = &Data; /* Use address of GUI_TTF_DATA */, L. }( X% y/ d2 j. h* d# }
  38. Cs0.PixelHeight = 24; /* Pixel height */(3)  k6 C1 Y: I! C7 C, M6 \$ ^" t8 j
  39. Cs0.FaceIndex = 0; /* Initialize to 0 */
    9 N6 @3 P/ E; [2 n6 \' |
  40. /* Set creation parameters of second font */
    7 k; q( p; j! h+ W2 D5 B
  41. Cs1.pTTF = &Data; /* Use address of GUI_TTF_DATA */! F$ M0 P6 g3 I
  42. Cs1.PixelHeight = 48; /* Pixel height */+ l" Z6 h" D& `3 }% W" @5 [' T
  43. Cs1.FaceIndex = 0; /* Initialize to 0 */4 E" o3 E$ U& E+ i
  44. /* Set creation parameters of first font *// i; ~. Z3 I6 O3 c6 R8 \5 _) [. J
  45. Cs2.pTTF = &Data; /* Use address of GUI_TTF_DATA */( D8 k9 r: I$ t
  46. Cs2.PixelHeight = 96; /* Pixel height */2 N$ T4 k6 ?& h
  47. Cs2.FaceIndex = 0; /* Initialize to 0 */
    6 t# {* @, J5 j% w, X0 C
  48. /* Set creation parameters of second font */" T, T4 S9 ?; l5 N% d
  49. Cs3.pTTF = &Data; /* Use address of GUI_TTF_DATA */
    ' B  Z) [  l8 W, I4 P* \
  50. Cs3.PixelHeight = 144; /* Pixel height */
    + _, |  h) k5 B% [# P
  51. Cs3.FaceIndex = 0; /* Initialize to 0 */
    , {, P) A$ h; [7 l5 i4 J5 T: @
  52. /* Create 4 fonts */
    - s. k4 R5 c( {1 Y3 b, h# T, J0 y
  53. GUI_TTF_CreateFont(&Font0, &Cs0);(4)
    2 M0 n, o9 h! V1 m, ?4 N
  54. GUI_TTF_CreateFont(&Font1, &Cs1);+ G. I2 B% Q# ~# _2 e. s
  55. GUI_TTF_CreateFont(&Font2, &Cs2);; r% F  _8 a# W3 ~2 M! g
  56. GUI_TTF_CreateFont(&Font3, &Cs3);3 l7 @- |2 s0 [$ ^  a5 Q+ g
  57. /* Draw something using the fonts */2 p' F4 s# `/ F7 Z2 H) G
  58. GUI_SetFont(&Font0);
    4 S$ [+ m1 X; |, S
  59. GUI_DispStringAt("ABC1234", 0, 0);  I- m  l9 t' }  [8 h, J0 t
  60. GUI_SetFont(&Font1);
    ! X4 e( I4 j! c7 {
  61. GUI_DispStringAt("ABC1234", 0, 24);9 K3 i& O  j5 ~. \! n- X3 u
  62. GUI_SetFont(&Font2);7 E' m$ d  y6 [4 T; L& `, `4 L
  63. GUI_DispStringAt("ABC1234", 0, 24+48);
    , j4 E$ j/ u1 ~. K. R+ k8 j
  64. GUI_SetFont(&Font3);, L3 |& i7 W) b) k  k1 p5 N9 k
  65. GUI_DispStringAt("ABC1234", 0, 24+48+96);
    ) W* t1 q. E: N: K
  66. GUI_DispStringAt("ARMFLY", 0, 24+48+96+144);
    $ n- P- Q$ Z; U# d: g- _) }$ K
  67. while(1)) r  q+ m$ ~* E
  68. {
    ! K, t; ]; Z0 L9 ^! h
  69. GUI_Delay(100);
    & C# u# `- |5 Y1 l6 J  r
  70. }
    6 d( W' F+ E# i0 @) F6 d: p" p: V

  71. $ m; d# s7 P& o' E: k- q( A8 G
  72. }
复制代码
1. 申请动态内存用于加载字库。
2. 将矢量字体从SD卡中加载到外接SRAM中。
3. 设置矢量字体点阵大小。
4. 创建四种大小的矢量字体。
22.4.5 第五步:矢量字体放到SD卡中
    由于汉字的矢量字体比较大,使用2MB的SRAM空间不够,这里使用从网上下载的米字体做为显示。
22.8.png
    放到SD卡后,在屏上的实际显示效果如下:
22.9.png
     特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示。
22.5 总结
    矢量字体就跟大家讲这么多,更多的知识可以研究下源码的实现。关于字体的显示截至到本期教程就算结束了。
1 s2 e9 [0 G- _6 I
. W- ^* H4 ?' V" I0 }& `, ?
时光碎了天 回答时间:2015-1-31 11:51:16
感觉很不错的
20091217083309-1058990770.jpg
MouseCat 回答时间:2015-1-31 12:17:18
强悍啊,收藏了
cxtarm 回答时间:2015-1-31 12:30:12
强悍 弃天帝签名.jpg
) F6 Y0 Y- e/ A7 ^0 l( J- ?! G2 w, u
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版