Deploying to gh-pages from @ f748ecebd0ffd1ca2b83dad4956253f18ce8d809 🚀

This commit is contained in:
Lemmih 2020-08-06 11:12:41 +00:00
commit b60f066769
6 changed files with 808 additions and 728 deletions

View file

@ -1,7 +1,10 @@
100% ( 22 / 22) in 'Reanimate.Effect' 100% ( 22 / 22) in 'Reanimate.Effect'
92% ( 12 / 13) in 'Reanimate.ColorMap' 100% ( 17 / 17) in 'Reanimate.Parameters'
100% ( 13 / 13) in 'Reanimate.ColorMap'
100% ( 12 / 12) in 'Reanimate.ColorComponents'
100% ( 9 / 9) in 'Reanimate.Constants'
94% (144 /154) in 'Reanimate'
88% ( 7 / 8) in 'Reanimate.Transition' 88% ( 7 / 8) in 'Reanimate.Transition'
86% (134 /155) in 'Reanimate'
85% ( 47 / 55) in 'Reanimate.Svg.Constructors' 85% ( 47 / 55) in 'Reanimate.Svg.Constructors'
77% ( 33 / 43) in 'Reanimate.Animation' 77% ( 33 / 43) in 'Reanimate.Animation'
73% ( 8 / 11) in 'Reanimate.Ease' 73% ( 8 / 11) in 'Reanimate.Ease'
@ -11,9 +14,9 @@
50% ( 1 / 2) in 'Reanimate.Builtin.CirclePlot' 50% ( 1 / 2) in 'Reanimate.Builtin.CirclePlot'
44% ( 4 / 9) in 'Reanimate.LaTeX' 44% ( 4 / 9) in 'Reanimate.LaTeX'
42% ( 17 / 40) in 'Reanimate.GeoProjection' 42% ( 17 / 40) in 'Reanimate.GeoProjection'
42% ( 5 / 12) in 'Reanimate.ColorComponents'
41% ( 45 /111) in 'Reanimate.Scene' 41% ( 45 /111) in 'Reanimate.Scene'
38% ( 3 / 8) in 'Reanimate.Builtin.Documentation' 38% ( 3 / 8) in 'Reanimate.Builtin.Documentation'
33% ( 4 / 12) in 'Reanimate.Render'
28% ( 5 / 18) in 'Reanimate.Svg' 28% ( 5 / 18) in 'Reanimate.Svg'
25% ( 1 / 4) in 'Reanimate.Builtin.Slide' 25% ( 1 / 4) in 'Reanimate.Builtin.Slide'
17% ( 1 / 6) in 'Reanimate.Svg.BoundingBox' 17% ( 1 / 6) in 'Reanimate.Svg.BoundingBox'
@ -26,16 +29,13 @@
0% ( 0 / 37) in 'Reanimate.Internal.CubicBezier' 0% ( 0 / 37) in 'Reanimate.Internal.CubicBezier'
0% ( 0 / 20) in 'Reanimate.Math.Compatible' 0% ( 0 / 20) in 'Reanimate.Math.Compatible'
0% ( 0 / 19) in 'Reanimate.Morph.Rigid' 0% ( 0 / 19) in 'Reanimate.Morph.Rigid'
0% ( 0 / 17) in 'Reanimate.Parameters'
0% ( 0 / 13) in 'Reanimate.Morph.LeastWork' 0% ( 0 / 13) in 'Reanimate.Morph.LeastWork'
0% ( 0 / 13) in 'Reanimate.Morph.Common' 0% ( 0 / 13) in 'Reanimate.Morph.Common'
0% ( 0 / 12) in 'Reanimate.Render'
0% ( 0 / 10) in 'Reanimate.Math.Render' 0% ( 0 / 10) in 'Reanimate.Math.Render'
0% ( 0 / 10) in 'Reanimate.ColorSpace' 0% ( 0 / 10) in 'Reanimate.ColorSpace'
0% ( 0 / 10) in 'Reanimate.Builtin.TernaryPlot' 0% ( 0 / 10) in 'Reanimate.Builtin.TernaryPlot'
0% ( 0 / 9) in 'Reanimate.Povray' 0% ( 0 / 9) in 'Reanimate.Povray'
0% ( 0 / 9) in 'Reanimate.Math.Smooth' 0% ( 0 / 9) in 'Reanimate.Math.Smooth'
0% ( 0 / 9) in 'Reanimate.Constants'
0% ( 0 / 8) in 'Reanimate.Misc' 0% ( 0 / 8) in 'Reanimate.Misc'
0% ( 0 / 8) in 'Reanimate.Math.Balloon' 0% ( 0 / 8) in 'Reanimate.Math.Balloon'
0% ( 0 / 8) in 'Reanimate.Chiphunk' 0% ( 0 / 8) in 'Reanimate.Chiphunk'

View file

@ -1 +1 @@
{ "schemaVersion": 1, "label": "api docs", "message": "30%", "color": "success" } { "schemaVersion": 1, "label": "api docs", "message": "34%", "color": "success" }

View file

