接上,一点点来,先把写屏函数分析完:
# r+ ^7 E8 K; T写屏函数: -
- 02A2EA4C |> /8B00 |/mov eax,dword ptr ds:[eax]
- 02A2EA4E |. |0FB70450 ||movzx eax,word ptr ds:[eax+edx*2] ; //取出第edx个字符
- 02A2EA52 |. |8B7C24 14 ||mov edi,dword ptr ss:[esp+14]
- 02A2EA56 |. |8B7F 2C ||mov edi,dword ptr ds:[edi+2C] ; //003E69F0
- 02A2EA59 |. |8D04C0 ||lea eax,dword ptr ds:[eax+eax*8]
- 02A2EA5C |. |8D0487 ||lea eax,dword ptr ds:[edi+eax*4] ; //eax存放的就是字库的地址(实际上是单个字符的坐标)
- 02A2EA5F |. |8B7C24 0C ||mov edi,dword ptr ss:[esp+C] ; //129CE000
- 02A2EA63 |. |8D7C39 14 ||lea edi,dword ptr ds:[ecx+edi+14]
- 02A2EA67 |. |D940 04 ||fld dword ptr ds:[eax+4]
- 02A2EA6A |. |83C2 01 ||add edx,1 ; //多少个需要渲染的字符
- 02A2EA6D |. |D95C24 30 ||fstp dword ptr ss:[esp+30]
- 02A2EA71 |. |D900 ||fld dword ptr ds:[eax]
- 02A2EA73 |. |D91F ||fstp dword ptr ds:[edi]
- 02A2EA75 |. |D94424 30 ||fld dword ptr ss:[esp+30]
- 02A2EA79 |. |D95F 04 ||fstp dword ptr ds:[edi+4]
- 02A2EA7C |. |8B7C24 0C ||mov edi,dword ptr ss:[esp+C]
- 02A2EA80 |. |D940 04 ||fld dword ptr ds:[eax+4]
- 02A2EA83 |. |8D7C39 30 ||lea edi,dword ptr ds:[ecx+edi+30] ; // 14 + X,Y + 14 ==30
- 02A2EA87 |. |D95C24 30 ||fstp dword ptr ss:[esp+30]
- 02A2EA8B |. |D940 08 ||fld dword ptr ds:[eax+8]
- 02A2EA8E |. |D91F ||fstp dword ptr ds:[edi]
- 02A2EA90 |. |D94424 30 ||fld dword ptr ss:[esp+30]
- 02A2EA94 |. |D95F 04 ||fstp dword ptr ds:[edi+4]
- 02A2EA97 |. |8B7C24 0C ||mov edi,dword ptr ss:[esp+C]
- 02A2EA9B |. |D940 0C ||fld dword ptr ds:[eax+C]
- 02A2EA9E |. |8D7C39 4C ||lea edi,dword ptr ds:[ecx+edi+4C]
- 02A2EAA2 |. |D95C24 30 ||fstp dword ptr ss:[esp+30]
- 02A2EAA6 |. |D900 ||fld dword ptr ds:[eax]
- 02A2EAA8 |. |D91F ||fstp dword ptr ds:[edi]
- 02A2EAAA |. |D94424 30 ||fld dword ptr ss:[esp+30]
- 02A2EAAE |. |D95F 04 ||fstp dword ptr ds:[edi+4]
- 02A2EAB1 |. |8B7C24 0C ||mov edi,dword ptr ss:[esp+C]
- 02A2EAB5 |. |D940 0C ||fld dword ptr ds:[eax+C]
- 02A2EAB8 |. |8D7C39 68 ||lea edi,dword ptr ds:[ecx+edi+68]
- 02A2EABC |. |D95C24 30 ||fstp dword ptr ss:[esp+30]
- 02A2EAC0 |. |83C1 70 ||add ecx,70 ; //每70一个顶点结构
- 02A2EAC3 |. |D940 08 ||fld dword ptr ds:[eax+8]
- 02A2EAC6 |. |D91F ||fstp dword ptr ds:[edi]
- 02A2EAC8 |. |D94424 30 ||fld dword ptr ss:[esp+30]
- 02A2EACC |. |D95F 04 ||fstp dword ptr ds:[edi+4]
- 02A2EACF |. |8B46 58 ||mov eax,dword ptr ds:[esi+58]
- 02A2EAD2 |. |03C3 ||add eax,ebx
- 02A2EAD4 |. |3B50 08 ||cmp edx,dword ptr ds:[eax+8]
- 02A2EAD7 |.^\\0F8C 6FFFFFFF |\\jl xcDxShad.02A2EA4C
复制代码
/ ] q \ W) e" @3 ]实际上这里是定义了一个顶点结构,那一串浮点运算就是根据003E69F0处的字符在字库中的坐标信息建来赋值自己定义的顶点结构 & k" z+ R& o3 I% [( A; E0 V* T
TLVertex vertices[] =
# X6 Y; Q! P% `+ u& F" O { 1 _" S% N* `/ y6 e
{ 248.6f, 222.2f, 0.5f, 1.0f, 0xffffff00, a, b }, 6 Y. B3 j' P1 g8 k+ ?% Y0 j
{ 262.6f, 222.2f, 0.5f, 1.0f, 0xffffff00, c, b }, ) W0 S. o1 C% c, k' E z2 ?) z, D
{ 248.6f, 240.2f, 0.5f, 1.0f, 0xffffff00, a, d },
+ r' J& ~7 a9 s8 d% b& `6 S+ b% d { 262.6f, 240.2f, 0.5f, 1.0f, 0xffffff00, c, d }
! O/ k% Y( z) B( w6 T }; //129CE000 指向vertices,0xffffff00表示颜色,这里应该是白色 6 q+ a7 k6 J. ?$ x! t- I: Q. Q
5 I0 Z. }* ?: y9 ]- e, T2 d
[a,b,c,d] = {0.02929688, 0.5410156, 0.08398438, 0.6113281}; //003E69F0
' `" p2 `2 }& j0 F( l$ i/ p. E. j7 K0 ?8 D2 J9 U( ^% z+ L- j( ~8 v
PS:“每个字符占1C个字节,最后的四个字节都是一样的,可以认为是结束标志”
7 g$ J8 l; Z* v4 O4 ]* l5 o& h其实是每个字符占0x70个字节,每个字符有4个顶点信息,你可以把它想像成那个字符的四个角,7 \% T7 C( c+ G. r6 i7 a
每1C个字节就是一个顶点信息,倒数第三个字节表示颜色,他们之间的颜色渐变是由DXD来实现的
, W) j c1 V! d( I* y这是一张DDS格式的图片字库 |