tweak text-drawing caching
This commit is contained in:
parent
aa1578eb72
commit
ff617c4bf2
|
@ -294,12 +294,14 @@
|
||||||
(set! effective-scale-y (cairo_matrix_t-yy mx))
|
(set! effective-scale-y (cairo_matrix_t-yy mx))
|
||||||
(set! effective-origin-x (cairo_matrix_t-x0 mx))
|
(set! effective-origin-x (cairo_matrix_t-x0 mx))
|
||||||
(set! effective-origin-y (cairo_matrix_t-y0 mx))
|
(set! effective-origin-y (cairo_matrix_t-y0 mx))
|
||||||
(set! current-xform (vector (cairo_matrix_t-xx mx)
|
(let ([v (vector (cairo_matrix_t-xx mx)
|
||||||
(cairo_matrix_t-yx mx)
|
(cairo_matrix_t-yx mx)
|
||||||
(cairo_matrix_t-xy mx)
|
(cairo_matrix_t-xy mx)
|
||||||
(cairo_matrix_t-yy mx)
|
(cairo_matrix_t-yy mx)
|
||||||
(cairo_matrix_t-x0 mx)
|
(cairo_matrix_t-x0 mx)
|
||||||
(cairo_matrix_t-y0 mx)))))
|
(cairo_matrix_t-y0 mx))])
|
||||||
|
(unless (equal? v current-xform)
|
||||||
|
(set! current-xform v)))))
|
||||||
|
|
||||||
(define/override (set-auto-scroll dx dy)
|
(define/override (set-auto-scroll dx dy)
|
||||||
(unless (and (= scroll-dx (- dx))
|
(unless (and (= scroll-dx (- dx))
|
||||||
|
@ -957,8 +959,8 @@
|
||||||
(draw cr #t #t)))
|
(draw cr #t #t)))
|
||||||
(cairo_restore cr)))
|
(cairo_restore cr)))
|
||||||
|
|
||||||
(define desc-layouts (make-weak-hash))
|
(define desc-layouts (make-weak-hasheq))
|
||||||
(define/private (reset-layouts!) (set! desc-layouts (make-weak-hash)))
|
(define/private (reset-layouts!) (set! desc-layouts (make-weak-hasheq)))
|
||||||
|
|
||||||
(inherit get-size)
|
(inherit get-size)
|
||||||
(def/public (draw-text [string? s] [real? x] [real? y]
|
(def/public (draw-text [string? s] [real? x] [real? y]
|
||||||
|
@ -971,9 +973,7 @@
|
||||||
(do-text cr #t s x y font combine? offset angle)
|
(do-text cr #t s x y font combine? offset angle)
|
||||||
(flush-cr)))
|
(flush-cr)))
|
||||||
|
|
||||||
;; FIXME: how do we keep this from growing too much ---
|
(define size-cache (make-weak-hasheq))
|
||||||
;; lots of characters in lots of fonts?
|
|
||||||
(define size-cache (make-hasheq))
|
|
||||||
|
|
||||||
(define/private (get-size-cache desc)
|
(define/private (get-size-cache desc)
|
||||||
(or (hash-ref size-cache desc #f)
|
(or (hash-ref size-cache desc #f)
|
||||||
|
@ -1087,6 +1087,7 @@
|
||||||
(substring s (max 1 ok-count))))])
|
(substring s (max 1 ok-count))))])
|
||||||
(when draw?
|
(when draw?
|
||||||
(cairo_move_to cr (align-x/delta (+ x w) 0) (align-y/delta y 0))
|
(cairo_move_to cr (align-x/delta (+ x w) 0) (align-y/delta y 0))
|
||||||
|
;; Draw the text:
|
||||||
(pango_cairo_show_layout cr layout))
|
(pango_cairo_show_layout cr layout))
|
||||||
(cond
|
(cond
|
||||||
[(and draw? (not next-s))
|
[(and draw? (not next-s))
|
||||||
|
@ -1110,10 +1111,13 @@
|
||||||
(not (= 1.0 effective-scale-y)))
|
(not (= 1.0 effective-scale-y)))
|
||||||
#f
|
#f
|
||||||
(get-size-cache desc))]
|
(get-size-cache desc))]
|
||||||
[layouts (let ([key (cons desc attrs)])
|
[layouts (let ([attr-layouts (or (hash-ref desc-layouts desc #f)
|
||||||
(or (hash-ref desc-layouts key #f)
|
|
||||||
(let ([layouts (make-hasheq)])
|
(let ([layouts (make-hasheq)])
|
||||||
(hash-set! desc-layouts key layouts)
|
(hash-set! desc-layouts desc layouts)
|
||||||
|
layouts))])
|
||||||
|
(or (hash-ref attr-layouts attrs #f)
|
||||||
|
(let ([layouts (make-hasheq)])
|
||||||
|
(hash-set! attr-layouts attrs layouts)
|
||||||
layouts)))]
|
layouts)))]
|
||||||
[xform current-xform])
|
[xform current-xform])
|
||||||
(begin0
|
(begin0
|
||||||
|
@ -1136,8 +1140,10 @@
|
||||||
(unless (equal? xform (mcdr layout+xform))
|
(unless (equal? xform (mcdr layout+xform))
|
||||||
(pango_cairo_update_layout cr layout)
|
(pango_cairo_update_layout cr layout)
|
||||||
(set-mcdr! layout+xform xform))
|
(set-mcdr! layout+xform xform))
|
||||||
(when draw?
|
(when (and draw? (or (not (eq? ch #\space))
|
||||||
|
attrs))
|
||||||
(cairo_move_to cr (align-x/delta (+ x w) 0) (align-y/delta y 0))
|
(cairo_move_to cr (align-x/delta (+ x w) 0) (align-y/delta y 0))
|
||||||
|
;; Here's the draw command, which uses most of the time:
|
||||||
(pango_cairo_show_layout cr layout))
|
(pango_cairo_show_layout cr layout))
|
||||||
(let ([v (and cache
|
(let ([v (and cache
|
||||||
(hash-ref cache (char->integer ch) #f))])
|
(hash-ref cache (char->integer ch) #f))])
|
||||||
|
|
Loading…
Reference in New Issue
Block a user