OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 01 Апрель, 2023 17:13

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: расширение bottleneck для рисовалок
СообщениеДобавлено: Пятница, 03 Февраль, 2023 08:23 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 579
как считает честно́й народ: имеет ли мне смысл нежно улучшать растровый bottleneck? давайте признаемся: интерфейс рисовалок в BBCB в своё время был даже выше среднего с его безьерками, но на нынешний день он никакой.

я предлагаю как минимум добавить в bottleneck заливку полигонов и безьерок произвольным паттерном 8x8 пикселей (это нужно, например, для более правильной и полной реализации HostPictures), а также официальный метод создания растровых картинок, манипуляции ними, и разные варианты blit. сами омики, например, в тех же HostPictures вообще плюнули на свои же рисовалки и работали напрямую с винапи. мы — по очевидным причинам — так не можем.

и, кстати, предлагаю рисование овалов из bottleneck выкинуть: это элементарно эмулируется безьерками (ну да, безьерками нельзя рисовать правильные кружочки, но ещё ни один хуманс не заметил разницы). омики скорее всего добавили овалы просто потому что для них было быстрое API, но на нынешний день это малоактуально, я считаю, и лучше bottleneck упростить, оставив только самый минимум.

также предлагаю расширить райдер фрэймов разными утилитарными функциями, типа DrawRoundedRect. там довольно много полезных мелочей можно сделать Просто Один Раз на основе уже существуюшего bottleneck (всё равно по сути всё сводится к рисованию безьерок и полигонов в итоге).

если принципиальных возражений нет (молчание — знак согласия! ;-), я постепенно этим займусь, а потом представлю реализацию, и мы её обсудим/улучшим/переделаем. таким путём удобней, мне кажется, потому что делать bottleneck «от практики» лучше, чем пытаться сначала всё-всё предусмотреть, а потом вспомнить, что в доме забыли запланировать дверь.


на всякий случай (мало ли), если у кого-то из читающих возникнет вопрос, почему нельзя в bottleneck оставить только полигоны, а безьерки унести выше: разное разрешение. райдеры фрэймов работают с универсальными координатами, где DPI порядка десятков, если не сотен тысяч (иногда омики думали ОЧЕНЬ далеко в будущее ;-). если преобразовывать безьерки в полигоны при таком разрешении — получится очень много линий, которые на реальном растре схлопнутся в точки (и выглядеть это будет хуже, чем преобразование с «родным» разрешением). лишняя работа, лишняя память, и никакой пользы. поэтому омики добавили безьерки в bottleneck.


p.s.: кстати сказать, во всех нынешних реализациях портов (начиная с базовой омиковской) есть баг: они абсолютно игнорируют aspect ratio. с этим удаётся убежать только потому, что сейчас почти везде пиксели очень близки к квадратным (но всё равно не квадратные). однако по уму нужно или два юнита (горизонтальный и вертикальный), или как-то учитывать аспект в bottleneck.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширение bottleneck для рисовалок
СообщениеДобавлено: Пятница, 03 Февраль, 2023 12:04 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3594
1. Не стоит ничего убирать в Port, что бы нарушило обратную совместимость, так что овалы давайте оставим.

2. А что если закодировать паттерны заливки в отрицательном коде толщины линии? (Мы подобное уже сделали в одном проекте для DrawLine, что цвет с отрицательным знаком означает рисовку пунктиром.)

3. Мы как-то обсуждали возможность рисовать текст под углами 90 и 270 градусов. Но после раздумий, есть предложение сделать это через свойства шрифта, то есть кроме
Код:
 italic* = 0; underline* = 1; strikeout* = 2;   (** style elements **)
добавить vertical, что будет рисовать строку повернутой на 90 градусов против часовой стрелки.

4. Прямоугольник со скруглёнными углами как раз рисуется без проблем кривыми Безье, у меня и код есть такой.

