Page 1 of 2

Области пустоты в окне.

Posted: Wed Apr 16, 2014 7:53 pm
by Mario_r4
Текущее устройство ф.0 позволяет отключать заливку окна (C = 1 - не закрашивать рабочую область при отрисовке окна), т.е. рисуется внешняя рамка и заголовок. Это сделано было с целью убрать моргание (blink) появляю щееся при последовательной отрисовке фона, а поверх него отличающиеся по цвету элементы. Способность полезная, спору нет, однако, имеется недостаток - программисту приходится самому вычислять все пустоты между элементами (кнопки, боксы, бары...) и заливать их ф.13. Получается куча лишних действий и кода, и так в каждой программе.

У меня уже давно идея вертелась в голове - указывать таблицу прямоугольных областей пустот, где фон не должен отрисовываться. Т.е. такой список в каждой строке которого хранится четыре элемента, описывающих крайние углы области пустоты (верхний левый, верхний правый, нижний левый, нижний правый). Опция может включаться флагом, например, можно выбросить градиентную заливку, которую по факту ни одна программа (кроме SETUP) не использует. Указателем на структуру с областями пустот будет служить ESI.

Естественно, при каждом изменение размера окна, эту структуру придется обновлять, но это несложно, так как размеры и расположение для "резинового" окна приходится все равно вычислять. Области пустот могут пересекаться. При заливке фона, перед тем как залить очередной пиксел, код пробежится по этому списку, если координаты будут находиться за пределами описанных областей пустот, то пиксел будет отображен, в противном случае место останется не тронутым, с расчетом на последующую отрисовку пользовательскими элементами.

Плюсы: не нужно высчитывать и отрисовывать ф.13 оставшиеся между элементами пустоты, меньше головной боли для прикладного програмиса.

Минусы: некоторое снижение скорости отрисовки фона для этого режима, за счет добавления лишних проверок.

Re: Области пустоты в окне.

Posted: Wed Apr 16, 2014 8:08 pm
by Serge
Mario_r4
И что будет с Fplay и другими программами, которые сами всё рисуют ?

Re: Области пустоты в окне.

Posted: Wed Apr 16, 2014 10:11 pm
by Leency
Идея отличная.

Совместимость со старыми программами будет сохранена?

Re: Области пустоты в окне.

Posted: Wed Apr 16, 2014 11:47 pm
by Mario_r4
Serge wrote:И что будет с Fplay и другими программами, которые сами всё рисуют ?
Ничего, они будут продолжать рисовать как раньше - это же выбираемая вещь. Единственно я пока не знаю, что делать в случае аппаратной отрисовки. Можешь ли ты по простому объяснить, что происходит с отрисовкой окон со скинами, при задействовании драйвера?
Leency wrote:Идея отличная. Совместимость со старыми программами будет сохранена?
Да.

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 12:43 am
by Serge
Mario_r4
Ничего не происходит. Ядро про акселерацию не знает.
Драйвер делает то же, что и ф.73 - выводит битмап на экран. Демки Mesa выводят картинку на месте клиентской области и поэтому заливку фоном не используют. Fplay рисует всё окно в битмап и выводит через ф73 а видео через ф73 или драйвер.

