[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