@ -18,104 +18,134 @@ span.spaces { background: white }
</pre> </pre>
<pre> <pre>
<span class="lineno"> 1 </span>{-# LANGUAGE RecordWildCards #-} <span class="lineno"> 1 </span>{-# LANGUAGE RecordWildCards #-}
<span class="lineno"> 2 </span>module Reanimate.ColorComponents where <span class="lineno"> 2 </span>{- |
<span class="lineno"> 3 </span> <span class="lineno"> 3 </span> Colors are three dimensional and can be projected into many color spaces
<span class="lineno"> 4 </span>import Codec.Picture <span class="lineno"> 4 </span> with different properties.
<span class="lineno"> 5 </span>import Codec.Picture.Types <span class="lineno"> 5 </span>
<span class="lineno"> 6 </span>import Data.Colour <span class="lineno"> 6 </span> Interpolating directly in the RGB color space is unintuitive and rarely useful.
<span class="lineno"> 7 </span>import Data.Colour.CIE <span class="lineno"> 7 </span> If you want to transition through color, you most likely want either the XYZ space
<span class="lineno"> 8 </span>import Data.Colour.CIE.Illuminant (d65) <span class="lineno"> 8 </span> (for physically accurate color transitions) or the LAB space (for esthetically
<span class="lineno"> 9 </span>import Data.Colour.RGBSpace <span class="lineno"> 9 </span> pleasing colors).
<span class="lineno"> 10 </span>import Data.Colour.RGBSpace.HSV <span class="lineno"> 10 </span>-}
<span class="lineno"> 11 </span>import Data.Colour.SRGB <span class="lineno"> 11 </span>module Reanimate.ColorComponents
<span class="lineno"> 12 </span>import Data.Fixed <span class="lineno"> 12 </span> ( ColorComponents(..)
<span class="lineno"> 13 </span>import Reanimate.Ease <span class="lineno"> 13 </span> , rgbComponents
<span class="lineno"> 14 </span> <span class="lineno"> 14 </span> , hsvComponents
<span class="lineno"> 15 </span>data ColorComponents = ColorComponents <span class="lineno"> 15 </span> , labComponents
<span class="lineno"> 16 </span> { <span class="nottickedoff"><span class="decl"><span class="nottickedoff">colorUnpack</span></span></span> :: Colour Double -&gt; (Double, Double, Double) <span class="lineno"> 16 </span> , xyzComponents
<span class="lineno"> 17 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">colorPack</span></span></span> :: Double -&gt; Double -&gt; Double -&gt; Colour Double } <span class="lineno"> 17 </span> , lchComponents
<span class="lineno"> 18 </span> <span class="lineno"> 18 </span> , interpolate
<span class="lineno"> 19 </span>-- | &gt; interpolate rgbComponents yellow blue <span class="lineno"> 19 </span> , interpolateRGB8
<span class="lineno"> 20 </span>-- <span class="lineno"> 20 </span> , interpolateRGBA8
<span class="lineno"> 21 </span>-- &lt;&lt;docs/gifs/doc_rgbComponents.gif&gt;&gt; <span class="lineno"> 21 </span> , toRGB8
<span class="lineno"> 22 </span>rgbComponents :: ColorComponents <span class="lineno"> 22 </span> , fromRGB8
<span class="lineno"> 23 </span><span class="decl"><span class="istickedoff">rgbComponents = ColorComponents rgbUnpack sRGB</span> <span class="lineno"> 23 </span> ) where
<span class="lineno"> 24 </span><span class="spaces"> </span><span class="istickedoff">where</span> <span class="lineno"> 24 </span>
<span class="lineno"> 25 </span><span class="spaces"> </span><span class="istickedoff">rgbUnpack :: Colour Double -&gt; (Double, Double, Double)</span> <span class="lineno"> 25 </span>import Codec.Picture
<span class="lineno"> 26 </span><span class="spaces"> </span><span class="istickedoff">rgbUnpack c =</span> <span class="lineno"> 26 </span>import Codec.Picture.Types
<span class="lineno"> 27 </span><span class="spaces"> </span><span class="istickedoff">case toSRGB c of</span> <span class="lineno"> 27 </span>import Data.Colour
<span class="lineno"> 28 </span><span class="spaces"> </span><span class="istickedoff">RGB r g b -&gt; (r,g,b)</span></span> <span class="lineno"> 28 </span>import Data.Colour.CIE
<span class="lineno"> 29 </span> <span class="lineno"> 29 </span>import Data.Colour.CIE.Illuminant (d65)
<span class="lineno"> 30 </span>-- | &gt; interpolate hsvComponents yellow blue <span class="lineno"> 30 </span>import Data.Colour.RGBSpace
<span class="lineno"> 31 </span>-- <span class="lineno"> 31 </span>import Data.Colour.RGBSpace.HSV
<span class="lineno"> 32 </span>-- &lt;&lt;docs/gifs/doc_hsvComponents.gif&gt;&gt; <span class="lineno"> 32 </span>import Data.Colour.SRGB
<span class="lineno"> 33 </span>hsvComponents :: ColorComponents <span class="lineno"> 33 </span>import Data.Fixed
<span class="lineno"> 34 </span><span class="decl"><span class="istickedoff">hsvComponents = ColorComponents unpack pack</span> <span class="lineno"> 34 </span>import Reanimate.Ease
<span class="lineno"> 35 </span><span class="spaces"> </span><span class="istickedoff">where</span> <span class="lineno"> 35 </span>
<span class="lineno"> 36 </span><span class="spaces"> </span><span class="istickedoff">unpack = hsvView.toSRGB</span> <span class="lineno"> 36 </span>-- | Constructor and destructor for color's three components.
<span class="lineno"> 37 </span><span class="spaces"> </span><span class="istickedoff">pack a b c = uncurryRGB sRGB $ hsv a b c</span></span> <span class="lineno"> 37 </span>data ColorComponents = ColorComponents
<span class="lineno"> 38 </span> <span class="lineno"> 38 </span> { <span class="nottickedoff"><span class="decl"><span class="nottickedoff">colorUnpack</span></span></span> :: Colour Double -&gt; (Double, Double, Double)
<span class="lineno"> 39 </span>-- | &gt; interpolate labComponents yellow blue <span class="lineno"> 39 </span> -- ^ Unpack a color into its three components.
<span class="lineno"> 40 </span>-- <span class="lineno"> 40 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">colorPack</span></span></span> :: Double -&gt; Double -&gt; Double -&gt; Colour Double
<span class="lineno"> 41 </span>-- &lt;&lt;docs/gifs/doc_labComponents.gif&gt;&gt; <span class="lineno"> 41 </span> -- ^ Restore a color from three coordinates.
<span class="lineno"> 42 </span>labComponents :: ColorComponents <span class="lineno"> 42 </span> }
<span class="lineno"> 43 </span><span class="decl"><span class="istickedoff">labComponents = ColorComponents unpack pack</span> <span class="lineno"> 43 </span>
<span class="lineno"> 44 </span><span class="spaces"> </span><span class="istickedoff">where</span> <span class="lineno"> 44 </span>-- | &gt; interpolate rgbComponents yellow blue
<span class="lineno"> 45 </span><span class="spaces"> </span><span class="istickedoff">unpack = cieLABView d65</span> <span class="lineno"> 45 </span>--
<span class="lineno"> 46 </span><span class="spaces"> </span><span class="istickedoff">pack = cieLAB d65</span></span> <span class="lineno"> 46 </span>-- &lt;&lt;docs/gifs/doc_rgbComponents.gif&gt;&gt;
<span class="lineno"> 47 </span> <span class="lineno"> 47 </span>rgbComponents :: ColorComponents
<span class="lineno"> 48 </span>-- | &gt; interpolate xyzComponents yellow blue <span class="lineno"> 48 </span><span class="decl"><span class="istickedoff">rgbComponents = ColorComponents rgbUnpack sRGB</span>
<span class="lineno"> 49 </span>-- <span class="lineno"> 49 </span><span class="spaces"> </span><span class="istickedoff">where</span>
<span class="lineno"> 50 </span>-- &lt;&lt;docs/gifs/doc_xyzComponents.gif&gt;&gt; <span class="lineno"> 50 </span><span class="spaces"> </span><span class="istickedoff">rgbUnpack :: Colour Double -&gt; (Double, Double, Double)</span>
<span class="lineno"> 51 </span>xyzComponents :: ColorComponents <span class="lineno"> 51 </span><span class="spaces"> </span><span class="istickedoff">rgbUnpack c =</span>
<span class="lineno"> 52 </span><span class="decl"><span class="istickedoff">xyzComponents = ColorComponents cieXYZView cieXYZ</span></span> <span class="lineno"> 52 </span><span class="spaces"> </span><span class="istickedoff">case toSRGB c of</span>
<span class="lineno"> 53 </span> <span class="lineno"> 53 </span><span class="spaces"> </span><span class="istickedoff">RGB r g b -&gt; (r,g,b)</span></span>
<span class="lineno"> 54 </span>-- | &gt; interpolate lchComponents yellow blue <span class="lineno"> 54 </span>
<span class="lineno"> 55 </span>-- <span class="lineno"> 55 </span>-- | &gt; interpolate hsvComponents yellow blue
<span class="lineno"> 56 </span>-- &lt;&lt;docs/gifs/doc_lchComponents.gif&gt;&gt; <span class="lineno"> 56 </span>--
<span class="lineno"> 57 </span>lchComponents :: ColorComponents <span class="lineno"> 57 </span>-- &lt;&lt;docs/gifs/doc_hsvComponents.gif&gt;&gt;
<span class="lineno"> 58 </span><span class="decl"><span class="istickedoff">lchComponents = ColorComponents unpack pack</span> <span class="lineno"> 58 </span>hsvComponents :: ColorComponents
<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff">where</span> <span class="lineno"> 59 </span><span class="decl"><span class="istickedoff">hsvComponents = ColorComponents unpack pack</span>
<span class="lineno"> 60 </span><span class="spaces"> </span><span class="istickedoff">toDeg,toRad :: Double -&gt; Double</span> <span class="lineno"> 60 </span><span class="spaces"> </span><span class="istickedoff">where</span>
<span class="lineno"> 61 </span><span class="spaces"> </span><span class="istickedoff">toRad deg = deg/180 * pi</span> <span class="lineno"> 61 </span><span class="spaces"> </span><span class="istickedoff">unpack = hsvView.toSRGB</span>
<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff">toDeg rad = rad/pi * 180</span> <span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff">pack a b c = uncurryRGB sRGB $ hsv a b c</span></span>
<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff">unpack :: Colour Double -&gt; (Double, Double, Double)</span> <span class="lineno"> 63 </span>
<span class="lineno"> 64 </span><span class="spaces"> </span><span class="istickedoff">unpack color =</span> <span class="lineno"> 64 </span>-- | &gt; interpolate labComponents yellow blue
<span class="lineno"> 65 </span><span class="spaces"> </span><span class="istickedoff">let (l,a,b) = cieLABView d65 color</span> <span class="lineno"> 65 </span>--
<span class="lineno"> 66 </span><span class="spaces"> </span><span class="istickedoff">c = sqrt (a*a + b*b)</span> <span class="lineno"> 66 </span>-- &lt;&lt;docs/gifs/doc_labComponents.gif&gt;&gt;
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="istickedoff">h :: Double</span> <span class="lineno"> 67 </span>labComponents :: ColorComponents
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="istickedoff">h = (toDeg(atan2 b a) + 360) `mod'` 360</span> <span class="lineno"> 68 </span><span class="decl"><span class="istickedoff">labComponents = ColorComponents unpack pack</span>
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="istickedoff">isZero = round (c*10000) == (0::Integer)</span> <span class="lineno"> 69 </span><span class="spaces"> </span><span class="istickedoff">where</span>
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="istickedoff">in (l, c, if <span class="tickonlyfalse">isZero</span> then <span class="nottickedoff">0/0</span> else h)</span> <span class="lineno"> 70 </span><span class="spaces"> </span><span class="istickedoff">unpack = cieLABView d65</span>
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="istickedoff">pack l c h =</span> <span class="lineno"> 71 </span><span class="spaces"> </span><span class="istickedoff">pack = cieLAB d65</span></span>
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="istickedoff">cieLAB d65 l (cos (toRad h) * c) (sin (toRad h) * c)</span></span> <span class="lineno"> 72 </span>
<span class="lineno"> 73 </span> <span class="lineno"> 73 </span>-- | &gt; interpolate xyzComponents yellow blue
<span class="lineno"> 74 </span>interpolate :: ColorComponents -&gt; Colour Double -&gt; Colour Double -&gt; (Double -&gt; Colour Double) <span class="lineno"> 74 </span>--
<span class="lineno"> 75 </span><span class="decl"><span class="istickedoff">interpolate ColorComponents{..} from to = \d -&gt;</span> <span class="lineno"> 75 </span>-- &lt;&lt;docs/gifs/doc_xyzComponents.gif&gt;&gt;
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="istickedoff">colorPack (a1 + (a2-a1)*d) (b1 + (b2-b1)*d) (c1 + (c2-c1)*d)</span> <span class="lineno"> 76 </span>xyzComponents :: ColorComponents
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="istickedoff">where</span> <span class="lineno"> 77 </span><span class="decl"><span class="istickedoff">xyzComponents = ColorComponents cieXYZView cieXYZ</span></span>
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="istickedoff">(a1,b1,c1) = colorUnpack from</span> <span class="lineno"> 78 </span>
<span class="lineno"> 79 </span><span class="spaces"> </span><span class="istickedoff">(a2,b2,c2) = colorUnpack to</span></span> <span class="lineno"> 79 </span>-- | &gt; interpolate lchComponents yellow blue
<span class="lineno"> 80 </span> <span class="lineno"> 80 </span>--
<span class="lineno"> 81 </span>interpolateRGB8 :: ColorComponents -&gt; PixelRGB8 -&gt; PixelRGB8 -&gt; (Double -&gt; PixelRGB8) <span class="lineno"> 81 </span>-- &lt;&lt;docs/gifs/doc_lchComponents.gif&gt;&gt;
<span class="lineno"> 82 </span><span class="decl"><span class="istickedoff">interpolateRGB8 comps from to = toRGB8 . interpolate comps (fromRGB8 from) (fromRGB8 to)</span></span> <span class="lineno"> 82 </span>lchComponents :: ColorComponents
<span class="lineno"> 83 </span> <span class="lineno"> 83 </span><span class="decl"><span class="istickedoff">lchComponents = ColorComponents unpack pack</span>
<span class="lineno"> 84 </span>interpolateRGBA8 :: ColorComponents -&gt; PixelRGBA8 -&gt; PixelRGBA8 -&gt; (Double -&gt; PixelRGBA8) <span class="lineno"> 84 </span><span class="spaces"> </span><span class="istickedoff">where</span>
<span class="lineno"> 85 </span><span class="decl"><span class="nottickedoff">interpolateRGBA8 comps from to = \t -&gt;</span> <span class="lineno"> 85 </span><span class="spaces"> </span><span class="istickedoff">toDeg,toRad :: Double -&gt; Double</span>
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="nottickedoff">case interp t of</span> <span class="lineno"> 86 </span><span class="spaces"> </span><span class="istickedoff">toRad deg = deg/180 * pi</span>
<span class="lineno"> 87 </span><span class="spaces"> </span><span class="nottickedoff">PixelRGB8 r g b -&gt;</span> <span class="lineno"> 87 </span><span class="spaces"> </span><span class="istickedoff">toDeg rad = rad/pi * 180</span>
<span class="lineno"> 88 </span><span class="spaces"> </span><span class="nottickedoff">let alpha = fromToS (fromIntegral $ pixelOpacity from) (fromIntegral $ pixelOpacity to) t</span> <span class="lineno"> 88 </span><span class="spaces"> </span><span class="istickedoff">unpack :: Colour Double -&gt; (Double, Double, Double)</span>
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="nottickedoff">in PixelRGBA8 r g b (round alpha)</span> <span class="lineno"> 89 </span><span class="spaces"> </span><span class="istickedoff">unpack color =</span>
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="nottickedoff">where</span> <span class="lineno"> 90 </span><span class="spaces"> </span><span class="istickedoff">let (l,a,b) = cieLABView d65 color</span>
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="nottickedoff">interp = interpolateRGB8 comps (dropTransparency from) (dropTransparency to)</span></span> <span class="lineno"> 91 </span><span class="spaces"> </span><span class="istickedoff">c = sqrt (a*a + b*b)</span>
<span class="lineno"> 92 </span> <span class="lineno"> 92 </span><span class="spaces"> </span><span class="istickedoff">h :: Double</span>
<span class="lineno"> 93 </span>toRGB8 :: Colour Double -&gt; PixelRGB8 <span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff">h = (toDeg(atan2 b a) + 360) `mod'` 360</span>
<span class="lineno"> 94 </span><span class="decl"><span class="istickedoff">toRGB8 c = PixelRGB8 r g b</span> <span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff">isZero = round (c*10000) == (0::Integer)</span>
<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">where</span> <span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">in (l, c, if <span class="tickonlyfalse">isZero</span> then <span class="nottickedoff">0/0</span> else h)</span>
<span class="lineno"> 96 </span><span class="spaces"> </span><span class="istickedoff">RGB r g b = toSRGBBounded c</span></span> <span class="lineno"> 96 </span><span class="spaces"> </span><span class="istickedoff">pack l c h =</span>
<span class="lineno"> 97 </span> <span class="lineno"> 97 </span><span class="spaces"> </span><span class="istickedoff">cieLAB d65 l (cos (toRad h) * c) (sin (toRad h) * c)</span></span>
<span class="lineno"> 98 </span>fromRGB8 :: PixelRGB8 -&gt; Colour Double <span class="lineno"> 98 </span>
<span class="lineno"> 99 </span><span class="decl"><span class="istickedoff">fromRGB8 (PixelRGB8 r g b) = sRGB24 r g b</span></span> <span class="lineno"> 99 </span>-- | Smoothly interpolate between two colors using the given color components.
<span class="lineno"> 100 </span>interpolate :: ColorComponents -&gt; Colour Double -&gt; Colour Double -&gt; (Double -&gt; Colour Double)
<span class="lineno"> 101 </span><span class="decl"><span class="istickedoff">interpolate ColorComponents{..} from to = \d -&gt;</span>
<span class="lineno"> 102 </span><span class="spaces"> </span><span class="istickedoff">colorPack (a1 + (a2-a1)*d) (b1 + (b2-b1)*d) (c1 + (c2-c1)*d)</span>
<span class="lineno"> 103 </span><span class="spaces"> </span><span class="istickedoff">where</span>
<span class="lineno"> 104 </span><span class="spaces"> </span><span class="istickedoff">(a1,b1,c1) = colorUnpack from</span>
<span class="lineno"> 105 </span><span class="spaces"> </span><span class="istickedoff">(a2,b2,c2) = colorUnpack to</span></span>
<span class="lineno"> 106 </span>
<span class="lineno"> 107 </span>-- | Convenience interpolation function for RGB8 values.
<span class="lineno"> 108 </span>interpolateRGB8 :: ColorComponents -&gt; PixelRGB8 -&gt; PixelRGB8 -&gt; (Double -&gt; PixelRGB8)
<span class="lineno"> 109 </span><span class="decl"><span class="istickedoff">interpolateRGB8 comps from to = toRGB8 . interpolate comps (fromRGB8 from) (fromRGB8 to)</span></span>
<span class="lineno"> 110 </span>
<span class="lineno"> 111 </span>-- | Convenience interpolation function for RGBA8 values.
<span class="lineno"> 112 </span>interpolateRGBA8 :: ColorComponents -&gt; PixelRGBA8 -&gt; PixelRGBA8 -&gt; (Double -&gt; PixelRGBA8)
<span class="lineno"> 113 </span><span class="decl"><span class="nottickedoff">interpolateRGBA8 comps from to = \t -&gt;</span>
<span class="lineno"> 114 </span><span class="spaces"> </span><span class="nottickedoff">case interp t of</span>
<span class="lineno"> 115 </span><span class="spaces"> </span><span class="nottickedoff">PixelRGB8 r g b -&gt;</span>
<span class="lineno"> 116 </span><span class="spaces"> </span><span class="nottickedoff">let alpha = fromToS (fromIntegral $ pixelOpacity from) (fromIntegral $ pixelOpacity to) t</span>
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="nottickedoff">in PixelRGBA8 r g b (round alpha)</span>
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="nottickedoff">interp = interpolateRGB8 comps (dropTransparency from) (dropTransparency to)</span></span>
<span class="lineno"> 120 </span>
<span class="lineno"> 121 </span>-- | Convenience function for expressing a color as an RGB8 value.
<span class="lineno"> 122 </span>toRGB8 :: Colour Double -&gt; PixelRGB8
<span class="lineno"> 123 </span><span class="decl"><span class="istickedoff">toRGB8 c = PixelRGB8 r g b</span>
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="istickedoff">where</span>
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="istickedoff">RGB r g b = toSRGBBounded c</span></span>
<span class="lineno"> 126 </span>
<span class="lineno"> 127 </span>-- | Convenience function for expressing an RGB8 value as a color.
<span class="lineno"> 128 </span>fromRGB8 :: PixelRGB8 -&gt; Colour Double
<span class="lineno"> 129 </span><span class="decl"><span class="istickedoff">fromRGB8 (PixelRGB8 r g b) = sRGB24 r g b</span></span>
</pre> </pre>
</body> </body>

File diff suppressed because it is too large Load diff

View file

@ -17,34 +17,57 @@ span.spaces { background: white }
<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span> <span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span>
</pre> </pre>
<pre> <pre>
<span class="lineno"> 1 </span>module Reanimate.Constants <span class="lineno"> 1 </span>{- |
<span class="lineno"> 2 </span> ( screenWidth <span class="lineno"> 2 </span> Reanimate configures a consistent, default canvas. The values of this default
<span class="lineno"> 3 </span> , screenHeight <span class="lineno"> 3 </span> can be observed via the constants in this module. Keep in mind, these values
<span class="lineno"> 4 </span> , screenTop <span class="lineno"> 4 </span> describe the /default/ canvas and will not apply to custom viewports.
<span class="lineno"> 5 </span> , screenBottom <span class="lineno"> 5 </span>-}
<span class="lineno"> 6 </span> , screenLeft <span class="lineno"> 6 </span>module Reanimate.Constants
<span class="lineno"> 7 </span> , screenRight <span class="lineno"> 7 </span> ( screenWidth
<span class="lineno"> 8 </span> , defaultDPI <span class="lineno"> 8 </span> , screenHeight
<span class="lineno"> 9 </span> , defaultStrokeWidth <span class="lineno"> 9 </span> , screenTop
<span class="lineno"> 10 </span> ) where <span class="lineno"> 10 </span> , screenBottom
<span class="lineno"> 11 </span> <span class="lineno"> 11 </span> , screenLeft
<span class="lineno"> 12 </span>import Graphics.SvgTree <span class="lineno"> 12 </span> , screenRight
<span class="lineno"> 13 </span> <span class="lineno"> 13 </span> , defaultDPI
<span class="lineno"> 14 </span>screenWidth, screenHeight, screenTop :: Fractional a =&gt; a <span class="lineno"> 14 </span> , defaultStrokeWidth
<span class="lineno"> 15 </span>screenBottom, screenLeft, screenRight :: Fractional a =&gt; a <span class="lineno"> 15 </span> ) where
<span class="lineno"> 16 </span> <span class="lineno"> 16 </span>
<span class="lineno"> 17 </span><span class="decl"><span class="istickedoff">screenWidth = 16</span></span> <span class="lineno"> 17 </span>import Graphics.SvgTree
<span class="lineno"> 18 </span><span class="decl"><span class="istickedoff">screenHeight = 9</span></span> <span class="lineno"> 18 </span>
<span class="lineno"> 19 </span><span class="decl"><span class="nottickedoff">screenTop = screenHeight/2</span></span> <span class="lineno"> 19 </span>-- | Number of units from the left-most point to the right-most point on the screen.
<span class="lineno"> 20 </span><span class="decl"><span class="nottickedoff">screenBottom = -screenHeight/2</span></span> <span class="lineno"> 20 </span>screenWidth :: Fractional a =&gt; a
<span class="lineno"> 21 </span><span class="decl"><span class="nottickedoff">screenLeft = -screenWidth/2</span></span> <span class="lineno"> 21 </span>
<span class="lineno"> 22 </span><span class="decl"><span class="nottickedoff">screenRight = screenWidth/2</span></span> <span class="lineno"> 22 </span>-- | Number of units from the bottom to the top of the screen.
<span class="lineno"> 23 </span> <span class="lineno"> 23 </span>screenHeight :: Fractional a =&gt; a
<span class="lineno"> 24 </span>defaultDPI :: Dpi <span class="lineno"> 24 </span>
<span class="lineno"> 25 </span><span class="decl"><span class="nottickedoff">defaultDPI = 96</span></span> <span class="lineno"> 25 </span>-- | Position of the top of the screen.
<span class="lineno"> 26 </span> <span class="lineno"> 26 </span>screenTop :: Fractional a =&gt; a
<span class="lineno"> 27 </span>defaultStrokeWidth :: Double <span class="lineno"> 27 </span>
<span class="lineno"> 28 </span><span class="decl"><span class="istickedoff">defaultStrokeWidth = 0.05</span></span> <span class="lineno"> 28 </span>-- | Position of the bottom of the screen.
<span class="lineno"> 29 </span>screenBottom :: Fractional a =&gt; a
<span class="lineno"> 30 </span>
<span class="lineno"> 31 </span>-- | Position of the left side of the screen.
<span class="lineno"> 32 </span>screenLeft :: Fractional a =&gt; a
<span class="lineno"> 33 </span>
<span class="lineno"> 34 </span>-- | Position of the right side of the screen.
<span class="lineno"> 35 </span>screenRight :: Fractional a =&gt; a
<span class="lineno"> 36 </span>
<span class="lineno"> 37 </span><span class="decl"><span class="istickedoff">screenWidth = 16</span></span>
<span class="lineno"> 38 </span><span class="decl"><span class="istickedoff">screenHeight = 9</span></span>
<span class="lineno"> 39 </span><span class="decl"><span class="nottickedoff">screenTop = screenHeight/2</span></span>
<span class="lineno"> 40 </span><span class="decl"><span class="nottickedoff">screenBottom = -screenHeight/2</span></span>
<span class="lineno"> 41 </span><span class="decl"><span class="nottickedoff">screenLeft = -screenWidth/2</span></span>
<span class="lineno"> 42 </span><span class="decl"><span class="nottickedoff">screenRight = screenWidth/2</span></span>
<span class="lineno"> 43 </span>
<span class="lineno"> 44 </span>-- | SVG allows measurements in inches which have to be converted to local units.
<span class="lineno"> 45 </span>-- This value describes how many local units there are in an inch.
<span class="lineno"> 46 </span>defaultDPI :: Dpi
<span class="lineno"> 47 </span><span class="decl"><span class="nottickedoff">defaultDPI = 96</span></span>
<span class="lineno"> 48 </span>
<span class="lineno"> 49 </span>-- | Default thickness of lines.
<span class="lineno"> 50 </span>defaultStrokeWidth :: Double
<span class="lineno"> 51 </span><span class="decl"><span class="istickedoff">defaultStrokeWidth = 0.05</span></span>
</pre> </pre>
</body> </body>

View file

@ -17,106 +17,128 @@ span.spaces { background: white }
<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span> <span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span>
</pre> </pre>
<pre> <pre>
<span class="lineno"> 1 </span>module Reanimate.Parameters <span class="lineno"> 1 </span>{- |
<span class="lineno"> 2 </span> ( Raster(..) <span class="lineno"> 2 </span> Parameters define the global context of an animation. They are set once
<span class="lineno"> 3 </span> , Width <span class="lineno"> 3 </span> before an animation is rendered and may not change during rendering.
<span class="lineno"> 4 </span> , Height <span class="lineno"> 4 </span>-}
<span class="lineno"> 5 </span> , FPS <span class="lineno"> 5 </span>module Reanimate.Parameters
<span class="lineno"> 6 </span> , pRaster <span class="lineno"> 6 </span> ( Raster(..)
<span class="lineno"> 7 </span> , pFPS <span class="lineno"> 7 </span> , Width
<span class="lineno"> 8 </span> , pWidth <span class="lineno"> 8 </span> , Height
<span class="lineno"> 9 </span> , pHeight <span class="lineno"> 9 </span> , FPS
<span class="lineno"> 10 </span> , pNoExternals <span class="lineno"> 10 </span> , pRaster
<span class="lineno"> 11 </span> , pRootDirectory <span class="lineno"> 11 </span> , pFPS
<span class="lineno"> 12 </span> , setRaster <span class="lineno"> 12 </span> , pWidth
<span class="lineno"> 13 </span> , setFPS <span class="lineno"> 13 </span> , pHeight
<span class="lineno"> 14 </span> , setWidth <span class="lineno"> 14 </span> , pNoExternals
<span class="lineno"> 15 </span> , setHeight <span class="lineno"> 15 </span> , pRootDirectory
<span class="lineno"> 16 </span> , setNoExternals <span class="lineno"> 16 </span> , setRaster
<span class="lineno"> 17 </span> , setRootDirectory <span class="lineno"> 17 </span> , setFPS
<span class="lineno"> 18 </span> ) where <span class="lineno"> 18 </span> , setWidth
<span class="lineno"> 19 </span> <span class="lineno"> 19 </span> , setHeight
<span class="lineno"> 20 </span>import System.IO.Unsafe <span class="lineno"> 20 </span> , setNoExternals
<span class="lineno"> 21 </span>import Data.IORef <span class="lineno"> 21 </span> , setRootDirectory
<span class="lineno"> 22 </span> <span class="lineno"> 22 </span> ) where
<span class="lineno"> 23 </span>type Width = Int <span class="lineno"> 23 </span>
<span class="lineno"> 24 </span>type Height = Int <span class="lineno"> 24 </span>import System.IO.Unsafe
<span class="lineno"> 25 </span>type FPS = Int <span class="lineno"> 25 </span>import Data.IORef
<span class="lineno"> 26 </span> <span class="lineno"> 26 </span>
<span class="lineno"> 27 </span>data Raster <span class="lineno"> 27 </span>-- | Width of animation in pixels.
<span class="lineno"> 28 </span> = RasterNone <span class="lineno"> 28 </span>type Width = Int
<span class="lineno"> 29 </span> | RasterAuto <span class="lineno"> 29 </span>-- | Height of animation in pixels.
<span class="lineno"> 30 </span> | RasterInkscape <span class="lineno"> 30 </span>type Height = Int
<span class="lineno"> 31 </span> | RasterRSvg <span class="lineno"> 31 </span>-- | Framerate of animation in frames per second.
<span class="lineno"> 32 </span> | RasterMagick <span class="lineno"> 32 </span>type FPS = Int
<span class="lineno"> 33 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>) <span class="lineno"> 33 </span>
<span class="lineno"> 34 </span> <span class="lineno"> 34 </span>-- | Raster engines turn SVG images into pixels.
<span class="lineno"> 35 </span>{-# NOINLINE pRasterRef #-} <span class="lineno"> 35 </span>data Raster
<span class="lineno"> 36 </span>pRasterRef :: IORef Raster <span class="lineno"> 36 </span> = RasterNone -- ^ Do not use any external raster engine. Rely on the browser or ffmpeg.
<span class="lineno"> 37 </span><span class="decl"><span class="nottickedoff">pRasterRef = unsafePerformIO (newIORef RasterNone)</span></span> <span class="lineno"> 37 </span> | RasterAuto -- ^ Scan for installed raster engines and pick the fastest one.
<span class="lineno"> 38 </span> <span class="lineno"> 38 </span> | RasterInkscape -- ^ Use Inkscape to raster SVG images.
<span class="lineno"> 39 </span>{-# NOINLINE pRaster #-} <span class="lineno"> 39 </span> | RasterRSvg -- ^ Use rsvg-convert to raster SVG images.
<span class="lineno"> 40 </span>pRaster :: Raster <span class="lineno"> 40 </span> | RasterMagick -- ^ Use imagemagick to raster SVG images.
<span class="lineno"> 41 </span><span class="decl"><span class="nottickedoff">pRaster = unsafePerformIO (readIORef pRasterRef)</span></span> <span class="lineno"> 41 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>)
<span class="lineno"> 42 </span> <span class="lineno"> 42 </span>
<span class="lineno"> 43 </span>setRaster :: Raster -&gt; IO () <span class="lineno"> 43 </span>{-# NOINLINE pRasterRef #-}
<span class="lineno"> 44 </span><span class="decl"><span class="nottickedoff">setRaster = writeIORef pRasterRef</span></span> <span class="lineno"> 44 </span>pRasterRef :: IORef Raster
<span class="lineno"> 45 </span> <span class="lineno"> 45 </span><span class="decl"><span class="nottickedoff">pRasterRef = unsafePerformIO (newIORef RasterNone)</span></span>
<span class="lineno"> 46 </span>{-# NOINLINE pFPSRef #-} <span class="lineno"> 46 </span>
<span class="lineno"> 47 </span>pFPSRef :: IORef FPS <span class="lineno"> 47 </span>{-# NOINLINE pRaster #-}
<span class="lineno"> 48 </span><span class="decl"><span class="nottickedoff">pFPSRef = unsafePerformIO (newIORef 0)</span></span> <span class="lineno"> 48 </span>-- | Selected raster engine.
<span class="lineno"> 49 </span> <span class="lineno"> 49 </span>pRaster :: Raster
<span class="lineno"> 50 </span>{-# NOINLINE pFPS #-} <span class="lineno"> 50 </span><span class="decl"><span class="nottickedoff">pRaster = unsafePerformIO (readIORef pRasterRef)</span></span>
<span class="lineno"> 51 </span>pFPS :: FPS <span class="lineno"> 51 </span>
<span class="lineno"> 52 </span><span class="decl"><span class="nottickedoff">pFPS = unsafePerformIO (readIORef pFPSRef)</span></span> <span class="lineno"> 52 </span>-- | Set raster engine.
<span class="lineno"> 53 </span> <span class="lineno"> 53 </span>setRaster :: Raster -&gt; IO ()
<span class="lineno"> 54 </span>setFPS :: FPS -&gt; IO () <span class="lineno"> 54 </span><span class="decl"><span class="nottickedoff">setRaster = writeIORef pRasterRef</span></span>
<span class="lineno"> 55 </span><span class="decl"><span class="nottickedoff">setFPS = writeIORef pFPSRef</span></span> <span class="lineno"> 55 </span>
<span class="lineno"> 56 </span> <span class="lineno"> 56 </span>{-# NOINLINE pFPSRef #-}
<span class="lineno"> 57 </span>{-# NOINLINE pWidthRef #-} <span class="lineno"> 57 </span>pFPSRef :: IORef FPS
<span class="lineno"> 58 </span>pWidthRef :: IORef FPS <span class="lineno"> 58 </span><span class="decl"><span class="nottickedoff">pFPSRef = unsafePerformIO (newIORef 0)</span></span>
<span class="lineno"> 59 </span><span class="decl"><span class="nottickedoff">pWidthRef = unsafePerformIO (newIORef 0)</span></span> <span class="lineno"> 59 </span>
<span class="lineno"> 60 </span> <span class="lineno"> 60 </span>{-# NOINLINE pFPS #-}
<span class="lineno"> 61 </span>{-# NOINLINE pWidth #-} <span class="lineno"> 61 </span>-- | Selected framerate.
<span class="lineno"> 62 </span>pWidth :: Width <span class="lineno"> 62 </span>pFPS :: FPS
<span class="lineno"> 63 </span><span class="decl"><span class="nottickedoff">pWidth = unsafePerformIO (readIORef pWidthRef)</span></span> <span class="lineno"> 63 </span><span class="decl"><span class="nottickedoff">pFPS = unsafePerformIO (readIORef pFPSRef)</span></span>
<span class="lineno"> 64 </span> <span class="lineno"> 64 </span>
<span class="lineno"> 65 </span>setWidth :: Width -&gt; IO () <span class="lineno"> 65 </span>-- | Set desired framerate.
<span class="lineno"> 66 </span><span class="decl"><span class="nottickedoff">setWidth = writeIORef pWidthRef</span></span> <span class="lineno"> 66 </span>setFPS :: FPS -&gt; IO ()
<span class="lineno"> 67 </span> <span class="lineno"> 67 </span><span class="decl"><span class="nottickedoff">setFPS = writeIORef pFPSRef</span></span>
<span class="lineno"> 68 </span> <span class="lineno"> 68 </span>
<span class="lineno"> 69 </span>{-# NOINLINE pHeightRef #-} <span class="lineno"> 69 </span>{-# NOINLINE pWidthRef #-}
<span class="lineno"> 70 </span>pHeightRef :: IORef FPS <span class="lineno"> 70 </span>pWidthRef :: IORef FPS
<span class="lineno"> 71 </span><span class="decl"><span class="nottickedoff">pHeightRef = unsafePerformIO (newIORef 0)</span></span> <span class="lineno"> 71 </span><span class="decl"><span class="nottickedoff">pWidthRef = unsafePerformIO (newIORef 0)</span></span>
<span class="lineno"> 72 </span> <span class="lineno"> 72 </span>
<span class="lineno"> 73 </span>{-# NOINLINE pHeight #-} <span class="lineno"> 73 </span>{-# NOINLINE pWidth #-}
<span class="lineno"> 74 </span>pHeight :: Height <span class="lineno"> 74 </span>-- | Width of animation in pixel.
<span class="lineno"> 75 </span><span class="decl"><span class="nottickedoff">pHeight = unsafePerformIO (readIORef pHeightRef)</span></span> <span class="lineno"> 75 </span>pWidth :: Width
<span class="lineno"> 76 </span> <span class="lineno"> 76 </span><span class="decl"><span class="nottickedoff">pWidth = unsafePerformIO (readIORef pWidthRef)</span></span>
<span class="lineno"> 77 </span>setHeight :: Height -&gt; IO () <span class="lineno"> 77 </span>
<span class="lineno"> 78 </span><span class="decl"><span class="nottickedoff">setHeight = writeIORef pHeightRef</span></span> <span class="lineno"> 78 </span>-- | Set desired width of animation in pixel.
<span class="lineno"> 79 </span> <span class="lineno"> 79 </span>setWidth :: Width -&gt; IO ()
<span class="lineno"> 80 </span>{-# NOINLINE pNoExternalsRef #-} <span class="lineno"> 80 </span><span class="decl"><span class="nottickedoff">setWidth = writeIORef pWidthRef</span></span>
<span class="lineno"> 81 </span>pNoExternalsRef :: IORef Bool <span class="lineno"> 81 </span>
<span class="lineno"> 82 </span><span class="decl"><span class="istickedoff">pNoExternalsRef = unsafePerformIO (newIORef <span class="nottickedoff">False</span>)</span></span> <span class="lineno"> 82 </span>{-# NOINLINE pHeightRef #-}
<span class="lineno"> 83 </span> <span class="lineno"> 83 </span>pHeightRef :: IORef FPS
<span class="lineno"> 84 </span>{-# NOINLINE pNoExternals #-} <span class="lineno"> 84 </span><span class="decl"><span class="nottickedoff">pHeightRef = unsafePerformIO (newIORef 0)</span></span>
<span class="lineno"> 85 </span>pNoExternals :: Bool <span class="lineno"> 85 </span>
<span class="lineno"> 86 </span><span class="decl"><span class="istickedoff">pNoExternals = unsafePerformIO (readIORef pNoExternalsRef)</span></span> <span class="lineno"> 86 </span>{-# NOINLINE pHeight #-}
<span class="lineno"> 87 </span> <span class="lineno"> 87 </span>-- | Height of animation in pixel.
<span class="lineno"> 88 </span>setNoExternals :: Bool -&gt; IO () <span class="lineno"> 88 </span>pHeight :: Height
<span class="lineno"> 89 </span><span class="decl"><span class="istickedoff">setNoExternals = writeIORef pNoExternalsRef</span></span> <span class="lineno"> 89 </span><span class="decl"><span class="nottickedoff">pHeight = unsafePerformIO (readIORef pHeightRef)</span></span>
<span class="lineno"> 90 </span> <span class="lineno"> 90 </span>
<span class="lineno"> 91 </span>{-# NOINLINE pRootDirectoryRef #-} <span class="lineno"> 91 </span>-- | Set desired height of animation in pixel.
<span class="lineno"> 92 </span>pRootDirectoryRef :: IORef FilePath <span class="lineno"> 92 </span>setHeight :: Height -&gt; IO ()
<span class="lineno"> 93 </span><span class="decl"><span class="nottickedoff">pRootDirectoryRef = unsafePerformIO (newIORef (error &quot;root directory not set&quot;))</span></span> <span class="lineno"> 93 </span><span class="decl"><span class="nottickedoff">setHeight = writeIORef pHeightRef</span></span>
<span class="lineno"> 94 </span> <span class="lineno"> 94 </span>
<span class="lineno"> 95 </span>{-# NOINLINE pRootDirectory #-} <span class="lineno"> 95 </span>{-# NOINLINE pNoExternalsRef #-}
<span class="lineno"> 96 </span>pRootDirectory :: FilePath <span class="lineno"> 96 </span>pNoExternalsRef :: IORef Bool
<span class="lineno"> 97 </span><span class="decl"><span class="nottickedoff">pRootDirectory = unsafePerformIO (readIORef pRootDirectoryRef)</span></span> <span class="lineno"> 97 </span><span class="decl"><span class="istickedoff">pNoExternalsRef = unsafePerformIO (newIORef <span class="nottickedoff">False</span>)</span></span>
<span class="lineno"> 98 </span> <span class="lineno"> 98 </span>
<span class="lineno"> 99 </span>setRootDirectory :: FilePath -&gt; IO () <span class="lineno"> 99 </span>{-# NOINLINE pNoExternals #-}
<span class="lineno"> 100 </span><span class="decl"><span class="nottickedoff">setRootDirectory = writeIORef pRootDirectoryRef</span></span> <span class="lineno"> 100 </span>-- | This parameter determined whether or not external tools are allowed.
<span class="lineno"> 101 </span>-- If this flag is True then tools such as 'latex' and 'blender' will not
<span class="lineno"> 102 </span>-- be invoked.
<span class="lineno"> 103 </span>pNoExternals :: Bool
<span class="lineno"> 104 </span><span class="decl"><span class="istickedoff">pNoExternals = unsafePerformIO (readIORef pNoExternalsRef)</span></span>
<span class="lineno"> 105 </span>
<span class="lineno"> 106 </span>-- | Set whether external tools are allowed.
<span class="lineno"> 107 </span>setNoExternals :: Bool -&gt; IO ()
<span class="lineno"> 108 </span><span class="decl"><span class="istickedoff">setNoExternals = writeIORef pNoExternalsRef</span></span>
<span class="lineno"> 109 </span>
<span class="lineno"> 110 </span>{-# NOINLINE pRootDirectoryRef #-}
<span class="lineno"> 111 </span>pRootDirectoryRef :: IORef FilePath
<span class="lineno"> 112 </span><span class="decl"><span class="nottickedoff">pRootDirectoryRef = unsafePerformIO (newIORef (error &quot;root directory not set&quot;))</span></span>
<span class="lineno"> 113 </span>
<span class="lineno"> 114 </span>{-# NOINLINE pRootDirectory #-}
<span class="lineno"> 115 </span>-- | Root directory of animation. Images and other data has to be placed
<span class="lineno"> 116 </span>-- here if they are referenced in an SVG image.
<span class="lineno"> 117 </span>pRootDirectory :: FilePath
<span class="lineno"> 118 </span><span class="decl"><span class="nottickedoff">pRootDirectory = unsafePerformIO (readIORef pRootDirectoryRef)</span></span>
<span class="lineno"> 119 </span>
<span class="lineno"> 120 </span>-- | Set the root animation directory.
<span class="lineno"> 121 </span>setRootDirectory :: FilePath -&gt; IO ()
<span class="lineno"> 122 </span><span class="decl"><span class="nottickedoff">setRootDirectory = writeIORef pRootDirectoryRef</span></span>
</pre> </pre>
</body> </body>