[cairo] problems with text rendering, 1.6.4

Behdad Esfahbod behdad at behdad.org
Mon Apr 21 20:12:04 PDT 2008


On Mon, 2008-04-21 at 21:03 -0400, Tamas K Papp wrote:
> On Mon, Apr 21, 2008 at 08:47:46PM -0400, Behdad Esfahbod wrote:
> > On Mon, 2008-04-21 at 20:32 -0400, Tamas K Papp wrote:
> > > 
> > > I can provide the example code that generated these (it is in Lisp,
> > > but maps into C commands straightforwardly).
> > 
> > If you can, then just straight do.  We don't read minds!
> 
> Sorry, here it is.  It just uses the simple text functions.  In the
> functions below, *context* is the default context.

I see.  The PDF renders fine in evince here.  Looks like a bug in the PS
backend.  Adrian may be able to tell what's wrong by just looking at the
PS output.  Or he may need to convert the sample to C and run it...
Anyway, I'm sure he can figure out what the bug is.

Cheers,

behdad


> ;;;;
> ;;;; helper functions
> ;;;;
> 
> (defun show-text-aligned (text x y &optional (x-align 0.5) (y-align 0.5)
> 			  (context *context*))
>   "Show text aligned relative to (x,y)."
>   (let ((*context* context))
>     (multiple-value-bind (x-bearing y-bearing width height)
> 	(text-extents text)
>       (move-to (- x (* width x-align) x-bearing)
> 	       (- y (* height y-align) y-bearing))
>       (show-text text))))
> 
> ;;;;
> ;;;;  text placement example
> ;;;;
> ;;;;  This example demonstrates the use of text-extents, by placing
> ;;;;  text aligned relative to a red marker.
> 
> (defun mark-at (x y d red green blue)
>   "Make a rectangle of size 2d around x y with the given colors,
>   50% alpha.  Used for marking points."
>   (rectangle (- x d) (- y d) (* 2 d) (* 2 d))
>   (set-source-rgba red green blue 0.5)
>   (fill-path))
> 
> (defun show-text-with-marker (text x y x-align y-align)
>   "Show text aligned relative to a red market at (x,y)."
>   (mark-at x y 2 1 0 0)
>   (set-source-rgba 0 0 0 0.6)
>   (show-text-aligned text x y x-align y-align))
> 
> (defparameter width 500)
> (defparameter height 500)
> (defparameter text "Fog")		; contains g, which goes below baseline
> (defparameter size 50)
> (defparameter x 20)
> (defparameter y 50)
> (setf *context* (create-ps-context "text.ps" width height))
> ;; white background
> (set-source-rgb 1 1 1)
> (paint)
> ;; setup font
> (select-font-face "Arial" 'font-slant-normal 'font-weight-normal)
> (set-font-size size)
> ;; starting point
> (mark-at x y 2 1 0 0)			; red
> ;; first text in a box
> (multiple-value-bind (x-bearing y-bearing text-width text-height)
>     (text-extents text)
>   (let ((rect-x (+ x x-bearing))
> 	(rect-y (+ y y-bearing)))
>     (rectangle rect-x rect-y text-width text-height)
>     (set-source-rgba 0 0 1 0.3)		; blue
>     (set-line-width 1)
>     (set-dash 0 '(5 5))
>     (stroke)))
> (set-source-rgba 0 0 0 0.6)
> (move-to x y)
> (show-text text)
> ;; text automatically aligned
> (dolist (x-align '(0 0.5 1))
>   (dolist (y-align '(0 0.5 1))
>     (show-text-with-marker text (+ x (* x-align 300)) (+ y (* y-align 300) 100)
> 			   x-align y-align)))
> ;; done
> (destroy *context*)
> 
> Strangely enough, I haven't been able to get this with a simpler
> example, if I remove the double loop at the end, destroy just works
> correctly.
> 
> Tamas
-- 
behdad
http://behdad.org/

"Those who would give up Essential Liberty to purchase a little
 Temporary Safety, deserve neither Liberty nor Safety."
        -- Benjamin Franklin, 1759



More information about the cairo mailing list