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