Комментарии 14
Статье +, однако подозрение у санитаров нарастает:
LDL. The main idea is to write an analogue of the SDL library.
Исходники LDL уже 1,7 мб кода... и это только начало.
Я об этом проекте упоминал в прошлых статьях. Он получился слишком жирным и сложно портируемым под старые системы. Такой большой проект я так и не смог портировать под DOS и Windows 3.1 И еще проблема, что я в него впихнул всё, и форматы графики, аудио, шрифты с поддержкой free type. Теперь я понимаю, что такие вещи должны быть внешними.
Поэтому решил начать заново, но уже с учетом предыдущего опыта и уже по мере реализации пока кодовая база небольшая портировать и под DOS и под Windows 3.1
Сделать его реально компактным.
Ну и по мере реализации, всегда хотелось поделиться мыслями и решениями которые использую в разработке LDL. Такой некий гайд получается.
ИМХО слово "портировать" и чуть-чуть слова "старые системы" подразумевают не стареющую классику: голый (как Король) membuff + минимальный, но удачный набор алгоритмов графики над ним.
Там не только в этом проблема. Много лишних namespace'ов, лишнего функционала. И главное я набил руку на этом проекте. И теперь знаю как некоторые вещи сделать хорошо или упростить.
То о чем вы говорите, будет просто ещё одним вариантом рендера.
голый (как Король) membuff + минимальный, но удачный набор алгоритмов графики над ним.
Ещё в планах такой рендер портировать под микроконтроллеры. Да и вообще всю библиотеку LDL, если это возможно конечно.
Для этого каждую новую фичу или функционал, как бы в уме прокручиваю, будет ли работать на том или ином железе. Мало функционала, лучше портабельность.
В своё время пользовался очень компактным рендером, с весьма качественной реализацией.
https://agg.sourceforge.net/antigrain.com/index.html
Очень хорошо работает в условиях недостатка памяти.
В частности на нём была написана iGo для КПК ещё в каменном веке.
Второе, насчёт GUI для старых систем, рекламирую второй раз на хабре - Zinc!
В своё время тоже плотно возился с DirectX и GDI. Эх как давно было!
Если вы хотите просто вывести свой DIB, но не хотите что бы GDI отслеживал его как ресурс, лучше использовать функцию SetDIBitsToDevice, сэкономите целое копирование. В 2001-м году, такие нюансы были ой как заметны и важны ;)
Result
подозрительно напоминает std::expected
, но зачем-то от него отличается.
Данные функции поддерживаются в Windows 95, 98. Для Windows 3.1 нужно будет найти альтернативу.
А нетути. Windows 3.x изначально не поддерживал работу с DIB напрямую (CreateDIBSection()
и его друзья). Есть SetDIBits()
, StretchDIBits()
и, кажется, SetDIBitsToDevice()
, но всё это дохлый номер. Зато была библиотека WinG, являвшаяся по сути тем же API для DIB section, но перенесённым с Windows 95 (тогда ещё Chicago) обратно на Windows 3.11 - после пинка от Джона Кармака из-за неудачи с портированием DOOM. И вот там уже как раз есть WinGStretchBlt()
и прочие штучки.
Что до TransparentBlt()
, то увы, он появился уже только в Windows 98 (линейка 9x) и Windows 2000 (линейка NT). И да: учти, что для полноэкранного режима лучше использовать вообще другие способы, типа DCI / DispDIB или же сторонних решений вроде SciTech WinDirect (в частности, на ней был основан, кажется, WinQuake - самый первый порт Quake на Windows, ещё до GLQuake).
Не уверен, что точно помню детали, но в остальном, думаю, нигде не соврал.
Спасибо за дополнительную информацию. На Windows 3.1 пока проблема с выводом, картинок. И я еще пока не тестировал вывод картинок через GDI на Windows 95.
Надо будет изучить этот вопрос.
Что до
TransparentBlt()
, то увы, он появился уже только в Windows 98 (линейка 9x) и Windows 2000 (линейка NT). И да: учти, что для полноэкранного режима лучше использовать вообще другие способы, типа DCI / DispDIB или же сторонних решений вроде SciTech WinDirect (в частности, на ней был основан, кажется, WinQuake - самый первый порт Quake на Windows, ещё до GLQuake).
Поддержка GDI нужна как опция, я не возлагаю особых надежд на производительность. GDI нужен больше для очень старых систем, где 256-512 кб на видеокарте. Выводит графику и ладно.
И поковыряться во всем этом интересно.
Пишем легаси с нуля на С++, не вызывая подозрение у санитаров. 05 — GDI рендер