问题
我想开发一个小型的乌尔都语桌面出版应用程序。这是一种从右到左的语言,但排版可能非常复杂。
在最简单的情况下,我们可以使用Unicode字体,这是BBC使用的方法:http://www.bbc.co.uk/urdu然而,Unicode方法本质上是强迫所有的字母牢牢地坐在一个共同的基线上,并具有相同的字母高度。文本看起来更像阿拉伯语,这对于商业文件来说是可以接受的,但乌尔都语的美丽在于其自由形式的书法风格。下面是一个示例:
http://upload.wikimedia.org/wikipedia/commons/9/94/Urdu_couplet.svg我想写一个乌尔都字体呈现引擎,它提供了大量的控制来呈现Unicode乌尔都文字的书法风格。创建一个单独的字体文件(假设其中可以容纳大约18,000种字母字形组合)并不能完全解决这个问题。例如,我想增加"字距"(字母间距),这将需要流畅地扩展连接字母的线条,同时保持平滑的曲线。
的问题我最初的方法是只针对Windows,并使用c++和MFC。但这些都是非常古老的技术,虽然可能仍然可以解决问题,但我想问的是,什么是更现代的方法。以下是我探索过的选项:
- 字体渲染是一个低级活动,大概c#/WPF不合适
- 我想避免只针对Windows,所以也许c++/Qt可能是一个选项
- 考虑到云计算的趋势,理想的情况是通过浏览器部署,但我认为这是不可能得到一致的体验。然后,我还没有正确地探索GDI和DirectWrite
- 也许可以从DirectX/OpenGL游戏中利用一些东西
你的目标是什么?字体渲染引擎是为桌面/移动应用程序,还是为web?当然,您可以同时开发和,这没有问题。如果您的代码架构良好,您可以拥有三部分:核心引擎、桌面平台接口和web平台接口。前者将同时用c++和javascript编写,它们几乎是1:1的重新实现,也许js机器是从c++的一个子集生成的。平台接口将分别用c++和javascript编写。
在平台界面中,你最关心的是用于渲染(描边)字体的API。Qt的GUI模块提供了一个可以很好地工作的QPainterPath
。Cairo是另一个运行良好的库。Qt的好处是它提供了许多其他跨平台的好处。使用你的渲染器的应用程序根本不必是基于Qt的,事实上,你可以静态地将Qt的核心和gui模块链接到你的库,使其完全透明。
WPF"类似于"Qt Quick 2,而MFC"类似于"Qt Widgets——简单地解决不同的问题。您不是在设计用户界面,而只是在设计渲染库。您需要2D路径描边和几何支持,而不是用户界面框架。Qt的模块化对你来说是一个很好的资产:只使用你需要的模块。
使用JavaScript,你会在某种HTML5画布元素上绘图。所有与字体相关的东西都必须从头开始实现。HTML5不允许你插入字体渲染引擎,你只需要绘制图片并处理复制-粘贴等操作。既然你必须经历所有这些麻烦,那么就没有必要涉猎DirectWrite,因为你必须从头开始实现它。当然,有多少字体解码是在服务器端完成的,多少是在客户端完成的,这取决于您。服务器端可以使用Qt——它是一个相当有能力的服务器开发平台。如果你一直在使用信用卡,很有可能你的一些交易是通过Qt编码的后端进行的:)