Fix "dancing flags" issue with timeline ticks in future visualizer

(cherry picked from commit 6eed135d02)
This commit is contained in:
James Swaine 2012-07-19 15:13:13 -05:00 committed by Ryan Culpepper
parent b7ef456965
commit a79b122f5e
2 changed files with 72 additions and 88 deletions

View File

@ -58,7 +58,8 @@
;Represents a vertical line depicting a specific time in the execution history
(struct timeline-tick (x
abs-time
rel-time) #:transparent)
rel-time
show-label?) #:transparent)
;;viewable-region-from-frame : frame-info -> viewable-region
(define (viewable-region-from-frame finfo)
@ -179,19 +180,29 @@
[else
(loop (cdr ss))])))
;;timeline-tick-label-pict : real -> pict
(define (timeline-tick-label-pict rel-time)
(text-block-pict (format "~a ms" (real->decimal-string rel-time))
#:backcolor (timeline-tick-label-backcolor)
#:forecolor (timeline-tick-label-forecolor)
#:padding 3))
;;calc-ticks : (listof segment) float trace -> (listof timeline-tick)
(define (calc-ticks segs timeToPixMod tr)
(define LABEL-PAD 3)
(define trace-start (inexact->exact (trace-start-time tr)))
(define segs-len (length segs))
(define-values (lt lx tks _)
(define-values (lt lx tks _ __)
(for/fold ([last-time trace-start]
[last-x 0]
[ticks '()]
[last-label-x-extent 0]
[remain-segs segs]) ([i (in-range 0 (floor (/ (- (trace-end-time tr)
trace-start)
DEFAULT-TIME-INTERVAL)))])
(define tick-time (+ last-time DEFAULT-TIME-INTERVAL))
(define tick-rel-time (* (add1 i) DEFAULT-TIME-INTERVAL))
#;(define tick-time (+ last-time DEFAULT-TIME-INTERVAL))
(define tick-rel-time (* (add1 i) DEFAULT-TIME-INTERVAL))
(define tick-time (+ trace-start tick-rel-time))
(define want-x (+ last-x (* DEFAULT-TIME-INTERVAL timeToPixMod)))
(define-values (most-recent-seg next-seg r-segs)
(find-most-recent-and-next remain-segs tick-time))
@ -201,31 +212,37 @@
(define next-evt-time (inexact->exact (event-start-time next-evt)))
(define most-recent-edge (segment-edge most-recent-seg))
(define next-edge (segment-x next-seg))
(cond
[(= most-recent-time tick-time)
(values tick-time
(segment-x most-recent-seg)
(cons (timeline-tick (segment-x most-recent-seg) tick-time tick-rel-time) ticks)
r-segs)]
[(= (segment-x next-seg) (add1 (+ (segment-x most-recent-seg) (segment-width most-recent-seg))))
(values tick-time
(+ (segment-x most-recent-seg) (segment-width most-recent-seg))
(cons (timeline-tick (+ (segment-x most-recent-seg)
(segment-width most-recent-seg))
tick-time
tick-rel-time)
ticks)
r-segs)]
[else
(define start-x (max most-recent-edge last-x))
(define start-time (max most-recent-time last-time))
(define size-mod (/ (- next-edge start-x) (- next-evt-time start-time)))
(define x-offset (ceiling (* (- tick-time start-time) size-mod)))
(define tick-x (round (+ start-x x-offset)))
(values tick-time
tick-x
(cons (timeline-tick tick-x tick-time tick-rel-time) ticks)
r-segs)])))
(define tick-x
(cond
[(= most-recent-time tick-time) (segment-x most-recent-seg)]
[(= (segment-x next-seg) (add1 (+ (segment-x most-recent-seg) (segment-width most-recent-seg))))
(+ (segment-x most-recent-seg) (segment-width most-recent-seg))]
[else
(define start-x (max most-recent-edge last-x))
(define start-time (max most-recent-time last-time))
(define size-mod (/ (- next-edge start-x) (- next-evt-time start-time)))
(define x-offset (ceiling (* (- tick-time start-time) size-mod)))
(round (+ start-x x-offset))]))
(define show-tick? ((- tick-x last-x) . >= . TIMELINE-MIN-TICK-PADDING))
(define show-label?
(if (not show-tick?)
#f
(>= tick-x (+ last-label-x-extent LABEL-PAD))))
(define new-label-x-extent
(if show-label?
(+ tick-x (pict-width (timeline-tick-label-pict tick-rel-time)))
last-label-x-extent))
(if show-tick?
(values tick-time
tick-x
(cons (timeline-tick tick-x tick-time tick-rel-time show-label?) ticks)
new-label-x-extent
r-segs)
(values tick-time
last-x
ticks
new-label-x-extent
r-segs))))
tks)
;;calc-process-timespan-lines : trace (listof segment) -> (listof (uint . uint))
@ -373,51 +390,23 @@
;;draw-ruler-on : pict viewable-region frameinfo -> pict
(define (draw-ruler-on base vregion frameinfo)
(let loop ([pct base]
[ticks (filter (λ (t) (in-viewable-region-horiz vregion (timeline-tick-x t)))
(frame-info-timeline-ticks frameinfo))]
[next-label-x (viewable-region-x-extent vregion)]
[next-tick-x (viewable-region-x-extent vregion)])
(cond
[(null? ticks) pct]
[(< (- next-tick-x (timeline-tick-x (car ticks))) TIMELINE-MIN-TICK-PADDING)
(loop pct
(cdr ticks)
next-label-x
next-tick-x)]
[else (let* ([LABEL-PAD 2]
[VERT-PAD 3]
[cur-tick (car ticks)]
[cur-x (timeline-tick-x cur-tick)]
[tick-desc (format "~a ms" (real->decimal-string
(timeline-tick-rel-time cur-tick) 1))]
[t (text-block-pict tick-desc
#:backcolor (timeline-tick-label-backcolor)
#:forecolor (timeline-tick-label-forecolor)
#:padding 3)]
[text-width (pict-width t)]
[show-label? (<= (+ cur-x LABEL-PAD text-width) next-label-x)]
[pinnedline (pin-over pct
(- cur-x (viewable-region-x vregion))
0
(linestyle 'dot
(colorize (vline 1
(frame-info-adjusted-height frameinfo))
(if show-label?
(timeline-tick-bold-color)
(timeline-tick-color)))))])
(if show-label?
(loop (pin-over pinnedline
(- cur-x (viewable-region-x vregion))
VERT-PAD
t)
(cdr ticks)
cur-x
cur-x)
(loop pinnedline
(cdr ticks)
next-label-x
cur-x)))])))
(for/fold ([pct base]) ([tick (in-list (filter (λ (t) (in-viewable-region-horiz vregion (timeline-tick-x t)))
(frame-info-timeline-ticks frameinfo)))])
(define cur-x (timeline-tick-x tick))
(define pinnedline
(pin-over pct
(- cur-x (viewable-region-x vregion))
0
(linestyle 'dot
(colorize (vline 1
(frame-info-adjusted-height frameinfo))
(timeline-tick-color)))))
(if (timeline-tick-show-label? tick)
(pin-over pinnedline
(- cur-x (viewable-region-x vregion))
3
(timeline-tick-label-pict (timeline-tick-rel-time tick)))
pinnedline)))
;;draw-row-lines-on : pict viewable-region trace frameinfo -> pict
(define (draw-row-lines-on base vregion tr finfo opacity)

View File

@ -41,11 +41,11 @@
(check-true (in-viewable-region-horiz vr 222)))
(let ([vr (viewable-region 0 0 732 685)]
[ticks (list (timeline-tick 222.0 #f 0.4999999999999982)
(timeline-tick 169.0 #f 0.3999999999999986)
(timeline-tick 116.0 #f 0.29999999999999893)
(timeline-tick 63.0 #f 0.1999999999999993)
(timeline-tick 10 #f 0.09999999999999964))])
[ticks (list (timeline-tick 222.0 #f 0.4999999999999982 #f)
(timeline-tick 169.0 #f 0.3999999999999986 #f)
(timeline-tick 116.0 #f 0.29999999999999893 #f)
(timeline-tick 63.0 #f 0.1999999999999993 #f)
(timeline-tick 10 #f 0.09999999999999964 #f))])
(define in-vr (filter (λ (t)
(in-viewable-region-horiz vr (timeline-tick-x t)))
ticks))
@ -250,14 +250,9 @@
(indexed-future-event 1 (future-event 0 0 'start-work 11.0 #f #f))
(indexed-future-event 2 (future-event 0 0 'end-work 20.0 #f #f)))])
(define-values (tr finfo segs ticks) (compile-trace-data l))
;Check that number of ticks stays constant whatever the time->pixel modifier
(check-equal? (length ticks) 100)
(check-equal? (length (calc-ticks segs 700 tr)) 100)
(for ([i (in-range 0.1 20)])
(check-equal? (length (calc-ticks segs i tr))
100
(format "Wrong number of ticks for time->pix mod ~a\n" i)))
(check-seg-layout tr segs ticks))
;Number of ticks can vary, but cannot exceed (total trace time / tick interval)
(check-true (<= (length ticks) 100))
(check-equal? (length (calc-ticks segs 1000 tr)) 99))
(let ([l (list (indexed-future-event 0 '#s(future-event #f 0 create 1334778395768.733 #f 3))
(indexed-future-event 1 '#s(future-event 3 2 start-work 1334778395768.771 #f #f))
@ -267,7 +262,7 @@
(define last-evt (indexed-future-event-fevent (list-ref l 3)))
(define first-evt (indexed-future-event-fevent (list-ref l 0)))
(define total-time (- (future-event-time last-evt) (future-event-time first-evt)))
(check-equal? (length ticks) (inexact->exact (floor (* 10 total-time)))))
(check-true (<= (length ticks) (inexact->exact (floor (* 10 total-time))))))
(define mand-first
(list (indexed-future-event 0 '#s(future-event #f 0 create 1334779294212.415 #f 1))