|
|
Community > ReactOS Newsletter Archive > ReactOS Newsletter: 时事通讯 55 期时事通讯 55 期by Z98 on 2009-03-16 字体引擎在功能上的正确以及实现上的正确这两者的定义上确实是有个差别,这个差别是每个人在 ReactOS 里说某个功能能够运作时必须紧记住。以文本渲染而言,当多数的输出看似正确,其根本的实现却未必能够与正确的做法相近。显示文本有个函数调用链,它的缩写分别为TextOutA/W, NtGdiExtTextOutW, 和 GreExtTextOutW。当然还有几个其他的类型但以上的例子将能够给个大概的意思关于 Gre 函数的顺序。ReactOS 在另一个方面却没有 GreExtTextOutW 的情况下Win32k 模块居然在调用 NtGdiExtTextOutW。既然 NtGdiExtTextOutW 是个与用户模式内存互动的 syscall,它因此确保其缓存是在用户模式中处理,所以在内核模式里调用该函数以及含有内核模式的缓存本来就不应该运作的。之所以能够运作是由于另一个错误在 MmCopyFromCaller,它是用做从用户模式的缓存复制数据到内核模式里。这个函数本来应该检查用户模式并且复制该数据到内核模式的缓存。可是这个检查有问题,才能够让Win32k 使用NtGdiExtTextOutW。况且, MmCopyFromCaller 本来就不应该存在。它是ReactOS 的特定破解并且 NtGdiExtTextOutW 本来应该就使用 SEH 来检测所收到的缓存。之所以 Win32k 应该使用 GreExtTextOutW 的原因是它处理内核模式缓存的函数并且 GreExtTextOutW 也预期接收内核模式的缓存。因此它在没有任何检查的情况下自动相信所处理的东西。这种情况在当中的函数仅在内核模式里调用才能运作时是相当普遍的。 另一个 ReactOS 没有做的是使用 STROBJ/ESTROBJ 数据结构,是用来描述字型的套件以及其位置,基本上就是所要显示的文本。 GreExtTextOutW 调用ESTROBJ::vInit 来初始化该结构,并且也数据传递着以便填上它并且做出必要的坐标翻译。ESTROBJ::vInit 函数也会检查 RFONTOBJ 的数据结构以获取字体的字型信息。当这一切都完成之后,STROBJ 结构就会移交给 EngTextOut 或者 DrvTextOut 函数。Eng 前缀表示在显示驱动程序并没有实现特定功能的情况下将作为Win32k 的内建的显示函数备份用途,并且这个例子下应该使用的是DrvTextOut 函数。ROS 所存在的问题却是 STROBJ 或 RFONTOBJ 二者的数据结构并不存在,因此在上所描述的整个渲染链也不存在。更何况 ReactOS 的 Win32k 也没有实现EngTextOut ,也因此完全忽视 DrvTextOut 函数,即使它是存在的。 这段期间,Timo Kreuzer 都在字体驱动程序里忙着纠正这个情况。在上所描述的 RFONTOBJ 数据结构也用作为任何已被渲染字型的缓存。可是当某个字型首次被渲染时,一个与RFONTOBJ 结构关联的字体驱动程序将被调用。字体驱动程序有个函数叫 DrvQueryFontData 是用来渲染字型并且返回值是位图或者一个轮廓。此后的下一步是真正的实现 RFONTOBJ 和 STROBJ 数据结构并再重写那些负责文本渲染并使用它们的函数。大概这样的工作量足以让他在下一个年头里忙碌了。 我已经解释了目前 ReactOS 并没有做什么,那么如果连它现在能够做什么的都只字不提将会是非常疏忽的行为,无论其功能出现多大的错误。与其透过字体驱动程序以获取字型信息,所有以上的描述都被绕过并且直接调用 Freetype DLL。而且既然 EngTextOut 和 DrvTextOut 的函数都不在文本渲染的一部分里有用途,GreExtTextOut 就直接调用 Freetype 来渲染字型然后再使用 EngBitBlt 或 DrvBitBlt 来显示它们。这又是另一个在 ReactOS 的Win32k 里是多么的令人费解的好榜样。 top网络就如上次时事通讯所提起的, Cameron Gutman 在 Art Yerkes 完成了初步的实现后都在处理网络堆栈。他目前正在修正错误,比如 IRP 的取消造成 ping 死机。他的多数作品已经合并到 0.3.6 和 0.3.7 的发布并分布于数个网络堆栈。当中介于确保资源正确的分派和取消分派以及到取决于某个操作成功完成之后所应该返回正确的状态信息。 topTwitter(推特)最近 Ged Murphy 设立了一个公共 Twitter 群的账户以便为那些有兴趣的开发者能够做出本工程的更新。这些更新将会通过一般的 tweet 方式发送并且能够为任何跟随此账户的人所接收。任何人注册为 reactos 跟随着将自动被reactos 账户所跟随。这换句话说表示他们将能够参与本群组的 tweets 并且将会在所有跟随着中传播。若要发生一个群组 tweet,您只需要发送一个直接的信息到 reactos 而非一个 @reply 然后 GroupTweet 就会替您照顾其他的事务。它未来的用途有可能包括在会场里提供现场更新。 top |