OberonCore
https://forum.oberoncore.ru/

Про буферизацию
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6939
Страница 1 из 1

Автор:  arisu [ Понедельник, 27 Март, 2023 22:02 ]
Заголовок сообщения:  Про буферизацию

кстати, в 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()`. недосмотрели, не всё убрали.

Автор:  Иван Денисов [ Среда, 29 Март, 2023 07:33 ]
Заголовок сообщения:  Re: BlackBox 2.0

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 из записи порта, и селекторый тоже убрать, оставив только новый вариант.

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

Автор:  arisu [ Среда, 29 Март, 2023 11:12 ]
Заголовок сообщения:  Re: BlackBox 2.0

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

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

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

Автор:  Борис Рюмшин [ Среда, 29 Март, 2023 11:16 ]
Заголовок сообщения:  Re: BlackBox 2.0

Иван Денисов писал(а):
Утверждаем ли мы такую замену? Новый вариант всем устраивает?

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

Автор:  arisu [ Среда, 29 Март, 2023 11:20 ]
Заголовок сообщения:  Re: BlackBox 2.0

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/