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/ |