Render.hs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. module Rolling.Render (diagram) where
  2. import qualified Control.Monad.IO.Class as Monad
  3. import qualified Control.Monad as Monad
  4. import qualified Graphics.Rendering.Cairo as Cairo
  5. import qualified Graphics.Rendering.Pango as Pango
  6. import Rolling.Common
  7. import Rolling.Prob
  8. findProb :: Result -> Prob Result -> Double
  9. findProb r (Prob rs) = case [ fromIntegral n / fromIntegral t | (r', P n t) <- rs, r == r' ] of
  10. [x] -> x
  11. _ -> 0.0
  12. renderRow :: Prob Result -> Int -> Cairo.Render ()
  13. renderRow results offset = do
  14. let f = findProb Failure results
  15. p = findProb Partial results
  16. s = findProb Success results
  17. o = 50.0 * fromIntegral offset + 5
  18. Cairo.rectangle 5 o (f * 290) 40
  19. Cairo.setSourceRGB 1.0 0.0 0.0
  20. Cairo.fill
  21. Cairo.rectangle (5 + f * 290) o (p * 290) 40
  22. Cairo.setSourceRGB 1.0 1.0 0.0
  23. Cairo.fill
  24. Cairo.rectangle (5 + (f + p) * 290) o (s * 290) 40
  25. Cairo.setSourceRGB 0.0 0.0 1.0
  26. Cairo.fill
  27. Cairo.setSourceRGB 0.0 0.0 0.0
  28. layout <- text ("+" ++ show offset)
  29. Cairo.moveTo 310.0 (50.0 * fromIntegral offset)
  30. Pango.showLayout layout
  31. text :: String -> Cairo.Render Pango.PangoLayout
  32. text t = do
  33. layout <- Pango.createLayout t
  34. Monad.liftIO $ do
  35. font <- Pango.fontDescriptionNew
  36. Pango.fontDescriptionSetFamily font "Fira Sans"
  37. Pango.fontDescriptionSetSize font 30
  38. Pango.layoutSetFontDescription layout (Just font)
  39. return layout
  40. diagram :: Diagram -> IO ()
  41. diagram d = do
  42. let results = rolls d
  43. width = 400
  44. height = length results * 50 + 50
  45. surface <- Cairo.createImageSurface Cairo.FormatRGB24 width height
  46. Cairo.renderWith surface $ do
  47. Cairo.setSourceRGB 1.0 1.0 1.0
  48. Cairo.rectangle 0.0 0.0 (fromIntegral width) (fromIntegral height)
  49. Cairo.fill
  50. Monad.forM_ results $ \(n, r) ->
  51. renderRow r n
  52. Cairo.setSourceRGB 0.0 0.0 0.0
  53. layout <- text (title d)
  54. Cairo.moveTo 20 (fromIntegral height - 50)
  55. Pango.showLayout layout
  56. Cairo.surfaceWriteToPNG surface (filename d)