接上,一点点来,先把写屏函数分析完:
, }" B1 F, z' O4 e写屏函数: -
- 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
复制代码
! @2 [# Q+ U/ }& a3 P! }8 J- L* w实际上这里是定义了一个顶点结构,那一串浮点运算就是根据003E69F0处的字符在字库中的坐标信息建来赋值自己定义的顶点结构
* v: X- H) z9 x% r9 g. Q TLVertex vertices[] =
' g# R7 c+ y5 } l' q7 R' Q { 9 C o7 w+ s2 i
{ 248.6f, 222.2f, 0.5f, 1.0f, 0xffffff00, a, b },
2 m% {7 n# c, Y/ } { 262.6f, 222.2f, 0.5f, 1.0f, 0xffffff00, c, b },
1 `0 V8 }- D" y7 Q* c( f { 248.6f, 240.2f, 0.5f, 1.0f, 0xffffff00, a, d },
. `! i% {+ w/ P' U4 c7 r { 262.6f, 240.2f, 0.5f, 1.0f, 0xffffff00, c, d } ) Y5 C9 o. P- `
}; //129CE000 指向vertices,0xffffff00表示颜色,这里应该是白色 5 P" c0 A( z7 S. _( l8 Q7 w! v
8 U; c/ A/ K4 B- a
[a,b,c,d] = {0.02929688, 0.5410156, 0.08398438, 0.6113281}; //003E69F0 - ~3 }% z& w* v/ H8 Q
0 X) m5 E8 C1 I
PS:“每个字符占1C个字节,最后的四个字节都是一样的,可以认为是结束标志”
& E T$ q' U& M6 G: U5 p其实是每个字符占0x70个字节,每个字符有4个顶点信息,你可以把它想像成那个字符的四个角,
3 o. d# A }' W; q) t每1C个字节就是一个顶点信息,倒数第三个字节表示颜色,他们之间的颜色渐变是由DXD来实现的" j$ }5 l6 O. Z2 ]
这是一张DDS格式的图片字库 |