<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#000000">
<font face="Helvetica, Arial, sans-serif">I have a strange problem,
which is so elementary that I think I must be missing something...<br>
<br>
In GTK2HS, when I draw text using using textPath, the text is located
at different locations depending on which backend is used. I'm not
talking about a difference of a couple of pixels , but in my case it's
half a page off. The PNG and Win32 backend work fine, but the PDF/PS
backends get it wrong. <br>
<br>
For example, I modified the Text.hs demo in the demos/Cairo
subdirectory so it also outputs PDF. Here the text is also at different
locations, so I guess it's not just my code. Code is pasted below.<br>
<br>
I'm using Windows, and GTK2HS version 0.9.12 from
<a class="moz-txt-link-freetext" href="http://www.haskell.org/gtk2hs">http://www.haskell.org/gtk2hs</a><br>
<br>
Maybe someone could give this a quick test on Linux? <br>
<br>
I guess this is most likely a Cairo problem, and has nothing to do with
the Haskell wrapper? Still this is hard to believe, since these kinds
of bugs would be quickly found.<br>
<br>
Thanks,<br>
Peter<br>
<br>
</font><tt>----------------------------------------<br>
</tt><font face="Helvetica, Arial, sans-serif"><br>
import Graphics.Rendering.Cairo<br>
import qualified Graphics.Rendering.Cairo.Matrix as M<br>
<br>
boxText :: String -&gt; Double -&gt; Double -&gt; Render ()<br>
boxText text x y = do<br>
&nbsp; save<br>
<br>
&nbsp; lineWidth &lt;- getLineWidth<br>
<br>
&nbsp; (TextExtents xb yb w h _ _) &lt;- textExtents text<br>
<br>
&nbsp; rectangle (x + xb - lineWidth)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (y + yb - lineWidth)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (w + 2 * lineWidth)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (h + 2 * lineWidth)<br>
&nbsp; stroke<br>
&nbsp; moveTo x y<br>
&nbsp; textPath text<br>
&nbsp; fillPreserve<br>
&nbsp; setSourceRGBA 0 0 1 0.5<br>
&nbsp; setLineWidth 3.0<br>
&nbsp; stroke<br>
<br>
&nbsp; restore<br>
<br>
transpSurface :: Double -&gt; Double -&gt; Render ()<br>
transpSurface w h = do<br>
&nbsp; save<br>
&nbsp; rectangle 0 0 w h<br>
&nbsp; setSourceRGBA 0 0 0 0<br>
&nbsp; setOperator OperatorSource<br>
&nbsp; fill<br>
&nbsp; restore<br>
<br>
width = 400<br>
height = 300<br>
<br>
main :: IO ()<br>
main = withImageSurface FormatARGB32 width height $ \surface -&gt; do<br>
<br>
&nbsp; let render = do<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setSourceRGB 0.0 0.0 0.0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setLineWidth 2.0<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transpSurface (fromIntegral width) (fromIntegral height)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; selectFontFace "sans" FontSlantNormal FontWeightNormal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setFontSize 40<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extents &lt;- fontExtents<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; let fontHeight = fontExtentsHeight extents<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boxText "Howdy, world!" 10 fontHeight<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translate 0 fontHeight<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; save<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translate 10 fontHeight<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rotate (10.0 * pi / 180.0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boxText "Yay for Haskell!" 0 0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; restore<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; translate 0 (3 * fontHeight)<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; save<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setFontMatrix $ M.rotate ((-10.0) * pi / 180.0) $ M.scale 40.0
40.0 M.identity<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boxText "...and Cairo!" 10 fontHeight<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; restore<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp; renderWith surface render<br>
&nbsp; <br>
&nbsp; surfaceWriteToPNG surface "Text.png"<br>
&nbsp; <br>
&nbsp; withPDFSurface "Text.pdf" (realToFrac width) (realToFrac height)
(flip renderWith $ render &gt;&gt; showPage)<br>
&nbsp; <br>
&nbsp; return ()<br>
<br>
<br>
<br>
<br>
</font>
</body>
</html>