packages feed

gruff-examples 0.3 → 0.3.1

raw patch · 11 files changed

+261/−14 lines, 11 filesdep +filepathnew-component:exe:gruff-convert

Dependencies added: filepath

Files

gruff-examples.cabal view
@@ -1,8 +1,9 @@ Name:                gruff-examples-Version:             0.3+Version:             0.3.1 Synopsis:            Mandelbrot Set examples using ruff and gruff Description:-  Some example animation scripts.+  Some example scripts, including a converter from old versions of gruff+  file formats to the current file format.  License:             GPL-2 License-file:        LICENSE@@ -17,6 +18,21 @@   description: use 'hmpfr' for higher precision floating point   default: False +Executable gruff-convert+  Hs-source-dirs:     src+  Main-is:            gruff-convert.hs+  Other-modules:      Convert.Common+                      Convert.Gruff+                      Convert.Gruff1+                      Convert.Gruff2a+                      Convert.Gruff2+  Build-depends:      base >= 4 && < 5,+                      filepath,+                      ruff >= 0.3 && < 0.4,+                      gruff >= 0.3 && < 0.4+  GHC-options:        -Wall -threaded -rtsopts+  GHC-Prof-Options:   -prof -auto-all -caf-all+ Executable gruff-labels   Hs-source-dirs:     src   Main-is:            gruff-labels.hs@@ -104,4 +120,4 @@ source-repository this   type:     git   location: git://gitorious.org/ruff/gruff-examples.git-  tag:      v0.3+  tag:      v0.3.1
+ src/Convert/Common.hs view
@@ -0,0 +1,33 @@+module Convert.Common (readMay, image, image', Colour(Colour), Image()) where+import Data.List (sortBy)+import Data.Ord (comparing)+import Fractal.GRUFF+import Fractal.RUFF.Types.Complex(Complex((:+)))++image :: Rational -> Rational -> Double -> Image+image = image' 512 288 4 (red, black, white)+  where+    red   = Colour 1 0 0+    black = Colour 0 0 0+    white = Colour 1 1 1++image' :: Int -> Int -> Double -> (Colour, Colour, Colour) -> Rational -> Rational -> Double -> Image+image' w h ss (ci, cb, ce) re im sz = Image+  { imageWindow = Window{ width = w, height = h, supersamples = ss }+  , imageViewport = Viewport{ aspect = fromIntegral w / fromIntegral h, orient = 0 }+  , imageLocation = Location{ center = re :+ im, radius = sz }+  , imageColours = Colours{ colourInterior = ci, colourBoundary = cb, colourExterior = ce }+  , imageLabels = []+  , imageLines = []+  }++readMay :: Read a => String -> Maybe a+readMay s = case sortBy (comparing (length . snd)) . filter (all whiteSpace . snd) . reads $ s of+  (a, _):_ -> Just a+  _ -> Nothing+  where+    whiteSpace ' '  = True+    whiteSpace '\t' = True+    whiteSpace '\n' = True+    whiteSpace '\r' = True+    whiteSpace  _   = False
+ src/Convert/Gruff.hs view
@@ -0,0 +1,34 @@+module Convert.Gruff (gruff) where+import Convert.Common (readMay, image, Image)+import Numeric (readSigned, readFloat)++data AngledInternalAddress+  = Unangled Integer+  | Angled Integer Angle AngledInternalAddress+  deriving Read++type Angle = Rational++newtype R = R Rational++instance Read R where+  readsPrec _ = map (\(x, s) -> (R x, s)) . readParen False (readSigned readFloat)++data Gruff = Gruff+  { gAddress :: Maybe AngledInternalAddress+  , gIsland :: Maybe AngledInternalAddress+  , gChild :: Maybe [Angle]+  , gLowerAngle :: Maybe Angle+  , gUpperAngle :: Maybe Angle+  , gReal :: Maybe R+  , gImag :: Maybe R+  , gSize :: Maybe R+  }+  deriving Read++gruff :: String -> Maybe Image+gruff s = convert =<< readMay s++convert :: Gruff -> Maybe Image+convert Gruff{ gReal = Just (R re), gImag = Just (R im), gSize = Just (R sz) } = Just $ image re im (fromRational sz)+convert _ = Nothing
+ src/Convert/Gruff1.hs view
@@ -0,0 +1,36 @@+module Convert.Gruff1 (gruff1) where+import Convert.Common (readMay, image, Image)+import Numeric (readSigned, readFloat)++data AngledInternalAddress+  = Unangled Integer+  | Angled Integer Angle AngledInternalAddress+  deriving Read++type Angle = Rational++newtype R = R Rational++instance Read R where+  readsPrec _ = map (\(x, s) -> (R x, s)) . readParen False (readSigned readFloat)++data Gruff1 = Gruff1+  { gAddress :: Maybe AngledInternalAddress+  , gIsland :: Maybe AngledInternalAddress+  , gChild :: Maybe [Angle]+  , gLowerAngle :: Maybe Angle+  , gUpperAngle :: Maybe Angle+  , gReal :: Maybe R+  , gImag :: Maybe R+  , gSize :: Maybe R+  , gHueShift :: Maybe R+  , gHueScale :: Maybe R+  }+  deriving Read++gruff1 :: String -> Maybe Image+gruff1 s = convert =<< readMay s++convert :: Gruff1 -> Maybe Image+convert Gruff1{ gReal = Just (R re), gImag = Just (R im), gSize = Just (R sz) } = Just $ image re im (fromRational sz)+convert _ = Nothing
+ src/Convert/Gruff2.hs view
@@ -0,0 +1,50 @@+module Convert.Gruff2 (gruff2) where+import Convert.Common (readMay, image', Colour(Colour), Image())+import Numeric (readSigned, readFloat)++data AngledInternalAddress+  = Unangled Integer+  | Angled Integer Angle AngledInternalAddress+  deriving Read++type Angle = Rational++newtype R = R Rational++instance Read R where+  readsPrec _ = map (\(x, s) -> (R x, s)) . readParen False (readSigned readFloat)++data Color = Color Int Int Int+  deriving Read++c :: Color -> Colour+c (Color r g b) = Colour (fromIntegral r / m) (fromIntegral g / m) (fromIntegral b / m) where m = 65535++data Window = Window{ width :: Int, height :: Int, supersamples :: R }+  deriving Read++data Viewport = Viewport{ aspect :: R, orient :: R }+  deriving Read++data Gruff2 = Gruff2+  { gAddress :: Maybe AngledInternalAddress+  , gReal :: Maybe R+  , gImag :: Maybe R+  , gSize :: Maybe R+  , gRota :: Maybe Double+  , gColours :: (Color, Color, Color)+  , gWindow :: Window+  , gViewport :: Viewport+  }+  deriving Read++gruff2 :: String -> Maybe Image+gruff2 s = convert =<< readMay s++convert :: Gruff2 -> Maybe Image -- FIXME handle rota, orient, aspect?+convert Gruff2+  { gReal = Just (R re), gImag = Just (R im), gSize = Just (R sz)+  , gColours = (ci, cb, ce)+  , gWindow = Window{ width = w, height = h, supersamples = R ss }+  } = Just $ image' w h (fromRational ss) (c ci, c cb, c ce) re im (fromRational sz)+convert _ = Nothing
+ src/Convert/Gruff2a.hs view
@@ -0,0 +1,41 @@+module Convert.Gruff2a (gruff2a) where+import Convert.Common (readMay, image', Colour(Colour), Image())+import Numeric (readSigned, readFloat)++data AngledInternalAddress+  = Unangled Integer+  | Angled Integer Angle AngledInternalAddress+  deriving Read++type Angle = Rational++newtype R = R Rational++instance Read R where+  readsPrec _ = map (\(x, s) -> (R x, s)) . readParen False (readSigned readFloat)++data Color = Color Int Int Int+  deriving Read++c :: Color -> Colour+c (Color r g b) = Colour (fromIntegral r / m) (fromIntegral g / m) (fromIntegral b / m) where m = 65535++data Gruff2a = Gruff2+  { gAddress :: Maybe AngledInternalAddress+  , gReal :: Maybe R+  , gImag :: Maybe R+  , gSize :: Maybe R+  , gRota :: Maybe Double+  , gColours :: (Color, Color, Color)+  }+  deriving Read++gruff2a :: String -> Maybe Image+gruff2a s = convert =<< readMay s++convert :: Gruff2a -> Maybe Image -- FIXME handle rota?+convert Gruff2+  { gReal = Just (R re), gImag = Just (R im), gSize = Just (R sz)+  , gColours = (ci, cb, ce)+  } = Just $ image' 512 288 4 (c ci, c cb, c ce) re im (fromRational sz)+convert _ = Nothing
+ src/gruff-convert.hs view
@@ -0,0 +1,27 @@+import Data.Maybe (mapMaybe)+import System.Environment (getArgs)+import System.FilePath ((</>), takeFileName)++import Convert.Common (Image)+import Convert.Gruff  (gruff)+import Convert.Gruff1 (gruff1)+import Convert.Gruff2a(gruff2a)+import Convert.Gruff2 (gruff2)++parsers :: [String -> Maybe Image]+parsers = [gruff2, gruff2a, gruff1, gruff]++main :: IO ()+main = do+  args <- getArgs+  case args of+    odir:files@(_:_) -> mapM_ (main1 odir) files+    _ -> putStrLn "usage: gruff-convert outdir/ *.oldformat.gruff"++main1 :: FilePath -> FilePath -> IO ()+main1 odir file = do+  old <- readFile file+  case mapMaybe ($ old) parsers of+    []    -> putStrLn $ "Error: `" ++ file ++ "' unrecognised"+    [new] -> writeFile (odir </> takeFileName file) (show new)+    _     -> putStrLn $ "Error: `" ++ file ++ "' ambiguous"
src/gruff-octopus.hs view
@@ -9,7 +9,7 @@ import Fractal.RUFF.Types.Complex (Complex((:+)))  main :: IO ()-main = print animation+main = defaultMain animation  animation :: [(Image, FilePath)] animation = mapMaybe scene (score `zip` [0..])
src/gruff-patterns.hs view
@@ -13,8 +13,11 @@  main :: IO () main = do-  [num, den, depth] <- map read `fmap` getArgs-  defaultMain (animation (num % den) (fromIntegral depth))+  args <- getArgs+  case map reads args of+    [[(num, "")], [(den, "")], [(depth, "")]] ->+      defaultMain (animation (num % den) (fromIntegral depth))+    _ -> putStrLn "usage: gruff-patterns num den depth | gruff"  animation :: Rational -> Int -> [(Image, FilePath)] animation r d = mapMaybe scene (score r d)
src/gruff-randoms.hs view
@@ -20,13 +20,20 @@  main :: IO () main = do-  n <- (read . head) `fmap` getArgs-  gs <- unfoldr (Just . split) `fmap` newStdGen-  ch <- newChan-  forM_ ([0..] `zip` take numCapabilities gs) $ forkIO . worker ch-  let unique = nubBy ((==) `on` snd)-      f ((i, _), a) = (i, toFileName (prettyAngledInternalAddress a))-  defaultMain . take n . map f . unique =<< getChanContents ch+  args <- getArgs+  case args of+    [ns] -> case reads ns of+      [(n, "")] -> do+        gs <- unfoldr (Just . split) `fmap` newStdGen+        ch <- newChan+        forM_ ([0..] `zip` take numCapabilities gs) $ forkIO . worker ch+        let unique = nubBy ((==) `on` snd)+            f ((i, _), a) = (i, toFileName (prettyAngledInternalAddress a))+        defaultMain . take n . map f . unique =<< getChanContents ch+      _ -> usage+    _ -> usage+  where+    usage = putStrLn "usage: gruff-randoms count | gruff"  toFileName :: String -> String toFileName = (++ ".ppm") . map toFileChar
src/gruff-whn.hs view
@@ -32,7 +32,7 @@               [(q'', "")] -> q''               _ -> Preview             _ -> Preview-  print (animation q)+  defaultMain (animation q)  window :: Quality -> Window window Preview = Window{ width =  512, height =  288, supersamples =  1    }