[Haskell-cafe] Drawing an existing image into a cairo surface?

Rafal Kolanski xs at xaph.net
Sun Sep 21 09:01:00 EDT 2008



Austin Seipp wrote:
> Excerpts from Rafal Kolanski's message of Sun Sep 21 07:28:37 -0500 2008:
>> The best I can find is withImageSurfaceFromPNG, but I can't
>> make it work.
> 
> Why not? Seems to me all you need to do is:
> 
>  withImageSurfaceFromPNG "blah.png" $ \surface -> do
>     ...
> 
> Lots of code is written this way (create a resource, pass it to a
> function and then release it after the function is over.)

Well, but withImageSurfaceFromPNG only lets you work within that scope
and wipes out the surface straight afterwards ...

>> I tried playing around with unsafePerformIO but that just gets me into:
> 
> Without further context as to what you are doing, I really see no
> reason why you would have to use unsafePerformIO at all.

The context is, I want to render a multi-page PDF with a variety of
things on it, so I have something like (very simplified):

main :: IO ()
main = do
     withPDFSurface outputFile pdfWidth pdfHeight renderer

renderer s = renderWith s renderPresentation

renderPresentation = do
     myDraw1
     showPage
     myDraw2
     showPage

myDraw1 = do
     setSourceRGB 1 0 0
     setLineWidth 1
     moveTo 0 0
     lineTo 100 100
     stroke

so renderPresentation will have type Render ()

Now lets say I want to draw an image on page 2, that will only appear on
page 2 ... with one image, your technique makes sense to me, but with
multiple images on multiple pages, I don't understand how to make it scale.

Perhaps this code is very naive, but I'm kinda new to the pure world of
Haskell.

Sincerely,

Rafal Kolanski.



More information about the Haskell-Cafe mailing list