[Haskell-cafe] Diagrams and GTK

Claude Heiland-Allen claude at mathr.co.uk
Fri Aug 9 17:39:18 CEST 2013


Hi Michael,

On 09/08/13 08:21, Michael Oswald wrote:
> Hello,
> 
> I am currently writing an application which draws the structure of some
> packets with help of the diagrams library directly to a GTK GUI.
> 
> Now the packets can have several hundreds of parameters which have to be
> drawn so it takes some seconds to calculate the diagram itself. Of
> course this now blocks the GUI thread, so the basic idea was to put the
> calculation in a separate thread. Unfortunately this doesn't work as
> lazyness kicks in and the final diagram is calculated when it is
> rendered and not evaluated before. Using seq didn't help (because of
> WHNF) and there seems to be no deepseq instance for the diagrams.
> 
> Does somebody has an idea on how to speed this up / get the diagram
> evaluated strictly as especially scrolling the DrawingArea is now really
> a pain?

Cairo is thread safe* so you could render the whole thing (if it isn't
super huge dimensions) to an image surface in the background thread,
then displaying could be a matter of copying the correct part (for
scrolling) of the surface to the DrawingArea.

Something like this perhaps (untested, incomplete):

----8<----
import qualified Diagrams.(...) as D
import qualified Graphics.Rendering.Cairo as C

renderDiaToSurface width height diagram = do
  let w' = fromIntegral width
      h' = fromIntegral height
      opts = D.CairoOptions "" (D.Dims w' h') D.RenderOnly False
      (_, render) = D.renderDia D.Cairo opts diagram
  surface <- C.createImageSurface C.FormatARGB32 width height
  C.renderWith surface render
  return surface

...
----8<----


Hope this is useful,


Claude

* I had some very rare crashes in heavily threaded code, still not found
the root cause...

-- 
http://mathr.co.uk





More information about the Haskell-Cafe mailing list