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

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

[复制链接]
baiyongbin2009 发布时间:2015-1-31 11:26
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
  B: k4 i4 D+ s$ P5 J# ~" b4 G
第22章 TrueType矢量字体

8 d+ x* P; K" T: g3 n) O+ 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_TEST8 E1 A0 K0 ]6 V' W/ p

  2. 0 \& x7 ^0 N1 a( T) I
  3. #include <windows.h>8 G0 U" ?& W" A9 L4 K
  4. #include <stdio.h>
    & ^' h$ u- M  A2 M: c
  5. #include "GUI.h"
    2 Y, V, S6 ?) i6 b

  6. ) i" N% f% [1 f* S* K
  7. /*********************************************************************
    9 C, d5 d; g% `5 ^2 q9 s, M4 w3 |
  8. *
    # x' W* o8 J$ d" t" ^9 k
  9. *       Static data
    - ^* l' _( [' J5 B  c) v+ F
  10. *) I! b$ @# [6 x" T9 {" {
  11. **********************************************************************
    9 n5 C8 Z0 p+ H% f7 `9 i- U
  12. */
    8 Q2 W( x" S7 P
  13. static unsigned     _aHeight  [] = {16, 20, 32, 48};   // Array of heights used to show text; }/ b. y: @6 i- c. Q) E
  14. static GUI_TTF_CS   _aCS      [GUI_COUNTOF(_aHeight)]; // Each GUI font needs its own GUI_TTF_CS structure$ w+ w8 c! |$ S, o  _
  15. static GUI_FONT     _aFont    [GUI_COUNTOF(_aHeight)]; // Array of GUI fonts
      e6 L" w1 U( {. l8 i
  16. static char         _acFamily [200];
    5 H4 e& T9 G" ~* R
  17. static char         _acStyle  [200];
    : P" x( B6 H, F( b

  18.   v" ?3 c5 d1 J; q$ t
  19. /*********************************************************************
    / M6 a9 @9 H& B
  20. *6 C( I" k$ }: |! h% d/ f
  21. *       Static code
    * d  z9 l" {! w8 i' g4 b  H
  22. *2 r7 Q* A0 v3 T8 ^( @. b
  23. **********************************************************************
    " q! _% {" L# T+ _& I! W1 N
  24. */! i+ E" f# Z) @7 ~; t" a
  25. /*********************************************************************
    , W2 R. w2 ]3 A+ p1 @
  26. *
    ! n8 A1 C  `0 ~6 q! u
  27. *       _ShowText
    9 l( f% U5 {5 q" S. O3 J% d
  28. */
    6 Q3 F4 {) c0 A# U# K, E
  29. static void _ShowText(void) {(1)
    ) i1 I: [- A7 F& N0 {
  30.   int i;! X$ V1 C/ N  X/ _3 @; k1 [5 K

  31. / q' a" Q# ^( C
  32.   GUI_Clear();
    6 F# @6 g7 F, Y
  33.   i = 0;. V. N8 ^8 I7 v4 m0 v0 w( ?! ]
  34.   GUI_TTF_GetFamilyName(&_aFont[i], _acFamily, sizeof(_acFamily));(2)
    % M4 [" q" M6 ]. e" v
  35.   GUI_TTF_GetStyleName(&_aFont[i],  _acStyle,  sizeof(_acStyle));
    # N  l2 l; i/ Z) R* M7 ]
  36.   GUI_SetFont(&GUI_Font20_1);
    / g0 j+ F! I0 x
  37.   GUI_DispString(_acFamily);. r/ {) {! q3 i1 i( Q+ C
  38.   GUI_DispString(", ");
    8 S0 o$ t% U6 u
  39.   GUI_DispString(_acStyle);
    0 j) x* k5 [$ q/ i/ }5 p
  40.   GUI_DispNextLine();& N1 u  `0 N" v# E! c( f4 s. M1 r
  41.   GUI_DrawHLine(GUI_GetDispPosY(), 0, 0xfff);
      `, f# m- Y; |7 u
  42.   GUI_SetFont(&_aFont[i]);1 M! H- u* e5 S2 }, p" m6 |" S
  43.   GUI_DispString("abcdefghijklmnopqrstuvwxyz\n");
    $ C! N( B% U- F" Y/ n! n/ o
  44.   GUI_DispString("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");* i9 N- H4 |' C8 x! s0 d
  45.   GUI_DispString("123456789.:,;(:*!?')\n");
    0 b* @9 X; e) E( q2 c  H5 U7 S) A
  46.   GUI_DrawHLine(GUI_GetDispPosY(), 0, 0xfff);- c* P7 U  Z* o! b4 Z8 e2 b7 F
  47.   for (i = 0; i < GUI_COUNTOF(_aHeight); i++) {
    * n$ @) J, @: E
  48.     GUI_SetFont(&_aFont[i]);
    8 @5 N3 s" J% C; c4 b
  49.     GUI_DispString("The quick brown fox jumps over the lazy dog. 1234567890\n");: f( f7 [( `( I2 |
  50.   }! W+ p! h' Z  G$ A
  51.   GUI_Delay(1000);- E  e) ^/ w- o0 B# K0 A0 e
  52. }( c0 z" o  h/ d/ F

  53. & ^; U) l8 ?  @0 }: l9 r( g
  54. /*********************************************************************) \* G- h7 E" z9 X4 V
  55. *6 T) Z3 ]  y2 r( K
  56. *       _CreateFonts( `/ [( p" `9 B+ J; t/ l6 n
  57. */
    " o7 F7 B7 v# x# f
  58. static int _CreateFonts(const U8 * pData, U32 NumBytes) {(3)
    ; R- g) C# ?, w7 \7 a) M8 z
  59.   int i;: m& P7 T7 ?& c6 R
  60.   GUI_TTF_DATA TTF_Data;        // Only one GUI_TTF_DATA structure is used per font face; W, a3 b) u2 Q1 d; j

  61. " S; e6 R; D" k0 I0 L
  62.   TTF_Data.pData    = pData;    // Set pointer to file data0 c" B+ {5 O4 L1 b% w; C
  63.   TTF_Data.NumBytes = NumBytes; // Set size of file
    5 S+ x7 @1 v- Y* P/ r0 J
  64.   for (i = 0; i < GUI_COUNTOF(_aHeight); i++) {
    - `" L1 y$ x3 e3 T# r" w; ]1 m! Q* v9 i
  65.     //
    3 f: W9 P" s1 V1 N. B9 G* E
  66.     // Initialize GUI_TTF_CS members  t6 a7 C9 C; \  G
  67.     //
    1 w8 d8 H9 j. ~. P6 ^
  68.     _aCS[i].PixelHeight = _aHeight[i];- s, p1 h0 b0 t9 ]  g6 S" A4 q$ V
  69.     _aCS[i].pTTF        = &TTF_Data;& Z% D( P4 c5 Y' b, h7 W) Y
  70.     //9 W1 R. k& X  c6 |/ W  A! f" G9 v, b
  71.     // Create GUI font2 E2 j9 D! `) P  w- P- m9 x2 I" Z" {' ]
  72.     //$ v2 c2 X0 l9 \) P
  73.     if (GUI_TTF_CreateFont(&_aFont[i], &_aCS[i])) {(4)' Y7 I  Q, G2 X1 X- ?6 l
  74.       return 1;
    / N2 V: a* a  q0 ~0 ^
  75.     }
    * E8 {& x4 c3 Q! P
  76.   }
    9 r* e- K  S) Z  G
  77.   return 0;/ E' Z( H. u' {, ~- X) W; ~
  78. }
    : e  I8 p% ~0 W0 \; h9 y+ H
  79. . O2 H" `( H( K( Q
  80. /*********************************************************************1 @* N( o0 B2 `4 G' K
  81. *
    + z' R+ {1 D! F9 m9 ?, V% _3 {
  82. *       _cbFontDemo. ~8 K( ^% I; I2 |  T* D" W
  83. *
    ( K# a" s: b, a6 S& U7 v- ~+ [
  84. * Function description1 Z+ k; i/ s* J. n3 f, A
  85. *   The function uses the given pointer to a true type font for creating4 W7 [, W0 ?. v& g1 k' b; q& K
  86. *   a couple of GUI fonts and showing the outline of the TTF font.. J: b) s0 N/ r
  87. *% P* }0 B1 l) `! h8 k5 h8 E! T+ D
  88. * Parameters:8 W' z% v/ G3 l: P4 s
  89. *   pData    - Location of font file
    , T6 B6 q; v5 M6 z3 E0 q( O% l# h
  90. *   NumBytes - Size of font file2 t! E1 z) e. E: [) ?: u
  91. */
    . O$ ]9 k0 p9 U( N7 U
  92. static void _cbFontDemo(const U8 * pData, U32 NumBytes) {(5)
    ; Y; X- N4 t& {1 b7 H' N3 g
  93.   _CreateFonts(pData, NumBytes); // Create fonts& \9 e' @5 z! s; v  `
  94.   _ShowText();                   // Show some text
    $ `' e" b6 w3 }* W
  95.   GUI_TTF_DestroyCache();        // Clear the TTF cache
    # B4 F" a3 X) c
  96. }
    . }7 S  g$ A5 H: Y

  97. ! O8 \3 X( y, N  \" t" @8 Q
  98. /*********************************************************************( `- H$ z1 [* ~; Y- ?# f
  99. *4 Q4 {8 _4 n, v
  100. *       _IterateOverAllFiles
    + h9 n* [+ B  j0 X, n* C. T1 Z- C% N
  101. *
    4 Z; Q0 i+ W7 _( M5 K, {
  102. * Function description
    ( E8 n. p: p2 c  d
  103. *   The function iterates over all files of the given folder and the0 V* N9 P' e. K
  104. *   given mask, reads the contents of the file and calls the function, W! s  d) u0 o6 J4 n
  105. *   pfDoSomething() with location and size of file data.
    " r5 [) g; O& f7 ~1 P
  106. *   Can be used under Win32 environment only.. C2 X, q( P! S$ _! l, q3 G# h0 |# f
  107. */
    5 x+ F7 E" }6 {# e5 I1 X
  108. static void _IterateOverAllFiles(const char * sFolder, const char * sMask, void (* pfDoSomething)(const U8 * pData, U32 NumBytes)) {(6)' t, o8 B5 ?  L) O9 l; s( j- }) s
  109.   GUI_RECT Rect = {0, 10, 1000, 1000};
    : I! ?& @, t, a( M/ T
  110.   char              acMask[_MAX_PATH];7 H1 a* v& t  [- Y! C1 C8 v
  111.   char              acFile[_MAX_PATH];- x+ S" t9 }" J) I) l: `
  112.   WIN32_FIND_DATA   Context;/ D) ]$ o5 _' U6 X
  113.   HANDLE            hFind;
    $ b! ~! A/ Y: L, p1 B3 Q$ i
  114.   HANDLE            hFile;
    , C5 s/ \0 N  u# Y; U
  115.   U8              * pData;5 v) z4 u/ N3 q; G. I! q
  116.   DWORD             NumBytes;+ b5 X0 P2 `/ h+ g; M/ C
  117.   DWORD             NumBytesRead;
    , Q3 `' V' m/ X+ a' P6 ?
  118. 5 E. w4 D3 c- M& W
  119.   sprintf(acMask, "%s\\%s", sFolder, sMask);
    2 ~# q  X. s2 z4 C
  120.   hFind = FindFirstFile(acMask, &Context);& l6 r' m$ k# \  ?* R0 N
  121.   if (hFind != INVALID_HANDLE_VALUE) {& W3 Q4 D1 ^4 {; V5 K2 @2 W
  122.     do {
    ! J9 v5 g. o  g1 t, z4 O
  123.       sprintf(acFile, "%s\\%s", sFolder, Context.cFileName);
    1 c; |# f8 L6 P* }$ u% y3 C
  124.       hFile = CreateFile(acFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    , b6 Q4 A( Q5 a+ Z. F* P, w
  125.       if (hFile != INVALID_HANDLE_VALUE) {5 J1 i' B8 z! Y. o
  126.         NumBytes = GetFileSize(hFile, NULL);+ k4 q5 J3 e1 S" X" C7 h
  127.         pData = (U8 *)malloc(NumBytes);: z+ ?9 }" L2 c8 Q
  128.         ReadFile(hFile, pData, NumBytes, &NumBytesRead, NULL);. m- y/ w& x9 N$ g
  129.         pfDoSomething(pData, NumBytes);* ~% C; p' S/ l8 J/ t
  130.         free(pData);; k8 z  m, f% j0 h/ O
  131.       }
    # k6 C4 o+ H- D1 E6 \- t# ~
  132.       CloseHandle(hFile);
    ' I+ J  o% U* H4 M. n+ R' q% w
  133.     } while (FindNextFile(hFind, &Context));
    / T8 G  f* M2 N- X  F- T" i* x
  134.   }* x4 T; O' v: w. Z, [4 O$ S. N( Y
  135. }. H6 q* w) Q- V3 n& {0 {

  136. 1 L1 K9 W7 r9 M0 b0 M: \
  137. /*********************************************************************
      b2 {+ w4 D- Z( p2 S: L9 s- ?
  138. *
    / h# U0 ?1 o" r  L8 U6 A
  139. *       Public code
    & z: u& T5 K7 Z% ~  P
  140. *6 y- w& R8 ]9 V
  141. **********************************************************************
    % O$ c8 H" ?) x- ^- p1 Y0 H/ f
  142. */
      @5 A* b5 T0 }8 ~6 _
  143. /*********************************************************************7 S6 O, B! a' ?" c$ j8 h
  144. *
    . z. r5 g  n7 }4 L) [
  145. *       MainTask2 f% T! b) u* m: ?& r
  146. */1 x8 f5 N) H1 q& w
  147. void MainTask(void) {
    7 M( V4 y+ u8 O& T5 }4 o
  148.   char acPath[200];% V2 f8 u  V* f1 a9 G' F  {1 q

  149. 2 x" u; z6 \5 d! _( O
  150.   GUI_Init();
    : ]$ W" G# K3 \2 B. ?. Z! n% Z$ Q
  151.   //( o) g: l6 _6 \: I% |
  152.   // Set colors and text mode* n9 v9 y( f8 b* I
  153.   //
      @# v9 S$ M+ e6 P# i0 h$ Y
  154.   GUI_SetBkColor(GUI_WHITE);3 ]. b9 Q3 _& q* o9 N
  155.   GUI_SetColor(GUI_BLACK);
    7 @( {% d  B2 H) h$ p6 m
  156.   GUI_SetTextMode(GUI_TM_TRANS);
    . W7 Y7 B, I- E; L: r+ g6 j
  157.   //$ I/ S9 O3 W9 E6 X% V+ ~2 {
  158.   // Get windows system directory and extend it with '\Font'(7)
    / Z2 G# A% H* t& \# Y; p5 @
  159.   //) S$ `' P3 y, m
  160.   GetWindowsDirectory(acPath, sizeof(acPath));
    " p7 T+ [; b) C) i: A( V( A
  161.   strcat(acPath, "\\Fonts");
    ) T! T. t) U& V  ~% r
  162.   //
    8 _; h# x0 c$ ^5 z+ }
  163.   // Iterate over files and call _cbFontDemo for each file' |7 q  Z) [- Z  R3 t' }, g. K9 C
  164.   //# }+ l' W3 p% Y# v; Z/ |- F4 K* ?/ b
  165.   while (1) {
    . \5 ~# t- n+ ^: D7 C) f1 j
  166.     _IterateOverAllFiles(acPath, "*.ttf", _cbFontDemo);
    1 M" P. r2 Q- W0 |( {/ L
  167.   }
    " t. i6 G) m$ Y7 N
  168. }
    8 ?/ L  m# V' }

  169. 1 @. q( K3 g/ O8 e
  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

2 G- k! y5 O8 N/ ]. A2 T3 t
收藏 1 评论15 发布时间:2015-1-31 11:26

举报

15个回答
baiyongbin2009 回答时间:2015-1-31 11:27:26
本帖最后由 baiyongbin2009 于 2015-1-31 11:29 编辑
  L* ]8 o/ c; z# Q# h4 C  N, C5 O; O! n( c8 C0 i  i0 w* v8 g
22.4 移植到开发板上显示$ C# d4 v( [. E/ p  g
  z8 l* I9 ~& F5 Y6 ?3 J+ G+ b; m
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. /*! V, X- u  E# g7 ]/ A
  2. *********************************************************************************************************9 z$ Q: U+ P" J: Z6 C: U2 l
  3. *        函 数 名: MainTask" M: m" e& G) |, T9 r1 H
  4. *        功能说明: GUI主函数
    3 M$ y* y$ d, Q& I# s+ R) W# i
  5. *        形 参:无
    9 {6 q6 l' T  M0 M
  6. *        返 回 值: 无' ~% W# P" K; `1 T
  7. *********************************************************************************************************  S5 ^0 J  q, p
  8. */
    0 ~1 N2 }7 u" ~( `: i/ E
  9. void MainTask(void) 7 ]$ G; o5 l/ K
  10. {
    ) F- U" H# I* t2 l
  11. OS_ERR err;
    . ]% J0 p5 t. ^  J) t( p, {1 s8 x
  12. char *_acBuffer;" @5 E- Q, t7 j# n& l- \+ J' f9 i
  13. GUI_TTF_CS Cs0, Cs1, Cs2, Cs3;
    % \) ?$ Z" z% Y
  14. GUI_TTF_DATA Data;, {- D2 J0 V" {) z; p% M3 ?/ Z0 T* G! k
  15. GUI_FONT Font0, Font1, Font2, Font3;$ C6 _5 t# L$ U2 H
  16. GUI_HMEM hMem;$ }. @- W$ ]1 t
  17. $ }: V% o; ]. ~5 u; q; W5 |
  18. GUI_Init();, o/ O/ E; ?. S0 v
  19. GUI_SetBkColor(GUI_BLACK);
    0 r8 m* J$ Y+ a+ [. z% ?
  20. GUI_SetColor(GUI_RED);  Q- j" T( B* C. Z
  21. , c* M. q/ x0 P3 H
  22. /* 申请一块内存空间 并且将其清零 */ (1)
    4 D. W8 g1 z  J# E5 k" a- p
  23. hMem = GUI_ALLOC_AllocZero(1024*1500);
    " M0 e% l0 W5 n: j
  24. /* 将申请到内存的句柄转换成指针类型 */2 W' o2 M* V7 c: s- t
  25. _acBuffer = GUI_ALLOC_h2p(hMem);
    . q- {5 W- D) f; r: D* f
  26. /* 打开文件 */
    9 ^: i6 {5 _- p# e" B
  27. OSSchedLock(&err);. e! N+ U# i- y$ @$ w
  28. result = f_open(&file, "seg.ttf", FA_OPEN_EXISTING | FA_READ | FA_OPEN_ALWAYS); (2): k3 X- r& G5 m5 G8 O& c5 P
  29. result = f_read(&file, _acBuffer, file.fsize, &bw);+ v$ N4 w9 c3 d/ _2 T- H
  30. OSSchedUnlock(&err);
    & q. e( K* N/ _
  31. 7 Y2 Q$ P  f. I4 R3 Q+ R( t
  32. /* Set parameters for accessing the font file */6 T3 m  Z+ s- Q8 k" R, E
  33. Data.pData = _acBuffer; /* Address */
    ! ?* Z5 i# {% Q
  34. Data.NumBytes = file.fsize; /* Size */
    - D, \4 q* |$ F  _
  35. 8 J6 E- n% ?* E: ~/ L/ I
  36. /* Set creation parameters of first font */# ^0 Q$ V/ E1 e& X2 L5 f
  37. Cs0.pTTF = &Data; /* Use address of GUI_TTF_DATA */! w% Z/ z: O# V4 j8 l" ]
  38. Cs0.PixelHeight = 24; /* Pixel height */(3)
    ' Y. a1 n8 `/ _' Z6 J, N" K
  39. Cs0.FaceIndex = 0; /* Initialize to 0 */
    + t9 G9 g7 f# ~& x
  40. /* Set creation parameters of second font */6 m# A( ~0 O: ~6 k* K
  41. Cs1.pTTF = &Data; /* Use address of GUI_TTF_DATA */1 J' f7 }9 C  K& b5 N$ O
  42. Cs1.PixelHeight = 48; /* Pixel height */
    # _0 h2 f+ e6 ?" ?! b1 s0 {
  43. Cs1.FaceIndex = 0; /* Initialize to 0 */
    & C( v4 c" W; s! b+ e  J
  44. /* Set creation parameters of first font */# [1 e6 H+ ]8 f3 N6 I  b- J+ j
  45. Cs2.pTTF = &Data; /* Use address of GUI_TTF_DATA */% r, P  x9 F# \2 J
  46. Cs2.PixelHeight = 96; /* Pixel height */
    7 B" j. z4 W4 V$ _) ?' R( E5 q
  47. Cs2.FaceIndex = 0; /* Initialize to 0 */
    ; c) ^- [# R- w* ?
  48. /* Set creation parameters of second font */
    " w3 w) v4 ]( t7 B
  49. Cs3.pTTF = &Data; /* Use address of GUI_TTF_DATA */* n- C+ c, t; B  v  G
  50. Cs3.PixelHeight = 144; /* Pixel height */
    / i0 [- m* @5 x% m) M
  51. Cs3.FaceIndex = 0; /* Initialize to 0 */
    - h$ P% t+ E) \6 j9 x* t
  52. /* Create 4 fonts */2 ~- U3 I! x# s0 M' T
  53. GUI_TTF_CreateFont(&Font0, &Cs0);(4)1 V4 T8 f1 v! w) F
  54. GUI_TTF_CreateFont(&Font1, &Cs1);: b# E6 \5 C2 I+ `' r9 s1 p! W
  55. GUI_TTF_CreateFont(&Font2, &Cs2);+ H; ]- P, |+ @4 `5 ?5 {
  56. GUI_TTF_CreateFont(&Font3, &Cs3);
    $ G( \7 I+ U6 B$ z
  57. /* Draw something using the fonts */8 S' N  F( f( Z! L3 M$ J: E
  58. GUI_SetFont(&Font0);
    . j' k6 s, M4 w( p% _& h+ I) b
  59. GUI_DispStringAt("ABC1234", 0, 0);0 D4 B2 M' X( v; {
  60. GUI_SetFont(&Font1);
    1 |) B1 a6 J7 C
  61. GUI_DispStringAt("ABC1234", 0, 24);* W3 p* ^2 F/ \+ \( b8 a
  62. GUI_SetFont(&Font2);
    4 y0 E* i( w5 a+ @8 y( a
  63. GUI_DispStringAt("ABC1234", 0, 24+48);9 p0 E# e: C7 N5 Y
  64. GUI_SetFont(&Font3);, P& w/ l* _7 K: T, V& w& b
  65. GUI_DispStringAt("ABC1234", 0, 24+48+96);* V' ?4 W. t' m
  66. GUI_DispStringAt("ARMFLY", 0, 24+48+96+144);4 r* _! O' B4 ]5 V, G$ I
  67. while(1), i9 J' ?0 L# k" M' @+ I$ N
  68. {0 i8 t7 O7 ~2 a) o3 v
  69. GUI_Delay(100);
    & X9 ]$ X& Y) x
  70. }
    - K" R) p' X+ ~
  71. / D% q/ @* _" I8 ^3 c
  72. }
复制代码
1. 申请动态内存用于加载字库。
2. 将矢量字体从SD卡中加载到外接SRAM中。
3. 设置矢量字体点阵大小。
4. 创建四种大小的矢量字体。
22.4.5 第五步:矢量字体放到SD卡中
    由于汉字的矢量字体比较大,使用2MB的SRAM空间不够,这里使用从网上下载的米字体做为显示。
22.8.png
    放到SD卡后,在屏上的实际显示效果如下:
22.9.png
     特别注意,如果使用的是800*480分辨率的屏可以完成显示出来,如果是小于这个分辨率的屏只能显示出一部分,大家可以按照上面的设计方法做一个适合自己屏大小的显示。
22.5 总结
    矢量字体就跟大家讲这么多,更多的知识可以研究下源码的实现。关于字体的显示截至到本期教程就算结束了。

9 v4 P* C  l7 h  {- P( @; \, h: x. j: |* M4 O$ l1 _2 j
时光碎了天 回答时间:2015-1-31 11:51:16
感觉很不错的
20091217083309-1058990770.jpg
MouseCat 回答时间:2015-1-31 12:17:18
强悍啊,收藏了
cxtarm 回答时间:2015-1-31 12:30:12
强悍 弃天帝签名.jpg / ?4 Q2 l8 k  |' x
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 手机版