Doom портировали на DTF

Doom портировали на DTF

Разработчик ading2210 создал уникальный проект DoomPDF, демонстрирующий неожиданные возможности формата PDF. Проект, написанный на языке C и размещенный на GitHub, позволяет запускать легендарную игру Doom непосредственно в PDF-документе через браузеры на базе Chromium с движком PDFium.

Doom портировали на DTF

Формат PDF, изначально созданный для статических документов, обладает встроенной поддержкой JavaScript со своей стандартной библиотекой. Современные браузеры, включая Chromium и Firefox, интегрируют эту функциональность в свои PDF-движки, хотя с существенными ограничениями API по соображениям безопасности.

Doom портировали на DTF

Adobe Acrobat предлагает полную спецификацию JavaScript для PDF, включающую расширенные возможности: 3D-рендеринг, выполнение HTTP-запросов и даже определение подключенных к системе мониторов. Однако браузерные реализации намеренно ограничены базовым функционалом, что, тем не менее, достаточно для выполнения сложных вычислений при ограниченном вводе-выводе.

Для запуска игры в PDF используется старая версия Emscripten, компилирующая C-код в asm.js вместо WebAssembly. Основные технические вызовы включали организацию ввода данных и создание эффективного буфера кадров.

Инновационный подход к рендерингу заключается в использовании отдельных текстовых полей для каждой строки изображения, заполняемых ASCII-символами. Это решение позволило достичь 6-цветного монохромного вывода, достаточного для комфортной игры, избежав неэффективного подхода с отдельными полями для каждого пикселя при разрешении 320×200.

Несмотря на относительно низкую производительность (около 80 мс на кадр), игра остается вполне играбельной. Разработчик реализовал прокручиваемую консоль из 25 текстовых полей для отладки, куда перенаправляется stdout из Emscripten, компенсируя отсутствие стандартного console.println в Chrome.

Предшествующий опыт: PDFtris. До появления DoomPDF разработчик Томас Ринсма создал pdftris - реализацию Tetris в PDF, используя Python. Проект демонстрирует совместимость с движками PDFium и PDF.js, используя отображение/скрытие аннотационных полей для создания монохромных пикселей и обработку клавиатурного ввода через текстовые поля. Весь код проекта доступен в ASCII-формате на GitHub.

Оба проекта демонстрируют неожиданную гибкость формата PDF и открывают новые перспективы его использования за пределами традиционной документации.

Исходный код:

1
4