Код:
   PROCEDURE DrawSmoothRect(f: Views.Frame; l, t, r, b, rad, lw, color: INTEGER);
      VAR p: ARRAY 24 OF Ports.Point;
   BEGIN
         (* Левый верхний угол *)
         p[23].x := l;
         p[23].y := t + 2 * rad;
         p[0].x := l;
         p[0].y := t + rad;
         p[1].x := l;
         p[1].y := t;

         p[2].x := l ;
         p[2].y := t;
         p[3].x := l + rad;
         p[3].y := t;
         p[4].x := l + 2 * rad;
         p[4].y := t;

         (* Задние четыре точки *)
         p[5].x := r - 2 * rad;
         p[5].y := t;
         p[6].x := r - rad;
         p[6].y := t;
         p[7].x := r;
         p[7].y := t;

         p[8].x := r;
         p[8].y := t;
         p[9].x := r;
         p[9].y := t + rad;
         p[10].x:= r;
         p[10].y:= t + 2 * rad;

         p[11].x := r;
         p[11].y := b - 2 * rad;
         p[12].x := r;
         p[12].y := b - rad;
         p[13].x := r;
         p[13].y := b;

         p[14].x := r;
         p[14].y := b;
         p[15].x := r - rad;
         p[15].y := b;
         p[16].x := r - 2 * rad;
         p[16].y := b;

         (* Левый нижний угол *)
         p[17].x := l + 2 * rad;
         p[17].y := b;
         p[18].x := l + rad;
         p[18].y := b;
         p[19].x := l;
         p[19].y := b;

         p[20].x := l;
         p[20].y := b;
         p[21].x := l;
         p[21].y := b - rad;
         p[22].x := l;
         p[22].y := b - 2 * rad;

         f.DrawPath(p, LEN(p), lw, color, Ports.closedBezier);
   END DrawSmoothRect;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширение bottleneck для рисовалок
СообщениеДобавлено: Пятница, 03 Февраль, 2023 12:29 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 579
Иван Денисов писал(а):
1. Не стоит ничего убирать в Port, что бы нарушило обратную совместимость, так что овалы давайте оставим.
я очень-очень сомневаюсь, что на свете существует хотя бы пять проектов, которые напрямую используют рисовалки из бэкэнда, а не из Frame. из Frame я ничего, конечно, убирать не собираюсь, только в бэкэнде. ну не нужно оно там, Frame может нарисовать овал безьерками без проблем.

Иван Денисов писал(а):
2. А что если закодировать паттерны заливки в отрицательном коде толщины линии?
паттерны должны быть как минимум битмапами 8x8 пикселей. не хватит байтов. ;-) даже рисовалки dashed lines и pattern-filled lines очень разные по эффектам (поэтому `MarkRect()`, например, использует именно паттерны даже для рамочки в один пиксель толщиной).

Иван Денисов писал(а):
3. Мы как-то обсуждали возможность рисовать текст под углами 90 и 270 градусов. Но после раздумий, есть предложение сделать это через свойства шрифта
мне всё-таки кажется, что это (свойства шрифта) неправильное место: реализация всё равно должна быть в bottleneck, так что более естественно добавить API для такого в райдеры. но тут мне ещё надо подумать и посмотреть.

Иван Денисов писал(а):
4. Прямоугольник со скруглёнными углами как раз рисуется без проблем кривыми Безье
да, я в курсе. я как раз и предлагаю докинуть во Frame подобных утилит, чтобы не копипастить их каждый раз, когда понадобится: их там не надо будет никуда портировать и поддерживать, просто один раз добавить и забыть навсегда, они будут Просто Работать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширение bottleneck для рисовалок
СообщениеДобавлено: Пятница, 03 Февраль, 2023 12:58 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3594
arisu писал(а):
Иван Денисов писал(а):
1. Не стоит ничего убирать в Port, что бы нарушило обратную совместимость, так что овалы давайте оставим.
я очень-очень сомневаюсь, что на свете существует хотя бы пять проектов, которые напрямую используют рисовалки из бэкэнда, а не из Frame. из Frame я ничего, конечно, убирать не собираюсь, только в бэкэнде. ну не нужно оно там, Frame может нарисовать овал безьерками без проблем.

