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

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

[复制链接]
baiyongbin2009 发布时间:2015-1-31 11:26
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
: z/ J/ F. A! z) p. ]3 k
第22章 TrueType矢量字体
% l+ q! f3 w* q  V: k0 i6 t
    本期教程跟大家讲解矢量字体的相关知识,矢量字体最大的好处就是可以任意放大或者缩小字体,而且字体的显示效果不失真。矢量字体的缺点就是不适合用在小型嵌入式系统中,极其消耗内存。
    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# A+ Y1 u6 ]  v% l6 D: O7 H( x( \
  2. - F" d9 P+ H" H/ r- h5 q* K: v2 u
  3. #include <windows.h>
    5 r7 H' c4 T! O$ L) w& O/ v
  4. #include <stdio.h>
    2 J! k+ g# C, X* F. k4 v
  5. #include "GUI.h"
    ! x; k1 Z: m0 i' Z# o$ i

  6. 9 S4 Z* V3 g: p8 ~& M2 G
  7. /*********************************************************************% U4 j' }4 u' X3 q0 ?) H$ A
  8. *
    3 y" m- r: ]  @0 V! {
  9. *       Static data4 D- }1 K& V+ i
  10. *
    & j3 d: B" ?- v$ u
  11. **********************************************************************
    4 t+ R# L- Q3 I& i- V+ S- u
  12. */
    : V# E+ @4 |, X% K4 |% d
  13. static unsigned     _aHeight  [] = {16, 20, 32, 48};   // Array of heights used to show text* Y: V% L6 M  L/ S
  14. static GUI_TTF_CS   _aCS      [GUI_COUNTOF(_aHeight)]; // Each GUI font needs its own GUI_TTF_CS structure
    & H" J  u# p- o
  15. static GUI_FONT     _aFont    [GUI_COUNTOF(_aHeight)]; // Array of GUI fonts
    , l" g0 s6 P- H/ R7 M8 E; R
  16. static char         _acFamily [200];/ ?: H6 u7 U; t+ i4 B* l
  17. static char         _acStyle  [200];
    * c. z0 `  \0 i

  18. 8 Y9 r! p6 A4 k* p; h8 a
  19. /*********************************************************************
    ( S6 F8 E. v4 ~8 N
  20. *0 H5 l; E6 M% {" ?: ~+ `
  21. *       Static code
    % n6 P! x9 T3 M" \- h* Q' F
  22. */ N0 y* x- k1 o( `; T
  23. **********************************************************************
    1 _8 U% U1 @( [" ^0 v
  24. */) S( a/ g+ t' {; u+ X
  25. /*********************************************************************
    3 D3 Q% p& t" v  m; a% l
  26. *
    0 R4 ^- C8 l/ Q! ^& A- K
  27. *       _ShowText
    # O' I- i! ]8 W5 W$ r
  28. */
    ; i1 V7 G) P  ^% }' ]& A, p
  29. static void _ShowText(void) {(1)- T7 ^) O6 }! q+ @  L8 O  i
  30.   int i;
    * r. c, X9 ~- [. L. X5 ~( h$ k

  31. 8 O! O: b! y. V  S7 ]3 R8 ?
  32.   GUI_Clear();
    ( s$ |1 Z" Q  g4 n/ |* Q+ O3 t
  33.   i = 0;
    ; [" ]6 y( S( x- S( q, z
  34.   GUI_TTF_GetFamilyName(&_aFont[i], _acFamily, sizeof(_acFamily));(2)7 L  B9 X4 `* d0 a. W' w/ @
  35.   GUI_TTF_GetStyleName(&_aFont[i],  _acStyle,  sizeof(_acStyle));
    # _5 N  X. e* o8 `: ^
  36.   GUI_SetFont(&GUI_Font20_1);
    1 z, `$ n! ~8 [1 y
  37.   GUI_DispString(_acFamily);
    ; C$ L, E( M7 v6 N
  38.   GUI_DispString(", ");
      x1 O0 C  x2 o2 F& L
  39.   GUI_DispString(_acStyle);2 a! a: g/ }! E
  40.   GUI_DispNextLine();6 b0 h4 m/ @  z) O; i  ]' U* s
  41.   GUI_DrawHLine(GUI_GetDispPosY(), 0, 0xfff);
      z# b2 Y& ^% }$ z% W
  42.   GUI_SetFont(&_aFont[i]);
    6 C% A6 `1 y* P; o  g3 Y1 t" @# i
  43.   GUI_DispString("abcdefghijklmnopqrstuvwxyz\n");2 L% r$ }9 M5 @# c. N5 y
  44.   GUI_DispString("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");0 H0 ]) d9 L! A- j% Q8 V
  45.   GUI_DispString("123456789.:,;(:*!?')\n");
    . w% \5 k+ m% Q7 J: @8 K8 k8 V
  46.   GUI_DrawHLine(GUI_GetDispPosY(), 0, 0xfff);
    6 Z" U$ \0 P$ {9 G/ N- c6 z
  47.   for (i = 0; i < GUI_COUNTOF(_aHeight); i++) {& O! {( I' P1 l& C# [! X" i
  48.     GUI_SetFont(&_aFont[i]);
    2 t3 Z- X2 u) Y% ]  Y: ?- Y7 k
  49.     GUI_DispString("The quick brown fox jumps over the lazy dog. 1234567890\n");
    ; I! @: E, W+ I; L: r) x0 ?
  50.   }/ J9 x$ u- k% o# ?" q) [3 N
  51.   GUI_Delay(1000);$ \( a/ M& _% M  C8 y  G
  52. }7 \; ?% F' [" b* R1 q

  53. 9 p$ T8 M; I) Z5 q4 o2 ^/ a% R
  54. /********************************************************************** e5 t7 n- z6 T6 }/ u) O
  55. *
    6 q4 t7 B& s- ?" ~& i$ u) h
  56. *       _CreateFonts5 Q; b4 R$ k( d( i$ c2 r( Z4 q
  57. */6 g6 e+ F+ d& B/ t5 U
  58. static int _CreateFonts(const U8 * pData, U32 NumBytes) {(3)
      H" M, E3 Z& X8 ~+ x* q
  59.   int i;
    ; P3 v* w" E" \3 D
  60.   GUI_TTF_DATA TTF_Data;        // Only one GUI_TTF_DATA structure is used per font face
    ; l( L6 ?  T9 p- T

  61. - R2 t0 g- p; _2 ^% c# W, _8 ^/ }1 @
  62.   TTF_Data.pData    = pData;    // Set pointer to file data
    $ u$ i- r$ y* E0 B- M  s4 R1 G7 s
  63.   TTF_Data.NumBytes = NumBytes; // Set size of file
    8 Q1 K2 f4 [) O5 y. c, @
  64.   for (i = 0; i < GUI_COUNTOF(_aHeight); i++) {) f+ d/ f# h  |5 g
  65.     //$ I  {# o0 f$ D. z/ O
  66.     // Initialize GUI_TTF_CS members
    ! ^: Z( K$ E7 e; t
  67.     //: h6 v- H' V' V  X& d' ^/ V- C# T
  68.     _aCS[i].PixelHeight = _aHeight[i];- K3 A( i9 C, W6 k2 S
  69.     _aCS[i].pTTF        = &TTF_Data;
    * [. B. _8 o0 n  Q* U
  70.     //
    ! y6 f5 F! ~4 [" N) z# {
  71.     // Create GUI font
    , n4 Q: p" r4 ?" ^, s
  72.     //( W+ F$ X2 F7 p+ k
  73.     if (GUI_TTF_CreateFont(&_aFont[i], &_aCS[i])) {(4)
    8 c& c1 m  S% x- G' g  C
  74.       return 1;
    % U* T5 V8 Y5 P6 \0 N6 G
  75.     }4 Q3 s* w* e2 @& S
  76.   }+ |- n8 @, O5 s1 d
  77.   return 0;6 n% G( `1 y8 D1 @" d0 `
  78. }
    5 M8 F7 F7 m0 B9 L
  79. & b5 f% n8 ?  o& k, M
  80. /*********************************************************************. P' w* G1 V* C7 o6 t* k: H
  81. *
    " ~" z4 v4 f) u2 x6 H% Q
  82. *       _cbFontDemo" O, h% T+ m6 @7 H4 g8 R
  83. *' v) ~1 {6 [7 e# v( J
  84. * Function description
    ; n0 q# h" |) h) `4 n+ c7 T0 f
  85. *   The function uses the given pointer to a true type font for creating
    " g/ v! D" V" q- G1 ~- o
  86. *   a couple of GUI fonts and showing the outline of the TTF font.
    7 p/ V2 W3 c4 @  `4 X7 B. B
  87. *$ Y* R( T: q; k4 g+ b2 B0 d) R
  88. * Parameters:4 P* m1 b& e+ {: `9 P* }8 q; V5 _2 |
  89. *   pData    - Location of font file2 d9 U2 ^; N" a2 ^
  90. *   NumBytes - Size of font file
      A! l) x. D1 W1 l+ E
  91. */# Z$ G( r7 N/ p) r  y+ _7 D
  92. static void _cbFontDemo(const U8 * pData, U32 NumBytes) {(5)3 L' Y# k. K, q
  93.   _CreateFonts(pData, NumBytes); // Create fonts
    3 Y; T( C3 x: b' z6 o
  94.   _ShowText();                   // Show some text# n# d( Y* n% H1 E$ W
  95.   GUI_TTF_DestroyCache();        // Clear the TTF cache
    # X( Z+ h" Q! F1 v3 O2 x% p
  96. }
      [  @: s2 A! e. K. ]* H
  97. 5 F( r/ S" C, u0 g0 N* \
  98. /*********************************************************************
    / `4 ]( A% H( d
  99. *
    4 U: H' V( ^2 n: Y
  100. *       _IterateOverAllFiles
    2 |2 C0 y% ?& X& k! |$ _  A; E: V+ d
  101. *
    " b  g( x( b* \' _
  102. * Function description
    ! G# {& O! {* W5 ]& v$ i
  103. *   The function iterates over all files of the given folder and the
    ' u$ V- b6 b- ?/ j9 y, `
  104. *   given mask, reads the contents of the file and calls the function
    4 ?8 b5 M$ ~: D" R2 _: g
  105. *   pfDoSomething() with location and size of file data.8 U( w; Q7 d" [9 K3 C! w2 K8 D$ ]( y
  106. *   Can be used under Win32 environment only.
    5 P+ ~4 C9 m8 y! @. e- ~/ g
  107. */
    ) g6 ^$ L8 V5 {
  108. static void _IterateOverAllFiles(const char * sFolder, const char * sMask, void (* pfDoSomething)(const U8 * pData, U32 NumBytes)) {(6)7 B& e" ?$ w8 ?1 b4 ^
  109.   GUI_RECT Rect = {0, 10, 1000, 1000};
    : J( M) i  p, T1 [- |: y
  110.   char              acMask[_MAX_PATH];
    + c4 g: [7 L' L
  111.   char              acFile[_MAX_PATH];
    % a- I+ h. w! `8 a
  112.   WIN32_FIND_DATA   Context;1 I" k# g, A8 R+ G' }# K$ t# w# D
  113.   HANDLE            hFind;* p# ~# o9 p# Y/ H" L, c
  114.   HANDLE            hFile;( X" ^* f- O  l- W
  115.   U8              * pData;* C0 ~6 B" n) K
  116.   DWORD             NumBytes;
    ! Q3 j  ~+ Z0 D
  117.   DWORD             NumBytesRead;6 G! M: k+ F( F( K5 j  ~$ y
  118. - H4 ~1 d+ K& J/ c9 b9 z
  119.   sprintf(acMask, "%s\\%s", sFolder, sMask);
    , n3 Z; p2 @/ F
  120.   hFind = FindFirstFile(acMask, &Context);& H7 [: @. _% p5 M0 b% [( [$ j
  121.   if (hFind != INVALID_HANDLE_VALUE) {
    1 x1 ]1 A) @0 r& U5 X" [- l" X
  122.     do {: w( J7 X0 P# n$ Z$ n! F
  123.       sprintf(acFile, "%s\\%s", sFolder, Context.cFileName);
    / ^- T" F8 f) i( d1 {
  124.       hFile = CreateFile(acFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);. C% @7 n# j  S- S  Q" ~7 C4 C5 ~
  125.       if (hFile != INVALID_HANDLE_VALUE) {6 D0 ~1 W5 V5 g, W1 y: h
  126.         NumBytes = GetFileSize(hFile, NULL);& n2 s) s  O) I+ I0 ?
  127.         pData = (U8 *)malloc(NumBytes);! [! U; D  ?7 n" N6 i1 Y, V
  128.         ReadFile(hFile, pData, NumBytes, &NumBytesRead, NULL);4 |5 e+ h$ U* f+ ?* I
  129.         pfDoSomething(pData, NumBytes);
    ; C$ j6 o% H  O% w9 Q
  130.         free(pData);" Y; q+ S. J2 p) j. t7 k
  131.       }; A7 n0 X$ ^7 `. C6 k. R, C
  132.       CloseHandle(hFile);+ C) F6 n- o' P$ l
  133.     } while (FindNextFile(hFind, &Context));
    : ~0 ^& m5 z2 s
  134.   }' s3 W6 I6 i$ Y/ A$ p
  135. }
    ( q/ g. v9 ?: L! Z: \/ `

  136. 1 e0 p4 s4 Z! g- j3 L, e
  137. /*********************************************************************
    3 f* F' w( {/ c4 p8 \
  138. *+ ~; N6 L3 {8 @8 ^1 b
  139. *       Public code$ U& d; o- Y" o; Y7 D
  140. *$ A: B6 u' v) o0 w
  141. **********************************************************************
    & Z# d9 {2 k6 H- P* K7 p, Z( ^
  142. */
    0 Q; y: I0 r; T! q1 }
  143. /*********************************************************************
    " l2 d5 o2 s- V$ Z' v' S6 L
  144. *
    - Q8 ]' t4 S& C# ]" b. ~2 j! V6 j$ F* b
  145. *       MainTask
    0 I, h( Y" ]1 l% [5 ]2 I  F/ H
  146. */& ~; _& f9 |6 W7 ^
  147. void MainTask(void) {
    ! F% S' z' ^0 q! e  l8 K, {4 f. P
  148.   char acPath[200];. E2 p& |. _/ q0 {( q; \8 j
  149. ! B: j4 R1 g, O
  150.   GUI_Init();& `; E% j6 b9 @% L3 d
  151.   //
    1 C2 y7 N$ A1 G0 J7 O7 i* n2 {4 L
  152.   // Set colors and text mode7 W7 S1 n7 v+ S) |- r2 Y
  153.   //# E9 r% U" \1 U* S: u: l
  154.   GUI_SetBkColor(GUI_WHITE);
    " B9 ]3 y. ?, c/ s4 P( t
  155.   GUI_SetColor(GUI_BLACK);
    , Y. P! L5 q$ E0 v: f
  156.   GUI_SetTextMode(GUI_TM_TRANS);/ ~! f& [( A. A3 W. P
  157.   //
    ; Y( p+ \' ^) _* }) X
  158.   // Get windows system directory and extend it with '\Font'(7)' l, |  `$ p* M6 K  L9 ?2 M4 q
  159.   //
    ( Y5 R9 a* A# h: g7 _7 b# ]
  160.   GetWindowsDirectory(acPath, sizeof(acPath));; m5 S) }' y9 `/ u2 e0 m
  161.   strcat(acPath, "\\Fonts");
    , x  v3 N( F" A$ r6 ^  C# l2 `
  162.   //+ V  i7 }! W5 A" L. ?% c: X
  163.   // Iterate over files and call _cbFontDemo for each file& B! ~7 j( Z; u
  164.   //. Z2 O# }/ G5 t5 f4 n
  165.   while (1) {, S( u+ o: @$ Y# i( N# u
  166.     _IterateOverAllFiles(acPath, "*.ttf", _cbFontDemo);, F* ]3 f0 U9 O4 ?+ ?$ U  `1 E
  167.   }
    & D/ Y1 J8 w1 O! s$ L4 C
  168. }0 v% q0 s# D9 r* d. s* W

  169. & W) ^2 Z8 N/ D4 F9 f
  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

3 a5 L# T# @6 v* @+ R- E& s$ A
赞 收藏 1 评论15 发布时间:2015-1-31 11:26

举报

15个回答
baiyongbin2009 回答时间:2015-1-31 11:27:26
本帖最后由 baiyongbin2009 于 2015-1-31 11:29 编辑 ; n6 k1 @( f& i3 [4 q/ O" H" h5 v
* Q0 {9 ]5 o" u/ v) C0 P
22.4 移植到开发板上显示% ?/ P$ g! U- n1 n( Y- g: _1 L

0 X+ u5 U! U* h22.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. /*
    , o1 V6 [- g# _) a  X/ h3 ^
  2. *********************************************************************************************************
    ' g/ M% V" T6 f- T
  3. *        函 数 名: MainTask
    1 ~8 i2 ~" B7 X  g
  4. *        功能说明: GUI主函数
    6 N" p' O7 {3 V. s% y  n" z& H
  5. *        形 参:无
    " T  {( X) I$ Z, a& ?- s
  6. *        返 回 值: 无
    " }8 {" z8 M9 m
  7. *********************************************************************************************************
    $ e! u1 S% L/ S# B# s8 S
  8. */% G2 n9 d. H: y8 \7 z
  9. void MainTask(void) / Z) w0 p& I+ b5 `$ g9 [" l6 X3 }
  10. {% y" }; t* u4 j& ^( O
  11. OS_ERR err;' O; v, p4 [$ P- `9 Q
  12. char *_acBuffer;
    $ t6 @: \1 j+ p2 |( H
  13. GUI_TTF_CS Cs0, Cs1, Cs2, Cs3;
    4 E+ ]$ B/ p5 }- f; `
  14. GUI_TTF_DATA Data;
    * r. f" Z0 v+ @2 ?
  15. GUI_FONT Font0, Font1, Font2, Font3;
      |. L" Y* _  B3 ^. W" `3 ?3 d
  16. GUI_HMEM hMem;9 T/ W) A5 Z6 f5 S  ]: o; N( b

  17. 2 }2 i9 ~; r6 V' r( A
  18. GUI_Init();
    * A/ \& v6 b3 s* ]) P- J6 X  }
  19. GUI_SetBkColor(GUI_BLACK);
    . Q8 |6 w( V! M: l9 k6 q
  20. GUI_SetColor(GUI_RED);7 P/ o2 ]3 z5 X1 k
  21. % ]3 w% W* L2 c- j0 a2 f
  22. /* 申请一块内存空间 并且将其清零 */ (1)
    2 ?. |7 D& N  }/ g3 g) y
  23. hMem = GUI_ALLOC_AllocZero(1024*1500);
    4 w( ^$ n! V" I; c, r; |7 t
  24. /* 将申请到内存的句柄转换成指针类型 */
    ) f4 y: G/ B9 r) N2 f0 o
  25. _acBuffer = GUI_ALLOC_h2p(hMem);- |$ {, q  N0 K: `
  26. /* 打开文件 */3 g+ t8 z- z1 Z/ }! s  p" Q
  27. OSSchedLock(&err);  K! k7 S  D: v& S3 Q8 z3 {4 w
  28. result = f_open(&file, "seg.ttf", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS); (2)
    ( o: S9 X) l& l: H$ J( q
  29. result = f_read(&file, _acBuffer, file.fsize, &bw);7 c* e. t( B/ l
  30. OSSchedUnlock(&err); + {) ]! X& y" {8 {. r
  31. 1 ]" ]4 t! ^/ U, Z$ R* Y9 b
  32. /* Set parameters for accessing the font file *// l2 I5 p  ]4 G+ ]) d2 ^8 K
  33. Data.pData = _acBuffer; /* Address */
    1 O) |- q/ L$ j- {
  34. Data.NumBytes = file.fsize; /* Size */9 U- V; [3 L/ n0 L; H7 R1 w

  35.   Z9 o. `7 Z4 `* p
  36. /* Set creation parameters of first font */
    % j$ l$ r3 {- R$ e# D! s
  37. Cs0.pTTF = &Data; /* Use address of GUI_TTF_DATA */
    4 v" |* b; g* y6 U* e, u2 b
  38. Cs0.PixelHeight = 24; /* Pixel height */(3)
    ( A4 \- p2 J6 E1 E% U
  39. Cs0.FaceIndex = 0; /* Initialize to 0 */* |* Y* i) L; f( a4 k3 [0 z1 K
  40. /* Set creation parameters of second font */3 O: [2 W6 B# B# @% c' H1 R  n
  41. Cs1.pTTF = &Data; /* Use address of GUI_TTF_DATA */
    7 }: A! g$ G. B( F4 W) d
  42. Cs1.PixelHeight = 48; /* Pixel height */: p# I$ ?+ X8 ^% v# y' @
  43. Cs1.FaceIndex = 0; /* Initialize to 0 */
      }) Y% W( `4 M9 c! F
  44. /* Set creation parameters of first font */8 o* U) }- q/ K0 r; e3 T
  45. Cs2.pTTF = &Data; /* Use address of GUI_TTF_DATA */9 I7 k! g! _# D
  46. Cs2.PixelHeight = 96; /* Pixel height */
    ; Z3 E6 |  }# T& H' _# F) U
  47. Cs2.FaceIndex = 0; /* Initialize to 0 */' L. H9 Y/ `( o  j6 w- a
  48. /* Set creation parameters of second font */" i/ [# K1 L# Q; m; T
  49. Cs3.pTTF = &Data; /* Use address of GUI_TTF_DATA */
    & o: D  ~$ @$ R8 ?. H4 E
  50. Cs3.PixelHeight = 144; /* Pixel height */* H& F  B- G( f
  51. Cs3.FaceIndex = 0; /* Initialize to 0 */3 z: L9 Q  i7 a# ]
  52. /* Create 4 fonts */
    # ?& G$ q' O% k- p& z  r
  53. GUI_TTF_CreateFont(&Font0, &Cs0);(4)
    ) l) b. T( L" l
  54. GUI_TTF_CreateFont(&Font1, &Cs1);
    ; f( h  f, `! q% ]0 N
  55. GUI_TTF_CreateFont(&Font2, &Cs2);0 l) A8 _4 N7 w; ^" {
  56. GUI_TTF_CreateFont(&Font3, &Cs3);
    ) `8 T! r. ]# v0 n: `; v# S
  57. /* Draw something using the fonts */
    ( K% y% U3 [2 Y6 Y; Q$ c% }
  58. GUI_SetFont(&Font0);- S- W8 H3 _* Z+ L/ e2 m
  59. GUI_DispStringAt("ABC1234", 0, 0);
    # h' P2 q2 M+ V. p8 M( F, U; K
  60. GUI_SetFont(&Font1);
    ; P$ B3 E& F4 h% M$ r/ t
  61. GUI_DispStringAt("ABC1234", 0, 24);
    : {2 w  G; `/ y! n; V1 ]8 H7 x& R
  62. GUI_SetFont(&Font2);  F# b2 D, P( L! Y  z5 s' g
  63. GUI_DispStringAt("ABC1234", 0, 24+48);
    4 C4 A* {9 G; K1 U) `# R2 [
  64. GUI_SetFont(&Font3);" ?+ ?% b. u. a3 L. F0 X
  65. GUI_DispStringAt("ABC1234", 0, 24+48+96);
    9 i! Q) R2 M3 U( N9 }
  66. GUI_DispStringAt("ARMFLY", 0, 24+48+96+144);
    6 t$ ^6 T- a  p
  67. while(1)
    - z5 r; y. V* E- Y
  68. {
      |4 c9 r& C' Z
  69. GUI_Delay(100);# D8 i  E+ H+ T! c. I
  70. }4 R3 \  u1 m6 |" E  {  ]

  71. $ M; `; a1 |' `
  72. }
复制代码
1. 申请动态内存用于加载字库。
2. 将矢量字体从SD卡中加载到外接SRAM中。
3. 设置矢量字体点阵大小。
4. 创建四种大小的矢量字体。
22.4.5 第五步:矢量字体放到SD卡中
    由于汉字的矢量字体比较大,使用2MB的SRAM空间不够,这里使用从网上下载的米字体做为显示。
22.8.png
    放到SD卡后,在屏上的实际显示效果如下:
22.9.png
     特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示。
22.5 总结
    矢量字体就跟大家讲这么多,更多的知识可以研究下源码的实现。关于字体的显示截至到本期教程就算结束了。
" U0 F4 o; @9 s6 [, K
1 }% Z# u0 k/ D- Y/ ^
时光碎了天 回答时间:2015-1-31 11:51:16
感觉很不错的
20091217083309-1058990770.jpg
MouseCat 回答时间:2015-1-31 12:17:18
强悍啊,收藏了
cxtarm 回答时间:2015-1-31 12:30:12
强悍 弃天帝签名.jpg . o$ x) U  C, L
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 手机版