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

【安富莱STemWin教程】第27章 抗锯齿实例讲解

[复制链接]
baiyongbin2009 发布时间:2015-2-11 15:31
特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
; j, d' s2 H" B
第27章 抗锯齿实例讲解
5 Y1 L: s  [6 U; |" ~
    本期教程主要是通过三个官方的抗锯齿实例跟大家讲解下抗锯齿的使用。
    27. 1  例子一:AA_HiResAntialiasing
    27. 2 例子二:AA_HiResPixels
    27. 3 例子三:AA_Lines
    27. 3 总结
5 w1 g$ _: y* t$ O: G
27.1 例子一:AA_HiResAntialiasing
    这个例子主要是演示了两个动态的指针,一个具有抗锯齿效果,另一个没有抗锯齿效果。例子所在的位置如下:
27.1.png
    例子实际显示效果如下:
27.2.png
下面跟大家分析下这个程序的源码:
  1. #include "GUI.h"
    % p! ~& b( p8 _
  2. , k2 E/ f* E- d1 P) d& ?
  3. /******************************************************************** z5 D8 r+ l( r) x' t: c7 b6 I
  4. *$ e! k2 S$ |9 r  n9 g" k  _5 m+ @- ]
  5. *       Defines# O" R1 n: L' S* A& ~
  6. *: F! e, z6 x, [
  7. ********************************************************************
    0 e# @1 n/ O1 j
  8. */- E7 p* w& r% T5 _5 y( x' P
  9. #define countof(Obj) (sizeof(Obj)/sizeof(Obj[0]))(1)
      m7 C* S4 Q0 V

  10. ' T5 i! d' M9 K  A+ _5 s
  11. /*******************************************************************
    4 _! k* \, }8 ]  j& F, \2 T
  12. *
    5 T3 c$ Q! G) U( l2 X' k6 y
  13. *       static variables
    % V) U8 c% ~  P( S4 M3 t
  14. *! m+ O( _( H" j) e( ]: f
  15. ********************************************************************
    $ |8 T6 d# Y) [8 b
  16. */7 h; j* b2 @6 L% y- [- }* e
  17. 4 c% q( O6 b5 U& d# M
  18. static const GUI_POINT _aPointer[] = {(2)
    ' Q& r9 d7 k4 ^3 @$ {
  19.   { 0,  3},
    , G7 A1 `: J  Q
  20.   {85,  1},
    ( H( u5 _+ S- S/ `, K5 e: R4 r/ t1 g$ q
  21.   {90,  0},
    + ]9 i9 q/ m# G/ n3 a# I
  22.   {85, -1},
    " w6 ]( [# t* `
  23.   { 0, -3}$ C  D& ]0 a+ }9 o3 Z
  24. };
    - ^) V7 g# J9 s
  25. + k( l% S& F0 U1 L7 Q
  26. static GUI_POINT _aPointerHiRes[countof(_aPointer)];& g2 }+ D, Z, i7 Y3 `! m- T' ^
  27. . @8 R, x- M  ]1 {; A/ m
  28. typedef struct {7 d: ]: \* y7 }& O$ G
  29.   GUI_AUTODEV_INFO AutoInfo;
    & u0 M% I" o# H  g# o( _6 C
  30.   GUI_POINT aPoints[countof(_aPointer)];! o& n0 e# z2 s& [
  31.   int Factor;
    7 d2 X+ m& U7 l+ q
  32. } PARAM;
    / l+ T- V- U. |. ?
  33. 5 {3 @3 }8 ~0 M+ k% W7 g
  34. /*******************************************************************, k/ c; Q7 F$ l: L  @$ i' X. S/ n+ p
  35. *! k, i* j' R; [) y2 U, g9 |
  36. *       Static functions1 E) X$ o0 K0 K" n# I
  37. *
    6 n1 u# T. Y5 [0 K& B; ]1 c; ~
  38. ********************************************************************
    + _6 p5 R7 T) ]% }+ |
  39. */4 V4 i; u6 I8 f5 ]6 s
  40. /*******************************************************************! j% r3 s# C3 i8 d
  41. *
    2 A. H- k5 s0 m: [4 V6 `5 q+ n
  42. *       _DrawHiRes
    + c/ V2 u' Y, f( ~, K. p8 J# p
  43. *7 ?0 _" n: b0 w7 s4 {3 W
  44. * Function description
    $ n8 q& h6 u! B4 W+ i( [: O, _" x
  45. *   This function draws the high resolution pointer
    0 Y! y7 m( z9 T/ X5 {6 C$ V
  46. */
    % D. w+ w' |, I; f: X
  47. static void _DrawHiRes(void * p) {
    8 B( i0 l/ \! P# d  @2 M$ I
  48.   PARAM * pParam = (PARAM *)p;
    - |* P# A' F! r/ k
  49.   if (pParam->AutoInfo.DrawFixed) {
    * e5 X: V, Y( u/ P3 e! |' p8 t1 a
  50.     GUI_ClearRect(60, 60, 159, 159);3 O! i: Y3 Z' q+ p( s* z
  51.   }+ |% \0 k* H) J, Y( {, r# J
  52.   GUI_AA_FillPolygon(pParam->aPoints,       (3)
    " g& r) u7 V0 m, `& d7 H
  53.                      countof(_aPointer), 1 h; X6 a! L' H
  54.                      65  * pParam->Factor, : ^; d0 L, u3 v1 B
  55.                      155 * pParam->Factor);$ k& v; {- ~; Q- B) j1 B
  56. }
    , r1 n  D0 t/ k6 A  `" B- }* Y
  57. / y  S# d) M+ @2 [7 i9 P& |+ E
  58. /*******************************************************************
    , D2 r& ~/ v# E
  59. *- P" I7 ]/ o2 p/ [4 S1 }
  60. *       _Draw
    4 B+ N4 N: h) W/ E& M' h2 _8 e1 `
  61. *
    ' o3 \" ^, ]: N" y5 ?7 p. \
  62. * Function description8 \1 ~9 i* G; y; h& p# B- m3 _
  63. *   This function draws the non high resolution pointer
    1 C8 X0 X5 J) k( M& \
  64. */* P' T/ `( h8 W  j3 T2 \) n8 ]! ?
  65. static void _Draw(void * p) {9 u- l7 u: [) |- E
  66.   PARAM * pParam = (PARAM *)p;
    # @& _: w# i$ H# b
  67.   if (pParam->AutoInfo.DrawFixed) {
    " U: F) o5 y8 F& U
  68.     GUI_ClearRect(160, 60, 259, 159);9 S& g' G4 K# w
  69.   }
    ' x: S9 n* i/ s+ ?/ J
  70.   GUI_AA_FillPolygon(pParam->aPoints, countof(_aPointer), 165, 155); (4)  k+ I+ e! Q3 K2 n
  71. }
    ( O3 z) T. |7 I" t' [: @

  72. " c1 q' m: `( z9 a& L
  73. /*******************************************************************+ S1 `! p6 Q, h% W4 P
  74. *
    9 \) Q) E3 v  G4 P- R. [8 J
  75. *       _ShowHiresAntialiasing7 R* ?! Z. B) l+ ]: S. `  j# \5 k
  76. *) b$ c! x" h; R9 B  P
  77. * Function description3 A/ o5 X) o# ]
  78. *   This function creates the memory auto devices and handle the6 E" R9 a& z7 P, f8 B1 V
  79. *   rotation of the pointers
    ( z& L! t7 w8 n! ~6 T
  80. */7 @) q- x2 w8 `/ r
  81. static void _ShowHiresAntialiasing(void) {
    * ]4 i  r$ d4 N* _
  82.   GUI_AUTODEV aAuto[2];
    / y7 P& ]3 }# S5 B
  83.   PARAM       Param;% r1 h0 k0 }2 n
  84.   unsigned         i;
    * N9 N: t% S( \8 e; j" a% j
  85. 5 {5 ~: n2 Q. E9 s& n
  86.   Param.Factor = 3;
    4 k* j; g0 U- B  F
  87.   GUI_SetBkColor(GUI_BLACK);
    ) k& h( _( D+ v# o
  88.   GUI_Clear();
    $ }" r/ ]1 M( q6 w
  89.   GUI_SetColor(GUI_WHITE);9 b$ C$ `! U3 `' M3 z+ K2 H  Q
  90.   GUI_SetTextAlign(GUI_TA_HCENTER);9 V2 x  t  h. @0 N; i- ^% E. R! }
  91.   GUI_SetFont(&GUI_Font24_ASCII);+ C2 y9 L2 `8 l; t, [8 g
  92.   GUI_DispStringAt("AA_HiResAntialiasing - Sample", 160, 5);
    ' d. V; X6 S. a& Y+ D3 c
  93.   GUI_SetFont(&GUI_Font6x8);" H' W, Y6 |$ O0 B  d7 L" m6 s
  94.   GUI_DispStringHCenterAt("Using\nhigh\nresolution\nmode", 110, 180);
    ! _3 s$ \; Q) E3 p5 L5 e
  95.   GUI_DispStringHCenterAt("Not using\nhigh\nresolution\nmode", 210, 180);
    # N* T: m* q3 ~2 y, k2 q; _
  96.   //: z: }' h& P& q% V* ?
  97.   // Create GUI_AUTODEV objects
    * t# `( y% @4 }' _9 ]2 A
  98.   //
    7 U" @, x# x7 d0 L; X
  99.   for (i = 0; i < countof(aAuto); i++) {(5)
    7 k3 F9 V4 Z/ d1 n' d
  100.     GUI_MEMDEV_CreateAuto(&aAuto[i]);+ B& @9 b3 @/ O- \
  101.   }. M5 u) e/ D+ j* e2 K
  102.   //
    + v2 S  V" w$ J( i8 F/ M
  103.   // Calculate pointer for high resolution  @0 c5 C! S2 Q. x- [0 M+ r
  104.   //) h+ d2 Z6 H0 Q  U' X6 a9 I& r
  105.   for (i = 0; i < countof(_aPointer); i++) {
    % E. S: u8 @0 r
  106.     _aPointerHiRes[i].x = _aPointer[i].x * Param.Factor;
    1 y( T1 k. L/ E! P; B( l
  107.     _aPointerHiRes[i].y = _aPointer[i].y * Param.Factor;" e9 B. [& g. G, _: W) |
  108.   }. P: W. x3 D# T' G
  109.   GUI_AA_SetFactor(Param.Factor); /* Set antialiasing factor */(6)5 M& R6 X8 e9 b, M; j
  110.   while (1) {
    4 Z% L# k6 }  u: d- U1 y
  111.     for (i = 0; i < 1800; i++) {
    ! c; P* m) R' ?. x
  112.       float Angle = (i >= 900) ? 1800 - i : i;
    3 H; N( X$ L" P6 {4 f2 R
  113.       Angle *= 3.1415926f / 1800;' K) x% H+ m1 O% Q. A6 h3 u; X) J1 d
  114.       //
    8 [  \# `( {- m% E' e& a5 P
  115.       // Draw pointer with high resolution(7)
    ! L* N1 f- }# n- J& i, M. ~
  116.       //- R6 s) D9 E9 s: g9 B2 n
  117.       GUI_AA_EnableHiRes();
    ' T( j( B( R' e) a
  118.       GUI_RotatePolygon(Param.aPoints, _aPointerHiRes, countof(_aPointer), Angle);' N8 I) I6 Z- W6 M# q
  119.       GUI_MEMDEV_DrawAuto(&aAuto[0], &Param.AutoInfo, _DrawHiRes, &Param);& l0 _" e& y' a" N: \/ o0 q0 |3 d2 r
  120.       //
    . I" [; k  K' Q) S" C/ E% p7 u' u
  121.       // Draw pointer without high resolution(8)
    % h0 u% R6 `0 r: n! y% f! x+ X$ H
  122.       //
    % m- x+ m! a3 q. c$ H5 |& l8 s; x
  123.       GUI_AA_DisableHiRes();
    % h- k  d3 K0 @5 e
  124.       GUI_RotatePolygon(Param.aPoints, _aPointer, countof(_aPointer), Angle);& E) l9 D) `3 k- v+ k
  125.       GUI_MEMDEV_DrawAuto(&aAuto[1], &Param.AutoInfo, _Draw, &Param);
    1 W& e- |, K$ t' Y5 \2 {1 i- i
  126.       GUI_Delay(2);
    * o1 s1 W. R/ A3 r
  127.     }" d% R7 I0 ?1 W6 l6 @
  128.   }5 Y+ \2 r4 e2 a$ g8 B* R3 M' B1 q
  129. }
    ; `5 c# b( p, L* u2 P
  130. / S- @- O$ |) V: w* N$ C+ u7 y
  131. /*********************************************************************
    ' f+ p0 X# B6 I5 G3 e" C
  132. *
    " @) n$ |. t# d( k
  133. *       Public code8 |( \* o# d$ N# }7 W
  134. *: S& N+ p1 D' d% |8 q3 `2 ^/ S
  135. **********************************************************************
      F6 Y$ `. H8 P5 J5 ~3 k% a$ h3 ~
  136. */+ ?4 S' U2 A! `0 W0 j
  137. /*********************************************************************# a: i) ?. U( L9 q  M3 |
  138. *
    ! }+ m7 q* \2 d% B; h' C" v
  139. *       MainTask
    & T7 N6 p7 w' w3 I( z! m
  140. */
    ' G2 H9 F3 N9 L: @8 O6 }
  141. void MainTask(void) {7 K  f6 d+ }1 j  r1 [! o
  142.   GUI_Init();8 r+ J0 u) f; o; Q
  143.   _ShowHiresAntialiasing();' ~, t4 [: j4 Z# F( {. S" O+ i
  144. }
复制代码
1. 通过这种方式可以获得数组中元素的个数。
2. 指针的坐标点,注意这些坐标点的值是相对于函数中指定的X,Y来说说的。这些数组中的值是相对值。
3. 这个函数在26.2.6小节有讲解。
4. 同上,只是这里没有使用高分辨率。
5. 创建一个内存设备,这个函数会在后面教程中再跟大家详细讲解。
6. 设置抗锯齿因子。
7. 绘制指针,带抗锯齿效果。
8. 绘制指针,不带抗锯齿效果。
27.2 例子二:AA_HiResPixels
    这个例子主要也是演示一下高分辨率,例子所在位置:
27.3.png
    例子实际显示效果如下:
27.4.png
下面跟大家分析下这个程序的源码:
  1. #include "GUI.h"+ H( P$ U( }' E/ o
  2. #include "WM.h"" ?* r* U% `$ [' t! c% E
  3. : J: q, d6 ^* d, B" A' L" z8 L
  4. /*******************************************************************1 o' [2 A: S" m' D( B4 h! M& O3 a
  5. *; q9 S3 d0 A& Y, _0 J$ ]/ |
  6. *       Defines
      {1 Z0 x" |5 n$ j, A0 p
  7. *; R9 W8 y- N( @5 z! V/ F
  8. ********************************************************************3 T9 o* W& p, D; S0 l/ ~3 s
  9. */
    " D5 y1 ^" r8 ^$ P! S6 D; U
  10. #define AA_FACTOR    4
    8 i: ]& j" g3 K* P' N
  11. #define POLY_SIZE   19" T3 w7 i2 `( r/ Z
  12. #define POLY_POINTS  3. Q; C) w0 B2 g; n9 ?1 i( \
  13. 4 A* j, t% D7 j# i7 i
  14. #define COORD_0(Plus, AA_Factor) (I16)(((I32)((Plus ? POLY_SIZE : -POLY_SIZE) * AA_Factor * 0.7071f * 10000)) / 10000)
    & |, @- _' a6 R, b
  15. #define COORD_1(Plus, AA_Factor) (I16)(((I32)((Plus ? POLY_SIZE : -POLY_SIZE) * AA_Factor * 1.2247f * 10000)) / 10000): S! F( G1 d1 }  I) F  G
  16. #define COORD_2(Plus, AA_Factor) (I16)(((I32)((Plus ? POLY_SIZE : -POLY_SIZE) * AA_Factor * 1.4142f * 10000)) / 10000)
    * U4 [. I) [4 `1 ^
  17. 1 v) I6 ]! Y7 Y! t
  18. /*******************************************************************
    5 b6 B& C0 Q3 D8 m& d3 M" h7 }5 V
  19. *
    1 B' r' N8 ^' E3 l& W
  20. *       Static variables
    2 l3 d0 u( b  y. O9 m
  21. *" Y; `2 h" c2 k3 g
  22. ********************************************************************& x( _, i1 ?4 x; c4 K; {8 n  G
  23. */- p( Z' Z- L1 w- l$ P
  24. static int _pos_x1         = 30;( w, w0 m' p& V1 l/ U8 Q* |
  25. static int _pos_y1         = 30;9 q$ e  S2 [. V( W* N0 a- _
  26. static int _pos_x2         = 125;
    ( {) Z2 [; u$ E" z
  27. static int _pos_y2         = 30;
    1 e; _' Z( x1 |5 V" ?
  28. static int _pos_x3         = 220 * AA_FACTOR;, o! i6 f. J8 S# q$ h
  29. static int _pos_y3         = 30  * AA_FACTOR;
    * z) z3 C5 e* ^7 q# F+ E
  30. static int _color_d        = -1;! P" t! g& x% c9 i' w0 s3 L5 ~
  31. static GUI_COLOR _color_a  = 0xFF00FE;3 Y. V* j* |$ y7 t
  32. static GUI_COLOR _color_b  = 0x00FEFF;
    5 j8 P. k5 H9 t; d3 [
  33. static GUI_COLOR _color_c  = 0xFEFFFE;
    / g: c) U9 e0 D

  34. & `& w% c3 F  j1 ?  Y2 Q7 e
  35. static const GUI_POINT _aPolygon_src[] = { (1)
    , v5 Z( c+ h+ H7 E
  36.   {             0, COORD_2(0, 1) },2 k3 e. x- o. W
  37.   { COORD_1(1, 1), COORD_0(1, 1) },
    6 }) B: ^7 ]( N& p: @& ]  N
  38.   { COORD_1(0, 1), COORD_0(1, 1) }( d$ ?# `* A: [8 s2 r, B
  39. };. L- r6 M8 T2 k" t- O  n

  40. ) m( {: U6 d) b* x1 `8 c
  41. static const GUI_POINT _aPolygonHiRes_src[] = { (2)- {  y$ K" ~  w, j* k: K( Y$ @
  42.   {                     0, COORD_2(0, AA_FACTOR) },
    7 t' T, x3 u/ L3 T# `& e. i; D
  43.   { COORD_1(1, AA_FACTOR), COORD_0(1, AA_FACTOR) },
    # I9 Q/ P; H4 ]& G
  44.   { COORD_1(0, AA_FACTOR), COORD_0(1, AA_FACTOR) }
    3 [! e  |/ P& h( |
  45. };' |3 w3 |1 I' Z
  46. + {3 E8 \, n7 q; ]! R& V
  47. static GUI_POINT _aPolygon[POLY_POINTS];
    ; u) d4 _9 s# v% g! I8 r7 v
  48. static GUI_POINT _aPolygonHiRes[POLY_POINTS];
    / p) e1 \9 V& d* F) Q
  49.   o3 K& n; U: i0 }
  50. /*******************************************************************
    : S# ~7 O$ x# a" e
  51. *
    + [* z6 [2 k- V8 |1 o. L8 C& D7 X
  52. *       Static code
    $ o. Y- d5 E) N" w. Z5 E0 ^4 Z
  53. *+ v3 p& B5 Z! Q0 g1 C) H
  54. ********************************************************************
    3 D3 N2 W+ K( w
  55. */
    / h1 E7 y4 G/ m" v4 J* H6 ~- ^1 d& n
  56. /*******************************************************************
    & h( _2 c% r% o: P& b
  57. *; K' C  H4 E2 \! [3 g( i
  58. *       _cbWindow
    " V# W1 y! |/ E; s2 _
  59. *
    6 |3 D6 U" W5 t# j8 o. X% E
  60. * Function description
    2 Q0 m7 X2 v* u: }! i+ G+ Z
  61. *   This is the callback for the window. A callback was used
    4 B: A3 `/ K; k
  62. *   for memory devices.
    2 ~) m3 c) [+ z' u
  63. */
    ; b0 c; Z, G- b2 _+ e1 p4 L5 T8 f
  64. static void _cbWindow(WM_MESSAGE * pMsg) {(3)! |% G% y# p6 {" B
  65.   switch (pMsg->MsgId) {
    # N, h1 j2 c- a1 ^# Z0 m
  66.   case WM_PAINT:9 Y/ O7 _* V( A; w
  67.     GUI_SetBkColor(_color_a); (4)" f% K" ]: Z) t4 T
  68.     GUI_ClearRect( 0, 0, 250, 14);8 L: I3 N* p0 l
  69.     GUI_SetBkColor(_color_b);3 ^' x: H; n8 q3 F
  70.     GUI_ClearRect( 0, 15, 250, 29);6 o+ b. t) g/ J3 D( a/ b" m
  71.     GUI_SetBkColor(GUI_BLACK);
    ( \5 g: G: Z# \7 z( i. d
  72.     GUI_ClearRect( 0, 30, 250, 60);+ i$ A) @! t4 T! C
  73.     GUI_SetColor(_color_c);$ ^1 }+ e$ _* m/ k8 _( y) R: V
  74.     GUI_FillPolygon(_aPolygon, POLY_POINTS, _pos_x1, _pos_y1);(5)/ N3 c# q6 ]9 l& l* x
  75.     GUI_AA_FillPolygon(_aPolygon, POLY_POINTS, _pos_x2, _pos_y2);(6)
    ) q4 K2 ~; R" X6 U# x/ p8 u
  76.     GUI_AA_EnableHiRes();) u9 L( ?" p8 q; e# s
  77.     GUI_AA_FillPolygon(_aPolygonHiRes, POLY_POINTS, _pos_x3, _pos_y3);(7)7 |6 J, d1 F9 U
  78.     GUI_AA_DisableHiRes();2 k( D2 \& v# k( x" s; y+ J
  79.     break;
    " J3 C% _, ^; U; ?, H+ j, k4 `
  80.   default:' e3 a6 O) y! v% q' h+ j
  81.     WM_DefaultProc(pMsg);
    ; m: ~9 t  X- b$ }5 E' m
  82.   }
    1 ^/ h1 |4 L6 _- n0 R$ W
  83. }1 b$ C) S! P9 h

  84. ( n1 J0 o& t" B* }7 E
  85. /*******************************************************************3 w& K5 x% Z8 n( E& j2 g( k
  86. *# P% ]$ r" y* @6 A4 U7 d: N3 ]# g
  87. *       _CalcColor
    0 B5 S: C; {! k1 b
  88. *9 o# V1 G% S  A6 l
  89. * Function description
    " `+ m% A+ u: w: w: M
  90. *   Calculates the color-fading./ h! @4 ~- G: m* a1 P, z1 v/ `
  91. */
    : M8 p" i. i7 r% N# L; z% r
  92. static void _CalcColor(void) {
    / s# C: }1 B+ N+ A! U
  93.   _color_a += 0x000002 * _color_d;
    " n) _1 A& r6 g: h2 j" q! z' X6 m1 g1 u
  94.   _color_b += 0x000200 * _color_d;- p7 d& o. p3 @; F% E
  95.   _color_c += 0x020002 * _color_d;' ]1 A  P7 @# s* e9 f& \/ s
  96.   if (_color_c == 0xFEFFFE || _color_c == 0x00FF00) {* ]  Z+ u7 v% J3 m: D( F
  97.     _color_d = -_color_d;7 r* G$ W9 N& \% F7 |
  98.   }/ \& B3 e, Y  [6 O( @
  99. }
    $ V* B9 s) a  i% N5 p

  100. , R5 A. z! f2 P9 V0 |
  101. /*******************************************************************3 f$ X4 P: W2 ?6 W% I( c& V
  102. *
    - X- L/ b: G' l& a# J  q- q
  103. *       _ShowHiResPixels
    % ?7 U. \  h3 j' T2 t3 V
  104. *
    0 {  g9 c0 Q) I' }
  105. * Function description
    9 Q6 O' {9 N: O
  106. *   This is frame-function for the callback. It creates the window1 u$ ^: g' v7 O1 W- V5 t7 `% U
  107. *   and handles the rotation of polygons and colors.6 F8 y1 j7 N& [- r- J. b/ g4 j
  108. */
    : R9 p" |2 E2 u" h. h9 B+ r: r4 L  I
  109. static void _ShowHiResPixels(void) {
    ( [. m, ~, K. x! M. \' [0 z3 f
  110.   const GUI_FONT * FontOld;
    2 A; v: S7 y0 f* A
  111.   WM_HWIN          hWindow;
    # W1 i. ]/ S2 X, N
  112.   float            pi;
    " I+ ]! }: R* f4 ]! p; N* u/ b
  113.   float            Step;
    6 G4 {0 `& i" z- c+ H8 W* h
  114.   float            Angle;
      w. ]9 x3 h- D5 i; a* R5 L& Z
  115.   int              i;; X* i2 ~% Q, f. l' C; R
  116. # K: @% L  d$ C6 M; c0 o
  117.   pi   = 3.1415926f;
    * ~: Z" T4 R. Z( {
  118.   Step = pi / 180;( ]& S5 B& C" i2 O7 l$ T" L
  119.   GUI_SetBkColor(GUI_BLACK);
    - F) X2 g3 p/ s! \. \
  120.   GUI_Clear();; a2 m5 C. i1 D8 I4 ]2 S  B& X
  121.   GUI_SetColor(GUI_WHITE);
    ; R4 s& ^. D+ x5 f0 L
  122.   GUI_SetTextAlign(GUI_TA_HCENTER);
    * i5 t5 V' c. G; Y* I' R, f
  123.   FontOld = GUI_SetFont(&GUI_Font24_ASCII);
    9 h4 O, w8 x" t, f7 |. ]7 v1 X
  124.   GUI_DispStringAt("AA_HiResPixels - Sample", 160, 5);& A* \3 v4 b! h+ `& q
  125.   GUI_SetFont(FontOld);' c7 A- x- W$ H
  126.   GUI_SetColor(GUI_RED);' Y: y( b9 ]) R! P- \* o
  127.   GUI_DispStringHCenterAt("not\nantialised", 65, 100);
    . C! v. }0 f6 J$ y& d9 E% R
  128.   GUI_SetColor(GUI_GREEN);
    " E  n( t4 j+ ]3 t( _' b  P
  129.   GUI_DispStringHCenterAt("antialised", 160, 100);
    " `" b8 Y7 D( q1 A0 b# }
  130.   GUI_SetColor(GUI_BLUE);( |) u; }( J/ W2 _
  131.   GUI_DispStringHCenterAt("antialised\nwith high\nresolution", 255, 100);% Y. K; A& U' e* z
  132.   hWindow = WM_CreateWindow(35, 140, 250, 60, WM_CF_SHOW | WM_CF_MEMDEV, _cbWindow, 0);( v% I! j: g0 _$ ?/ _
  133.   WM_SelectWindow(hWindow);. U6 W0 F, c. X
  134.   GUI_AA_SetFactor(AA_FACTOR);
    ) ~" Q3 j" `$ j3 y
  135.   while (1) {( R. D4 l0 D6 q, \6 y6 v# M
  136.     for (i = 0, Angle = 0; i < 360; i++) {(8)& A  @3 ?/ f' i" m' L
  137.       Angle += Step;
    1 K' |& E8 b) O6 |1 c6 Y
  138.       GUI_RotatePolygon(_aPolygonHiRes, _aPolygonHiRes_src, POLY_POINTS, Angle);(9)
    - v4 b* @# \8 E4 S+ t1 i6 Z0 V
  139.       GUI_RotatePolygon(_aPolygon,      _aPolygon_src,      POLY_POINTS, Angle);
    9 f6 B+ D) l4 f
  140.       _CalcColor();
    : ~& a5 x- \+ F: c
  141.       WM_InvalidateWindow(hWindow);(10), M& O: W& p2 L
  142.       GUI_Delay(50);
    6 X; c+ x( a: n5 M! y# j3 E
  143.     }6 S9 _6 v5 Y7 t! h# O9 D
  144.   }) {; G0 x- w8 }9 E/ Y
  145. }+ `/ L3 M5 v6 _  E7 Y$ G
  146. ) `; c8 H2 y2 O* a% Q$ j
  147. /*********************************************************************
    2 d' j% r! i7 W! K6 R
  148. *! Z& A, A. N* c7 ~% M
  149. *       Public code/ r# `; |  m0 A/ ]
  150. *
    ( M9 k8 `! M$ t8 F) H
  151. **********************************************************************
    8 o0 t( V) w: q/ n" p: J
  152. */+ ^6 M/ b6 |6 E+ y& Q
  153. /*********************************************************************
    9 o/ @; K% c( b4 k+ X- V
  154. *& {# h$ f8 g% W7 M: g4 d
  155. *       MainTask7 g  E' N  E) }2 R) N
  156. */; X7 C5 N+ ?$ }! O7 }
  157. void MainTask(void) {4 [/ f* H. J3 s8 Y
  158.   GUI_Init();
    # d" z" ^) B  |  q9 X8 k4 d! s
  159.   _ShowHiResPixels();; n3 ?6 o" R! M9 f) Q2 s4 d: h
  160. }
复制代码
1. 多边形的原始坐标。
2. 加入了高分辨率后的坐标点。
3. 所创建窗口的回调函数。
4. 这里主要是实现回调函数中的重绘消息。
5. 绘制多边形。
6. 绘制具有抗锯齿效果的多边形。
7. 绘制具有抗锯齿并支持高分辨率坐标的多边形。
8. 通过for循环实现图像的旋转。
9. 旋转多边形的原始坐标点,得到新的坐标点。详细可以看用户手册上面对这个函数的介绍
10. 通过使窗口无效来执行回调函数。从而实现多边形的旋转效果。
27.3 例子三:AA_HiResAntialiasing
    这个例子给大家演示一下直线的抗锯齿效果,例子所在位置:
27.5.png
    例子实际显示效果如下:
27.6.png
下面跟大家分析下这个程序的源码:
  1. #include "GUI.h"
    ) F+ U* u/ p/ U, n2 p
  2. ' Y+ f" @& w) @$ m/ A* x$ A* {! Y1 k
  3. /*******************************************************************4 R+ T  h$ v6 r+ \; X
  4. *
    0 K3 k& `' H; O& \9 B  w. u
  5. *       Static code& v) L. n1 n- \" x1 h* M, o3 T
  6. *1 P. S) Z9 ~* I$ a3 \) p
  7. ********************************************************************) k* e  e% @7 k
  8. */( U+ X& l9 F* @% a( ?  i
  9. /*******************************************************************
    8 p, r0 J; E# l- A9 `3 x
  10. *
    0 H7 _" e3 L# i6 z' a/ I+ p
  11. *       _DemoAntialiasing) s3 B# h# v4 B, Q1 o; B* L( B
  12. *: ^$ a; r& }% ?
  13. * Function description& f9 \5 I6 _9 E9 S& j* I, o$ q
  14. *   Draws lines with different antialiasing factors: }+ R5 E+ L; _/ l7 g
  15. */% F' s/ J9 ?: L
  16. static void _DemoAntialiasing(void) {9 ^" H  k" L: d  Y; u5 \
  17.   const GUI_FONT * font_old;
    % U( q$ _9 g& j# h; e
  18.   int              i;* Q; v' _* c* S
  19.   int              x1;
    ( Q2 F0 @# ]+ F# v  N1 C+ y4 t
  20.   int              x2;7 m# g, `+ Q2 @3 y8 z0 C; M
  21.   int              y1;) j# B1 b* N( ]2 h
  22.   int              y2;6 R  t8 C. U3 D, [

  23. % C0 x6 J$ A- J, o
  24.   y1 = 65;9 z$ Y2 R, f/ c0 S/ V& x/ ^
  25.   y2 = 5;  b9 @' I$ L( R! z! e9 l0 R: }
  26.   //' L5 t4 {" H) x( s* t" ~- U2 T
  27.   // Set drawing attributes 1 J+ J9 u5 Q0 W( a
  28.   //% J; N5 ~  z, [
  29.   GUI_SetColor(GUI_WHITE);5 T3 x& g# P; \" Z; i5 ^0 F! p
  30.   GUI_SetBkColor(GUI_BLACK);
    % y: x% m( @2 U7 N. e, V0 R
  31.   GUI_SetPenShape(GUI_PS_FLAT);(1)) R7 j3 }; d& M0 a+ F- m8 \( y' W' K
  32.   GUI_Clear();6 Y4 n+ [& Y' M" y5 T
  33.   //4 P* m1 C& n( E1 R# y
  34.   // Draw headline6 g! Z' {' W7 H
  35.   //
    / n$ X! Z3 O- y5 c0 G+ t
  36.   font_old = GUI_SetFont(&GUI_Font24_ASCII);
    + R: j4 B" t2 ]' a% ], g( @
  37.   GUI_SetTextAlign(GUI_TA_HCENTER);
    # F  t* d  R' R( [3 l1 q
  38.   GUI_DispStringAt("AA_Lines - Sample", 160, 5);
    1 h5 S! J$ Z9 {! q4 [
  39.   //5 i1 r$ K/ t6 S$ T& ]; E! i
  40.   // Draw lines without antialiased  (2)
    2 B, G: w4 M- J% H' q$ ~
  41.   //
    " ~0 e! {. L9 }* i$ q# v4 r
  42.   GUI_Delay(1000);
    ( d0 r! Z/ K! b5 `4 z
  43.   GUI_SetFont(&GUI_Font8x16);) e" y& q  w4 G  n; x" {
  44.   GUI_SetTextAlign(GUI_TA_LEFT);1 ~8 g7 k6 K  N# d; L& n
  45.   GUI_DispStringAtCEOL("draw normal lines using", 5, 40);( W( g/ j3 Y$ |; Z/ v# P/ C; z
  46.   GUI_DispStringAtCEOL("GUI_DrawLine", 5, 55);
    ( u2 \3 N8 ?- }1 i
  47.   GUI_Delay(2500);. }) O" g3 r8 d7 w: {
  48.   x1 = 20;
    8 Y* h' Y0 J8 ]' p1 \5 `' \
  49.   x2 = 100;
    : \) u8 s8 t  p; M/ ~+ ^# t
  50.   GUI_SetFont(font_old);
    - E, \- `6 I+ T! }* i% D2 q; ]
  51.   GUI_DispStringHCenterAt("Normal", (x1 + x2) / 2, 30 + y1);
    ; O- N9 y" d* r' h
  52.   for (i = 1; i < 8; i++) {' s3 l5 r1 Z' D, O- Q
  53.     GUI_SetPenSize(i);
    3 z! f) o5 k; _. [6 o5 w, u
  54.     GUI_DrawLine(x1, 40 + i * 15 + y1, x2, 40 + i * 15 + y1 + y2);5 v) |; u9 q0 A3 g0 c% B& S
  55.   }
    + F/ T% w* m" s2 }: M6 z- d
  56.   //* u# H8 m1 c$ V4 M
  57.   // Draw lines with antialiasing quality factor 2 (3)
    * _' x7 y4 f# t8 q) d
  58.   //
    & ^' F; ?$ J! r4 g' ]: A
  59.   GUI_Delay(3000);. t* s1 [7 ?2 X/ K
  60.   GUI_SetFont(&GUI_Font8x16);
    ! Y# Q. B$ w4 D% m, B
  61.   GUI_DispStringAtCEOL("", 5, 40);& _4 h3 l$ I+ f2 J* v2 E
  62.   GUI_DispStringAtCEOL("", 5, 55);; @5 \3 Z4 c8 J4 J- _
  63.   GUI_Delay(200);7 u* R7 z, k  Q+ {
  64.   GUI_DispStringAtCEOL("draw antialiased lines using", 5, 40);
    * r3 _' h* ^9 _, F' m
  65.   GUI_DispStringAtCEOL("GUI_AA_DrawLine", 5, 55);8 x6 m8 G1 h5 z5 Z3 T! \' W4 x9 k
  66.   GUI_Delay(3500);- X' f; @7 a% Y* ]
  67.   x1 = 120;
    . |4 h* i! L+ ]8 b. X" o
  68.   x2 = 200;
    $ y8 L0 e6 K3 P' L+ F
  69.   GUI_AA_SetFactor(2);% x" s9 S0 M$ Z# }" g5 z
  70.   GUI_SetFont(font_old);4 X& W, }& M2 Z: Q( ]% c
  71.   GUI_DispStringHCenterAt("Antialiased\nusing factor 2", (x1 + x2) / 2, 30 + y1);
    . @  K/ a' O. i5 ~
  72.   for (i = 1; i < 8; i++) {
    / v% P% A* d# @6 G
  73.     GUI_SetPenSize(i);
    ( a& r/ o/ ?& Q5 V( V7 d7 X
  74.     GUI_AA_DrawLine(x1, 40 + i * 15 + y1, x2, 40 + i * 15 + y1 + y2);
    7 [7 f3 X, w4 f+ q. l- l
  75.   }
    & v  }! d2 V3 f* {
  76.   //
    + S# n* u! w. e) t& q1 @# k6 d9 u
  77.   // Draw lines with antialiasing quality factor 6  (4): s' {+ w) V+ t- B
  78.   //
    % l4 g4 U; `; i' N$ g% N: Z
  79.   GUI_Delay(1500);( E& |" j$ P5 o6 w
  80.   x1 = 220;# i, q% @) N; R1 [+ |: C
  81.   x2 = 300;
    4 r  J3 l; I4 i* w+ \. E- L& z& Z
  82.   GUI_AA_SetFactor(6);: J2 f5 O! V+ I4 P+ J  a) u
  83.   GUI_SetFont(font_old);
    7 C+ _# C  [" F, v* q7 X9 `
  84.   GUI_DispStringHCenterAt("Antialiased\nusing factor 6", (x1 + x2) / 2, 30 + y1);
    - z; h! U; ]; U$ U, y( E3 M
  85.   for (i = 1; i < 8; i++) {- _* f- b7 N+ k8 K2 H
  86.     GUI_SetPenSize(i);
    9 \+ l8 m3 z% i; Z' S& V4 F2 u
  87.     GUI_AA_DrawLine(x1, 40 + i * 15 + y1, x2, 40 + i * 15 + y1 + y2);
    * ]) K. s- c" J/ H
  88.   }
    8 g% Z9 t# h9 U4 `: z1 l7 r
  89.   GUI_Delay(7500);9 X1 v. X: Z" G$ O1 ?: z
  90. }% @; q: a; |2 a; P+ ^! d) P# c; \3 x

  91. 6 v, n& d6 Z  y9 X
  92. /*********************************************************************
    6 m4 I6 y7 h! ]8 N% J/ R9 p
  93. *. d7 w- m1 @  D& l
  94. *       Public code
    - t2 z! f; c& S  x7 X
  95. *
    5 k  C; ?  P) {' W
  96. **********************************************************************  G9 A$ d( V5 @4 E; M0 a
  97. */) V) T5 K6 M* F6 N  C
  98. /********************************************************************** i, o( b  L$ B% g: M
  99. *
      g$ A- B; J7 W+ M# q
  100. *       MainTask
    # X; d" s! s8 b! I0 F5 v# l
  101. *// T( J5 f2 h2 c8 I. _
  102. void MainTask(void) {( `! N' ^# Z) a  q
  103.   GUI_Init();5 w& F$ o% d; k2 w% x& i5 u
  104.   while (1) {- _" K% v" u' f/ q) [1 b
  105.     _DemoAntialiasing();+ s/ |, O7 @& \) H: l
  106.   }$ Q& l+ M* g4 H
  107. }
复制代码
1. 这个函数在手册上面没有查到相关的说明。
2. 绘制普通的直线,不具有抗锯齿效果。
3. 绘制具有抗锯齿效果的直线,抗锯齿因子取2.
4. 绘制具有抗锯齿效果的直线,抗锯齿因子取4。
27.4 总结
    通过上面三个例子,大家要明白两点:
l 默认使用GUI_AA_XXX函数的时候,抗锯齿因子是1,也就是不使用抗锯齿效果。
l 上面说的抗锯齿和高分辨率是两码事,这个千万别搞混了。简单的理解就是通过高分辨率可以实现更好的显示效果。
+ T0 G9 p, I; \3 T
赞 收藏 1 评论4 发布时间:2015-2-11 15:31

举报

4个回答
说不定 回答时间:2015-2-11 16:21:12
收藏 慢慢学习
liudashuang 回答时间:2015-2-11 19:23:53
收藏 慢慢学习
MouseCat 回答时间:2015-2-11 21:04:02
好高级,收藏
埃斯提爱慕 回答时间:2015-2-12 11:15:38
提示: 作者被禁止或删除 内容自动屏蔽
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版