[mcclim-cvs] CVS mcclim/Drei
thenriksen
thenriksen at common-lisp.net
Thu Jan 17 13:42:27 UTC 2008
Update of /project/mcclim/cvsroot/mcclim/Drei
In directory clnet:/tmp/cvs-serv1537/Drei
Modified Files:
drei-redisplay.lisp
Log Message:
Fixed obscure case where the height of a line was sometimes miscalculated by Drei.
--- /project/mcclim/cvsroot/mcclim/Drei/drei-redisplay.lisp 2008/01/16 22:40:14 1.41
+++ /project/mcclim/cvsroot/mcclim/Drei/drei-redisplay.lisp 2008/01/17 13:42:22 1.42
@@ -596,7 +596,7 @@
(line-stroke-count line) 0)
;; So yeah, this is fairly black magic, but it's not actually
;; ugly, just complex.
- (multiple-value-bind (line-width line-height baseline pump-state)
+ (multiple-value-bind (line-width baseline descent pump-state)
;; Pump all the line strokes and calculate their dimensions.
(loop for index from 0
for stroke = (line-stroke-information line index)
@@ -605,39 +605,41 @@
(put-stroke view line pump-state offset-change)
do (update-stroke-dimensions pane view stroke cursor-x cursor-y)
(setf cursor-x (x2 stroke-dimensions))
- maximizing (dimensions-height stroke-dimensions) into line-height
+ maximizing (- (dimensions-height stroke-dimensions)
+ (center stroke-dimensions)) into descent
maximizing (+ (center stroke-dimensions) cursor-y) into baseline
summing (dimensions-width stroke-dimensions) into line-width
when (stroke-at-end-of-line (buffer view) stroke)
- return (values line-width line-height baseline pump-state))
- ;; Loop over the strokes and clear the parts of the pane that
- ;; has to be redrawn, trying to minimise the number of calls to
- ;; `clear-rectangle*'..
- (flet ((maybe-clear (x1 x2)
- (unless (= x1 x2)
- (clear-rectangle* pane x1 cursor-y x2
- (+ cursor-y line-height line-spacing)))))
- (loop with last-clear-x = orig-x-offset
- for stroke-index below (line-stroke-count line)
+ return (values line-width baseline descent pump-state))
+ (let ((line-height (- (+ baseline descent) cursor-y)))
+ ;; Loop over the strokes and clear the parts of the pane that
+ ;; has to be redrawn, trying to minimise the number of calls to
+ ;; `clear-rectangle*'..
+ (flet ((maybe-clear (x1 x2)
+ (unless (= x1 x2)
+ (clear-rectangle* pane x1 cursor-y x2
+ (+ cursor-y line-height line-spacing)))))
+ (loop with last-clear-x = orig-x-offset
+ for stroke-index below (line-stroke-count line)
+ for stroke = (aref (line-strokes line) stroke-index)
+ for stroke-dimensions = (stroke-dimensions stroke)
+ do (unless (= baseline (+ cursor-y (center stroke-dimensions)))
+ (invalidate-stroke stroke))
+ (unless (stroke-dirty stroke)
+ (maybe-clear last-clear-x (x1 stroke-dimensions))
+ (setf last-clear-x (x2 stroke-dimensions)))
+ ;; This clears from end of line to the end of the sheet.
+ finally (maybe-clear last-clear-x (bounding-rectangle-width pane))))
+ ;; Now actually draw them in a way that makes sure they all
+ ;; touch the bottom of the line.
+ (loop for stroke-index below (line-stroke-count line)
for stroke = (aref (line-strokes line) stroke-index)
for stroke-dimensions = (stroke-dimensions stroke)
- do (unless (= baseline (+ cursor-y (center stroke-dimensions)))
- (invalidate-stroke stroke))
- (unless (stroke-dirty stroke)
- (maybe-clear last-clear-x (x1 stroke-dimensions))
- (setf last-clear-x (x2 stroke-dimensions)))
- ;; This clears from end of line to the end of the sheet.
- finally (maybe-clear last-clear-x (bounding-rectangle-width pane))))
- ;; Now actually draw them in a way that makes sure they all
- ;; touch the bottom of the line.
- (loop for stroke-index below (line-stroke-count line)
- 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 line orig-x-offset cursor-y
- line-width line-height)
- (incf (displayed-lines-count view))
- (return (values pump-state line-height)))))))
+ do (draw-stroke pane view stroke (x1 stroke-dimensions) baseline)
+ 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))))))))
(defun clear-stale-lines (pane view)
"Clear from the last displayed line to the end of `pane'."
More information about the Mcclim-cvs
mailing list