c - 移植 Autodesk Animator Pro 以实现跨平台

标签 c paint dos allegro

我之前的相关问题在这里 Reverse Engineering old paint programs

我在这里建立了我的运营基地:http://animatorpro.org
维基即将推出。

好的,现在我有一个 300,000 行的旧版 MSDOS 代码库。这是一种“小心你想要的”情况。我不是一个有经验的 C 程序员。我也不是完全没有经验,但就所有意图和目的而言,我是该语言的菜鸟,尤其是其库的复杂性。我特别不了解专为 MSDOS 编写的 C 程序和跨平台程序之间的变化莫测的差异。然而,我已经研究这个代码库一年多了,这就是我对 Animator Pro 的了解:

使用的编译器和工具:

  • Watcom C 编译器
  • tcmake(从 Turbo C 制作程序)
  • 386asm,Phar Lap dos 扩展器的专用汇编器
  • 当然,还有 Phar Lap dos 扩展器本身。
  • 一些不起眼的 dos 实用程序

  • 大部分编译似乎是由批处理文件驱动的。虽然我已经获得了所有这些工具的副本,但我还没有成功地编译它。 (虽然我已经编译了它的哥哥,autodesk 动画师原创。

    它有一个插件系统,可以在 DLL 可用之前复制 DLL,基于 REX。插件系统处理:
  • 视频驱动程序(包含大量 VESA 驱动程序)
  • 输入驱动程序(包括 wacom 数位板和键盘)
  • 绘图工具
  • 墨水(如 photoshop 的滤镜或混合模式)
  • 脚本插件(本质上是编译脚本)
  • 文件格式

  • 它有自己的名为 POCO 的脚本解释器,基于 C 语言——脚本语言有足够的能力来完成插件系统可以做的几乎所有事情——只是速度更慢。

    有了这些信息,这就是我的发展计划。请批评这一点。源代码可在上面的链接中找到,因此如果您愿意,您可以轻松地自己评估情况。
  • 使用其原始工具进行编译。
  • 切换到使用 DJGPP,并进行必要的更改以使其与原始汇编器一起编译。
  • 包括 Allegro.cc“游戏”库,并将尽可能多的功能切换到该库——也许只需编写使用 Allegro API 的新视频和输入驱动程序即可。我在考虑 allegro 而不是 SDL,因为:Allegro 有 DOS 版本,而且令人着迷的是,它的核心功能之一是能够播放 Animator Pro 的原生格式 FLIC。
  • 希望在 3 之后,我将消除项目中的大部分或全部汇编程序。我说是有希望的,因为它是一种晦涩的方言,未经重大修改就不会在任何现代免费汇编程序中进行汇编。我都试过了。如果我可以定义汇编程序的实际功能,剩下的将转换为 NASM 中的汇编,或者转换为 C 代码。
  • 将 dos 扩展器从 Phar Lap 切换到 HX Dos http://www.japheth.de/HX.html , promise 尽可能多地复制 WIN32 api。然后进行所有必要的代码更改以使其工作。
  • 切换到Allegro.cc的win32版本,假设win32版本可以运行在HXDos之上。进行任何进一步的必要更改
  • 修改插件系统以使用某种标准的跨平台插件库。这会是什么,我不知道。也许你可以提供一些建议?我与最初编写插件系统的开发人员进行了交谈,他说由于分段限制,它在现代操作系统上无法实现某些功能。我不确定这意味着什么,但我猜这意味着几乎所有插件都需要从头开始重写。
  • 神奇的是,我完成了上述所有工作,我们可以尝试让它在 windows、osx 和 linux 中运行,同时处理其他跨平台小问题,如长文件名,以及我没有想到的事情。

  • 任何人有任何问题吗?快板是一个不错的选择吗?如果不是,为什么?你会怎么处理这个插件系统?你会怎么做?这整个事情是愚蠢的,我应该从头开始重写它,使用原作作为灵感吗? (显然需要原始开发人员“大约一个月”才能做到这一点)

    我上面没有提到的一件事是文本/字体系统。不确定该怎么做,但 Animator Pro 有自己的自定义字体格式,但也可以使用 Postscript Type 1 字体和其他一些格式。

    最佳答案

    简而言之,我对你的计划最大的担忧是:你的方法似乎是试图让整个庞大的东西始终工作,调整环境,远离 DOS。在对环境的每次调整期间,这意味着您将有大约 10 亿个可能同时被打破的微妙假设,而您不一定了解其中的任何一个。一次将它们全部解开将非常痛苦。

    如果我在做移植,我的方法是禁用尽可能多的代码以使某些东西在现代环境中运行,然后将部件重新联机,一次一个。编写一个简单的测试工具程序,加载一个显示驱动程序并绘制一些东西,并为 DOS 编译它以确保您理解界面。然后编写一些实现相同接口(interface)的 C 代码,但使用 Allegro(或 SDL 或 SFML),并使该程序在 Windows 或 Linux 下运行。当输出不同时,您可以使用一个简单的测试用例。

    您在此端口上的全部工作是用全新的接口(interface)和功能替换各种接口(interface)和功能的实现。这是单元测试擅长的工作。不要在没有在 DOS 下运行在旧代码上的某种测试的情况下编写任何新代码!使您的潜在问题尽可能小而简单。移植汇编代码而不是重写它,除非你有理由相信它实际上会让你的工作更容易(即,在 NASM 下只需很少的调整就可以很好地编译的算法内容)。不要一次咬掉一块比您可以舒适地放入大脑的更大的块。

    我,一方面,期待看到你的进步!我认为你正在尝试做的很棒。谢谢你这样做。

    关于c - 移植 Autodesk Animator Pro 以实现跨平台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4911160/

    相关文章:

    c# - 刷新一个控件

    java - 尝试从运行中重新绘制 Gui

    c - 在C语言游戏中使用鼠标控制

    windows - 批处理文件日/月/年语法?

    c - 查找所有强连接顶点集

    c - IOCTL:HDIO_GET_IDENTITY 的参数无效

    c++ - 声明全局常量和在使用它的函数内部声明常量有什么区别

    c - 错误 : expected declaration or statement at end of input

    java - 如何在透明JFrame上使用paintComponent重置图形?

    c - 写入 0xb8000000 会在屏幕上产生输出,而无需任何打印语句,例如 `printf`