Update - according to the cairo developers, this is a limitation of the current implementation of cairo, so there's nothing to be fixed. Thanks again for looking into it!

As a workaround, they suggested creating a path from the text and filling it, which works well:

#lang racket/gui

(define (draw-text dc offset)
  (send dc set-brush "red" 'solid)
  (send dc set-pen "red" 1 'transparent)

  (let ((p (new dc-path%)))
    (send p text-outline (send dc get-font) "hello" 0 0)
    (send dc draw-path p 0 0))

  (send dc set-brush "black" 'solid)
  (send dc set-pen "black" 1 'transparent)

  (let ((p (new dc-path%)))
    (send p text-outline (send dc get-font) "hello" 0 0)
    (send dc draw-path p offset offset))

  (send dc set-text-foreground "red")
  (send dc draw-text "hello" 0 20 #t)
  (send dc set-text-foreground "black")
  (send dc draw-text "hello" offset (+ 20 offset) #t)
  )

(define (draw-screen canvas dc)
  (send dc set-smoothing 'smoothed)
  (send dc set-font
        (send the-font-list find-or-create-font
              12 'default 'normal 'normal #f 'smoothed #f 'aligned))
  (send dc set-initial-matrix (vector 1 0 0 1 0 0))
  (for ((i 10))
    (draw-text dc (/ i 10.0))
    (send dc translate 50 0)))

(define frame (new frame% (label "Test draw-text")))

(define canvas
  (new canvas%
       (parent frame)
       (min-width 500)
       (min-height 100)
       (paint-callback draw-screen)))

(send frame show #t)





On 12/16/2013 02:16 PM, David Vanderson wrote:
Thank you - I'll look into it.

On 12/16/2013 02:14 PM, Matthew Flatt wrote:
Yes, it's the same on Mac and Windows.

At Mon, 16 Dec 2013 14:12:18 -0500, David Vanderson wrote:
Thanks for looking into it. Can you confirm if you see similar output on
a different platform (Mac or Win)?

On 12/16/2013 12:26 PM, Matthew Flatt wrote:
I'm not sure about that part. I've confirmed that the cairo_move_to()
call just before pango_cairo_show_layout_line() varies the "y" argument
by 0.1, and I don't see any options that would affect vertical
alignment.

At Mon, 16 Dec 2013 10:37:39 -0500, David Vanderson wrote:
That makes sense, but the picture with 'unaligned seems strange
(attached). It looks like each individual character is being pixel
aligned, and also the vertical pixel drop doesn't happen until it's 0.7
pixels down. Does this make sense?

On 12/16/2013 08:15 AM, Matthew Flatt wrote:
Did you mean to pass 'unaligned instead of 'aligned as the last
argument to `find-or-create-font`? That should disable pixel alignment.

At Mon, 16 Dec 2013 01:28:23 -0500, David Vanderson wrote:
Hello,

It seems that draw-text always pixel-aligns its text. In the example below, I draw a black "hello" on top of a red one, with a pixel offset of 0, 0.1, 0.2, . . . 0.9. At least for me, I see no change until 0.5,
where the black text jumps a whole pixel (see attached image).

Am I missing something? Do others see this behavior? (I'm on Linux)

Thanks,
Dave


#lang racket/gui

(define (draw-text dc offset)
      (send dc set-text-foreground "red")
      (send dc draw-text "hello" 0 0 #t)
      (send dc set-text-foreground "black")
      (send dc draw-text "hello" offset offset #t))

(define (draw-screen canvas dc)
      (send dc set-smoothing 'smoothed)
      (send dc set-font
            (send the-font-list find-or-create-font
12 'default 'normal 'normal #f 'smoothed #f 'aligned))
      (send dc set-initial-matrix (vector 1 0 0 1 0 0))
      (for ((i 10))
        (draw-text dc (/ i 10.0))
        (send dc translate 50 0)))

(define frame (new frame% (label "Test draw-text")))

(define canvas
      (new canvas%
           (parent frame)
           (min-width 500)
           (min-height 100)
           (paint-callback draw-screen)))

(send frame show #t)

------------------------------------------------------------------------------
[image/png "draw-text2-unaligned.png"] [~/Desktop & open] [~/Temp & open]
.


_________________________
 Racket Developers list:
 http://lists.racket-lang.org/dev

Reply via email to