diff --git a/collects/racket/draw/private/bitmap-dc.rkt b/collects/racket/draw/private/bitmap-dc.rkt index a948a6f1c5..a668a4cdb5 100644 --- a/collects/racket/draw/private/bitmap-dc.rkt +++ b/collects/racket/draw/private/bitmap-dc.rkt @@ -100,6 +100,8 @@ get-size get-transformation set-transformation + get-smoothing + set-smoothing scale get-font) @@ -163,10 +165,13 @@ [(make-or-false bitmap%) [mask #f]]) (let ([sx (if (zero? src-w) 1.0 (/ dest-w src-w))] [sy (if (zero? src-h) 1.0 (/ dest-h src-h))]) - (let ([t (get-transformation)]) + (let ([t (get-transformation)] + [s (get-smoothing)]) (scale sx sy) + (when (eq? s 'unsmoothed) (set-smoothing 'aligned)) (begin0 (draw-bitmap-section src (/ dest-x sx) (/ dest-y sy) src-x src-y src-w src-h style color mask) + (when (eq? s 'unsmoothed) (set-smoothing 'unsmoothed)) (set-transformation t))))) (def/override (get-char-width) diff --git a/collects/racket/draw/private/dc.rkt b/collects/racket/draw/private/dc.rkt index 5112e83f3a..c1ae0c7726 100644 --- a/collects/racket/draw/private/dc.rkt +++ b/collects/racket/draw/private/dc.rkt @@ -1634,12 +1634,17 @@ [a-src-y (floor src-y)] [a-msrc-x (floor msrc-x)] [a-msrc-y (floor msrc-y)] + [adjust-pattern-filter + (lambda (p) + (when (eq? smoothing 'unsmoothed) + (cairo_pattern_set_filter p CAIRO_FILTER_NEAREST)))] [stamp-pattern (lambda (src a-src-x a-src-y) (let ([p (cairo_pattern_create_for_surface (send src get-cairo-alpha-surface))] [m (make-cairo_matrix_t 0.0 0.0 0.0 0.0 0.0 0.0)]) (cairo_matrix_init_translate m (- a-src-x a-dest-x) (- a-src-y a-dest-y)) (cairo_pattern_set_matrix p m) + (adjust-pattern-filter (cairo_get_source cr)) ;; clip to the section that we're supposed to draw: (cairo_save cr) (when op (cairo_set_operator cr op)) @@ -1663,6 +1668,7 @@ (send src get-cairo-surface) (- a-dest-x a-src-x) (- a-dest-y a-src-y)) + (adjust-pattern-filter (cairo_get_source cr)) (if mask (stamp-pattern mask a-msrc-x a-msrc-y) (begin diff --git a/collects/racket/draw/unsafe/cairo.rkt b/collects/racket/draw/unsafe/cairo.rkt index 876596ccdb..b2d63fec17 100644 --- a/collects/racket/draw/unsafe/cairo.rkt +++ b/collects/racket/draw/unsafe/cairo.rkt @@ -410,4 +410,13 @@ CAIRO_PATTERN_TYPE_LINEAR CAIRO_PATTERN_TYPE_RADIAL) +(define-enum + 0 + CAIRO_FILTER_FAST + CAIRO_FILTER_GOOD + CAIRO_FILTER_BEST + CAIRO_FILTER_NEAREST + CAIRO_FILTER_BILINEAR + CAIRO_FILTER_GAUSSIAN) + (define/provide CAIRO_CONTENT_COLOR_ALPHA #x3000) diff --git a/collects/scribblings/draw/bitmap-dc-class.scrbl b/collects/scribblings/draw/bitmap-dc-class.scrbl index dff3a14bd1..eff6c26bd4 100644 --- a/collects/scribblings/draw/bitmap-dc-class.scrbl +++ b/collects/scribblings/draw/bitmap-dc-class.scrbl @@ -41,13 +41,10 @@ Creates a new memory DC. If @racket[bitmap] is not @racket[#f], it is The same as @method[dc<%> draw-bitmap-section], except that @racket[dest-width] and @racket[dest-height] cause the DC's - transformation to be adjusted while drawing the bitmap so - that the bitmap is scaled. - -In older versions, this method smoothed drawing more than - @method[dc<%> draw-bitmap-section], but smoothing is now provided by - @method[dc<%> draw-bitmap-section]. -} + transformation to be adjusted while drawing the bitmap so that the + bitmap is scaled; and, if the DC's smoothing mode is + @racket['unsmoothed], it is changed to @racket['aligned] while + drawing.} @defmethod[(get-argb-pixels [x real?] [y real?]