У меня есть некоторые сомнения.
Графическая часть ядра уже сильно запутана, а новый функционал сделает её ещё сложнее. С реализацией тоже не ясно. Сколько прямоугольников можно определять, где их хранить - ядерный malloc не безразмерный.

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 1:01 am
by Mario_r4
Serge wrote:Ничего не происходит. Ядро про акселерацию не знает.
Т.е. 2D ускорения для обычных приложений нет. Но ведь не факт, что в будущем не изменится?
Serge wrote:Драйвер делает то же, что и ф.73 - выводит битмап на экран. Демки Mesa выводят картинку на месте клиентской области и поэтому заливку фоном не используют. Fplay рисует всё окно в битмап и выводит через ф73 а видео через ф73 или драйвер.
Я спрашивал именно про отрисовку скинованных окон, про вывод через битмап это не коснется вообще.
Serge wrote:У меня есть некоторые сомнения.
Графическая часть ядра уже сильно запутана, а новый функционал сделает её ещё сложнее.
В WinAPI такая фича с пустотами есть, чем мы хуже? Насчет запутанности - по моему документация нормально все описывает и у меня лично проблем не было. С прикладной точки зрения отрисовка окна значительно упрощается, и я как ты знаешь не любитель траты памяти (код вывод курсора передает горячий привет ненужному фреймбуферу).
Serge wrote:С реализацией тоже не ясно. Сколько прямоугольников можно определять, где их хранить - ядерный malloc не безразмерный.
Не нужен мне malloc - обычное приложение ведь само отрисовывает свое окно. Это будет по реализации подобно "B = 1 - координаты всех графических примитивов задаются относительно клиентской области окна", т.е. ядру особых телодвижений не требуется. Зачем мне копировать данные в область ядра, если код отрисовки окна, в ядре, всегда имеет доступ к исходной области памяти, т.к. все выполняется в одном потоке. Для системной механики оконного стека абсолютно ничего не меняется.

З.Ы. Мне кажется ты просто не понял о чем именно идет речь.

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 10:02 am
by Serge
В WinAPI такая фича с пустотами есть, чем мы хуже?
Фича есть, используется редко, когда надо что-то совсем нестандартное
Насчет запутанности - по моему документация нормально все описывает и у меня лично проблем не было.
Я про исходники. Множественное отсечение вообще не подарок. GDI и X server делают CombineRgn(RGN_DIFF) и рисуют оставшиеся прямоугольники. Так же и с отрисовкой курсора. Каждый пиксель не проверяют.

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 10:18 am
by Mario_r4
Serge wrote:Я про исходники. Множественное отсечение вообще не подарок. GDI и X server делают CombineRgn(RGN_DIFF) и рисуют оставшиеся прямоугольники. Так же и с отрисовкой курсора. Каждый пиксель не проверяют.
Я не хочу зря расходовать память - жаба придет ко мне ночью и начнет душить меня.

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 10:26 am
by Serge
Будешь каждый пиксель на отсечение проверять ?

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 11:02 am
by Mario_r4
Serge wrote:Будешь каждый пиксель на отсечение проверять ?
Еще раз - если не установлен флаг D (сейчас используется для отрисовки градиента), то будет однократная проверка на установленность флага и все. Для существующих приложение абсолютно ничего не изменится. Если флаг установлен, отрисовка заливки фона перенаправляется в другую процедуру, в которой уже идет контроль каждого пиксела. Как вариант для ускорения можно написать процедуру разбиения на области рисуемых прямоугольников, но тут уже алгоритм сложнее получается. Еще раз - существующие приложения не будут затронуты вообще никак.

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 11:27 am
by SoUrcerer
А почему не поручить заливку boxlib?

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 11:51 am
by Akyltist
Извините, что влезаю в дискуссию, помимо "Setup" эту заливку использует "Арканойд v 0.3" - это чтобы не забыть поправить потом.

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 12:42 pm
by Mario_r4
SoUrcerer wrote:А почему не поручить заливку boxlib?
А приложения которым не нужен Box_Lib должны быть лишены такой возможности?
Spoiler:Akyltist
Спасибо, учту.

З.Ы. В общем все как обычно - в 90% случаев, когда предложишь новую полезную вещь, которая старых вещей не затрагивает, начинаются реакционные настроения. Когда сделаешь все успокаиваются и так до следующего раза...

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 3:48 pm
by lev
Позволит ли новый функционал не рисовать на правой и нижней рамках окна битмапы-тексты-кнопки-..., или лучше этим отдельно заняться?

Re: Области пустоты в окне.

Posted: Thu Apr 17, 2014 4:00 pm
by Mario_r4
lev wrote:Позволит ли новый функционал не рисовать на правой и нижней рамках окна битмапы-тексты-кнопки-..., или лучше этим отдельно заняться?
Я не понял суть идеи. Можно в виде рисунка изложить?