Update of /project/mcclim/cvsroot/mcclim/Drei In directory clnet:/tmp/cvs-serv13598/Drei
Modified Files: drei-redisplay.lisp Log Message: More redisplay optimisations (so fast!).
Also, don't end in an infinite loop if we can't even fit a single line on the screen.
--- /project/mcclim/cvsroot/mcclim/Drei/drei-redisplay.lisp 2008/01/16 12:01:05 1.37 +++ /project/mcclim/cvsroot/mcclim/Drei/drei-redisplay.lisp 2008/01/16 13:12:40 1.38 @@ -541,7 +541,9 @@ anything. Will use the function specified in the drawing-options of `stroke' to carry out the actual calculations." (unless (and (= cursor-x (x1 (stroke-dimensions stroke))) - (not (stroke-dirty stroke))) + (= cursor-y (y1 (stroke-dimensions stroke))) + (not (stroke-dirty stroke)) + (mark<= (stroke-end-offset stroke) (bot view))) (invalidate-stroke stroke :modified t)) (when (stroke-dirty stroke) (funcall (drawing-options-function (stroke-drawing-options stroke)) stream view stroke @@ -571,36 +573,14 @@ (x2 dimensions) (+ x1 line-width) (y2 dimensions) (+ y1 line-height))))
-(defun end-line-cleaning-up (view pane line line-x1 line-y1 +(defun end-line-cleaning-up (view line line-x1 line-y1 line-width line-height) "End the addition of strokes to `line' for now, and update the -dimensions of `line'. Update all undisplayed lines to have no -associated dimensions. Also clear from the bottom of strokes to -the bottom of the line, and from the end of the line to the end -of the sheet." +dimensions of `line'." (end-line line line-x1 line-y1 line-width line-height) - (with-accessors ((line-x1 x1) (line-y1 y1) - (line-x2 x2) (line-y2 y2)) (line-dimensions line) - (setf (max-line-width view) - (max (max-line-width view) - (dimensions-width (line-dimensions line)))) - ;; If a has a lesser height than the line, clear from the top of - ;; the line stroke to the top of the stroke, to avoid artifacts - ;; left over from previous redisplays. - (do-displayed-line-strokes (stroke line) - (let ((stroke-dimensions (stroke-dimensions stroke))) - (with-accessors ((stroke-x1 x1) (stroke-y1 y1) - (stroke-x2 x2) (stroke-y2 y2)) stroke-dimensions - (when (> line-height (dimensions-height stroke-dimensions)) - (clear-rectangle* pane stroke-x1 line-y1 - stroke-x2 stroke-y1))))) - ;; Reset the dimensions of undisplayed lines. - (do-undisplayed-line-strokes (stroke line) - (let ((stroke-dimensions (stroke-dimensions stroke))) - (with-accessors ((stroke-x1 x1) (stroke-y1 y1) - (stroke-x2 x2) (stroke-y2 y2)) stroke-dimensions - (setf stroke-x1 0 stroke-y1 0 - stroke-x2 0 stroke-y2 0)))))) + (setf (max-line-width view) + (max (max-line-width view) + (dimensions-width (line-dimensions line)))))
(defun draw-line-strokes (pane view initial-pump-state start-offset cursor-x cursor-y) @@ -654,7 +634,7 @@ for stroke = (aref (line-strokes line) stroke-index) for stroke-dimensions = (stroke-dimensions stroke) do (draw-stroke pane view stroke (x1 stroke-dimensions) baseline) - finally (progn (end-line-cleaning-up view pane line orig-x-offset cursor-y + finally (progn (end-line-cleaning-up view line orig-x-offset cursor-y line-width line-height) (incf (displayed-lines-count view)) (return (values pump-state line-height))))))) @@ -1103,7 +1083,8 @@ 0 (round x1)) 0))) - (when (> y2 (+ y-position viewport-height)) + (when (and (> y2 (+ y-position viewport-height)) + (not (end-of-buffer-p (bot view)))) (full-redisplay pane) ;; We start all over! (display-drei-pane (pane-frame pane) pane)))))))