А, я вас понял. Ну тогда надо проверить, что не будет рисоваться хуже по внешнему виду, или медленнее. Проверить и на Windows и на Linux. А так предложение логичное. Сейчас внедрил решения Антона для Windows рисование овалов через GDI+, и коммандер там в Windows сейчас выглядит симпатично. Там правда выяснились проблемы, что GDI+ себя как-то неадекватно ведёт, когда память заканчивается свободная. Тем не менее, сейчас коммандеры лучше выглядят, чем раньше.
Вложение:
new_GDIP_commanders.png
new_GDIP_commanders.png [ 13.91 КБ | Просмотров: 1450 ]


Так то лучше сделать кросс-платформенную реализацию через AGG. Тогда не будет зависимости от странного поведения от винды по памяти. Дмитрий Соломенников начинал эту работу, и весьма далеко продвинулся! Я тут выложу всё, что у меня осталось от этой работы. Там не так просто понять, что к чему, но уверен, что вы поймёте ход его мыслей, если будет интересно. Там есть и вызовы самой библиотеки и уже портированный код на КП, без вызовов этой библиотеки.
Вложение:
BBAGG.7z [952.35 КБ]
Скачиваний: 13


arisu писал(а):
Иван Денисов писал(а):
4. Прямоугольник со скруглёнными углами как раз рисуется без проблем кривыми Безье
да, я в курсе. я как раз и предлагаю докинуть во Frame подобных утилит, чтобы не копипастить их каждый раз, когда понадобится: их там не надо будет никуда портировать и поддерживать, просто один раз добавить и забыть навсегда, они будут Просто Работать.

А надо ли раздувать стандартную графическую библиотеку? Есть некая в Блэкбоксе также эстетика минимализма в интерфейсах.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширение bottleneck для рисовалок
СообщениеДобавлено: Пятница, 03 Февраль, 2023 13:15 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3594
Про карты 8x8 надо подумать, так как сама реализация StdPictures на постоянной основе сама вызывает сомнения. Эти рисунки хотелось бы перерисовать, так как там странный маковский формат данных. Неясно ни как создавать такие новые рисунки, ни как править старые. Похоже не реставрацию чего-то старого ненужного. Как временная мера сейчас ещё ничего, но даже dim25, dim50, dim75 в документации не обозначены как именно штрихованные, там говориться про оттенки серого цвета.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширение bottleneck для рисовалок
СообщениеДобавлено: Пятница, 03 Февраль, 2023 17:12 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 579
Иван Денисов писал(а):
А, я вас понял. Ну тогда надо проверить, что не будет рисоваться хуже по внешнему виду, или медленнее.
сильно хуже не будет. ;-) а медленней, конечно, будет, но мы здесь говорим про замедления в размерах наносекунд, так что вряд ли опасаться этого есть какой-то практический смысл.

Иван Денисов писал(а):
Проверить и на Windows и на Linux.
а оно магически станет одинаковым, потому что безьерки BBCB преобразует в полигоны своими силами. ещё один плюс, кстати.

Иван Денисов писал(а):
Так то лучше сделать кросс-платформенную реализацию через AGG. Тогда не будет зависимости от странного поведения от винды по памяти.
полная AGG в бэкэнде не нужна: там вполне достаточно растеризатора из AGGLite и небольшого кода поддержки. собственно, самописной библиотекой на базе AGGLite я в своих проектах на D пользуюсь давольно давно, и собираюсь её портировать потом. однако замечу, что я весьма прохладно отношусь к самой идее сглаживания: у меня от этого глаза болят. в прямом смысле, физически. это не в смысле что я категорически против, а в смысле что энтузиазма делать AA-рендеринг у меня не так много. в D я это обхожу ручной рихтовкой координат по пиксельной сетке, а в BBCB такое делать некультурно будет (зачем тогда сглаживание, тогда можно намного более простые растеризаторы сделать).

