From c27c26fb16a9f9b9ef6eb3d9694318a96e51e126 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 6 Dec 2013 11:12:06 -0700 Subject: [PATCH] racket/draw: fix problem with text drawing and scale Track the transformation of a text-drawing context and reset it when the current transform changes. There was already an update on an existing layout for a given character, but not an update for the context used to create layouts. Merge to v6.0 --- .../draw-lib/racket/draw/private/dc.rkt | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/pkgs/draw-pkgs/draw-lib/racket/draw/private/dc.rkt b/pkgs/draw-pkgs/draw-lib/racket/draw/private/dc.rkt index e1d3477751..481d4d0b78 100644 --- a/pkgs/draw-pkgs/draw-lib/racket/draw/private/dc.rkt +++ b/pkgs/draw-pkgs/draw-lib/racket/draw/private/dc.rkt @@ -1272,8 +1272,14 @@ [(aligned) 0] [(unaligned) 4]))) - (define/private (get-context cr smoothing-index font) - (or (vector-ref contexts smoothing-index) + (define/private (get-context cr smoothing-index font xform) + (or (let ([c (vector-ref contexts smoothing-index)]) + (and c + (begin + (unless (equal? xform (vector-ref c 1)) + (pango_cairo_update_context cr (vector-ref c 0)) + (vector-set! c 1 xform))) + (vector-ref c 0))) (let ([c (pango_font_map_create_context (let ([fm (vector-ref font-maps smoothing-index)]) (or fm @@ -1281,7 +1287,7 @@ (vector-set! font-maps smoothing-index fm) fm))))]) (pango_cairo_update_context cr c) - (vector-set! contexts smoothing-index c) + (vector-set! contexts smoothing-index (vector c xform)) (set-font-antialias c (dc-adjust-smoothing (send font get-smoothing)) (send font get-hinting)) @@ -1302,7 +1308,7 @@ s)] [rotate? (and draw-mode (not (zero? angle)))] [smoothing-index (get-smoothing-index font)] - [context (get-context cr smoothing-index font)]) + [context (get-context cr smoothing-index font current-xform)]) (when draw-mode (when (eq? text-mode 'solid) (unless rotate? @@ -1875,7 +1881,7 @@ (let ([desc (get-pango font)] [attrs (send font get-pango-attrs)] [context (or (for/or ([c (in-vector contexts)]) - c) + (and c (vector-ref c 0))) (pango_cairo_create_context cr))]) (let ([layout (pango_layout_new context)]) (pango_layout_set_font_description layout desc) @@ -1910,7 +1916,7 @@ (let* ([desc (get-pango font)] [attrs (send font get-pango-attrs)] [index (get-smoothing-index font)] - [context (get-context cr index font)] + [context (get-context cr index font current-xform)] [fontmap (vector-ref font-maps index)] [font (pango_font_map_load_font fontmap context desc)]) (and font ;; else font match failed