New binary: render as PNG
authorJoachim Breitner <mail@joachim-breitner.de>
Thu, 25 Jun 2009 21:32:50 +0000 (23:32 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Thu, 25 Jun 2009 21:38:52 +0000 (23:38 +0200)
This expects a plant on stdin and write a 400x400 png image to stdout. A
name can be passed as the first argument.

L-seed.cabal
src/.gitignore
src/Lseed/Renderer/Cairo.hs
src/renderAsPNG.hs [new file with mode: 0644]

index 6da1e70..9c4c5c5 100644 (file)
@@ -89,6 +89,12 @@ Executable runGarden
   if ! flag(RendererCairo)
     Buildable:    False
 
+Executable renderAsPNG
+  Main-Is:        renderAsPNG.hs
+  Hs-Source-Dirs: src/
+  if ! flag(RendererCairo)
+    Buildable:    False
+
 Executable validate
   Main-Is:        validate.hs
   Hs-Source-Dirs: src/
index 8e61dbd..2544d5e 100644 (file)
@@ -7,3 +7,4 @@ dbclient
 dbscorer
 fastScorer
 tags
+renderAsPNG
index db79dc9..1bd8676 100644 (file)
@@ -10,12 +10,32 @@ import Lseed.Data
 import Lseed.Data.Functions
 import Lseed.Constants
 import Lseed.Geometry
+import Lseed.StipeInfo
 import Text.Printf
 import System.Time
 
 colors :: [ (Double, Double, Double) ]
 colors = cycle $ [ (r,g,b) | r <- [0.0,0.4], b <- [0.0, 0.4], g <- [1.0,0.6,0.8]]
 
+pngObserver :: IO Observer
+pngObserver = return $ nullObserver {
+       obFinished = \garden -> do
+               let (w,h) = (400,400)
+               withImageSurface FormatRGB24 w h $ \sur -> do
+                       renderWith sur $ do
+                               -- Set up coordinates
+                               translate 0 (fromIntegral h)
+                               scale 1 (-1)
+                               scale (fromIntegral w) (fromIntegral w)
+                               translate (-0.5) 0
+                               scale 2 2
+                               translate 0 groundLevel
+                               setLineWidth stipeWidth
+
+                               render (pi/3) (annotateGarden (pi/3) garden)
+                       surfaceWriteToPNG sur "/dev/fd/1"
+       }
+
 cairoObserver :: IO Observer
 cairoObserver = do
        initGUI
@@ -80,7 +100,7 @@ render angle garden = do
 
        renderGround
 
-       renderInfo angle garden
+       --renderInfo garden
 
 renderPlanted :: AnnotatedPlanted -> Render ()
 renderPlanted planted = preserve $ do
@@ -198,7 +218,7 @@ renderLightedPoly ((x1,y1),(x2,y2),(x3,y3),(x4,y4), intensity) = do
                setSourceRGB 0 0 intensity
                fill
 
-renderInfo angle garden = do
+renderInfo garden = do
        forM_ garden $ \planted -> do
                let x = plantPosition planted
                {-
diff --git a/src/renderAsPNG.hs b/src/renderAsPNG.hs
new file mode 100644 (file)
index 0000000..621d13e
--- /dev/null
@@ -0,0 +1,24 @@
+import Lseed.Data
+import Lseed.Data.Functions
+import Lseed.Grammar.Parse
+import Lseed.Constants
+import Lseed.Mainloop
+import Control.Monad
+import Debug.Trace
+import System.Environment
+import System.Time
+import System.Random
+import Lseed.Renderer.Cairo
+import Data.Maybe
+
+readArgs doit = do
+       args <- getArgs
+       let name = fromMaybe "Some Plant" $ listToMaybe args
+
+       file <- getContents
+       let genome = either (error.show) id $ parseGrammar name file 
+       doit $ [Planted 0.5 0 name genome inititalPlant]
+               
+main = readArgs $ \garden -> do
+       obs <- pngObserver
+       lseedMainLoop False obs (constGardenSource garden) 10