% R+ S8 L3 e1 t3 w( R3 I2 W 9 q: S* |% F0 `. ^- i( v, F: q5 e% l7 Q; y. r
uchar* imageData = new uchar[tex_side * tex_side * 4];//设置一个空间用来保存位图 2 c: Y: V3 F2 Y! i5 w# g1 ~; q6 {( c
3 @' _! u& k5 M" m8 r) A, }. @ v! T
// Reset content 5 B$ z( R9 D3 l. X' X4 _+ s: c# \; |$ p4 r8 E6 \" r
memset(imageData, 0, tex_side * tex_side * 4);//清零 9 {7 }" D6 Q4 F' z
% X2 d) T# H5 E! X) x ; ]* n# f% n! [2 L
8 b( l g7 [1 n7 [9 o I; h4 R9 W for( i = startGlyph, l = 0, m = 0, n = 0; i < endGlyph; i++ )//遍历每个字, 2 z2 j. v9 b- E- L+ k3 J
( y6 U* w% M: b+ w& J
{ $ o) @& q- l1 L/ x5 Q) {( E% p( W7 i1 F) b, q: d b
+ _" K% k! r' M& u. E7 Y + W/ F4 l S; y5 J FT_Error ftResult; 2 S6 q+ G1 H; i* p; p- o, r" { $ B! W) g3 H+ ?4 g 3 O# y7 v; E- L: W6 ~% n+ e* _7 B
- z6 I. \) b5 c
// Load & render glyph ' ]2 ?- b6 f% j; ]+ X" }6 Z' v / r, } ~' p6 i7 F% ` ftResult = FT_Load_Char( mTTFMsg->face, i, FT_LOAD_RENDER );//读取字体 ) Q+ w3 p% t- E8 Q, ?7 M/ K. X2 ^8 ?( Z7 Y: M$ D: { `6 ?
if (ftResult). P3 Y! c7 j3 C' t' S+ b$ v: f
$ z1 ~2 r6 Z* l$ R# d4 M5 r p { . K5 f* b% S8 {: Z ) G5 F9 }- p, O- h2 f3 B // problem loading this glyph, continue - h% g8 u) E$ H/ Q. v
) `/ h( Z Q) ^% c
LogManager::getSingleton().logMessage("Info: cannot load character " +5 \. d- L/ x( _2 V) `' T) ~
8 `4 T3 i" s2 t. B* S( a StringConverter::toString(i) + " in font " + mName); 8 M8 I! T8 }: r( M+ V5 [' h0 P. C7 a( l7 y4 Z
continue;//如果错误跳过 % S' o; O% d. G, o W/ U. t
0 H4 n: j; c" g2 `1 I ` 9 E8 ], T, w! F' H$ Z* [* P // 得到FreeType2的位图 $ b3 {+ U- ]9 W: G9 O/ F
' }, r0 E1 {) A" q: ~- \2 C
unsigned char* buffer = mTTFMsg->face->glyph->bitmap.buffer;+ {( N6 _/ w9 |2 q" s' Q
/ |/ [1 M, @9 Q% V9 K- Q% I
( s: n$ t3 _ J3 w- k3 H+ u & h p& J9 B2 {$ y, F3 z if (!buffer) " b. P! K# q- `5 y! S- n% X# m + z' E+ R* b3 K+ s; c { & w$ x0 d9 M2 o" j) d* J8 B9 O1 y: v* G0 s; w5 I! a) s
// Yuck, FT didn't detect this but generated a null pointer! / w1 o- _: G6 \6 v
- C q- z# ?7 X* V0 a$ r/ n8 ]* O
LogManager::getSingleton().logMessage("Info: Freetype returned null for character " + " r3 L6 Y5 O# Q* g1 j" w- v* Y7 F; I9 X6 a6 [; s' n
StringConverter::toString(i) + " in font " + mName); K" X1 @3 U+ Y' Z- J " W! Z n! x. t/ S& t- z continue;//如果得不到跳过 1 c0 o& e3 _2 |. R 3 z0 k+ Q3 Z5 Q7 B; g } 9 a' Z# Y, e# B p& ?( \& z , e' [! g/ A) |) Z; z . t) P0 r# @; j/ h# P
6 P* [( g0 M% l3 Z9 n: K
// 得到y的空隙 (最大空-空-本字空)就是说空出这些字底部就平了 2 J7 ^8 ]2 g, x" D* M8 o
+ z( K0 o! K6 S2 D& [0 E
int y_bearnig = ( max_bear >> 6 ) - ( mTTFMsg->face->glyph->metrics.horiBearingY >> 6 ); 3 |( s; `8 b% Y# V. o) r$ l& i& q* `) v6 t" Z
0 i# h5 w: ]8 u2 d" N6 D2 |0 ^ I+ O+ x8 k- x" q
for( j = 0; j < mTTFMsg->face->glyph->bitmap.rows; j++ ) # q9 d& V' [* k$ `0 O& e% ?" L) `3 J3 B u4 c3 ^9 W
{ + g( ^9 h& _3 X$ u % F! I6 I# ~: x$ s k; M& o int row = j + m + y_bearnig;//相对行+本字在位图的总行+空隙 2 m# h5 @! Y; y4 ^' j
. E* D; ?( g9 @1 k int col = l;//列 0 W4 ^' Y' a t& O; @8 F$ F/ u; r
) v/ U/ ]+ v4 f- g+ X9 X uchar* pDest = &imageData[(row * data_width) + l * 4];//找起点 : S6 n( u+ Z8 A; l" ^* m+ l- ?2 i4 D : `' c. O8 [! c7 V2 v5 t& o6 j+ i for( k = 0; k < mTTFMsg->face->glyph->bitmap.width; k++ )//画图 - V' X" X; x( H* I+ _
7 m n, F/ w9 l9 d7 E; X
{+ M* F- f" y% D
/ I; }/ ]$ z' V: P8 M2 _$ e' |+ H8 ?
if (mAntialiasColour)//看不大懂,难道是灰色字体? $ |) [ W* f t/ t% d
: [% m- J) T! L8 j {6 J+ \5 y, S; `7 O1 [6 m- l) j
3 A! m) L7 H9 |" i
// Use the same greyscale pixel for all components RGBA 0 u4 }5 G- F9 Q5 o: K4 D, H
0 x* A7 q" ?' D7 Q) Y# A! r1 h *pDest++= *buffer;, ^) F% j$ W) c7 O4 P) R9 `
" s* M+ @1 M/ m! R; J6 z
*pDest++= *buffer; 6 L( k" Q9 m5 h. H, R' C6 [8 J, v x9 r) F9 V
*pDest++= *buffer; 8 Q. [/ q) E; J& }2 Z! o+ E$ f, F ( k1 W, u4 v: |+ e/ g% Y) U }5 N" g* y. B0 K# n4 a
, I$ |# e9 q5 d1 v, w
else 0 \+ j! _6 g R+ X! q- w) H5 R3 x
, m$ s$ y6 l4 E) t
{# j+ C, w; Q/ |6 W
+ F* T% E. P2 g7 r" ^3 q
// Clamp colour to full white or off - u$ _; Q% ^! h. B7 d3 L! T7 D/ n0 w. x/ Q1 C2 k* W1 z& J
if (*buffer > 0) ) K" @, I7 X4 u& x3 `% {; @5 | N) ]% e! F# X
{ / @6 r+ J5 r8 h4 u 1 }6 M. r3 Q7 l" O7 i *pDest++= 0xFF;) P4 P+ g5 _' N& _1 [, e
" R& x9 m5 A T: c, @
*pDest++= 0xFF; - u( [' ~% M5 K8 K& b9 D8 c1 ~4 z# N" G; K
*pDest++= 0xFF;' D- o' F' o( Y6 R8 \+ {- h! \6 Y/ I7 ^
% y1 n) ?* H& l! E
} ! E9 h) o- H; h: M( E ; [/ K6 |$ X& P- y' @: Q0 r! U2 m. F, g else 0 H m& Y( @* K- \ J6 g! g4 I4 P! d- r; o) ^5 F* K3 t3 J) P
{ 8 E$ B9 v3 n6 A 4 Q. d. z( h2 \9 Q *pDest++= 0;+ {% R j8 ?$ G4 u
/ m& E% w6 l! G2 W; @2 s *pDest++= 0;* z/ n/ G! W5 B. S2 K" q
3 g6 r! e, X9 X2 d$ X
*pDest++= 0; 8 c( D+ m9 q' a0 ~# t8 `$ G+ O9 `$ d6 d5 K8 J5 P7 w3 ]
} / b ^- K1 K' y4 u' B, ]; A% r/ r ' n' r5 ?. T6 ?3 O' U }9 c' x( Q% _. ?0 `( P D2 i0 A* e
% @/ ]" K- C; F+ W8 w
// Always use the greyscale value for alpha 5 b! r6 E% S a0 _& l0 e
2 \, t$ m& e. y1 D# a% c, O+ d
& l# p5 s* I4 z5 r* u& n9 H+ T 5 ^" m/ y) b3 s! m. x U *pDest++= *buffer++;//alpha! 我是一点不了解了为什么是这个? ( N, W) r# N4 ]- H& _ n! ^ % @, T2 V/ z. R8 T% q, x } / R- |% p1 c8 S+ O* Y; L) a' a. ]) P0 X- B8 E9 T' m3 F. C6 \
}6 O! k8 \5 Q* @0 y6 Y
. F, w }& h( @- w h w7 k+ G" e' t8 l
1 y: z$ b$ J$ s$ r' G+ j
this->setGlyphTexCoords( i, ' y3 g- @8 I8 E$ _" G: H1 _
+ H B) ?: z2 U6 Y (Real)l / (Real)tex_side, // u15 P6 Q. J n9 `2 {8 w7 E+ u
6 r B1 I4 R; l9 p+ Z (Real)m / (Real)tex_side, // v1$ L9 }3 I. ?, z" {2 _0 v
3 A* z W% f5 o( B
(Real)( l + ( mTTFMsg->face->glyph->advance.x >> 6 ) ) / (Real)tex_side, // u22 v8 j0 \, i2 ?. x' G8 v$ N
6 a7 |& b- ?" V- {1 W" `
(Real)( m + ( max_height >> 6 ) ) / (Real)tex_side // v2/ }/ F, t6 E" b. \6 y8 ]8 V7 f- g" Y
w% A0 Y% f( `
);//设置坐标 , P- u5 Q0 r' @ n' M " g- f% V2 B# A) p6 s$ H 4 Z: B5 Z/ y' M$ h% V0 w$ F 5 Q7 U$ m2 L7 V9 ~) q% U // Advance a column 7 O' o" {% b( {6 B 3 E W- `; s; F, P7 P" ~4 B l += (advance + mTTFMsg->char_spacer);4 R* k, {. R; l
( a0 ]( \7 Y. S3 R+ X9 l //l+= 本字宽+字空 ) g4 A4 m5 [9 @$ P! h- U+ W" F
1 D$ h0 \4 J& b + M, j; I# h, J( a- f 0 B5 O; i" G! R' F // If at end of row 7 ?1 ?! Y+ _7 s e) U" S/ }1 |; ~. l; ~0 O: m* u! t
//如果到头容不下一个字 ! S; ?% N- `6 D' l 6 B2 p: v( p( m( _( l, K if( tex_side - 1 < l + ( advance ) )8 |8 H8 G9 z! d
5 ]! {! U' v3 D* t {6 X2 C( J A: O; k
$ c) x' Q% f# s u m += ( max_height >> 6 ) + mTTFMsg->char_spacer;' s3 H: n( R# a( Z F( P2 h
+ ]: O- U! y: G! Z1 O0 v
l = n = 0; ; x* p; O% |5 q5 K8 M t T/ H: Q: \% R1 G( ^3 o }4 `8 R1 b P; E3 a. ]4 i
1 u/ T8 m6 _! X* L 4 d8 P1 U6 Z4 o( W# \4 G. q: y , `& _& Q& ~: k7 O, L } , x5 V' s6 I; k* K! A : l) P5 m% g# _. M. J: C# v // 把信息存到我们的mTTFMsg中 >_< 7 c! m# G) D R5 ?0 O/ y1 W8 W/ `; J( s- t( k
if(l)3 f' c4 _! i5 k/ f- g3 |
6 h' A) N9 G/ r4 Q G( V1 u mTTFMsg->point.second = m + ( max_height >> 6 ) + mTTFMsg->char_spacer; ( ^/ z5 E( j* \+ ]3 `6 u- U9 k8 V1 f% w8 M" P1 g
else " o( O0 i) S1 Y6 V" d: _. P
3 u" ~( Y+ y+ e Z2 Z( ^* m& i3 m2 R mTTFMsg->point.second = m;, C7 i2 l& r4 |
7 G" }, N1 J' O8 F# e
/ {9 L4 l- l4 Y6 v5 Y J1 P9 U' E/ M/ C$ m mTTFMsg->point.first = 0;//另起一行 ) X9 G7 r/ _* F, V" f# k
4 C6 S' y- e5 L* o+ _
$ z& Q2 A0 T4 r% n: F( V0 i }, h1 s1 O# s/ ]) t* p
8 u0 u& q6 }$ U s else : b3 W" u# N# R' [: E6 I1 y* g ! M, E$ d9 o, B; y9 W+ e L; b {: E. c7 U6 ^* a+ Z
+ ]7 Q' i. _" A; o$ K+ i1 H+ e2 e *pDest++= 0; 9 q& E Z4 u2 I( L- M1 c& x" [- [7 Y
*pDest++= 0; 4 F& d" j3 @1 ?8 `- U6 e8 B/ F- a: v9 ^: h4 |, @
*pDest++= 0;: j7 Q9 o8 c( U* x1 k+ c
2 b9 y: t( u# n }. ]* \3 @* {7 T
- V$ d9 P4 ?2 z( b. F8 l7 R
} 6 R3 E2 v, E2 s# y5 I4 E' O , s% D# ?: C' d" {) |, n // Always use the greyscale value for alpha 5 i$ b( [4 V* t( {2 ^9 d3 y( e$ c6 `: K B
0 ~: q5 X& d4 P
6 U( p; ?, p( X6 H8 O" X- @, o // LogManager::getSingleton().logMessage(StringConverter::toString(*buffer)+"is cool"); ; A) x9 v' h! k) {5 I( |8 g, q! u; [: K8 p
*pDest++= *buffer++; & _# j2 ?* ]* ~* Q 1 \4 N7 d f' c5 q } 6 T' ^3 s7 a8 R: a* P- c& z# m2 t3 q5 {
2 J& j+ I' u) j7 g$ h- o' _: z: h: u% O
} ) I4 d( _% j9 D- E+ F 0 K0 K" L: m5 s* H // 设置位置 1 T" U4 D/ g l3 d$ y* g
$ k" X/ Y# X: W, y% B
this->setGlyphTexCoords( dwChar, 7 M- j8 k9 H# R' n' C ) _1 D2 M- h9 S' j9 u (Real)rect.left / 512.0f, // u16 T3 a4 H- U! S( x2 {/ c
# o+ {' E4 N, n- D
(Real)rect.top / 512.0f, // v10 o4 Q% ]' x |* J5 e
: t" e; F" G3 x# {
(Real)( rect.left + (mTTFMsg->face->glyph->advance.x >> 6) ) / 512.0f, // u2! Z; T( `" D& a