Разработчик под ником ading2210 представил проект DoomPDF — это Doom в PDF в браузере. Код написан на C и опубликован на GitHub. Игровой PDF-файл открывается только в браузерах на базе Chromium, использующих движок PDFium.
«Можно было бы ожидать, что файлы PDF будут состоять только из статических документов, но, как ни странно, формат файла PDF поддерживает Javascript с собственной отдельной стандартной библиотекой. Современные браузеры (Chromium, Firefox) реализуют это как часть своих движков PDF. Однако API, доступные в браузере, гораздо более ограничены.
Полная спецификация для JS в PDF была реализована только Adobe Acrobat, и она содержит некоторые нелепые вещи, такие как возможность выполнять 3D‑рендеринг, делать HTTP‑запросы и обнаруживать каждый монитор, подключенный к системе пользователя. Однако в Chromium и других браузерах была реализована только крошечная часть этой поверхности API из‑за очевидных проблем безопасности. Благодаря этому мы можем выполнять любые вычисления, которые захотим, просто с очень ограниченным вводом‑выводом.
Код C можно скомпилировать для запуска в PDF с использованием старой версии Emscripten, которая нацелена на asm.js вместо WebAssembly. Затем всё, что нужно, — это способ получить ключевые входные данные и буфер кадра для вывода.
Вводные данные довольно просты, поскольку движок PDF Chromium поддерживает текстовые поля и кнопки. Однако получить красивый и достаточно быстрый буфер кадра — гораздо более сложная задача.
Предыдущие интерактивные проекты PDF, которые я видел, использовали отдельные текстовые поля, которые переключались между собой для создания отдельных пикселей. Однако разрешение Doom составляет 320×200, что означало бы, что тысячи текстовых полей должны переключаться в каждом кадре, что неосуществимо.
Вместо этого этот порт использует отдельное текстовое поле для каждой строки на экране, а затем устанавливает их содержимое в различные символы ASCII. Мне удалось получить таким образом 6-цветный монохромный вывод, чего достаточно для того, чтобы все было разборчиво в игре.
Производительность этого метода довольно плохая, но играбельна, поскольку обновление всего этого текста занимает около 80 мс на кадр. Я также реализовал прокручиваемую текстовую консоль с использованием 25 сложенных текстовых полей. Поток stdout из Emscripten перенаправляется туда. Это значительно облегчило мне отладку, поскольку в противном случае не было бы метода ведения журнала в консоли (надлежащий console.println не реализован в Chrome)»,
— пояснил автор проекта
Ранее разработчик Томас Ринсма представил проект pdftris — это тетрис в PDF в браузере. Код написан на Python и опубликован на GitHub. «Я понял, что движки PDF современных настольных браузеров (PDFium и PDF.js) поддерживают JavaScript с достаточным количеством примитивов ввода‑вывода для создания простой игры вроде Tetris. Было немного сложно найти объединение функций, которые работают в обоих движках, но в итоге оказалось, что отображение/скрытие „полей“ аннотаций хорошо работает для создания монохромных пикселей, а ввод с клавиатуры можно осуществить, набрав текст в поле ввода. В целом это довольно криво, но это хорошее напоминание о том, насколько универсальным может быть скриптование PDF. Связанный PDF полностью в ASCII, поэтому вы можете просто открыть его в текстовом редакторе или посмотреть исходный код здесь: https://github.com/ThomasRinsma/pdftris/blob/main/gengrid.py», — пояснил Ринсма.
ссылка на оригинал статьи https://habr.com/ru/articles/873194/
Добавить комментарий