Иван Денисов писал(а):
Дмитрий Соломенников начинал эту работу, и весьма далеко продвинулся! Я тут выложу всё, что у меня осталось от этой работы. Там не так просто понять, что к чему, но уверен, что вы поймёте ход его мыслей, если будет интересно.
спасибо! я, конечно, посмотрю, потому что очень любопытен. ;-)

Иван Денисов писал(а):
А надо ли раздувать стандартную графическую библиотеку? Есть некая в Блэкбоксе также эстетика минимализма в интерфейсах.
ну, совсем уж сильно раздувать я не предлагаю. но всё-таки BBCB — это не только про тексты, так что иметь уже готовые процедуры для рисования тех же прямоугольников со скруглёнными углами и дуг, например, будет полезно, мне кажется. в принципе, было бы неплохо ещё иметь возможность задавать caps и joins для толстых линий, но это я добавлять пока не планирую.

опять же, проблема в том, что делать отдельную рисовалку с кучей возможностей довольно сложно, потому что нет ни стандартной возможности работать с пикселями бэкэнда, ни стандартной возможности создать битмап в памяти, порисовать в нём, и потом битмап блитнуть. и если для тех же caps и joins можно обойтись существующим, то, например, градиенты так уже не сделать. а если захочется вещей покруче, типа масок с произвольным контуром, заливки полноценными изображениями, а не просто паттернами, и прочих вкусных плюшек — то вообще всё печально. и, честно говоря, я не очень представляю, как это решить без раздувания bottleneck'а.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширение bottleneck для рисовалок
СообщениеДобавлено: Пятница, 03 Февраль, 2023 19:52 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3594
Для таких фокусов как раз может пригодиться новый тип — растр. Он вам даёт свободу творчества. Делаете с ним магические штуки, а потом хлоп, и выводите в ББ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширение bottleneck для рисовалок
СообщениеДобавлено: Пятница, 03 Февраль, 2023 19:55 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 579
проблема с растром в том, что он… ну… растр. а BBCB работает в универсальных координатах, где over 9000 на один реальный пиксел. и каких размеров растры делать тогда? по экрану? по универсалу? от фонаря, и как-то рихтовать?

это я не издеваюсь, это я застрял в попытках придумать нормальный интерфейс для растров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширение bottleneck для рисовалок
СообщениеДобавлено: Пятница, 03 Февраль, 2023 20:23 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3594
Давайте так, я не особо уже могу понять, что вы предлагаете и какую проблему решаете. Так как тут все в одной куче. Надо понять, надо ли что-то вообще менять в текущей версии порта. Не совсем понимаю, какую задачу вы решаете, что не хватает и т.п. Вы еще и про кривые какие-то странные вещи говорите, что Блэкбокс их сам превращает в полигоны. Что это значит не ясно. Зачем вам растры в разрешении Блэкбокса для пиксельной графики тоже не понятно. Вы в общем подумайте, поэкспериментируйте ещё может.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: расширение bottleneck для рисовалок
СообщениеДобавлено: Пятница, 03 Февраль, 2023 20:30 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 579
простите, это я пытаюсь быстро-быстро изложить много-много, и получается плохо-плохо. особенно когда смешались несколько понятий. mea maxima culpa.

у BBCB, по сути, два интерфейса к рисовалкам: одна во Frames, в универсальных координатах, и одна в Backend, в пиксельных. безьерки в полигоны — это пиксельная преобразует, и рисует потом полигоны. а с растрами — это как раз проблема того, кому они принадлежат: рисовалке из Frames, или рисовалке из бэкэнда? если второй — то мы теряем возможность, например, нормально распечатать картинку. а если первой, то непонятно, какое у картинки должно быть разрешение, потому что универсальные координаты же, unit очень большой.

вы правы, это надо бы расписать более внятно. я постараюсь.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2023, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB