CLIM mail archive
[Prev][Next][Index][Thread]
Drawing Order
Date: Wed, 9 Dec 1992 18:37 EST
From: Ed Gamble <ebg@hip.atr.co.jp>
I'm not Eilerts but as best I can tell here is the same problem...
Congratulations! You found a previously unknown bug in incremental
redisplay. The fix is included below.
For this test, I attempting to draw two sets of concentric circles. One
set if fixed; a large red circle with a small black one. The other
set moves about randomly; it is blue with a yellow dot.
If you hit the "move" menu item the blue/yellow circle moves obscuring the
red/black. Problem is the black dot disappears. It can be seen again
if the window is iconified, then reopened.
Here is the fix for CLIM 1.1. This fix will be part of CLIM 2.0 as well.
(in-package :clim)
(defmethod augment-draw-set ((record output-record-element-mixin)
erases moves draws erase-overlapping move-overlapping
&optional (x-offset 0) (y-offset 0)
(old-x-offset 0) (old-y-offset 0))
(declare (fixnum x-offset y-offset old-x-offset old-y-offset))
(declare (values erases moves draws erase-overlapping move-overlapping))
(let ((new-draws nil))
(labels ((augment-draws (record x-offset y-offset old-x-offset old-y-offset)
(when (and (displayed-output-record-element-p record)
(not (elements-never-overlap-p (output-record-parent record)))
(not (member record draws :key #'first))
(not (member record erases :key #'first))
(dolist (erase erases nil)
(when (region-intersects-region-p record (first erase))
(return t))))
(push (list record
(bounding-rectangle-shift-position
record x-offset y-offset))
new-draws))
(when (output-record-p record)
(multiple-value-bind (start-x start-y)
(output-record-start-position* record)
(declare (fixnum start-x start-y))
(multiple-value-bind (o-start-x o-start-y)
(output-record-old-start-position* record)
(declare (fixnum o-start-x o-start-y))
(let ((x-offset (the fixnum (+ x-offset start-x)))
(y-offset (the fixnum (+ y-offset start-y)))
(old-x-offset (the fixnum (+ old-x-offset o-start-x)))
(old-y-offset (the fixnum (+ old-y-offset o-start-y))))
(map-over-output-record-elements record
#'augment-draws 0 0
x-offset y-offset old-x-offset old-y-offset)))))))
(declare (dynamic-extent #'augment-draws))
(augment-draws record x-offset y-offset old-x-offset old-y-offset))
(values erases moves (nconc (nreverse new-draws) draws)
erase-overlapping move-overlapping)))
0,,
Follow-Ups:
Main Index |
Thread Index