OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 01:33

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Про буферизацию
СообщениеДобавлено: Понедельник, 27 Март, 2023 22:02 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
кстати, в HostPorts/Lin явная ошибка в `DrawingBuf()`: оно там пытается взять map и прочее, а это не надо. то есть, вот этот код:
Код:
         IF (rd.port.map # NIL) & (rd.port.gc # NIL) THEN (* buffered drawing *)
            map := rd.port.map; gc := rd.port.gc; Gdk.gdk_gc_ref(gc)
         ELSE (* unbuffered drawing *)
            map := rd.port.da.window; gc := Gdk.gdk_gc_new(map)
         END;
он неправильный код. его надо заменить на:
Код:
map := rd.port.da.window; gc := Gdk.gdk_gc_new(map);
а потому что map возникает в `SaveRect()`, и содержит в себе ту самую сохранённую область, в которую рисовать уж точно не надо. и в `MarkRect()` надо выкинуть условие в начале, и заменить на `map := rd.port.da.window;`.

это очевидный обломок старого кода двойной буферизации, который есть в фолде в `OpenBuffer()`. недосмотрели, не всё убрали.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Среда, 29 Март, 2023 07:33 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
arisu писал(а):
потому что map возникает в `SaveRect()`, и содержит в себе ту самую сохранённую область, в которую рисовать уж точно не надо. и в `MarkRect()` надо выкинуть условие в начале, и заменить на `map := rd.port.da.window;`.

это очевидный обломок старого кода двойной буферизации, который есть в фолде в `OpenBuffer()`. недосмотрели, не всё убрали.

в SaveRect идет map райдера, так что там другая переменная.

в OpenBuffer и CloseBuffer была произведена замена, а в селекторах старый вариант.

Изначально у Оберон микросистемс был такой вариант

Код:
   PROCEDURE (p: Port) OpenBuffer* (l, t, r, b: INTEGER);
      (*VAR rect: Gdk.GdkRectangle;*)
   BEGIN
      ASSERT(p.da # NIL, 20);
      IF l < 0 THEN l := 0 END;
      IF t < 0 THEN t := 0 END;
      IF r > p.w THEN r := p.w END;
      IF b > p.h THEN b := p.h END;
      IF (l < r) & (t < b) THEN
         p.bl := l; p.bt := t; p.br := r; p.bb := b;
         p.map := Gdk.gdk_pixmap_new(p.da.window, p.w, p.h , -1);
         p.gc := Gdk.gdk_gc_new(p.map)
      END
   END OpenBuffer;
      
   PROCEDURE (p: Port) CloseBuffer*;
   BEGIN
      IF p.map # NIL THEN
         Gdk.gdk_draw_drawable(p.da.window, p.da.style.white_gc, p.map, p.bl, p.bt, p.bl, p.bt, p.br - p.bl, p.bb - p.bt);
         Gdk.gdk_drawable_unref(p.map);
         p.map := NIL;
         Gdk.gdk_gc_unref(p.gc);
         p.gc := NIL
      END
   END CloseBuffer;


Антон заменил на

Код:
PROCEDURE (p: Port) OpenBuffer* (l, t, r, b: INTEGER);
      VAR rect: Gdk.GdkRectangle;
   BEGIN    (* Gtk-based double buffering *)
      rect.x := l; rect.y := t; rect.width := r - l; rect.height := b - t;
      Gdk.gdk_window_begin_paint_rect(p.da.window, SYSTEM.ADR(rect))
      
   END OpenBuffer;
      
   PROCEDURE (p: Port) CloseBuffer*;
   BEGIN Gdk.gdk_window_end_paint(p.da.window);
   END CloseBuffer;


Поэтому, действительно, будет логично подчистить код, и убрать это поле map из записи порта, и селекторый тоже убрать, оставив только новый вариант.

Утверждаем ли мы такую замену? Новый вариант всем устраивает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Среда, 29 Март, 2023 11:12 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
Иван Денисов писал(а):
в SaveRect идет map райдера, так что там другая переменная.
а, действительно, прошу прощения. значит, я ошибся, никакого бага нет, просто мёртвый код болтается.

gc тоже из порта можно нюкнуть, btw.

про себя скажу, что вариант двойной буферизации от А.А. у меня лично отлично работает. полагаю, у остальных тоже (раз никто претензий особо не высказывал ;-), так что старый хранить явно не надо.


Последний раз редактировалось arisu Среда, 29 Март, 2023 11:17, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Среда, 29 Март, 2023 11:16 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4695
Откуда: Россия, Орёл
Иван Денисов писал(а):
Утверждаем ли мы такую замену? Новый вариант всем устраивает?

А почему он должен не устраивать, если работает? Это же привязка к системе, а не основные интерфейсы ББ.
Другое дело, что GTK2 скоро окончательно похоронят.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: BlackBox 2.0
СообщениеДобавлено: Среда, 29 Март, 2023 11:20 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
Борис Рюмшин писал(а):
Другое дело, что GTK2 скоро окончательно похоронят.
«мы работаем над этим!» ;-) когда я закончу с рендером в LC, то можно будет переехать на чистую Xlib — это и есть цель. и можно будет пересадить это всё обратно на mainline.


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

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


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

Сейчас этот форум просматривают: Bing [Bot] и гости: 6


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

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