mirror of
https://github.com/reanimate/reanimate.git
synced 2026-09-15 10:02:45 +00:00
Deploying to gh-pages from @ aa4656d77d 🚀
This commit is contained in:
parent
8f86f98362
commit
1feaadfd62
12 changed files with 958 additions and 921 deletions
14
haddock.txt
14
haddock.txt
|
|
@ -6,21 +6,27 @@
|
||||||
100% ( 22 / 22) in 'Reanimate.Effect'
|
100% ( 22 / 22) in 'Reanimate.Effect'
|
||||||
100% ( 17 / 17) in 'Reanimate.Parameters'
|
100% ( 17 / 17) in 'Reanimate.Parameters'
|
||||||
100% ( 14 / 14) in 'Reanimate.Raster'
|
100% ( 14 / 14) in 'Reanimate.Raster'
|
||||||
|
100% ( 13 / 13) in 'Reanimate.Render'
|
||||||
100% ( 13 / 13) in 'Reanimate.Morph.Common'
|
100% ( 13 / 13) in 'Reanimate.Morph.Common'
|
||||||
100% ( 13 / 13) in 'Reanimate.ColorMap'
|
100% ( 13 / 13) in 'Reanimate.ColorMap'
|
||||||
100% ( 12 / 12) in 'Reanimate.ColorComponents'
|
100% ( 12 / 12) in 'Reanimate.ColorComponents'
|
||||||
|
100% ( 10 / 10) in 'Reanimate.Voice'
|
||||||
100% ( 10 / 10) in 'Reanimate.Ease'
|
100% ( 10 / 10) in 'Reanimate.Ease'
|
||||||
100% ( 9 / 9) in 'Reanimate.Voice'
|
|
||||||
100% ( 9 / 9) in 'Reanimate.Povray'
|
100% ( 9 / 9) in 'Reanimate.Povray'
|
||||||
|
100% ( 9 / 9) in 'Reanimate.LaTeX'
|
||||||
100% ( 9 / 9) in 'Reanimate.Constants'
|
100% ( 9 / 9) in 'Reanimate.Constants'
|
||||||
100% ( 8 / 8) in 'Reanimate.Transition'
|
100% ( 8 / 8) in 'Reanimate.Transition'
|
||||||
100% ( 8 / 8) in 'Reanimate.Builtin.TernaryPlot'
|
100% ( 8 / 8) in 'Reanimate.Builtin.TernaryPlot'
|
||||||
|
100% ( 7 / 7) in 'Reanimate.Svg.LineCommand'
|
||||||
100% ( 7 / 7) in 'Reanimate.Builtin.Documentation'
|
100% ( 7 / 7) in 'Reanimate.Builtin.Documentation'
|
||||||
100% ( 6 / 6) in 'Reanimate.Morph.Linear'
|
100% ( 6 / 6) in 'Reanimate.Morph.Linear'
|
||||||
100% ( 6 / 6) in 'Reanimate.Builtin.Images'
|
100% ( 6 / 6) in 'Reanimate.Builtin.Images'
|
||||||
100% ( 5 / 5) in 'Reanimate.Transform'
|
100% ( 5 / 5) in 'Reanimate.Transform'
|
||||||
100% ( 4 / 4) in 'Reanimate.Svg.Unuse'
|
100% ( 4 / 4) in 'Reanimate.Svg.Unuse'
|
||||||
100% ( 4 / 4) in 'Reanimate.Svg.BoundingBox'
|
100% ( 4 / 4) in 'Reanimate.Svg.BoundingBox'
|
||||||
|
100% ( 4 / 4) in 'Reanimate.Morph.Rotational'
|
||||||
|
100% ( 4 / 4) in 'Reanimate.Debug'
|
||||||
|
100% ( 3 / 3) in 'Reanimate.Memo'
|
||||||
100% ( 3 / 3) in 'Reanimate.Math.Balloon'
|
100% ( 3 / 3) in 'Reanimate.Math.Balloon'
|
||||||
100% ( 3 / 3) in 'Reanimate.Blender'
|
100% ( 3 / 3) in 'Reanimate.Blender'
|
||||||
100% ( 2 / 2) in 'Reanimate.Builtin.CirclePlot'
|
100% ( 2 / 2) in 'Reanimate.Builtin.CirclePlot'
|
||||||
|
|
@ -28,12 +34,6 @@
|
||||||
89% (101 /113) in 'Reanimate.Scene'
|
89% (101 /113) in 'Reanimate.Scene'
|
||||||
84% ( 31 / 37) in 'Geom2D.CubicBezier.Linear'
|
84% ( 31 / 37) in 'Geom2D.CubicBezier.Linear'
|
||||||
61% ( 11 / 18) in 'Reanimate.Svg'
|
61% ( 11 / 18) in 'Reanimate.Svg'
|
||||||
56% ( 5 / 9) in 'Reanimate.LaTeX'
|
|
||||||
50% ( 2 / 4) in 'Reanimate.Builtin.Slide'
|
50% ( 2 / 4) in 'Reanimate.Builtin.Slide'
|
||||||
38% ( 5 / 13) in 'Reanimate.Render'
|
|
||||||
33% ( 1 / 3) in 'Reanimate.Morph.Rotational'
|
|
||||||
25% ( 1 / 4) in 'Reanimate.Debug'
|
|
||||||
20% ( 1 / 5) in 'Reanimate.Builtin.Flip'
|
20% ( 1 / 5) in 'Reanimate.Builtin.Flip'
|
||||||
10% ( 1 / 10) in 'Reanimate.ColorSpace'
|
10% ( 1 / 10) in 'Reanimate.ColorSpace'
|
||||||
6% ( 1 / 18) in 'Reanimate.Svg.LineCommand'
|
|
||||||
0% ( 0 / 3) in 'Reanimate.Memo'
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
{ "schemaVersion": 1, "label": "api docs", "message": "87%", "color": "success" }
|
{ "schemaVersion": 1, "label": "api docs", "message": "94%", "color": "success" }
|
||||||
|
|
|
||||||
|
|
@ -107,13 +107,13 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td align="right">38%</td><td>5/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>15/80</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>323/777</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">38%</td><td>5/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>15/80</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>323/777</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox</a></tt></td>
|
||||||
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>6/36</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">27%</td><td>76/281</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>6/36</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">26%</td><td>76/282</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="26%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors</a></tt></td>
|
||||||
<td align="right">67%</td><td>33/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="67%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">37%</td><td>3/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="37%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">65%</td><td>369/565</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="65%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">67%</td><td>33/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="67%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">37%</td><td>3/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="37%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">65%</td><td>369/565</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="65%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand</a></tt></td>
|
||||||
<td align="right">75%</td><td>12/16</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>43/74</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">69%</td><td>659/943</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="69%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">80%</td><td>12/15</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="80%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>43/74</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">70%</td><td>659/937</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="70%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.Unuse.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.Unuse</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.Unuse.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.Unuse</a></tt></td>
|
||||||
<td align="right">33%</td><td>1/3</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">21%</td><td>28/128</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="21%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">33%</td><td>1/3</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">21%</td><td>28/128</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="21%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
|
|
@ -125,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td align="right">100%</td><td>6/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">50%</td><td>1/2</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="50%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">95%</td><td>43/45</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="95%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">100%</td><td>6/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">50%</td><td>1/2</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="50%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">95%</td><td>43/45</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="95%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr></tr><tr style="background: #e0e0e0">
|
<tr></tr><tr style="background: #e0e0e0">
|
||||||
<th align=left> Program Coverage Total</tt></th>
|
<th align=left> Program Coverage Total</tt></th>
|
||||||
<td align="right">31%</td><td>246/786</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4646/15516</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">31%</td><td>246/785</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4646/15511</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
</table></body></html>
|
</table></body></html>
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td align="right">30%</td><td>40/130</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>15/25</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="60%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">36%</td><td>545/1483</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="36%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">30%</td><td>40/130</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>15/25</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="60%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">36%</td><td>545/1483</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="36%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand</a></tt></td>
|
||||||
<td align="right">75%</td><td>12/16</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>43/74</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">69%</td><td>659/943</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="69%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">80%</td><td>12/15</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="80%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>43/74</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">70%</td><td>659/937</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="70%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Animation.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Animation</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Animation.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Animation</a></tt></td>
|
||||||
<td align="right">90%</td><td>28/31</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="90%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>8/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">87%</td><td>298/341</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="87%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">90%</td><td>28/31</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="90%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">57%</td><td>8/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">87%</td><td>298/341</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="87%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
|
|
@ -50,7 +50,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">26%</td><td>22/83</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="26%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">26%</td><td>22/83</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="26%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox</a></tt></td>
|
||||||
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>6/36</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">27%</td><td>76/281</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>6/36</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">26%</td><td>76/282</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="26%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.LaTeX.hs.html">reanimate-0.4.1.0-inplace/Reanimate.LaTeX</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.LaTeX.hs.html">reanimate-0.4.1.0-inplace/Reanimate.LaTeX</a></tt></td>
|
||||||
<td align="right">33%</td><td>4/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>1/9</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>12/167</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">33%</td><td>4/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>1/9</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>12/167</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
|
|
@ -125,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td align="right">15%</td><td>3/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">14%</td><td>7/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="14%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">15%</td><td>3/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">14%</td><td>7/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="14%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr></tr><tr style="background: #e0e0e0">
|
<tr></tr><tr style="background: #e0e0e0">
|
||||||
<th align=left> Program Coverage Total</tt></th>
|
<th align=left> Program Coverage Total</tt></th>
|
||||||
<td align="right">31%</td><td>246/786</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4646/15516</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">31%</td><td>246/785</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4646/15511</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
</table></body></html>
|
</table></body></html>
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td align="right">75%</td><td>9/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">50%</td><td>1/2</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="50%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">81%</td><td>135/166</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="81%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">75%</td><td>9/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">50%</td><td>1/2</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="50%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">81%</td><td>135/166</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="81%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand</a></tt></td>
|
||||||
<td align="right">75%</td><td>12/16</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>43/74</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">69%</td><td>659/943</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="69%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">80%</td><td>12/15</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="80%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>43/74</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">70%</td><td>659/937</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="70%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors</a></tt></td>
|
||||||
<td align="right">67%</td><td>33/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="67%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">37%</td><td>3/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="37%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">65%</td><td>369/565</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="65%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">67%</td><td>33/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="67%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">37%</td><td>3/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="37%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">65%</td><td>369/565</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="65%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
|
|
@ -55,12 +55,12 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Builtin.Slide.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Builtin.Slide</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Builtin.Slide.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Builtin.Slide</a></tt></td>
|
||||||
<td align="right">33%</td><td>1/3</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">30%</td><td>18/60</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">33%</td><td>1/3</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">30%</td><td>18/60</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox</a></tt></td>
|
|
||||||
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>6/36</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">27%</td><td>76/281</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
|
||||||
<tr>
|
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Morph.Linear.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Morph.Linear</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Morph.Linear.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Morph.Linear</a></tt></td>
|
||||||
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">26%</td><td>22/83</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="26%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">26%</td><td>22/83</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="26%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox</a></tt></td>
|
||||||
|
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>6/36</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">26%</td><td>76/282</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="26%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.Unuse.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.Unuse</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.Unuse.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.Unuse</a></tt></td>
|
||||||
<td align="right">33%</td><td>1/3</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">21%</td><td>28/128</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="21%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">33%</td><td>1/3</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">21%</td><td>28/128</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="21%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
@ -125,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/61</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/61</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr></tr><tr style="background: #e0e0e0">
|
<tr></tr><tr style="background: #e0e0e0">
|
||||||
<th align=left> Program Coverage Total</tt></th>
|
<th align=left> Program Coverage Total</tt></th>
|
||||||
<td align="right">31%</td><td>246/786</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4646/15516</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">31%</td><td>246/785</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4646/15511</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
</table></body></html>
|
</table></body></html>
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,12 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Transform.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Transform</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Transform.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Transform</a></tt></td>
|
||||||
<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">33%</td><td>4/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">45%</td><td>76/166</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="45%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">33%</td><td>4/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">45%</td><td>76/166</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="45%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand</a></tt></td>
|
||||||
|
<td align="right">80%</td><td>12/15</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="80%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>43/74</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">70%</td><td>659/937</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="70%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.ColorComponents.hs.html">reanimate-0.4.1.0-inplace/Reanimate.ColorComponents</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.ColorComponents.hs.html">reanimate-0.4.1.0-inplace/Reanimate.ColorComponents</a></tt></td>
|
||||||
<td align="right">75%</td><td>9/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">50%</td><td>1/2</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="50%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">81%</td><td>135/166</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="81%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">75%</td><td>9/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">50%</td><td>1/2</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="50%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">81%</td><td>135/166</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="81%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.LineCommand</a></tt></td>
|
|
||||||
<td align="right">75%</td><td>12/16</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="75%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">58%</td><td>43/74</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="58%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">69%</td><td>659/943</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="69%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
|
||||||
<tr>
|
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.Constructors</a></tt></td>
|
||||||
<td align="right">67%</td><td>33/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="67%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">37%</td><td>3/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="37%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">65%</td><td>369/565</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="65%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">67%</td><td>33/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="67%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">37%</td><td>3/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="37%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">65%</td><td>369/565</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="65%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
@ -44,7 +44,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">26%</td><td>22/83</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="26%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">26%</td><td>22/83</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="26%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg.BoundingBox</a></tt></td>
|
||||||
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>6/36</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">27%</td><td>76/281</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">40%</td><td>2/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="40%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>6/36</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">26%</td><td>76/282</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="26%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg</a></tt></td>
|
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg</a></tt></td>
|
||||||
<td align="right">38%</td><td>5/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>15/80</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>323/777</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">38%</td><td>5/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>15/80</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>323/777</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
|
|
@ -125,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
||||||
<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/61</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/61</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||||
<tr></tr><tr style="background: #e0e0e0">
|
<tr></tr><tr style="background: #e0e0e0">
|
||||||
<th align=left> Program Coverage Total</tt></th>
|
<th align=left> Program Coverage Total</tt></th>
|
||||||
<td align="right">31%</td><td>246/786</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4646/15516</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
<td align="right">31%</td><td>246/785</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4646/15511</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||||
</table></body></html>
|
</table></body></html>
|
||||||
|
|
|
||||||
|
|
@ -9,4 +9,4 @@ const snippets = [{"title": "Hello World","url": "https://reanimate.clozecards.c
|
||||||
,{"title": "Object Positions","url": "https://reanimate.clozecards.com/IAQhjO0Ke7h/195.svg","code": "env =\n addStatic (mkBackground \"white\") .\n mapA (withStrokeColor \"black\")\n\nanimation :: Animation\nanimation = env $\n sceneAnimation $ do\n -- Configure objects\n txt <- newText \"Center\"\n top <- newText \"Top\"\n oModifyS top $ \n oTopY .= screenTop\n topR <- newText \"Top right\"\n oModifyS topR $ do\n oTopY .= screenTop\n oRightX .= screenRight\n botR <- newText \"Bottom right\"\n oModifyS botR $ do\n oBottomY .= screenBottom\n oRightX .= screenRight\n botL <- newText \"Bottom left\"\n oModifyS botL $ do\n oBottomY .= screenBottom\n oLeftX .= screenLeft\n topL <- newText \"Top left\"\n oModifyS topL $ do\n oTopY .= screenTop\n oLeftX .= screenLeft\n -- Show objects\n oShow txt\n wait 1\n switchTo txt top\n switchTo top topR\n switchTo topR botR\n switchTo botR botL\n switchTo botL topL\n switchTo topL txt\n\nswitchTo src dst = do\n fork $ oFadeOut src 1\n oModify dst $ oOpacity .~ 1\n oFadeIn dst 1\n wait 1\n\nnewText txt =\n newObject $ scale 1.5 $ center $ latex txt\n"}
|
,{"title": "Object Positions","url": "https://reanimate.clozecards.com/IAQhjO0Ke7h/195.svg","code": "env =\n addStatic (mkBackground \"white\") .\n mapA (withStrokeColor \"black\")\n\nanimation :: Animation\nanimation = env $\n sceneAnimation $ do\n -- Configure objects\n txt <- newText \"Center\"\n top <- newText \"Top\"\n oModifyS top $ \n oTopY .= screenTop\n topR <- newText \"Top right\"\n oModifyS topR $ do\n oTopY .= screenTop\n oRightX .= screenRight\n botR <- newText \"Bottom right\"\n oModifyS botR $ do\n oBottomY .= screenBottom\n oRightX .= screenRight\n botL <- newText \"Bottom left\"\n oModifyS botL $ do\n oBottomY .= screenBottom\n oLeftX .= screenLeft\n topL <- newText \"Top left\"\n oModifyS topL $ do\n oTopY .= screenTop\n oLeftX .= screenLeft\n -- Show objects\n oShow txt\n wait 1\n switchTo txt top\n switchTo top topR\n switchTo topR botR\n switchTo botR botL\n switchTo botL topL\n switchTo topL txt\n\nswitchTo src dst = do\n fork $ oFadeOut src 1\n oModify dst $ oOpacity .~ 1\n oFadeIn dst 1\n wait 1\n\nnewText txt =\n newObject $ scale 1.5 $ center $ latex txt\n"}
|
||||||
,{"title": "Camera","url": "https://reanimate.clozecards.com/CD5Bg7AwVkF/150.svg","code": "animation :: Animation\nanimation = docEnv $ mapA (withFillOpacity 1) $ sceneAnimation $ do\n cam <- newObject Camera\n\n txt <- newObject $ center $ latex \"Fixed (non-cam)\"\n oModifyS txt $ do\n oTopY .= screenTop \n oZIndex .= 2\n\n circle <- newObject $ Circle 1\n cameraAttach cam circle\n oModify circle $ oContext .~ withFillColor \"blue\"\n circleRight <- oRead circle oRightX\n\n box <- newObject $ Rectangle 2 2\n cameraAttach cam box\n oModify box $ oContext .~ withFillColor \"green\"\n oModify box $ oLeftX .~ circleRight\n boxCenter <- oRead box oCenterXY\n\n small <- newObject $ center $ latex \"This text is very small\"\n cameraAttach cam small\n oModifyS small $ do\n oCenterXY .= boxCenter\n oScale .= 0.1\n \n oShow txt\n oShow small\n oShow circle\n oShow box\n\n wait 1\n\n cameraFocus cam boxCenter\n waitOn $ do\n fork $ cameraPan cam 3 boxCenter\n fork $ cameraZoom cam 3 15\n \n wait 2\n cameraZoom cam 3 1\n cameraPan cam 1 (0,0)\n"}
|
,{"title": "Camera","url": "https://reanimate.clozecards.com/CD5Bg7AwVkF/150.svg","code": "animation :: Animation\nanimation = docEnv $ mapA (withFillOpacity 1) $ sceneAnimation $ do\n cam <- newObject Camera\n\n txt <- newObject $ center $ latex \"Fixed (non-cam)\"\n oModifyS txt $ do\n oTopY .= screenTop \n oZIndex .= 2\n\n circle <- newObject $ Circle 1\n cameraAttach cam circle\n oModify circle $ oContext .~ withFillColor \"blue\"\n circleRight <- oRead circle oRightX\n\n box <- newObject $ Rectangle 2 2\n cameraAttach cam box\n oModify box $ oContext .~ withFillColor \"green\"\n oModify box $ oLeftX .~ circleRight\n boxCenter <- oRead box oCenterXY\n\n small <- newObject $ center $ latex \"This text is very small\"\n cameraAttach cam small\n oModifyS small $ do\n oCenterXY .= boxCenter\n oScale .= 0.1\n \n oShow txt\n oShow small\n oShow circle\n oShow box\n\n wait 1\n\n cameraFocus cam boxCenter\n waitOn $ do\n fork $ cameraPan cam 3 boxCenter\n fork $ cameraZoom cam 3 15\n \n wait 2\n cameraZoom cam 3 1\n cameraPan cam 1 (0,0)\n"}
|
||||||
];
|
];
|
||||||
const playgroundVersion = "2020-08-27 (0ea12)";
|
const playgroundVersion = "2020-08-27 (aa465)";
|
||||||
|
|
|
||||||
|
|
@ -66,135 +66,139 @@ span.spaces { background: white }
|
||||||
<span class="lineno"> 47 </span>latex :: T.Text -> Tree
|
<span class="lineno"> 47 </span>latex :: T.Text -> Tree
|
||||||
<span class="lineno"> 48 </span><span class="decl"><span class="istickedoff">latex = latexWithHeaders <span class="nottickedoff">[]</span></span></span>
|
<span class="lineno"> 48 </span><span class="decl"><span class="istickedoff">latex = latexWithHeaders <span class="nottickedoff">[]</span></span></span>
|
||||||
<span class="lineno"> 49 </span>
|
<span class="lineno"> 49 </span>
|
||||||
<span class="lineno"> 50 </span>latexWithHeaders :: [T.Text] -> T.Text -> Tree
|
<span class="lineno"> 50 </span>-- | Invoke latex with extra script headers.
|
||||||
<span class="lineno"> 51 </span><span class="decl"><span class="istickedoff">latexWithHeaders = someTexWithHeaders <span class="nottickedoff">"latex"</span> <span class="nottickedoff">"dvi"</span> <span class="nottickedoff">[]</span></span></span>
|
<span class="lineno"> 51 </span>latexWithHeaders :: [T.Text] -> T.Text -> Tree
|
||||||
<span class="lineno"> 52 </span>
|
<span class="lineno"> 52 </span><span class="decl"><span class="istickedoff">latexWithHeaders = someTexWithHeaders <span class="nottickedoff">"latex"</span> <span class="nottickedoff">"dvi"</span> <span class="nottickedoff">[]</span></span></span>
|
||||||
<span class="lineno"> 53 </span>someTexWithHeaders :: String -> String -> [String] -> [T.Text] -> T.Text -> Tree
|
<span class="lineno"> 53 </span>
|
||||||
<span class="lineno"> 54 </span><span class="decl"><span class="istickedoff">someTexWithHeaders _exec _dvi _args _headers tex | <span class="tickonlytrue">pNoExternals</span> = mkText tex</span>
|
<span class="lineno"> 54 </span>someTexWithHeaders :: String -> String -> [String] -> [T.Text] -> T.Text -> Tree
|
||||||
<span class="lineno"> 55 </span><span class="spaces"></span><span class="istickedoff">someTexWithHeaders exec dvi args headers tex =</span>
|
<span class="lineno"> 55 </span><span class="decl"><span class="istickedoff">someTexWithHeaders _exec _dvi _args _headers tex | <span class="tickonlytrue">pNoExternals</span> = mkText tex</span>
|
||||||
<span class="lineno"> 56 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">(unsafePerformIO . (cacheMem . cacheDiskSvg) (latexToSVG dvi exec args))</span></span>
|
<span class="lineno"> 56 </span><span class="spaces"></span><span class="istickedoff">someTexWithHeaders exec dvi args headers tex =</span>
|
||||||
<span class="lineno"> 57 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">script</span></span>
|
<span class="lineno"> 57 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">(unsafePerformIO . (cacheMem . cacheDiskSvg) (latexToSVG dvi exec args))</span></span>
|
||||||
<span class="lineno"> 58 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 58 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">script</span></span>
|
||||||
<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">script = mkTexScript exec args headers tex</span></span></span>
|
<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
<span class="lineno"> 60 </span>
|
<span class="lineno"> 60 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">script = mkTexScript exec args headers tex</span></span></span>
|
||||||
<span class="lineno"> 61 </span>latexChunks :: [T.Text] -> [Tree]
|
<span class="lineno"> 61 </span>
|
||||||
<span class="lineno"> 62 </span><span class="decl"><span class="nottickedoff">latexChunks chunks | pNoExternals = map mkText chunks</span>
|
<span class="lineno"> 62 </span>-- | Invoke latex and separate results.
|
||||||
<span class="lineno"> 63 </span><span class="spaces"></span><span class="nottickedoff">latexChunks chunks = worker (svgGlyphs $ latex $ T.concat chunks) chunks</span>
|
<span class="lineno"> 63 </span>latexChunks :: [T.Text] -> [Tree]
|
||||||
<span class="lineno"> 64 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
<span class="lineno"> 64 </span><span class="decl"><span class="nottickedoff">latexChunks chunks | pNoExternals = map mkText chunks</span>
|
||||||
<span class="lineno"> 65 </span><span class="spaces"> </span><span class="nottickedoff">merge lst = mkGroup [ fmt svg | (fmt, _, svg) <- lst ]</span>
|
<span class="lineno"> 65 </span><span class="spaces"></span><span class="nottickedoff">latexChunks chunks = worker (svgGlyphs $ latex $ T.concat chunks) chunks</span>
|
||||||
<span class="lineno"> 66 </span><span class="spaces"> </span><span class="nottickedoff">worker [] [] = []</span>
|
<span class="lineno"> 66 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||||
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="nottickedoff">worker _ [] = error "latex chunk mismatch"</span>
|
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="nottickedoff">merge lst = mkGroup [ fmt svg | (fmt, _, svg) <- lst ]</span>
|
||||||
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="nottickedoff">worker everything (x : xs) =</span>
|
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="nottickedoff">worker [] [] = []</span>
|
||||||
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="nottickedoff">let width = length $ svgGlyphs (latex x)</span>
|
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="nottickedoff">worker _ [] = error "latex chunk mismatch"</span>
|
||||||
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="nottickedoff">in merge (take width everything) : worker (drop width everything) xs</span></span>
|
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="nottickedoff">worker everything (x : xs) =</span>
|
||||||
<span class="lineno"> 71 </span>
|
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="nottickedoff">let width = length $ svgGlyphs (latex x)</span>
|
||||||
<span class="lineno"> 72 </span>-- | Invoke xelatex and import the result as an SVG object. SVG objects are
|
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="nottickedoff">in merge (take width everything) : worker (drop width everything) xs</span></span>
|
||||||
<span class="lineno"> 73 </span>-- cached to improve performance. Xelatex has support for non-western scripts.
|
<span class="lineno"> 73 </span>
|
||||||
<span class="lineno"> 74 </span>xelatex :: Text -> Tree
|
<span class="lineno"> 74 </span>-- | Invoke xelatex and import the result as an SVG object. SVG objects are
|
||||||
<span class="lineno"> 75 </span><span class="decl"><span class="nottickedoff">xelatex = xelatexWithHeaders []</span></span>
|
<span class="lineno"> 75 </span>-- cached to improve performance. Xelatex has support for non-western scripts.
|
||||||
<span class="lineno"> 76 </span>
|
<span class="lineno"> 76 </span>xelatex :: Text -> Tree
|
||||||
<span class="lineno"> 77 </span>xelatexWithHeaders :: [T.Text] -> T.Text -> Tree
|
<span class="lineno"> 77 </span><span class="decl"><span class="nottickedoff">xelatex = xelatexWithHeaders []</span></span>
|
||||||
<span class="lineno"> 78 </span><span class="decl"><span class="nottickedoff">xelatexWithHeaders = someTexWithHeaders "xelatex" "xdv" ["-no-pdf"]</span></span>
|
<span class="lineno"> 78 </span>
|
||||||
<span class="lineno"> 79 </span>
|
<span class="lineno"> 79 </span>-- | Invoke xelatex with extra script headers.
|
||||||
<span class="lineno"> 80 </span>-- | Invoke xelatex with "\usepackage[UTF8]{ctex}" and import the result as an
|
<span class="lineno"> 80 </span>xelatexWithHeaders :: [T.Text] -> T.Text -> Tree
|
||||||
<span class="lineno"> 81 </span>-- SVG object. SVG objects are cached to improve performance. Xelatex has
|
<span class="lineno"> 81 </span><span class="decl"><span class="nottickedoff">xelatexWithHeaders = someTexWithHeaders "xelatex" "xdv" ["-no-pdf"]</span></span>
|
||||||
<span class="lineno"> 82 </span>-- support for non-western scripts.
|
<span class="lineno"> 82 </span>
|
||||||
<span class="lineno"> 83 </span>--
|
<span class="lineno"> 83 </span>-- | Invoke xelatex with "\usepackage[UTF8]{ctex}" and import the result as an
|
||||||
<span class="lineno"> 84 </span>-- Example:
|
<span class="lineno"> 84 </span>-- SVG object. SVG objects are cached to improve performance. Xelatex has
|
||||||
<span class="lineno"> 85 </span>--
|
<span class="lineno"> 85 </span>-- support for non-western scripts.
|
||||||
<span class="lineno"> 86 </span>-- > ctex "中文"
|
<span class="lineno"> 86 </span>--
|
||||||
<span class="lineno"> 87 </span>--
|
<span class="lineno"> 87 </span>-- Example:
|
||||||
<span class="lineno"> 88 </span>-- <<docs/gifs/doc_ctex.gif>>
|
<span class="lineno"> 88 </span>--
|
||||||
<span class="lineno"> 89 </span>ctex :: T.Text -> Tree
|
<span class="lineno"> 89 </span>-- > ctex "中文"
|
||||||
<span class="lineno"> 90 </span><span class="decl"><span class="nottickedoff">ctex = ctexWithHeaders []</span></span>
|
<span class="lineno"> 90 </span>--
|
||||||
<span class="lineno"> 91 </span>
|
<span class="lineno"> 91 </span>-- <<docs/gifs/doc_ctex.gif>>
|
||||||
<span class="lineno"> 92 </span>ctexWithHeaders :: [T.Text] -> T.Text -> Tree
|
<span class="lineno"> 92 </span>ctex :: T.Text -> Tree
|
||||||
<span class="lineno"> 93 </span><span class="decl"><span class="nottickedoff">ctexWithHeaders headers = xelatexWithHeaders ("\\usepackage[UTF8]{ctex}" : headers)</span></span>
|
<span class="lineno"> 93 </span><span class="decl"><span class="nottickedoff">ctex = ctexWithHeaders []</span></span>
|
||||||
<span class="lineno"> 94 </span>
|
<span class="lineno"> 94 </span>
|
||||||
<span class="lineno"> 95 </span>-- | Invoke latex and import the result as an SVG object. SVG objects are
|
<span class="lineno"> 95 </span>-- | Invoke xelatex with extra script headers + ctex headers.
|
||||||
<span class="lineno"> 96 </span>-- cached to improve performance. This wraps the TeX code in an 'align*'
|
<span class="lineno"> 96 </span>ctexWithHeaders :: [T.Text] -> T.Text -> Tree
|
||||||
<span class="lineno"> 97 </span>-- context.
|
<span class="lineno"> 97 </span><span class="decl"><span class="nottickedoff">ctexWithHeaders headers = xelatexWithHeaders ("\\usepackage[UTF8]{ctex}" : headers)</span></span>
|
||||||
<span class="lineno"> 98 </span>--
|
<span class="lineno"> 98 </span>
|
||||||
<span class="lineno"> 99 </span>-- Example:
|
<span class="lineno"> 99 </span>-- | Invoke latex and import the result as an SVG object. SVG objects are
|
||||||
<span class="lineno"> 100 </span>--
|
<span class="lineno"> 100 </span>-- cached to improve performance. This wraps the TeX code in an 'align*'
|
||||||
<span class="lineno"> 101 </span>-- > latexAlign "R = \\frac{{\\Delta x}}{{kA}}"
|
<span class="lineno"> 101 </span>-- context.
|
||||||
<span class="lineno"> 102 </span>--
|
<span class="lineno"> 102 </span>--
|
||||||
<span class="lineno"> 103 </span>-- <<docs/gifs/doc_latexAlign.gif>>
|
<span class="lineno"> 103 </span>-- Example:
|
||||||
<span class="lineno"> 104 </span>latexAlign :: Text -> Tree
|
<span class="lineno"> 104 </span>--
|
||||||
<span class="lineno"> 105 </span><span class="decl"><span class="istickedoff">latexAlign tex = latex $ T.unlines ["\\begin{align*}", tex, "\\end{align*}"]</span></span>
|
<span class="lineno"> 105 </span>-- > latexAlign "R = \\frac{{\\Delta x}}{{kA}}"
|
||||||
<span class="lineno"> 106 </span>
|
<span class="lineno"> 106 </span>--
|
||||||
<span class="lineno"> 107 </span>postprocess :: Tree -> Tree
|
<span class="lineno"> 107 </span>-- <<docs/gifs/doc_latexAlign.gif>>
|
||||||
<span class="lineno"> 108 </span><span class="decl"><span class="nottickedoff">postprocess = simplify</span></span>
|
<span class="lineno"> 108 </span>latexAlign :: Text -> Tree
|
||||||
<span class="lineno"> 109 </span>
|
<span class="lineno"> 109 </span><span class="decl"><span class="istickedoff">latexAlign tex = latex $ T.unlines ["\\begin{align*}", tex, "\\end{align*}"]</span></span>
|
||||||
<span class="lineno"> 110 </span>-- executable, arguments, header, tex
|
<span class="lineno"> 110 </span>
|
||||||
<span class="lineno"> 111 </span>latexToSVG :: String -> String -> [String] -> Text -> IO Tree
|
<span class="lineno"> 111 </span>postprocess :: Tree -> Tree
|
||||||
<span class="lineno"> 112 </span><span class="decl"><span class="nottickedoff">latexToSVG dviExt latexExec latexArgs tex = do</span>
|
<span class="lineno"> 112 </span><span class="decl"><span class="nottickedoff">postprocess = simplify</span></span>
|
||||||
<span class="lineno"> 113 </span><span class="spaces"> </span><span class="nottickedoff">latexBin <- requireExecutable latexExec</span>
|
<span class="lineno"> 113 </span>
|
||||||
<span class="lineno"> 114 </span><span class="spaces"> </span><span class="nottickedoff">dvisvgm <- requireExecutable "dvisvgm"</span>
|
<span class="lineno"> 114 </span>-- executable, arguments, header, tex
|
||||||
<span class="lineno"> 115 </span><span class="spaces"> </span><span class="nottickedoff">withTempDir $ \tmp_dir -> withTempFile "tex" $ \tex_file -></span>
|
<span class="lineno"> 115 </span>latexToSVG :: String -> String -> [String] -> Text -> IO Tree
|
||||||
<span class="lineno"> 116 </span><span class="spaces"> </span><span class="nottickedoff">withTempFile "svg" $ \svg_file -> do</span>
|
<span class="lineno"> 116 </span><span class="decl"><span class="nottickedoff">latexToSVG dviExt latexExec latexArgs tex = do</span>
|
||||||
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="nottickedoff">let dvi_file =</span>
|
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="nottickedoff">latexBin <- requireExecutable latexExec</span>
|
||||||
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="nottickedoff">tmp_dir </> replaceExtension (takeFileName tex_file) dviExt</span>
|
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="nottickedoff">dvisvgm <- requireExecutable "dvisvgm"</span>
|
||||||
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="nottickedoff">B.writeFile tex_file (T.encodeUtf8 tex)</span>
|
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="nottickedoff">withTempDir $ \tmp_dir -> withTempFile "tex" $ \tex_file -></span>
|
||||||
<span class="lineno"> 120 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
|
<span class="lineno"> 120 </span><span class="spaces"> </span><span class="nottickedoff">withTempFile "svg" $ \svg_file -> do</span>
|
||||||
<span class="lineno"> 121 </span><span class="spaces"> </span><span class="nottickedoff">latexBin</span>
|
<span class="lineno"> 121 </span><span class="spaces"> </span><span class="nottickedoff">let dvi_file =</span>
|
||||||
<span class="lineno"> 122 </span><span class="spaces"> </span><span class="nottickedoff">( latexArgs</span>
|
<span class="lineno"> 122 </span><span class="spaces"> </span><span class="nottickedoff">tmp_dir </> replaceExtension (takeFileName tex_file) dviExt</span>
|
||||||
<span class="lineno"> 123 </span><span class="spaces"> </span><span class="nottickedoff">++ [ "-interaction=nonstopmode"</span>
|
<span class="lineno"> 123 </span><span class="spaces"> </span><span class="nottickedoff">B.writeFile tex_file (T.encodeUtf8 tex)</span>
|
||||||
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="nottickedoff">, "-halt-on-error"</span>
|
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
|
||||||
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="nottickedoff">, "-output-directory=" ++ tmp_dir</span>
|
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="nottickedoff">latexBin</span>
|
||||||
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="nottickedoff">, tex_file</span>
|
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="nottickedoff">( latexArgs</span>
|
||||||
<span class="lineno"> 127 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
<span class="lineno"> 127 </span><span class="spaces"> </span><span class="nottickedoff">++ [ "-interaction=nonstopmode"</span>
|
||||||
<span class="lineno"> 128 </span><span class="spaces"> </span><span class="nottickedoff">)</span>
|
<span class="lineno"> 128 </span><span class="spaces"> </span><span class="nottickedoff">, "-halt-on-error"</span>
|
||||||
<span class="lineno"> 129 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
|
<span class="lineno"> 129 </span><span class="spaces"> </span><span class="nottickedoff">, "-output-directory=" ++ tmp_dir</span>
|
||||||
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="nottickedoff">dvisvgm</span>
|
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="nottickedoff">, tex_file</span>
|
||||||
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="nottickedoff">[ dvi_file</span>
|
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
||||||
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="nottickedoff">, "--precision=5"</span>
|
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="nottickedoff">)</span>
|
||||||
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="nottickedoff">, "--exact" -- better bboxes.</span>
|
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
|
||||||
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="nottickedoff">, "--no-fonts" -- use glyphs instead of fonts.</span>
|
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="nottickedoff">dvisvgm</span>
|
||||||
<span class="lineno"> 135 </span><span class="spaces"> </span><span class="nottickedoff">, "--scale=0.1,-0.1"</span>
|
<span class="lineno"> 135 </span><span class="spaces"> </span><span class="nottickedoff">[ dvi_file</span>
|
||||||
<span class="lineno"> 136 </span><span class="spaces"> </span><span class="nottickedoff">, "--verbosity=0"</span>
|
<span class="lineno"> 136 </span><span class="spaces"> </span><span class="nottickedoff">, "--precision=5"</span>
|
||||||
<span class="lineno"> 137 </span><span class="spaces"> </span><span class="nottickedoff">, "-o"</span>
|
<span class="lineno"> 137 </span><span class="spaces"> </span><span class="nottickedoff">, "--exact" -- better bboxes.</span>
|
||||||
<span class="lineno"> 138 </span><span class="spaces"> </span><span class="nottickedoff">, svg_file</span>
|
<span class="lineno"> 138 </span><span class="spaces"> </span><span class="nottickedoff">, "--no-fonts" -- use glyphs instead of fonts.</span>
|
||||||
<span class="lineno"> 139 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
<span class="lineno"> 139 </span><span class="spaces"> </span><span class="nottickedoff">, "--scale=0.1,-0.1"</span>
|
||||||
<span class="lineno"> 140 </span><span class="spaces"> </span><span class="nottickedoff">svg_data <- B.readFile svg_file</span>
|
<span class="lineno"> 140 </span><span class="spaces"> </span><span class="nottickedoff">, "--verbosity=0"</span>
|
||||||
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="nottickedoff">case parseSvgFile svg_file svg_data of</span>
|
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="nottickedoff">, "-o"</span>
|
||||||
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="nottickedoff">Nothing -> error "Malformed svg"</span>
|
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="nottickedoff">, svg_file</span>
|
||||||
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="nottickedoff">Just svg -> return $ postprocess $ unbox $ replaceUses svg</span></span>
|
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
||||||
<span class="lineno"> 144 </span>
|
<span class="lineno"> 144 </span><span class="spaces"> </span><span class="nottickedoff">svg_data <- B.readFile svg_file</span>
|
||||||
<span class="lineno"> 145 </span>mkTexScript :: String -> [String] -> [Text] -> Text -> Text
|
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="nottickedoff">case parseSvgFile svg_file svg_data of</span>
|
||||||
<span class="lineno"> 146 </span><span class="decl"><span class="nottickedoff">mkTexScript latexExec latexArgs texHeaders tex =</span>
|
<span class="lineno"> 146 </span><span class="spaces"> </span><span class="nottickedoff">Nothing -> error "Malformed svg"</span>
|
||||||
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="nottickedoff">T.unlines</span>
|
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="nottickedoff">Just svg -> return $ postprocess $ unbox $ replaceUses svg</span></span>
|
||||||
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="nottickedoff">$ [ "% " <> T.pack (unwords (latexExec : latexArgs))</span>
|
<span class="lineno"> 148 </span>
|
||||||
<span class="lineno"> 149 </span><span class="spaces"> </span><span class="nottickedoff">, "\\documentclass[preview]{standalone}"</span>
|
<span class="lineno"> 149 </span>mkTexScript :: String -> [String] -> [Text] -> Text -> Text
|
||||||
<span class="lineno"> 150 </span><span class="spaces"> </span><span class="nottickedoff">, "\\usepackage{amsmath}"</span>
|
<span class="lineno"> 150 </span><span class="decl"><span class="nottickedoff">mkTexScript latexExec latexArgs texHeaders tex =</span>
|
||||||
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="nottickedoff">, "\\usepackage{gensymb}"</span>
|
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="nottickedoff">T.unlines</span>
|
||||||
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="nottickedoff">$ [ "% " <> T.pack (unwords (latexExec : latexArgs))</span>
|
||||||
<span class="lineno"> 153 </span><span class="spaces"> </span><span class="nottickedoff">++ texHeaders</span>
|
<span class="lineno"> 153 </span><span class="spaces"> </span><span class="nottickedoff">, "\\documentclass[preview]{standalone}"</span>
|
||||||
<span class="lineno"> 154 </span><span class="spaces"> </span><span class="nottickedoff">++ [ "\\usepackage[english]{babel}"</span>
|
<span class="lineno"> 154 </span><span class="spaces"> </span><span class="nottickedoff">, "\\usepackage{amsmath}"</span>
|
||||||
<span class="lineno"> 155 </span><span class="spaces"> </span><span class="nottickedoff">, "\\linespread{1}"</span>
|
<span class="lineno"> 155 </span><span class="spaces"> </span><span class="nottickedoff">, "\\usepackage{gensymb}"</span>
|
||||||
<span class="lineno"> 156 </span><span class="spaces"> </span><span class="nottickedoff">, "\\begin{document}"</span>
|
<span class="lineno"> 156 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
||||||
<span class="lineno"> 157 </span><span class="spaces"> </span><span class="nottickedoff">, tex</span>
|
<span class="lineno"> 157 </span><span class="spaces"> </span><span class="nottickedoff">++ texHeaders</span>
|
||||||
<span class="lineno"> 158 </span><span class="spaces"> </span><span class="nottickedoff">, "\\end{document}"</span>
|
<span class="lineno"> 158 </span><span class="spaces"> </span><span class="nottickedoff">++ [ "\\usepackage[english]{babel}"</span>
|
||||||
<span class="lineno"> 159 </span><span class="spaces"> </span><span class="nottickedoff">]</span></span>
|
<span class="lineno"> 159 </span><span class="spaces"> </span><span class="nottickedoff">, "\\linespread{1}"</span>
|
||||||
<span class="lineno"> 160 </span>
|
<span class="lineno"> 160 </span><span class="spaces"> </span><span class="nottickedoff">, "\\begin{document}"</span>
|
||||||
<span class="lineno"> 161 </span>{- Packages used by manim.
|
<span class="lineno"> 161 </span><span class="spaces"> </span><span class="nottickedoff">, tex</span>
|
||||||
<span class="lineno"> 162 </span>
|
<span class="lineno"> 162 </span><span class="spaces"> </span><span class="nottickedoff">, "\\end{document}"</span>
|
||||||
<span class="lineno"> 163 </span>\\\usepackage{amsmath}\n\
|
<span class="lineno"> 163 </span><span class="spaces"> </span><span class="nottickedoff">]</span></span>
|
||||||
<span class="lineno"> 164 </span>\\\usepackage{amssymb}\n\
|
<span class="lineno"> 164 </span>
|
||||||
<span class="lineno"> 165 </span>\\\usepackage{dsfont}\n\
|
<span class="lineno"> 165 </span>{- Packages used by manim.
|
||||||
<span class="lineno"> 166 </span>\\\usepackage{setspace}\n\
|
<span class="lineno"> 166 </span>
|
||||||
<span class="lineno"> 167 </span>\\\usepackage{relsize}\n\
|
<span class="lineno"> 167 </span>\\\usepackage{amsmath}\n\
|
||||||
<span class="lineno"> 168 </span>\\\usepackage{textcomp}\n\
|
<span class="lineno"> 168 </span>\\\usepackage{amssymb}\n\
|
||||||
<span class="lineno"> 169 </span>\\\usepackage{mathrsfs}\n\
|
<span class="lineno"> 169 </span>\\\usepackage{dsfont}\n\
|
||||||
<span class="lineno"> 170 </span>\\\usepackage{calligra}\n\
|
<span class="lineno"> 170 </span>\\\usepackage{setspace}\n\
|
||||||
<span class="lineno"> 171 </span>\\\usepackage{wasysym}\n\
|
<span class="lineno"> 171 </span>\\\usepackage{relsize}\n\
|
||||||
<span class="lineno"> 172 </span>\\\usepackage{ragged2e}\n\
|
<span class="lineno"> 172 </span>\\\usepackage{textcomp}\n\
|
||||||
<span class="lineno"> 173 </span>\\\usepackage{physics}\n\
|
<span class="lineno"> 173 </span>\\\usepackage{mathrsfs}\n\
|
||||||
<span class="lineno"> 174 </span>\\\usepackage{xcolor}\n\
|
<span class="lineno"> 174 </span>\\\usepackage{calligra}\n\
|
||||||
<span class="lineno"> 175 </span>\\\usepackage{textcomp}\n\
|
<span class="lineno"> 175 </span>\\\usepackage{wasysym}\n\
|
||||||
<span class="lineno"> 176 </span>\\\usepackage{xfrac}\n\
|
<span class="lineno"> 176 </span>\\\usepackage{ragged2e}\n\
|
||||||
<span class="lineno"> 177 </span>\\\usepackage{microtype}\n\
|
<span class="lineno"> 177 </span>\\\usepackage{physics}\n\
|
||||||
<span class="lineno"> 178 </span>-}
|
<span class="lineno"> 178 </span>\\\usepackage{xcolor}\n\
|
||||||
|
<span class="lineno"> 179 </span>\\\usepackage{textcomp}\n\
|
||||||
|
<span class="lineno"> 180 </span>\\\usepackage{xfrac}\n\
|
||||||
|
<span class="lineno"> 181 </span>\\\usepackage{microtype}\n\
|
||||||
|
<span class="lineno"> 182 </span>-}
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -24,395 +24,413 @@ span.spaces { background: white }
|
||||||
<span class="lineno"> 5 </span>Maintainer : lemmih@gmail.com
|
<span class="lineno"> 5 </span>Maintainer : lemmih@gmail.com
|
||||||
<span class="lineno"> 6 </span>Stability : experimental
|
<span class="lineno"> 6 </span>Stability : experimental
|
||||||
<span class="lineno"> 7 </span>Portability : POSIX
|
<span class="lineno"> 7 </span>Portability : POSIX
|
||||||
<span class="lineno"> 8 </span>-}
|
<span class="lineno"> 8 </span>
|
||||||
<span class="lineno"> 9 </span>module Reanimate.Render
|
<span class="lineno"> 9 </span>Internal tools for rastering SVGs and rendering videos. You are unlikely
|
||||||
<span class="lineno"> 10 </span> ( render
|
<span class="lineno"> 10 </span>to ever directly use the functions in this module.
|
||||||
<span class="lineno"> 11 </span> , renderSvgs
|
<span class="lineno"> 11 </span>
|
||||||
<span class="lineno"> 12 </span> , renderSnippets -- :: Animation -> IO ()
|
<span class="lineno"> 12 </span>-}
|
||||||
<span class="lineno"> 13 </span> , renderOneFrame
|
<span class="lineno"> 13 </span>module Reanimate.Render
|
||||||
<span class="lineno"> 14 </span> , Format(..)
|
<span class="lineno"> 14 </span> ( render
|
||||||
<span class="lineno"> 15 </span> , Raster(..)
|
<span class="lineno"> 15 </span> , renderSvgs
|
||||||
<span class="lineno"> 16 </span> , Width, Height, FPS
|
<span class="lineno"> 16 </span> , renderSnippets -- :: Animation -> IO ()
|
||||||
<span class="lineno"> 17 </span> , requireRaster -- :: Raster -> IO Raster
|
<span class="lineno"> 17 </span> , renderOneFrame
|
||||||
<span class="lineno"> 18 </span> , selectRaster -- :: Raster -> IO Raster
|
<span class="lineno"> 18 </span> , Format(..)
|
||||||
<span class="lineno"> 19 </span> , applyRaster -- :: Raster -> FilePath -> IO ()
|
<span class="lineno"> 19 </span> , Raster(..)
|
||||||
<span class="lineno"> 20 </span> ) where
|
<span class="lineno"> 20 </span> , Width, Height, FPS
|
||||||
<span class="lineno"> 21 </span>
|
<span class="lineno"> 21 </span> , requireRaster -- :: Raster -> IO Raster
|
||||||
<span class="lineno"> 22 </span>import Control.Concurrent
|
<span class="lineno"> 22 </span> , selectRaster -- :: Raster -> IO Raster
|
||||||
<span class="lineno"> 23 </span>import Control.Exception
|
<span class="lineno"> 23 </span> , applyRaster -- :: Raster -> FilePath -> IO ()
|
||||||
<span class="lineno"> 24 </span>import Control.Monad (forM_, forever, unless, void, when)
|
<span class="lineno"> 24 </span> ) where
|
||||||
<span class="lineno"> 25 </span>import Data.Either
|
<span class="lineno"> 25 </span>
|
||||||
<span class="lineno"> 26 </span>import Data.Function
|
<span class="lineno"> 26 </span>import Control.Concurrent
|
||||||
<span class="lineno"> 27 </span>import qualified Data.Text as T
|
<span class="lineno"> 27 </span>import Control.Exception
|
||||||
<span class="lineno"> 28 </span>import qualified Data.Text.IO as T
|
<span class="lineno"> 28 </span>import Control.Monad (forM_, forever, unless, void, when)
|
||||||
<span class="lineno"> 29 </span>import Data.Time
|
<span class="lineno"> 29 </span>import Data.Either
|
||||||
<span class="lineno"> 30 </span>import Graphics.SvgTree (Number (..))
|
<span class="lineno"> 30 </span>import Data.Function
|
||||||
<span class="lineno"> 31 </span>import Numeric
|
<span class="lineno"> 31 </span>import qualified Data.Text as T
|
||||||
<span class="lineno"> 32 </span>import Reanimate.Animation
|
<span class="lineno"> 32 </span>import qualified Data.Text.IO as T
|
||||||
<span class="lineno"> 33 </span>import Reanimate.Driver.Check
|
<span class="lineno"> 33 </span>import Data.Time
|
||||||
<span class="lineno"> 34 </span>import Reanimate.Driver.Magick
|
<span class="lineno"> 34 </span>import Graphics.SvgTree (Number (..))
|
||||||
<span class="lineno"> 35 </span>import Reanimate.Misc
|
<span class="lineno"> 35 </span>import Numeric
|
||||||
<span class="lineno"> 36 </span>import Reanimate.Parameters
|
<span class="lineno"> 36 </span>import Reanimate.Animation
|
||||||
<span class="lineno"> 37 </span>import System.Console.ANSI.Codes
|
<span class="lineno"> 37 </span>import Reanimate.Driver.Check
|
||||||
<span class="lineno"> 38 </span>import System.Exit
|
<span class="lineno"> 38 </span>import Reanimate.Driver.Magick
|
||||||
<span class="lineno"> 39 </span>import System.FileLock (withTryFileLock, SharedExclusive(..), unlockFile)
|
<span class="lineno"> 39 </span>import Reanimate.Misc
|
||||||
<span class="lineno"> 40 </span>import System.Directory
|
<span class="lineno"> 40 </span>import Reanimate.Parameters
|
||||||
<span class="lineno"> 41 </span>import System.FilePath (replaceExtension, (<.>), (</>))
|
<span class="lineno"> 41 </span>import System.Console.ANSI.Codes
|
||||||
<span class="lineno"> 42 </span>import System.IO
|
<span class="lineno"> 42 </span>import System.Exit
|
||||||
<span class="lineno"> 43 </span>import Text.Printf (printf)
|
<span class="lineno"> 43 </span>import System.FileLock (withTryFileLock, SharedExclusive(..), unlockFile)
|
||||||
<span class="lineno"> 44 </span>
|
<span class="lineno"> 44 </span>import System.Directory
|
||||||
<span class="lineno"> 45 </span>idempotentFile :: FilePath -> IO () -> IO ()
|
<span class="lineno"> 45 </span>import System.FilePath (replaceExtension, (<.>), (</>))
|
||||||
<span class="lineno"> 46 </span><span class="decl"><span class="nottickedoff">idempotentFile path action = do</span>
|
<span class="lineno"> 46 </span>import System.IO
|
||||||
<span class="lineno"> 47 </span><span class="spaces"> </span><span class="nottickedoff">_ <- withTryFileLock lockFile Exclusive $ \lock -> do</span>
|
<span class="lineno"> 47 </span>import Text.Printf (printf)
|
||||||
<span class="lineno"> 48 </span><span class="spaces"> </span><span class="nottickedoff">haveFile <- doesFileExist path</span>
|
<span class="lineno"> 48 </span>
|
||||||
<span class="lineno"> 49 </span><span class="spaces"> </span><span class="nottickedoff">unless haveFile action</span>
|
<span class="lineno"> 49 </span>idempotentFile :: FilePath -> IO () -> IO ()
|
||||||
<span class="lineno"> 50 </span><span class="spaces"> </span><span class="nottickedoff">unlockFile lock</span>
|
<span class="lineno"> 50 </span><span class="decl"><span class="nottickedoff">idempotentFile path action = do</span>
|
||||||
<span class="lineno"> 51 </span><span class="spaces"> </span><span class="nottickedoff">_ <- try (removeFile lockFile) :: IO (Either SomeException ())</span>
|
<span class="lineno"> 51 </span><span class="spaces"> </span><span class="nottickedoff">_ <- withTryFileLock lockFile Exclusive $ \lock -> do</span>
|
||||||
<span class="lineno"> 52 </span><span class="spaces"> </span><span class="nottickedoff">return ()</span>
|
<span class="lineno"> 52 </span><span class="spaces"> </span><span class="nottickedoff">haveFile <- doesFileExist path</span>
|
||||||
<span class="lineno"> 53 </span><span class="spaces"> </span><span class="nottickedoff">return ()</span>
|
<span class="lineno"> 53 </span><span class="spaces"> </span><span class="nottickedoff">unless haveFile action</span>
|
||||||
<span class="lineno"> 54 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
<span class="lineno"> 54 </span><span class="spaces"> </span><span class="nottickedoff">unlockFile lock</span>
|
||||||
<span class="lineno"> 55 </span><span class="spaces"> </span><span class="nottickedoff">lockFile = path <.> "lock"</span></span>
|
<span class="lineno"> 55 </span><span class="spaces"> </span><span class="nottickedoff">_ <- try (removeFile lockFile) :: IO (Either SomeException ())</span>
|
||||||
<span class="lineno"> 56 </span>
|
<span class="lineno"> 56 </span><span class="spaces"> </span><span class="nottickedoff">return ()</span>
|
||||||
<span class="lineno"> 57 </span>renderSvgs :: FilePath -> Int -> Bool -> Animation -> IO ()
|
<span class="lineno"> 57 </span><span class="spaces"> </span><span class="nottickedoff">return ()</span>
|
||||||
<span class="lineno"> 58 </span><span class="decl"><span class="nottickedoff">renderSvgs folder offset _prettyPrint ani = do</span>
|
<span class="lineno"> 58 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||||
<span class="lineno"> 59 </span><span class="spaces"> </span><span class="nottickedoff">print frameCount</span>
|
<span class="lineno"> 59 </span><span class="spaces"> </span><span class="nottickedoff">lockFile = path <.> "lock"</span></span>
|
||||||
<span class="lineno"> 60 </span><span class="spaces"> </span><span class="nottickedoff">lock <- newMVar ()</span>
|
<span class="lineno"> 60 </span>
|
||||||
<span class="lineno"> 61 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
<span class="lineno"> 61 </span>-- | Generate SVGs at 60fps and put them in a folder.
|
||||||
<span class="lineno"> 62 </span><span class="spaces"> </span><span class="nottickedoff">handle errHandler $ concurrentForM_ (frameOrder rate frameCount) $ \nth' -> do</span>
|
<span class="lineno"> 62 </span>renderSvgs :: FilePath -> Int -> Bool -> Animation -> IO ()
|
||||||
<span class="lineno"> 63 </span><span class="spaces"> </span><span class="nottickedoff">let nth = (nth'+offset) `mod` frameCount</span>
|
<span class="lineno"> 63 </span><span class="decl"><span class="nottickedoff">renderSvgs folder offset _prettyPrint ani = do</span>
|
||||||
<span class="lineno"> 64 </span><span class="spaces"> </span><span class="nottickedoff">now = (duration ani / (fromIntegral frameCount - 1)) * fromIntegral nth</span>
|
<span class="lineno"> 64 </span><span class="spaces"> </span><span class="nottickedoff">print frameCount</span>
|
||||||
<span class="lineno"> 65 </span><span class="spaces"> </span><span class="nottickedoff">frame = frameAt (if frameCount <= 1 then 0 else now) ani</span>
|
<span class="lineno"> 65 </span><span class="spaces"> </span><span class="nottickedoff">lock <- newMVar ()</span>
|
||||||
<span class="lineno"> 66 </span><span class="spaces"> </span><span class="nottickedoff">svg = renderSvg Nothing Nothing frame</span>
|
<span class="lineno"> 66 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||||
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="nottickedoff">path = folder </> show nth <.> "svg"</span>
|
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="nottickedoff">handle errHandler $ concurrentForM_ (frameOrder rate frameCount) $ \nth' -> do</span>
|
||||||
<span class="lineno"> 68 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="nottickedoff">let nth = (nth'+offset) `mod` frameCount</span>
|
||||||
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="nottickedoff">idempotentFile path $ writeFile path svg</span>
|
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="nottickedoff">now = (duration ani / (fromIntegral frameCount - 1)) * fromIntegral nth</span>
|
||||||
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="nottickedoff">withMVar lock $ \_ -> do</span>
|
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="nottickedoff">frame = frameAt (if frameCount <= 1 then 0 else now) ani</span>
|
||||||
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="nottickedoff">print nth</span>
|
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="nottickedoff">svg = renderSvg Nothing Nothing frame</span>
|
||||||
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="nottickedoff">hFlush stdout</span>
|
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="nottickedoff">path = folder </> show nth <.> "svg"</span>
|
||||||
<span class="lineno"> 73 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
<span class="lineno"> 73 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||||
<span class="lineno"> 74 </span><span class="spaces"> </span><span class="nottickedoff">rate = 60</span>
|
<span class="lineno"> 74 </span><span class="spaces"> </span><span class="nottickedoff">idempotentFile path $ writeFile path svg</span>
|
||||||
<span class="lineno"> 75 </span><span class="spaces"> </span><span class="nottickedoff">frameCount = round (duration ani * fromIntegral rate) :: Int</span>
|
<span class="lineno"> 75 </span><span class="spaces"> </span><span class="nottickedoff">withMVar lock $ \_ -> do</span>
|
||||||
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="nottickedoff">errHandler (ErrorCall msg) = do</span>
|
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="nottickedoff">print nth</span>
|
||||||
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn stderr msg</span>
|
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="nottickedoff">hFlush stdout</span>
|
||||||
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="nottickedoff">exitWith (ExitFailure 1)</span></span>
|
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||||
<span class="lineno"> 79 </span>
|
<span class="lineno"> 79 </span><span class="spaces"> </span><span class="nottickedoff">rate = 60</span>
|
||||||
<span class="lineno"> 80 </span>renderOneFrame :: FilePath -> Int -> Bool -> Int -> Animation -> IO ()
|
<span class="lineno"> 80 </span><span class="spaces"> </span><span class="nottickedoff">frameCount = round (duration ani * fromIntegral rate) :: Int</span>
|
||||||
<span class="lineno"> 81 </span><span class="decl"><span class="nottickedoff">renderOneFrame folder offset _prettyPrint rate ani =</span>
|
<span class="lineno"> 81 </span><span class="spaces"> </span><span class="nottickedoff">errHandler (ErrorCall msg) = do</span>
|
||||||
<span class="lineno"> 82 </span><span class="spaces"> </span><span class="nottickedoff">worker (frameOrder rate frameCount)</span>
|
<span class="lineno"> 82 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn stderr msg</span>
|
||||||
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">exitWith (ExitFailure 1)</span></span>
|
||||||
<span class="lineno"> 84 </span><span class="spaces"> </span><span class="nottickedoff">worker [] = putStrLn "Done"</span>
|
<span class="lineno"> 84 </span>
|
||||||
<span class="lineno"> 85 </span><span class="spaces"> </span><span class="nottickedoff">worker (x:xs) = do</span>
|
<span class="lineno"> 85 </span>-- | Select a single frame that doesn't already exist in the output
|
||||||
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="nottickedoff">let nth = (x+offset) `mod` frameCount</span>
|
<span class="lineno"> 86 </span>-- folder and render it. If all frames have been rendered, print "Done".
|
||||||
<span class="lineno"> 87 </span><span class="spaces"> </span><span class="nottickedoff">now = (duration ani / (fromIntegral frameCount - 1)) * fromIntegral nth</span>
|
<span class="lineno"> 87 </span>renderOneFrame :: FilePath -> Int -> Bool -> Int -> Animation -> IO ()
|
||||||
<span class="lineno"> 88 </span><span class="spaces"> </span><span class="nottickedoff">frame = frameAt (if frameCount <= 1 then 0 else now) ani</span>
|
<span class="lineno"> 88 </span><span class="decl"><span class="nottickedoff">renderOneFrame folder offset _prettyPrint rate ani =</span>
|
||||||
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="nottickedoff">svg = renderSvg Nothing Nothing frame</span>
|
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="nottickedoff">worker (frameOrder rate frameCount)</span>
|
||||||
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="nottickedoff">path = folder </> show nth <.> "svg"</span>
|
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||||
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="nottickedoff">tmpPath = path <.> "tmp"</span>
|
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="nottickedoff">worker [] = putStrLn "Done"</span>
|
||||||
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="nottickedoff">haveFile <- doesFileExist path</span>
|
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="nottickedoff">worker (x:xs) = do</span>
|
||||||
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="nottickedoff">if haveFile</span>
|
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="nottickedoff">let nth = (x+offset) `mod` frameCount</span>
|
||||||
<span class="lineno"> 94 </span><span class="spaces"> </span><span class="nottickedoff">then worker xs</span>
|
<span class="lineno"> 94 </span><span class="spaces"> </span><span class="nottickedoff">now = (duration ani / (fromIntegral frameCount - 1)) * fromIntegral nth</span>
|
||||||
<span class="lineno"> 95 </span><span class="spaces"> </span><span class="nottickedoff">else do</span>
|
<span class="lineno"> 95 </span><span class="spaces"> </span><span class="nottickedoff">frame = frameAt (if frameCount <= 1 then 0 else now) ani</span>
|
||||||
<span class="lineno"> 96 </span><span class="spaces"> </span><span class="nottickedoff">writeFile tmpPath svg</span>
|
<span class="lineno"> 96 </span><span class="spaces"> </span><span class="nottickedoff">svg = renderSvg Nothing Nothing frame</span>
|
||||||
<span class="lineno"> 97 </span><span class="spaces"> </span><span class="nottickedoff">renameOrCopyFile tmpPath path</span>
|
<span class="lineno"> 97 </span><span class="spaces"> </span><span class="nottickedoff">path = folder </> show nth <.> "svg"</span>
|
||||||
<span class="lineno"> 98 </span><span class="spaces"> </span><span class="nottickedoff">print nth</span>
|
<span class="lineno"> 98 </span><span class="spaces"> </span><span class="nottickedoff">tmpPath = path <.> "tmp"</span>
|
||||||
<span class="lineno"> 99 </span><span class="spaces"> </span><span class="nottickedoff">frameCount = round (duration ani * fromIntegral rate) :: Int</span></span>
|
<span class="lineno"> 99 </span><span class="spaces"> </span><span class="nottickedoff">haveFile <- doesFileExist path</span>
|
||||||
<span class="lineno"> 100 </span>
|
<span class="lineno"> 100 </span><span class="spaces"> </span><span class="nottickedoff">if haveFile</span>
|
||||||
<span class="lineno"> 101 </span>-- XXX: Merge with 'renderSvgs'
|
<span class="lineno"> 101 </span><span class="spaces"> </span><span class="nottickedoff">then worker xs</span>
|
||||||
<span class="lineno"> 102 </span>renderSnippets :: Animation -> IO ()
|
<span class="lineno"> 102 </span><span class="spaces"> </span><span class="nottickedoff">else do</span>
|
||||||
<span class="lineno"> 103 </span><span class="decl"><span class="istickedoff">renderSnippets ani = forM_ [0 .. frameCount - 1] $ \nth -> do</span>
|
<span class="lineno"> 103 </span><span class="spaces"> </span><span class="nottickedoff">writeFile tmpPath svg</span>
|
||||||
<span class="lineno"> 104 </span><span class="spaces"> </span><span class="istickedoff">let now = (duration ani / (fromIntegral frameCount - 1)) * fromIntegral nth</span>
|
<span class="lineno"> 104 </span><span class="spaces"> </span><span class="nottickedoff">renameOrCopyFile tmpPath path</span>
|
||||||
<span class="lineno"> 105 </span><span class="spaces"> </span><span class="istickedoff">frame = frameAt now ani</span>
|
<span class="lineno"> 105 </span><span class="spaces"> </span><span class="nottickedoff">print nth</span>
|
||||||
<span class="lineno"> 106 </span><span class="spaces"> </span><span class="istickedoff">svg = renderSvg Nothing Nothing frame</span>
|
<span class="lineno"> 106 </span><span class="spaces"> </span><span class="nottickedoff">frameCount = round (duration ani * fromIntegral rate) :: Int</span></span>
|
||||||
<span class="lineno"> 107 </span><span class="spaces"> </span><span class="istickedoff">putStr (show nth)</span>
|
<span class="lineno"> 107 </span>
|
||||||
<span class="lineno"> 108 </span><span class="spaces"> </span><span class="istickedoff">T.putStrLn $ T.concat . T.lines . T.pack $ svg</span>
|
<span class="lineno"> 108 </span>-- XXX: Merge with 'renderSvgs'
|
||||||
<span class="lineno"> 109 </span><span class="spaces"> </span><span class="istickedoff">where frameCount = 10 :: Integer</span></span>
|
<span class="lineno"> 109 </span>-- | Render 10 frames and print them to stdout. Used for testing.
|
||||||
<span class="lineno"> 110 </span>
|
<span class="lineno"> 110 </span>--
|
||||||
<span class="lineno"> 111 </span>frameOrder :: Int -> Int -> [Int]
|
<span class="lineno"> 111 </span>-- XXX: Not related to the snippets in the playground.
|
||||||
<span class="lineno"> 112 </span><span class="decl"><span class="nottickedoff">frameOrder fps nFrames = worker [] fps</span>
|
<span class="lineno"> 112 </span>renderSnippets :: Animation -> IO ()
|
||||||
<span class="lineno"> 113 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
<span class="lineno"> 113 </span><span class="decl"><span class="istickedoff">renderSnippets ani = forM_ [0 .. frameCount - 1] $ \nth -> do</span>
|
||||||
<span class="lineno"> 114 </span><span class="spaces"> </span><span class="nottickedoff">worker _seen 0 = []</span>
|
<span class="lineno"> 114 </span><span class="spaces"> </span><span class="istickedoff">let now = (duration ani / (fromIntegral frameCount - 1)) * fromIntegral nth</span>
|
||||||
<span class="lineno"> 115 </span><span class="spaces"> </span><span class="nottickedoff">worker seen nthFrame = filterFrameList seen nthFrame nFrames</span>
|
<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff">frame = frameAt now ani</span>
|
||||||
<span class="lineno"> 116 </span><span class="spaces"> </span><span class="nottickedoff">++ worker (nthFrame : seen) (nthFrame `div` 2)</span></span>
|
<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff">svg = renderSvg Nothing Nothing frame</span>
|
||||||
<span class="lineno"> 117 </span>
|
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="istickedoff">putStr (show nth)</span>
|
||||||
<span class="lineno"> 118 </span>filterFrameList :: [Int] -> Int -> Int -> [Int]
|
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="istickedoff">T.putStrLn $ T.concat . T.lines . T.pack $ svg</span>
|
||||||
<span class="lineno"> 119 </span><span class="decl"><span class="nottickedoff">filterFrameList seen nthFrame nFrames = filter (not . isSeen)</span>
|
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="istickedoff">where frameCount = 10 :: Integer</span></span>
|
||||||
<span class="lineno"> 120 </span><span class="spaces"> </span><span class="nottickedoff">[0, nthFrame .. nFrames - 1]</span>
|
<span class="lineno"> 120 </span>
|
||||||
<span class="lineno"> 121 </span><span class="spaces"> </span><span class="nottickedoff">where isSeen x = any (\y -> x `mod` y == 0) seen</span></span>
|
<span class="lineno"> 121 </span>frameOrder :: Int -> Int -> [Int]
|
||||||
<span class="lineno"> 122 </span>
|
<span class="lineno"> 122 </span><span class="decl"><span class="nottickedoff">frameOrder fps nFrames = worker [] fps</span>
|
||||||
<span class="lineno"> 123 </span>data Format = RenderMp4 | RenderGif | RenderWebm
|
<span class="lineno"> 123 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||||
<span class="lineno"> 124 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>)
|
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="nottickedoff">worker _seen 0 = []</span>
|
||||||
<span class="lineno"> 125 </span>
|
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="nottickedoff">worker seen nthFrame = filterFrameList seen nthFrame nFrames</span>
|
||||||
<span class="lineno"> 126 </span>mp4Arguments :: FPS -> FilePath -> FilePath -> FilePath -> [String]
|
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="nottickedoff">++ worker (nthFrame : seen) (nthFrame `div` 2)</span></span>
|
||||||
<span class="lineno"> 127 </span><span class="decl"><span class="nottickedoff">mp4Arguments fps progress template target =</span>
|
<span class="lineno"> 127 </span>
|
||||||
<span class="lineno"> 128 </span><span class="spaces"> </span><span class="nottickedoff">[ "-r"</span>
|
<span class="lineno"> 128 </span>filterFrameList :: [Int] -> Int -> Int -> [Int]
|
||||||
<span class="lineno"> 129 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span>
|
<span class="lineno"> 129 </span><span class="decl"><span class="nottickedoff">filterFrameList seen nthFrame nFrames = filter (not . isSeen)</span>
|
||||||
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="nottickedoff">, "-i"</span>
|
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="nottickedoff">[0, nthFrame .. nFrames - 1]</span>
|
||||||
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
|
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="nottickedoff">where isSeen x = any (\y -> x `mod` y == 0) seen</span></span>
|
||||||
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="nottickedoff">, "-y"</span>
|
<span class="lineno"> 132 </span>
|
||||||
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="nottickedoff">, "-c:v"</span>
|
<span class="lineno"> 133 </span>-- | Video formats supported by reanimate.
|
||||||
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="nottickedoff">, "libx264"</span>
|
<span class="lineno"> 134 </span>data Format = RenderMp4 | RenderGif | RenderWebm
|
||||||
<span class="lineno"> 135 </span><span class="spaces"> </span><span class="nottickedoff">, "-vf"</span>
|
<span class="lineno"> 135 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>)
|
||||||
<span class="lineno"> 136 </span><span class="spaces"> </span><span class="nottickedoff">, "fps=" ++ show fps</span>
|
<span class="lineno"> 136 </span>
|
||||||
<span class="lineno"> 137 </span><span class="spaces"> </span><span class="nottickedoff">, "-preset"</span>
|
<span class="lineno"> 137 </span>mp4Arguments :: FPS -> FilePath -> FilePath -> FilePath -> [String]
|
||||||
<span class="lineno"> 138 </span><span class="spaces"> </span><span class="nottickedoff">, "slow"</span>
|
<span class="lineno"> 138 </span><span class="decl"><span class="nottickedoff">mp4Arguments fps progress template target =</span>
|
||||||
<span class="lineno"> 139 </span><span class="spaces"> </span><span class="nottickedoff">, "-crf"</span>
|
<span class="lineno"> 139 </span><span class="spaces"> </span><span class="nottickedoff">[ "-r"</span>
|
||||||
<span class="lineno"> 140 </span><span class="spaces"> </span><span class="nottickedoff">, "18"</span>
|
<span class="lineno"> 140 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span>
|
||||||
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="nottickedoff">, "-movflags"</span>
|
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="nottickedoff">, "-i"</span>
|
||||||
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="nottickedoff">, "+faststart"</span>
|
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
|
||||||
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="nottickedoff">, "-progress"</span>
|
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="nottickedoff">, "-y"</span>
|
||||||
<span class="lineno"> 144 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span>
|
<span class="lineno"> 144 </span><span class="spaces"> </span><span class="nottickedoff">, "-c:v"</span>
|
||||||
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="nottickedoff">, "-pix_fmt"</span>
|
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="nottickedoff">, "libx264"</span>
|
||||||
<span class="lineno"> 146 </span><span class="spaces"> </span><span class="nottickedoff">, "yuv420p"</span>
|
<span class="lineno"> 146 </span><span class="spaces"> </span><span class="nottickedoff">, "-vf"</span>
|
||||||
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="nottickedoff">, target</span>
|
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="nottickedoff">, "fps=" ++ show fps</span>
|
||||||
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="nottickedoff">]</span></span>
|
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="nottickedoff">, "-preset"</span>
|
||||||
<span class="lineno"> 149 </span>
|
<span class="lineno"> 149 </span><span class="spaces"> </span><span class="nottickedoff">, "slow"</span>
|
||||||
<span class="lineno"> 150 </span>-- gifArguments :: FPS -> FilePath -> FilePath -> FilePath -> [String]
|
<span class="lineno"> 150 </span><span class="spaces"> </span><span class="nottickedoff">, "-crf"</span>
|
||||||
<span class="lineno"> 151 </span>-- gifArguments fps progress template target =
|
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="nottickedoff">, "18"</span>
|
||||||
<span class="lineno"> 152 </span>
|
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="nottickedoff">, "-movflags"</span>
|
||||||
<span class="lineno"> 153 </span>render
|
<span class="lineno"> 153 </span><span class="spaces"> </span><span class="nottickedoff">, "+faststart"</span>
|
||||||
<span class="lineno"> 154 </span> :: Animation
|
<span class="lineno"> 154 </span><span class="spaces"> </span><span class="nottickedoff">, "-progress"</span>
|
||||||
<span class="lineno"> 155 </span> -> FilePath
|
<span class="lineno"> 155 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span>
|
||||||
<span class="lineno"> 156 </span> -> Raster
|
<span class="lineno"> 156 </span><span class="spaces"> </span><span class="nottickedoff">, "-pix_fmt"</span>
|
||||||
<span class="lineno"> 157 </span> -> Format
|
<span class="lineno"> 157 </span><span class="spaces"> </span><span class="nottickedoff">, "yuv420p"</span>
|
||||||
<span class="lineno"> 158 </span> -> Width
|
<span class="lineno"> 158 </span><span class="spaces"> </span><span class="nottickedoff">, target</span>
|
||||||
<span class="lineno"> 159 </span> -> Height
|
<span class="lineno"> 159 </span><span class="spaces"> </span><span class="nottickedoff">]</span></span>
|
||||||
<span class="lineno"> 160 </span> -> FPS
|
<span class="lineno"> 160 </span>
|
||||||
<span class="lineno"> 161 </span> -> Bool
|
<span class="lineno"> 161 </span>-- gifArguments :: FPS -> FilePath -> FilePath -> FilePath -> [String]
|
||||||
<span class="lineno"> 162 </span> -> IO ()
|
<span class="lineno"> 162 </span>-- gifArguments fps progress template target =
|
||||||
<span class="lineno"> 163 </span><span class="decl"><span class="nottickedoff">render ani target raster format width height fps partial = do</span>
|
<span class="lineno"> 163 </span>
|
||||||
<span class="lineno"> 164 </span><span class="spaces"> </span><span class="nottickedoff">printf "Starting render of animation: %.1f\n" (duration ani)</span>
|
<span class="lineno"> 164 </span>-- | Render animation to a video file with given parameters.
|
||||||
<span class="lineno"> 165 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg <- requireExecutable "ffmpeg"</span>
|
<span class="lineno"> 165 </span>render
|
||||||
<span class="lineno"> 166 </span><span class="spaces"> </span><span class="nottickedoff">generateFrames raster ani width height fps partial $ \template -></span>
|
<span class="lineno"> 166 </span> :: Animation
|
||||||
<span class="lineno"> 167 </span><span class="spaces"> </span><span class="nottickedoff">withTempFile "txt" $ \progress -> do</span>
|
<span class="lineno"> 167 </span> -> FilePath
|
||||||
<span class="lineno"> 168 </span><span class="spaces"> </span><span class="nottickedoff">writeFile progress ""</span>
|
<span class="lineno"> 168 </span> -> Raster
|
||||||
<span class="lineno"> 169 </span><span class="spaces"> </span><span class="nottickedoff">progressH <- openFile progress ReadMode</span>
|
<span class="lineno"> 169 </span> -> Format
|
||||||
<span class="lineno"> 170 </span><span class="spaces"> </span><span class="nottickedoff">hSetBuffering progressH NoBuffering</span>
|
<span class="lineno"> 170 </span> -> Width
|
||||||
<span class="lineno"> 171 </span><span class="spaces"> </span><span class="nottickedoff">allFinished <- newEmptyMVar</span>
|
<span class="lineno"> 171 </span> -> Height
|
||||||
<span class="lineno"> 172 </span><span class="spaces"> </span><span class="nottickedoff">void $ forkIO $ do</span>
|
<span class="lineno"> 172 </span> -> FPS
|
||||||
<span class="lineno"> 173 </span><span class="spaces"> </span><span class="nottickedoff">progressPrinter "rendered" (animationFrameCount ani fps)</span>
|
<span class="lineno"> 173 </span> -> Bool
|
||||||
<span class="lineno"> 174 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -> fix $ \loop -> do</span>
|
<span class="lineno"> 174 </span> -> IO ()
|
||||||
<span class="lineno"> 175 </span><span class="spaces"> </span><span class="nottickedoff">eof <- hIsEOF progressH</span>
|
<span class="lineno"> 175 </span><span class="decl"><span class="nottickedoff">render ani target raster format width height fps partial = do</span>
|
||||||
<span class="lineno"> 176 </span><span class="spaces"> </span><span class="nottickedoff">if eof</span>
|
<span class="lineno"> 176 </span><span class="spaces"> </span><span class="nottickedoff">printf "Starting render of animation: %.1f\n" (duration ani)</span>
|
||||||
<span class="lineno"> 177 </span><span class="spaces"> </span><span class="nottickedoff">then threadDelay 1000000 >> loop</span>
|
<span class="lineno"> 177 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg <- requireExecutable "ffmpeg"</span>
|
||||||
<span class="lineno"> 178 </span><span class="spaces"> </span><span class="nottickedoff">else do</span>
|
<span class="lineno"> 178 </span><span class="spaces"> </span><span class="nottickedoff">generateFrames raster ani width height fps partial $ \template -></span>
|
||||||
<span class="lineno"> 179 </span><span class="spaces"> </span><span class="nottickedoff">l <- try (hGetLine progressH)</span>
|
<span class="lineno"> 179 </span><span class="spaces"> </span><span class="nottickedoff">withTempFile "txt" $ \progress -> do</span>
|
||||||
<span class="lineno"> 180 </span><span class="spaces"> </span><span class="nottickedoff">case l of</span>
|
<span class="lineno"> 180 </span><span class="spaces"> </span><span class="nottickedoff">writeFile progress ""</span>
|
||||||
<span class="lineno"> 181 </span><span class="spaces"> </span><span class="nottickedoff">Left SomeException{} -> return ()</span>
|
<span class="lineno"> 181 </span><span class="spaces"> </span><span class="nottickedoff">progressH <- openFile progress ReadMode</span>
|
||||||
<span class="lineno"> 182 </span><span class="spaces"> </span><span class="nottickedoff">Right str -></span>
|
<span class="lineno"> 182 </span><span class="spaces"> </span><span class="nottickedoff">hSetBuffering progressH NoBuffering</span>
|
||||||
<span class="lineno"> 183 </span><span class="spaces"> </span><span class="nottickedoff">case take 6 str of</span>
|
<span class="lineno"> 183 </span><span class="spaces"> </span><span class="nottickedoff">allFinished <- newEmptyMVar</span>
|
||||||
<span class="lineno"> 184 </span><span class="spaces"> </span><span class="nottickedoff">"frame=" -> do</span>
|
<span class="lineno"> 184 </span><span class="spaces"> </span><span class="nottickedoff">void $ forkIO $ do</span>
|
||||||
<span class="lineno"> 185 </span><span class="spaces"> </span><span class="nottickedoff">void $ swapMVar done (read (drop 6 str))</span>
|
<span class="lineno"> 185 </span><span class="spaces"> </span><span class="nottickedoff">progressPrinter "rendered" (animationFrameCount ani fps)</span>
|
||||||
<span class="lineno"> 186 </span><span class="spaces"> </span><span class="nottickedoff">loop</span>
|
<span class="lineno"> 186 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -> fix $ \loop -> do</span>
|
||||||
<span class="lineno"> 187 </span><span class="spaces"> </span><span class="nottickedoff">_ | str == "progress=end" -> return ()</span>
|
<span class="lineno"> 187 </span><span class="spaces"> </span><span class="nottickedoff">eof <- hIsEOF progressH</span>
|
||||||
<span class="lineno"> 188 </span><span class="spaces"> </span><span class="nottickedoff">_ -> loop</span>
|
<span class="lineno"> 188 </span><span class="spaces"> </span><span class="nottickedoff">if eof</span>
|
||||||
<span class="lineno"> 189 </span><span class="spaces"> </span><span class="nottickedoff">putMVar allFinished ()</span>
|
<span class="lineno"> 189 </span><span class="spaces"> </span><span class="nottickedoff">then threadDelay 1000000 >> loop</span>
|
||||||
<span class="lineno"> 190 </span><span class="spaces"> </span><span class="nottickedoff">case format of</span>
|
<span class="lineno"> 190 </span><span class="spaces"> </span><span class="nottickedoff">else do</span>
|
||||||
<span class="lineno"> 191 </span><span class="spaces"> </span><span class="nottickedoff">RenderMp4 -> runCmd ffmpeg (mp4Arguments fps progress template target)</span>
|
<span class="lineno"> 191 </span><span class="spaces"> </span><span class="nottickedoff">l <- try (hGetLine progressH)</span>
|
||||||
<span class="lineno"> 192 </span><span class="spaces"> </span><span class="nottickedoff">RenderGif -> withTempFile "png" $ \palette -> do</span>
|
<span class="lineno"> 192 </span><span class="spaces"> </span><span class="nottickedoff">case l of</span>
|
||||||
<span class="lineno"> 193 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
|
<span class="lineno"> 193 </span><span class="spaces"> </span><span class="nottickedoff">Left SomeException{} -> return ()</span>
|
||||||
<span class="lineno"> 194 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span>
|
<span class="lineno"> 194 </span><span class="spaces"> </span><span class="nottickedoff">Right str -></span>
|
||||||
<span class="lineno"> 195 </span><span class="spaces"> </span><span class="nottickedoff">[ "-i"</span>
|
<span class="lineno"> 195 </span><span class="spaces"> </span><span class="nottickedoff">case take 6 str of</span>
|
||||||
<span class="lineno"> 196 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
|
<span class="lineno"> 196 </span><span class="spaces"> </span><span class="nottickedoff">"frame=" -> do</span>
|
||||||
<span class="lineno"> 197 </span><span class="spaces"> </span><span class="nottickedoff">, "-y"</span>
|
<span class="lineno"> 197 </span><span class="spaces"> </span><span class="nottickedoff">void $ swapMVar done (read (drop 6 str))</span>
|
||||||
<span class="lineno"> 198 </span><span class="spaces"> </span><span class="nottickedoff">, "-vf"</span>
|
<span class="lineno"> 198 </span><span class="spaces"> </span><span class="nottickedoff">loop</span>
|
||||||
<span class="lineno"> 199 </span><span class="spaces"> </span><span class="nottickedoff">, "fps="</span>
|
<span class="lineno"> 199 </span><span class="spaces"> </span><span class="nottickedoff">_ | str == "progress=end" -> return ()</span>
|
||||||
<span class="lineno"> 200 </span><span class="spaces"> </span><span class="nottickedoff">++ show fps</span>
|
<span class="lineno"> 200 </span><span class="spaces"> </span><span class="nottickedoff">_ -> loop</span>
|
||||||
<span class="lineno"> 201 </span><span class="spaces"> </span><span class="nottickedoff">++ ",scale="</span>
|
<span class="lineno"> 201 </span><span class="spaces"> </span><span class="nottickedoff">putMVar allFinished ()</span>
|
||||||
<span class="lineno"> 202 </span><span class="spaces"> </span><span class="nottickedoff">++ show width</span>
|
<span class="lineno"> 202 </span><span class="spaces"> </span><span class="nottickedoff">case format of</span>
|
||||||
<span class="lineno"> 203 </span><span class="spaces"> </span><span class="nottickedoff">++ ":"</span>
|
<span class="lineno"> 203 </span><span class="spaces"> </span><span class="nottickedoff">RenderMp4 -> runCmd ffmpeg (mp4Arguments fps progress template target)</span>
|
||||||
<span class="lineno"> 204 </span><span class="spaces"> </span><span class="nottickedoff">++ show height</span>
|
<span class="lineno"> 204 </span><span class="spaces"> </span><span class="nottickedoff">RenderGif -> withTempFile "png" $ \palette -> do</span>
|
||||||
<span class="lineno"> 205 </span><span class="spaces"> </span><span class="nottickedoff">++ ":flags=lanczos,palettegen"</span>
|
<span class="lineno"> 205 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
|
||||||
<span class="lineno"> 206 </span><span class="spaces"> </span><span class="nottickedoff">, "-t"</span>
|
<span class="lineno"> 206 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span>
|
||||||
<span class="lineno"> 207 </span><span class="spaces"> </span><span class="nottickedoff">, showFFloat Nothing (duration ani) ""</span>
|
<span class="lineno"> 207 </span><span class="spaces"> </span><span class="nottickedoff">[ "-i"</span>
|
||||||
<span class="lineno"> 208 </span><span class="spaces"> </span><span class="nottickedoff">, palette</span>
|
<span class="lineno"> 208 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
|
||||||
<span class="lineno"> 209 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
<span class="lineno"> 209 </span><span class="spaces"> </span><span class="nottickedoff">, "-y"</span>
|
||||||
<span class="lineno"> 210 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
|
<span class="lineno"> 210 </span><span class="spaces"> </span><span class="nottickedoff">, "-vf"</span>
|
||||||
<span class="lineno"> 211 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span>
|
<span class="lineno"> 211 </span><span class="spaces"> </span><span class="nottickedoff">, "fps="</span>
|
||||||
<span class="lineno"> 212 </span><span class="spaces"> </span><span class="nottickedoff">[ "-framerate"</span>
|
<span class="lineno"> 212 </span><span class="spaces"> </span><span class="nottickedoff">++ show fps</span>
|
||||||
<span class="lineno"> 213 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span>
|
<span class="lineno"> 213 </span><span class="spaces"> </span><span class="nottickedoff">++ ",scale="</span>
|
||||||
<span class="lineno"> 214 </span><span class="spaces"> </span><span class="nottickedoff">, "-i"</span>
|
<span class="lineno"> 214 </span><span class="spaces"> </span><span class="nottickedoff">++ show width</span>
|
||||||
<span class="lineno"> 215 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
|
<span class="lineno"> 215 </span><span class="spaces"> </span><span class="nottickedoff">++ ":"</span>
|
||||||
<span class="lineno"> 216 </span><span class="spaces"> </span><span class="nottickedoff">, "-y"</span>
|
<span class="lineno"> 216 </span><span class="spaces"> </span><span class="nottickedoff">++ show height</span>
|
||||||
<span class="lineno"> 217 </span><span class="spaces"> </span><span class="nottickedoff">, "-i"</span>
|
<span class="lineno"> 217 </span><span class="spaces"> </span><span class="nottickedoff">++ ":flags=lanczos,palettegen"</span>
|
||||||
<span class="lineno"> 218 </span><span class="spaces"> </span><span class="nottickedoff">, palette</span>
|
<span class="lineno"> 218 </span><span class="spaces"> </span><span class="nottickedoff">, "-t"</span>
|
||||||
<span class="lineno"> 219 </span><span class="spaces"> </span><span class="nottickedoff">, "-progress"</span>
|
<span class="lineno"> 219 </span><span class="spaces"> </span><span class="nottickedoff">, showFFloat Nothing (duration ani) ""</span>
|
||||||
<span class="lineno"> 220 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span>
|
<span class="lineno"> 220 </span><span class="spaces"> </span><span class="nottickedoff">, palette</span>
|
||||||
<span class="lineno"> 221 </span><span class="spaces"> </span><span class="nottickedoff">, "-filter_complex"</span>
|
<span class="lineno"> 221 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
||||||
<span class="lineno"> 222 </span><span class="spaces"> </span><span class="nottickedoff">, "fps="</span>
|
<span class="lineno"> 222 </span><span class="spaces"> </span><span class="nottickedoff">runCmd</span>
|
||||||
<span class="lineno"> 223 </span><span class="spaces"> </span><span class="nottickedoff">++ show fps</span>
|
<span class="lineno"> 223 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span>
|
||||||
<span class="lineno"> 224 </span><span class="spaces"> </span><span class="nottickedoff">++ ",scale="</span>
|
<span class="lineno"> 224 </span><span class="spaces"> </span><span class="nottickedoff">[ "-framerate"</span>
|
||||||
<span class="lineno"> 225 </span><span class="spaces"> </span><span class="nottickedoff">++ show width</span>
|
<span class="lineno"> 225 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span>
|
||||||
<span class="lineno"> 226 </span><span class="spaces"> </span><span class="nottickedoff">++ ":"</span>
|
<span class="lineno"> 226 </span><span class="spaces"> </span><span class="nottickedoff">, "-i"</span>
|
||||||
<span class="lineno"> 227 </span><span class="spaces"> </span><span class="nottickedoff">++ show height</span>
|
<span class="lineno"> 227 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
|
||||||
<span class="lineno"> 228 </span><span class="spaces"> </span><span class="nottickedoff">++ ":flags=lanczos[x];[x][1:v]paletteuse"</span>
|
<span class="lineno"> 228 </span><span class="spaces"> </span><span class="nottickedoff">, "-y"</span>
|
||||||
<span class="lineno"> 229 </span><span class="spaces"> </span><span class="nottickedoff">, "-t"</span>
|
<span class="lineno"> 229 </span><span class="spaces"> </span><span class="nottickedoff">, "-i"</span>
|
||||||
<span class="lineno"> 230 </span><span class="spaces"> </span><span class="nottickedoff">, showFFloat Nothing (duration ani) ""</span>
|
<span class="lineno"> 230 </span><span class="spaces"> </span><span class="nottickedoff">, palette</span>
|
||||||
<span class="lineno"> 231 </span><span class="spaces"> </span><span class="nottickedoff">, target</span>
|
<span class="lineno"> 231 </span><span class="spaces"> </span><span class="nottickedoff">, "-progress"</span>
|
||||||
<span class="lineno"> 232 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
<span class="lineno"> 232 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span>
|
||||||
<span class="lineno"> 233 </span><span class="spaces"> </span><span class="nottickedoff">RenderWebm -> runCmd</span>
|
<span class="lineno"> 233 </span><span class="spaces"> </span><span class="nottickedoff">, "-filter_complex"</span>
|
||||||
<span class="lineno"> 234 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span>
|
<span class="lineno"> 234 </span><span class="spaces"> </span><span class="nottickedoff">, "fps="</span>
|
||||||
<span class="lineno"> 235 </span><span class="spaces"> </span><span class="nottickedoff">[ "-r"</span>
|
<span class="lineno"> 235 </span><span class="spaces"> </span><span class="nottickedoff">++ show fps</span>
|
||||||
<span class="lineno"> 236 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span>
|
<span class="lineno"> 236 </span><span class="spaces"> </span><span class="nottickedoff">++ ",scale="</span>
|
||||||
<span class="lineno"> 237 </span><span class="spaces"> </span><span class="nottickedoff">, "-i"</span>
|
<span class="lineno"> 237 </span><span class="spaces"> </span><span class="nottickedoff">++ show width</span>
|
||||||
<span class="lineno"> 238 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
|
<span class="lineno"> 238 </span><span class="spaces"> </span><span class="nottickedoff">++ ":"</span>
|
||||||
<span class="lineno"> 239 </span><span class="spaces"> </span><span class="nottickedoff">, "-y"</span>
|
<span class="lineno"> 239 </span><span class="spaces"> </span><span class="nottickedoff">++ show height</span>
|
||||||
<span class="lineno"> 240 </span><span class="spaces"> </span><span class="nottickedoff">, "-progress"</span>
|
<span class="lineno"> 240 </span><span class="spaces"> </span><span class="nottickedoff">++ ":flags=lanczos[x];[x][1:v]paletteuse"</span>
|
||||||
<span class="lineno"> 241 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span>
|
<span class="lineno"> 241 </span><span class="spaces"> </span><span class="nottickedoff">, "-t"</span>
|
||||||
<span class="lineno"> 242 </span><span class="spaces"> </span><span class="nottickedoff">, "-c:v"</span>
|
<span class="lineno"> 242 </span><span class="spaces"> </span><span class="nottickedoff">, showFFloat Nothing (duration ani) ""</span>
|
||||||
<span class="lineno"> 243 </span><span class="spaces"> </span><span class="nottickedoff">, "libvpx-vp9"</span>
|
<span class="lineno"> 243 </span><span class="spaces"> </span><span class="nottickedoff">, target</span>
|
||||||
<span class="lineno"> 244 </span><span class="spaces"> </span><span class="nottickedoff">, "-vf"</span>
|
<span class="lineno"> 244 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
||||||
<span class="lineno"> 245 </span><span class="spaces"> </span><span class="nottickedoff">, "fps=" ++ show fps</span>
|
<span class="lineno"> 245 </span><span class="spaces"> </span><span class="nottickedoff">RenderWebm -> runCmd</span>
|
||||||
<span class="lineno"> 246 </span><span class="spaces"> </span><span class="nottickedoff">, target</span>
|
<span class="lineno"> 246 </span><span class="spaces"> </span><span class="nottickedoff">ffmpeg</span>
|
||||||
<span class="lineno"> 247 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
<span class="lineno"> 247 </span><span class="spaces"> </span><span class="nottickedoff">[ "-r"</span>
|
||||||
<span class="lineno"> 248 </span><span class="spaces"> </span><span class="nottickedoff">takeMVar allFinished</span></span>
|
<span class="lineno"> 248 </span><span class="spaces"> </span><span class="nottickedoff">, show fps</span>
|
||||||
<span class="lineno"> 249 </span>
|
<span class="lineno"> 249 </span><span class="spaces"> </span><span class="nottickedoff">, "-i"</span>
|
||||||
<span class="lineno"> 250 </span>---------------------------------------------------------------------------------
|
<span class="lineno"> 250 </span><span class="spaces"> </span><span class="nottickedoff">, template</span>
|
||||||
<span class="lineno"> 251 </span>-- Helpers
|
<span class="lineno"> 251 </span><span class="spaces"> </span><span class="nottickedoff">, "-y"</span>
|
||||||
<span class="lineno"> 252 </span>
|
<span class="lineno"> 252 </span><span class="spaces"> </span><span class="nottickedoff">, "-progress"</span>
|
||||||
<span class="lineno"> 253 </span>progressPrinter :: String -> Int -> (MVar Int -> IO ()) -> IO ()
|
<span class="lineno"> 253 </span><span class="spaces"> </span><span class="nottickedoff">, progress</span>
|
||||||
<span class="lineno"> 254 </span><span class="decl"><span class="nottickedoff">progressPrinter typeName maxCount action = do</span>
|
<span class="lineno"> 254 </span><span class="spaces"> </span><span class="nottickedoff">, "-c:v"</span>
|
||||||
<span class="lineno"> 255 </span><span class="spaces"> </span><span class="nottickedoff">printf "\rFrames %s: 0/%d" typeName maxCount</span>
|
<span class="lineno"> 255 </span><span class="spaces"> </span><span class="nottickedoff">, "libvpx-vp9"</span>
|
||||||
<span class="lineno"> 256 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ "\r"</span>
|
<span class="lineno"> 256 </span><span class="spaces"> </span><span class="nottickedoff">, "-vf"</span>
|
||||||
<span class="lineno"> 257 </span><span class="spaces"> </span><span class="nottickedoff">done <- newMVar (0 :: Int)</span>
|
<span class="lineno"> 257 </span><span class="spaces"> </span><span class="nottickedoff">, "fps=" ++ show fps</span>
|
||||||
<span class="lineno"> 258 </span><span class="spaces"> </span><span class="nottickedoff">start <- getCurrentTime</span>
|
<span class="lineno"> 258 </span><span class="spaces"> </span><span class="nottickedoff">, target</span>
|
||||||
<span class="lineno"> 259 </span><span class="spaces"> </span><span class="nottickedoff">let bgThread = forever $ do</span>
|
<span class="lineno"> 259 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
||||||
<span class="lineno"> 260 </span><span class="spaces"> </span><span class="nottickedoff">nDone <- readMVar done</span>
|
<span class="lineno"> 260 </span><span class="spaces"> </span><span class="nottickedoff">takeMVar allFinished</span></span>
|
||||||
<span class="lineno"> 261 </span><span class="spaces"> </span><span class="nottickedoff">now <- getCurrentTime</span>
|
<span class="lineno"> 261 </span>
|
||||||
<span class="lineno"> 262 </span><span class="spaces"> </span><span class="nottickedoff">let spent = diffUTCTime now start</span>
|
<span class="lineno"> 262 </span>---------------------------------------------------------------------------------
|
||||||
<span class="lineno"> 263 </span><span class="spaces"> </span><span class="nottickedoff">remaining =</span>
|
<span class="lineno"> 263 </span>-- Helpers
|
||||||
<span class="lineno"> 264 </span><span class="spaces"> </span><span class="nottickedoff">(spent / (fromIntegral nDone / fromIntegral maxCount)) - spent</span>
|
<span class="lineno"> 264 </span>
|
||||||
<span class="lineno"> 265 </span><span class="spaces"> </span><span class="nottickedoff">printf "\rFrames %s: %d/%d" typeName nDone maxCount</span>
|
<span class="lineno"> 265 </span>progressPrinter :: String -> Int -> (MVar Int -> IO ()) -> IO ()
|
||||||
<span class="lineno"> 266 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ ", time spent: " ++ ppDiff spent</span>
|
<span class="lineno"> 266 </span><span class="decl"><span class="nottickedoff">progressPrinter typeName maxCount action = do</span>
|
||||||
<span class="lineno"> 267 </span><span class="spaces"> </span><span class="nottickedoff">unless (nDone == 0) $ do</span>
|
<span class="lineno"> 267 </span><span class="spaces"> </span><span class="nottickedoff">printf "\rFrames %s: 0/%d" typeName maxCount</span>
|
||||||
<span class="lineno"> 268 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ ", time remaining: " ++ ppDiff remaining</span>
|
<span class="lineno"> 268 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ "\r"</span>
|
||||||
<span class="lineno"> 269 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ ", total time: " ++ ppDiff (remaining + spent)</span>
|
<span class="lineno"> 269 </span><span class="spaces"> </span><span class="nottickedoff">done <- newMVar (0 :: Int)</span>
|
||||||
<span class="lineno"> 270 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ "\r"</span>
|
<span class="lineno"> 270 </span><span class="spaces"> </span><span class="nottickedoff">start <- getCurrentTime</span>
|
||||||
<span class="lineno"> 271 </span><span class="spaces"> </span><span class="nottickedoff">hFlush stdout</span>
|
<span class="lineno"> 271 </span><span class="spaces"> </span><span class="nottickedoff">let bgThread = forever $ do</span>
|
||||||
<span class="lineno"> 272 </span><span class="spaces"> </span><span class="nottickedoff">threadDelay 1000000</span>
|
<span class="lineno"> 272 </span><span class="spaces"> </span><span class="nottickedoff">nDone <- readMVar done</span>
|
||||||
<span class="lineno"> 273 </span><span class="spaces"> </span><span class="nottickedoff">withBackgroundThread bgThread $ action done</span>
|
<span class="lineno"> 273 </span><span class="spaces"> </span><span class="nottickedoff">now <- getCurrentTime</span>
|
||||||
<span class="lineno"> 274 </span><span class="spaces"> </span><span class="nottickedoff">now <- getCurrentTime</span>
|
<span class="lineno"> 274 </span><span class="spaces"> </span><span class="nottickedoff">let spent = diffUTCTime now start</span>
|
||||||
<span class="lineno"> 275 </span><span class="spaces"> </span><span class="nottickedoff">let spent = diffUTCTime now start</span>
|
<span class="lineno"> 275 </span><span class="spaces"> </span><span class="nottickedoff">remaining =</span>
|
||||||
<span class="lineno"> 276 </span><span class="spaces"> </span><span class="nottickedoff">printf "\rFrames %s: %d/%d" typeName maxCount maxCount</span>
|
<span class="lineno"> 276 </span><span class="spaces"> </span><span class="nottickedoff">(spent / (fromIntegral nDone / fromIntegral maxCount)) - spent</span>
|
||||||
<span class="lineno"> 277 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ ", time spent: " ++ ppDiff spent</span>
|
<span class="lineno"> 277 </span><span class="spaces"> </span><span class="nottickedoff">printf "\rFrames %s: %d/%d" typeName nDone maxCount</span>
|
||||||
<span class="lineno"> 278 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ "\n"</span></span>
|
<span class="lineno"> 278 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ ", time spent: " ++ ppDiff spent</span>
|
||||||
<span class="lineno"> 279 </span>
|
<span class="lineno"> 279 </span><span class="spaces"> </span><span class="nottickedoff">unless (nDone == 0) $ do</span>
|
||||||
<span class="lineno"> 280 </span>animationFrameCount :: Animation -> FPS -> Int
|
<span class="lineno"> 280 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ ", time remaining: " ++ ppDiff remaining</span>
|
||||||
<span class="lineno"> 281 </span><span class="decl"><span class="nottickedoff">animationFrameCount ani rate = round (duration ani * fromIntegral rate) :: Int</span></span>
|
<span class="lineno"> 281 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ ", total time: " ++ ppDiff (remaining + spent)</span>
|
||||||
<span class="lineno"> 282 </span>
|
<span class="lineno"> 282 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ "\r"</span>
|
||||||
<span class="lineno"> 283 </span>generateFrames
|
<span class="lineno"> 283 </span><span class="spaces"> </span><span class="nottickedoff">hFlush stdout</span>
|
||||||
<span class="lineno"> 284 </span> :: Raster -> Animation -> Width -> Height -> FPS -> Bool -> (FilePath -> IO a) -> IO a
|
<span class="lineno"> 284 </span><span class="spaces"> </span><span class="nottickedoff">threadDelay 1000000</span>
|
||||||
<span class="lineno"> 285 </span><span class="decl"><span class="nottickedoff">generateFrames raster ani width_ height_ rate partial action = withTempDir $ \tmp -> do</span>
|
<span class="lineno"> 285 </span><span class="spaces"> </span><span class="nottickedoff">withBackgroundThread bgThread $ action done</span>
|
||||||
<span class="lineno"> 286 </span><span class="spaces"> </span><span class="nottickedoff">let frameName nth = tmp </> printf nameTemplate nth</span>
|
<span class="lineno"> 286 </span><span class="spaces"> </span><span class="nottickedoff">now <- getCurrentTime</span>
|
||||||
<span class="lineno"> 287 </span><span class="spaces"> </span><span class="nottickedoff">setRootDirectory tmp</span>
|
<span class="lineno"> 287 </span><span class="spaces"> </span><span class="nottickedoff">let spent = diffUTCTime now start</span>
|
||||||
<span class="lineno"> 288 </span><span class="spaces"> </span><span class="nottickedoff">progressPrinter "generated" frameCount</span>
|
<span class="lineno"> 288 </span><span class="spaces"> </span><span class="nottickedoff">printf "\rFrames %s: %d/%d" typeName maxCount maxCount</span>
|
||||||
<span class="lineno"> 289 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -> handle h $ concurrentForM_ frames $ \n -> do</span>
|
<span class="lineno"> 289 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ ", time spent: " ++ ppDiff spent</span>
|
||||||
<span class="lineno"> 290 </span><span class="spaces"> </span><span class="nottickedoff">writeFile (frameName n) $ renderSvg width height $ nthFrame n</span>
|
<span class="lineno"> 290 </span><span class="spaces"> </span><span class="nottickedoff">putStr $ clearFromCursorToLineEndCode ++ "\n"</span></span>
|
||||||
<span class="lineno"> 291 </span><span class="spaces"> </span><span class="nottickedoff">modifyMVar_ done $ \nDone -> return (nDone + 1)</span>
|
<span class="lineno"> 291 </span>
|
||||||
<span class="lineno"> 292 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
<span class="lineno"> 292 </span>animationFrameCount :: Animation -> FPS -> Int
|
||||||
<span class="lineno"> 293 </span><span class="spaces"> </span><span class="nottickedoff">when (isValidRaster raster)</span>
|
<span class="lineno"> 293 </span><span class="decl"><span class="nottickedoff">animationFrameCount ani rate = round (duration ani * fromIntegral rate) :: Int</span></span>
|
||||||
<span class="lineno"> 294 </span><span class="spaces"> </span><span class="nottickedoff">$ progressPrinter "rastered" frameCount</span>
|
<span class="lineno"> 294 </span>
|
||||||
<span class="lineno"> 295 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -> handle h $ concurrentForM_ frames $ \n -> do</span>
|
<span class="lineno"> 295 </span>generateFrames
|
||||||
<span class="lineno"> 296 </span><span class="spaces"> </span><span class="nottickedoff">applyRaster raster (frameName n)</span>
|
<span class="lineno"> 296 </span> :: Raster -> Animation -> Width -> Height -> FPS -> Bool -> (FilePath -> IO a) -> IO a
|
||||||
<span class="lineno"> 297 </span><span class="spaces"> </span><span class="nottickedoff">modifyMVar_ done $ \nDone -> return (nDone + 1)</span>
|
<span class="lineno"> 297 </span><span class="decl"><span class="nottickedoff">generateFrames raster ani width_ height_ rate partial action = withTempDir $ \tmp -> do</span>
|
||||||
<span class="lineno"> 298 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
<span class="lineno"> 298 </span><span class="spaces"> </span><span class="nottickedoff">let frameName nth = tmp </> printf nameTemplate nth</span>
|
||||||
<span class="lineno"> 299 </span><span class="spaces"> </span><span class="nottickedoff">action (tmp </> rasterTemplate raster)</span>
|
<span class="lineno"> 299 </span><span class="spaces"> </span><span class="nottickedoff">setRootDirectory tmp</span>
|
||||||
<span class="lineno"> 300 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
<span class="lineno"> 300 </span><span class="spaces"> </span><span class="nottickedoff">progressPrinter "generated" frameCount</span>
|
||||||
<span class="lineno"> 301 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster RasterNone = False</span>
|
<span class="lineno"> 301 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -> handle h $ concurrentForM_ frames $ \n -> do</span>
|
||||||
<span class="lineno"> 302 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster RasterAuto = False</span>
|
<span class="lineno"> 302 </span><span class="spaces"> </span><span class="nottickedoff">writeFile (frameName n) $ renderSvg width height $ nthFrame n</span>
|
||||||
<span class="lineno"> 303 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster _ = True</span>
|
<span class="lineno"> 303 </span><span class="spaces"> </span><span class="nottickedoff">modifyMVar_ done $ \nDone -> return (nDone + 1)</span>
|
||||||
<span class="lineno"> 304 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
<span class="lineno"> 304 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||||
<span class="lineno"> 305 </span><span class="spaces"> </span><span class="nottickedoff">width = Just $ Px $ fromIntegral width_</span>
|
<span class="lineno"> 305 </span><span class="spaces"> </span><span class="nottickedoff">when (isValidRaster raster)</span>
|
||||||
<span class="lineno"> 306 </span><span class="spaces"> </span><span class="nottickedoff">height = Just $ Px $ fromIntegral height_</span>
|
<span class="lineno"> 306 </span><span class="spaces"> </span><span class="nottickedoff">$ progressPrinter "rastered" frameCount</span>
|
||||||
<span class="lineno"> 307 </span><span class="spaces"> </span><span class="nottickedoff">h UserInterrupt | partial = do</span>
|
<span class="lineno"> 307 </span><span class="spaces"> </span><span class="nottickedoff">$ \done -> handle h $ concurrentForM_ frames $ \n -> do</span>
|
||||||
<span class="lineno"> 308 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn</span>
|
<span class="lineno"> 308 </span><span class="spaces"> </span><span class="nottickedoff">applyRaster raster (frameName n)</span>
|
||||||
<span class="lineno"> 309 </span><span class="spaces"> </span><span class="nottickedoff">stderr</span>
|
<span class="lineno"> 309 </span><span class="spaces"> </span><span class="nottickedoff">modifyMVar_ done $ \nDone -> return (nDone + 1)</span>
|
||||||
<span class="lineno"> 310 </span><span class="spaces"> </span><span class="nottickedoff">"\nCtrl-C detected. Trying to generate video with available frames. \</span>
|
<span class="lineno"> 310 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||||
<span class="lineno"> 311 </span><span class="spaces"> </span><span class="nottickedoff">\Hit ctrl-c again to abort."</span>
|
<span class="lineno"> 311 </span><span class="spaces"> </span><span class="nottickedoff">action (tmp </> rasterTemplate raster)</span>
|
||||||
<span class="lineno"> 312 </span><span class="spaces"> </span><span class="nottickedoff">return ()</span>
|
<span class="lineno"> 312 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||||
<span class="lineno"> 313 </span><span class="spaces"> </span><span class="nottickedoff">h other = throwIO other</span>
|
<span class="lineno"> 313 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster RasterNone = False</span>
|
||||||
<span class="lineno"> 314 </span><span class="spaces"> </span><span class="nottickedoff">-- frames = [0..frameCount-1]</span>
|
<span class="lineno"> 314 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster RasterAuto = False</span>
|
||||||
<span class="lineno"> 315 </span><span class="spaces"> </span><span class="nottickedoff">frames = frameOrder rate frameCount</span>
|
<span class="lineno"> 315 </span><span class="spaces"> </span><span class="nottickedoff">isValidRaster _ = True</span>
|
||||||
<span class="lineno"> 316 </span><span class="spaces"> </span><span class="nottickedoff">nthFrame nth = frameAt (recip (fromIntegral rate) * fromIntegral nth) ani</span>
|
<span class="lineno"> 316 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||||
<span class="lineno"> 317 </span><span class="spaces"> </span><span class="nottickedoff">frameCount = animationFrameCount ani rate</span>
|
<span class="lineno"> 317 </span><span class="spaces"> </span><span class="nottickedoff">width = Just $ Px $ fromIntegral width_</span>
|
||||||
<span class="lineno"> 318 </span><span class="spaces"> </span><span class="nottickedoff">nameTemplate :: String</span>
|
<span class="lineno"> 318 </span><span class="spaces"> </span><span class="nottickedoff">height = Just $ Px $ fromIntegral height_</span>
|
||||||
<span class="lineno"> 319 </span><span class="spaces"> </span><span class="nottickedoff">nameTemplate = "render-%05d.svg"</span></span>
|
<span class="lineno"> 319 </span><span class="spaces"> </span><span class="nottickedoff">h UserInterrupt | partial = do</span>
|
||||||
<span class="lineno"> 320 </span>
|
<span class="lineno"> 320 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn</span>
|
||||||
<span class="lineno"> 321 </span>withBackgroundThread :: IO () -> IO a -> IO a
|
<span class="lineno"> 321 </span><span class="spaces"> </span><span class="nottickedoff">stderr</span>
|
||||||
<span class="lineno"> 322 </span><span class="decl"><span class="nottickedoff">withBackgroundThread t = bracket (forkIO t) killThread . const</span></span>
|
<span class="lineno"> 322 </span><span class="spaces"> </span><span class="nottickedoff">"\nCtrl-C detected. Trying to generate video with available frames. \</span>
|
||||||
<span class="lineno"> 323 </span>
|
<span class="lineno"> 323 </span><span class="spaces"> </span><span class="nottickedoff">\Hit ctrl-c again to abort."</span>
|
||||||
<span class="lineno"> 324 </span>ppDiff :: NominalDiffTime -> String
|
<span class="lineno"> 324 </span><span class="spaces"> </span><span class="nottickedoff">return ()</span>
|
||||||
<span class="lineno"> 325 </span><span class="decl"><span class="nottickedoff">ppDiff diff | hours == 0 && mins == 0 = show secs ++ "s"</span>
|
<span class="lineno"> 325 </span><span class="spaces"> </span><span class="nottickedoff">h other = throwIO other</span>
|
||||||
<span class="lineno"> 326 </span><span class="spaces"> </span><span class="nottickedoff">| hours == 0 = printf "%.2d:%.2d" mins secs</span>
|
<span class="lineno"> 326 </span><span class="spaces"> </span><span class="nottickedoff">-- frames = [0..frameCount-1]</span>
|
||||||
<span class="lineno"> 327 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = printf "%.2d:%.2d:%.2d" hours mins secs</span>
|
<span class="lineno"> 327 </span><span class="spaces"> </span><span class="nottickedoff">frames = frameOrder rate frameCount</span>
|
||||||
<span class="lineno"> 328 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
<span class="lineno"> 328 </span><span class="spaces"> </span><span class="nottickedoff">nthFrame nth = frameAt (recip (fromIntegral rate) * fromIntegral nth) ani</span>
|
||||||
<span class="lineno"> 329 </span><span class="spaces"> </span><span class="nottickedoff">(osecs, secs) = round diff `divMod` (60 :: Int)</span>
|
<span class="lineno"> 329 </span><span class="spaces"> </span><span class="nottickedoff">frameCount = animationFrameCount ani rate</span>
|
||||||
<span class="lineno"> 330 </span><span class="spaces"> </span><span class="nottickedoff">(hours, mins) = osecs `divMod` 60</span></span>
|
<span class="lineno"> 330 </span><span class="spaces"> </span><span class="nottickedoff">nameTemplate :: String</span>
|
||||||
<span class="lineno"> 331 </span>
|
<span class="lineno"> 331 </span><span class="spaces"> </span><span class="nottickedoff">nameTemplate = "render-%05d.svg"</span></span>
|
||||||
<span class="lineno"> 332 </span>rasterTemplate :: Raster -> String
|
<span class="lineno"> 332 </span>
|
||||||
<span class="lineno"> 333 </span><span class="decl"><span class="nottickedoff">rasterTemplate RasterNone = "render-%05d.svg"</span>
|
<span class="lineno"> 333 </span>withBackgroundThread :: IO () -> IO a -> IO a
|
||||||
<span class="lineno"> 334 </span><span class="spaces"></span><span class="nottickedoff">rasterTemplate RasterAuto = "render-%05d.svg"</span>
|
<span class="lineno"> 334 </span><span class="decl"><span class="nottickedoff">withBackgroundThread t = bracket (forkIO t) killThread . const</span></span>
|
||||||
<span class="lineno"> 335 </span><span class="spaces"></span><span class="nottickedoff">rasterTemplate _ = "render-%05d.png"</span></span>
|
<span class="lineno"> 335 </span>
|
||||||
<span class="lineno"> 336 </span>
|
<span class="lineno"> 336 </span>ppDiff :: NominalDiffTime -> String
|
||||||
<span class="lineno"> 337 </span>requireRaster :: Raster -> IO Raster
|
<span class="lineno"> 337 </span><span class="decl"><span class="nottickedoff">ppDiff diff | hours == 0 && mins == 0 = show secs ++ "s"</span>
|
||||||
<span class="lineno"> 338 </span><span class="decl"><span class="nottickedoff">requireRaster raster = do</span>
|
<span class="lineno"> 338 </span><span class="spaces"> </span><span class="nottickedoff">| hours == 0 = printf "%.2d:%.2d" mins secs</span>
|
||||||
<span class="lineno"> 339 </span><span class="spaces"> </span><span class="nottickedoff">raster' <- selectRaster (if raster == RasterNone then RasterAuto else raster)</span>
|
<span class="lineno"> 339 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = printf "%.2d:%.2d:%.2d" hours mins secs</span>
|
||||||
<span class="lineno"> 340 </span><span class="spaces"> </span><span class="nottickedoff">case raster' of</span>
|
<span class="lineno"> 340 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||||
<span class="lineno"> 341 </span><span class="spaces"> </span><span class="nottickedoff">RasterNone -> do</span>
|
<span class="lineno"> 341 </span><span class="spaces"> </span><span class="nottickedoff">(osecs, secs) = round diff `divMod` (60 :: Int)</span>
|
||||||
<span class="lineno"> 342 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn</span>
|
<span class="lineno"> 342 </span><span class="spaces"> </span><span class="nottickedoff">(hours, mins) = osecs `divMod` 60</span></span>
|
||||||
<span class="lineno"> 343 </span><span class="spaces"> </span><span class="nottickedoff">stderr</span>
|
<span class="lineno"> 343 </span>
|
||||||
<span class="lineno"> 344 </span><span class="spaces"> </span><span class="nottickedoff">"Raster required but none could be found. \</span>
|
<span class="lineno"> 344 </span>rasterTemplate :: Raster -> String
|
||||||
<span class="lineno"> 345 </span><span class="spaces"> </span><span class="nottickedoff">\Please install either inkscape, imagemagick, or rsvg-convert."</span>
|
<span class="lineno"> 345 </span><span class="decl"><span class="nottickedoff">rasterTemplate RasterNone = "render-%05d.svg"</span>
|
||||||
<span class="lineno"> 346 </span><span class="spaces"> </span><span class="nottickedoff">exitWith (ExitFailure 1)</span>
|
<span class="lineno"> 346 </span><span class="spaces"></span><span class="nottickedoff">rasterTemplate RasterAuto = "render-%05d.svg"</span>
|
||||||
<span class="lineno"> 347 </span><span class="spaces"> </span><span class="nottickedoff">_ -> pure raster'</span></span>
|
<span class="lineno"> 347 </span><span class="spaces"></span><span class="nottickedoff">rasterTemplate _ = "render-%05d.png"</span></span>
|
||||||
<span class="lineno"> 348 </span>
|
<span class="lineno"> 348 </span>
|
||||||
<span class="lineno"> 349 </span>selectRaster :: Raster -> IO Raster
|
<span class="lineno"> 349 </span>-- | Resolve RasterNone and RasterAuto. If no valid raster can
|
||||||
<span class="lineno"> 350 </span><span class="decl"><span class="nottickedoff">selectRaster RasterAuto = do</span>
|
<span class="lineno"> 350 </span>-- be found, exit with an error message.
|
||||||
<span class="lineno"> 351 </span><span class="spaces"> </span><span class="nottickedoff">rsvg <- hasRSvg</span>
|
<span class="lineno"> 351 </span>requireRaster :: Raster -> IO Raster
|
||||||
<span class="lineno"> 352 </span><span class="spaces"> </span><span class="nottickedoff">ink <- hasInkscape</span>
|
<span class="lineno"> 352 </span><span class="decl"><span class="nottickedoff">requireRaster raster = do</span>
|
||||||
<span class="lineno"> 353 </span><span class="spaces"> </span><span class="nottickedoff">magick <- hasMagick</span>
|
<span class="lineno"> 353 </span><span class="spaces"> </span><span class="nottickedoff">raster' <- selectRaster (if raster == RasterNone then RasterAuto else raster)</span>
|
||||||
<span class="lineno"> 354 </span><span class="spaces"> </span><span class="nottickedoff">if</span>
|
<span class="lineno"> 354 </span><span class="spaces"> </span><span class="nottickedoff">case raster' of</span>
|
||||||
<span class="lineno"> 355 </span><span class="spaces"> </span><span class="nottickedoff">| isRight rsvg -> pure RasterRSvg</span>
|
<span class="lineno"> 355 </span><span class="spaces"> </span><span class="nottickedoff">RasterNone -> do</span>
|
||||||
<span class="lineno"> 356 </span><span class="spaces"> </span><span class="nottickedoff">| isRight ink -> pure RasterInkscape</span>
|
<span class="lineno"> 356 </span><span class="spaces"> </span><span class="nottickedoff">hPutStrLn</span>
|
||||||
<span class="lineno"> 357 </span><span class="spaces"> </span><span class="nottickedoff">| isRight magick -> pure RasterMagick</span>
|
<span class="lineno"> 357 </span><span class="spaces"> </span><span class="nottickedoff">stderr</span>
|
||||||
<span class="lineno"> 358 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise -> pure RasterNone</span>
|
<span class="lineno"> 358 </span><span class="spaces"> </span><span class="nottickedoff">"Raster required but none could be found. \</span>
|
||||||
<span class="lineno"> 359 </span><span class="spaces"></span><span class="nottickedoff">selectRaster r = pure r</span></span>
|
<span class="lineno"> 359 </span><span class="spaces"> </span><span class="nottickedoff">\Please install either inkscape, imagemagick, or rsvg-convert."</span>
|
||||||
<span class="lineno"> 360 </span>
|
<span class="lineno"> 360 </span><span class="spaces"> </span><span class="nottickedoff">exitWith (ExitFailure 1)</span>
|
||||||
<span class="lineno"> 361 </span>applyRaster :: Raster -> FilePath -> IO ()
|
<span class="lineno"> 361 </span><span class="spaces"> </span><span class="nottickedoff">_ -> pure raster'</span></span>
|
||||||
<span class="lineno"> 362 </span><span class="decl"><span class="nottickedoff">applyRaster RasterNone _ = return ()</span>
|
<span class="lineno"> 362 </span>
|
||||||
<span class="lineno"> 363 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterAuto _ = return ()</span>
|
<span class="lineno"> 363 </span>-- | Resolve RasterNone and RasterAuto. If no valid raster can
|
||||||
<span class="lineno"> 364 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterInkscape path = runCmd</span>
|
<span class="lineno"> 364 </span>-- be found, return RasterNone.
|
||||||
<span class="lineno"> 365 </span><span class="spaces"> </span><span class="nottickedoff">"inkscape"</span>
|
<span class="lineno"> 365 </span>selectRaster :: Raster -> IO Raster
|
||||||
<span class="lineno"> 366 </span><span class="spaces"> </span><span class="nottickedoff">[ "--without-gui"</span>
|
<span class="lineno"> 366 </span><span class="decl"><span class="nottickedoff">selectRaster RasterAuto = do</span>
|
||||||
<span class="lineno"> 367 </span><span class="spaces"> </span><span class="nottickedoff">, "--file=" ++ path</span>
|
<span class="lineno"> 367 </span><span class="spaces"> </span><span class="nottickedoff">rsvg <- hasRSvg</span>
|
||||||
<span class="lineno"> 368 </span><span class="spaces"> </span><span class="nottickedoff">, "--export-png=" ++ replaceExtension path "png"</span>
|
<span class="lineno"> 368 </span><span class="spaces"> </span><span class="nottickedoff">ink <- hasInkscape</span>
|
||||||
<span class="lineno"> 369 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
<span class="lineno"> 369 </span><span class="spaces"> </span><span class="nottickedoff">magick <- hasMagick</span>
|
||||||
<span class="lineno"> 370 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterRSvg path = runCmd</span>
|
<span class="lineno"> 370 </span><span class="spaces"> </span><span class="nottickedoff">if</span>
|
||||||
<span class="lineno"> 371 </span><span class="spaces"> </span><span class="nottickedoff">"rsvg-convert"</span>
|
<span class="lineno"> 371 </span><span class="spaces"> </span><span class="nottickedoff">| isRight rsvg -> pure RasterRSvg</span>
|
||||||
<span class="lineno"> 372 </span><span class="spaces"> </span><span class="nottickedoff">[path, "--unlimited", "--output", replaceExtension path "png"]</span>
|
<span class="lineno"> 372 </span><span class="spaces"> </span><span class="nottickedoff">| isRight ink -> pure RasterInkscape</span>
|
||||||
<span class="lineno"> 373 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterMagick path =</span>
|
<span class="lineno"> 373 </span><span class="spaces"> </span><span class="nottickedoff">| isRight magick -> pure RasterMagick</span>
|
||||||
<span class="lineno"> 374 </span><span class="spaces"> </span><span class="nottickedoff">runCmd magickCmd [path, replaceExtension path "png"]</span></span>
|
<span class="lineno"> 374 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise -> pure RasterNone</span>
|
||||||
<span class="lineno"> 375 </span>
|
<span class="lineno"> 375 </span><span class="spaces"></span><span class="nottickedoff">selectRaster r = pure r</span></span>
|
||||||
<span class="lineno"> 376 </span>concurrentForM_ :: [a] -> (a -> IO ()) -> IO ()
|
<span class="lineno"> 376 </span>
|
||||||
<span class="lineno"> 377 </span><span class="decl"><span class="nottickedoff">concurrentForM_ lst action = do</span>
|
<span class="lineno"> 377 </span>-- | Convert SVG file to a PNG file with selected raster engine. If
|
||||||
<span class="lineno"> 378 </span><span class="spaces"> </span><span class="nottickedoff">n <- getNumCapabilities</span>
|
<span class="lineno"> 378 </span>-- raster engine is RasterAuto or RasterNone, do nothing.
|
||||||
<span class="lineno"> 379 </span><span class="spaces"> </span><span class="nottickedoff">sem <- newQSemN n</span>
|
<span class="lineno"> 379 </span>applyRaster :: Raster -> FilePath -> IO ()
|
||||||
<span class="lineno"> 380 </span><span class="spaces"> </span><span class="nottickedoff">eVar <- newEmptyMVar</span>
|
<span class="lineno"> 380 </span><span class="decl"><span class="nottickedoff">applyRaster RasterNone _ = return ()</span>
|
||||||
<span class="lineno"> 381 </span><span class="spaces"> </span><span class="nottickedoff">forM_ lst $ \elt -> do</span>
|
<span class="lineno"> 381 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterAuto _ = return ()</span>
|
||||||
<span class="lineno"> 382 </span><span class="spaces"> </span><span class="nottickedoff">waitQSemN sem 1</span>
|
<span class="lineno"> 382 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterInkscape path = runCmd</span>
|
||||||
<span class="lineno"> 383 </span><span class="spaces"> </span><span class="nottickedoff">emp <- isEmptyMVar eVar</span>
|
<span class="lineno"> 383 </span><span class="spaces"> </span><span class="nottickedoff">"inkscape"</span>
|
||||||
<span class="lineno"> 384 </span><span class="spaces"> </span><span class="nottickedoff">if emp</span>
|
<span class="lineno"> 384 </span><span class="spaces"> </span><span class="nottickedoff">[ "--without-gui"</span>
|
||||||
<span class="lineno"> 385 </span><span class="spaces"> </span><span class="nottickedoff">then</span>
|
<span class="lineno"> 385 </span><span class="spaces"> </span><span class="nottickedoff">, "--file=" ++ path</span>
|
||||||
<span class="lineno"> 386 </span><span class="spaces"> </span><span class="nottickedoff">void</span>
|
<span class="lineno"> 386 </span><span class="spaces"> </span><span class="nottickedoff">, "--export-png=" ++ replaceExtension path "png"</span>
|
||||||
<span class="lineno"> 387 </span><span class="spaces"> </span><span class="nottickedoff">$ forkIO</span>
|
<span class="lineno"> 387 </span><span class="spaces"> </span><span class="nottickedoff">]</span>
|
||||||
<span class="lineno"> 388 </span><span class="spaces"> </span><span class="nottickedoff">( catch (action elt) (void . tryPutMVar eVar)</span>
|
<span class="lineno"> 388 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterRSvg path = runCmd</span>
|
||||||
<span class="lineno"> 389 </span><span class="spaces"> </span><span class="nottickedoff">`finally` signalQSemN sem 1</span>
|
<span class="lineno"> 389 </span><span class="spaces"> </span><span class="nottickedoff">"rsvg-convert"</span>
|
||||||
<span class="lineno"> 390 </span><span class="spaces"> </span><span class="nottickedoff">)</span>
|
<span class="lineno"> 390 </span><span class="spaces"> </span><span class="nottickedoff">[path, "--unlimited", "--output", replaceExtension path "png"]</span>
|
||||||
<span class="lineno"> 391 </span><span class="spaces"> </span><span class="nottickedoff">else signalQSemN sem 1</span>
|
<span class="lineno"> 391 </span><span class="spaces"></span><span class="nottickedoff">applyRaster RasterMagick path =</span>
|
||||||
<span class="lineno"> 392 </span><span class="spaces"> </span><span class="nottickedoff">waitQSemN sem n</span>
|
<span class="lineno"> 392 </span><span class="spaces"> </span><span class="nottickedoff">runCmd magickCmd [path, replaceExtension path "png"]</span></span>
|
||||||
<span class="lineno"> 393 </span><span class="spaces"> </span><span class="nottickedoff">mbE <- tryTakeMVar eVar</span>
|
<span class="lineno"> 393 </span>
|
||||||
<span class="lineno"> 394 </span><span class="spaces"> </span><span class="nottickedoff">case mbE of</span>
|
<span class="lineno"> 394 </span>concurrentForM_ :: [a] -> (a -> IO ()) -> IO ()
|
||||||
<span class="lineno"> 395 </span><span class="spaces"> </span><span class="nottickedoff">Nothing -> return ()</span>
|
<span class="lineno"> 395 </span><span class="decl"><span class="nottickedoff">concurrentForM_ lst action = do</span>
|
||||||
<span class="lineno"> 396 </span><span class="spaces"> </span><span class="nottickedoff">Just e -> throwIO (e :: SomeException)</span></span>
|
<span class="lineno"> 396 </span><span class="spaces"> </span><span class="nottickedoff">n <- getNumCapabilities</span>
|
||||||
|
<span class="lineno"> 397 </span><span class="spaces"> </span><span class="nottickedoff">sem <- newQSemN n</span>
|
||||||
|
<span class="lineno"> 398 </span><span class="spaces"> </span><span class="nottickedoff">eVar <- newEmptyMVar</span>
|
||||||
|
<span class="lineno"> 399 </span><span class="spaces"> </span><span class="nottickedoff">forM_ lst $ \elt -> do</span>
|
||||||
|
<span class="lineno"> 400 </span><span class="spaces"> </span><span class="nottickedoff">waitQSemN sem 1</span>
|
||||||
|
<span class="lineno"> 401 </span><span class="spaces"> </span><span class="nottickedoff">emp <- isEmptyMVar eVar</span>
|
||||||
|
<span class="lineno"> 402 </span><span class="spaces"> </span><span class="nottickedoff">if emp</span>
|
||||||
|
<span class="lineno"> 403 </span><span class="spaces"> </span><span class="nottickedoff">then</span>
|
||||||
|
<span class="lineno"> 404 </span><span class="spaces"> </span><span class="nottickedoff">void</span>
|
||||||
|
<span class="lineno"> 405 </span><span class="spaces"> </span><span class="nottickedoff">$ forkIO</span>
|
||||||
|
<span class="lineno"> 406 </span><span class="spaces"> </span><span class="nottickedoff">( catch (action elt) (void . tryPutMVar eVar)</span>
|
||||||
|
<span class="lineno"> 407 </span><span class="spaces"> </span><span class="nottickedoff">`finally` signalQSemN sem 1</span>
|
||||||
|
<span class="lineno"> 408 </span><span class="spaces"> </span><span class="nottickedoff">)</span>
|
||||||
|
<span class="lineno"> 409 </span><span class="spaces"> </span><span class="nottickedoff">else signalQSemN sem 1</span>
|
||||||
|
<span class="lineno"> 410 </span><span class="spaces"> </span><span class="nottickedoff">waitQSemN sem n</span>
|
||||||
|
<span class="lineno"> 411 </span><span class="spaces"> </span><span class="nottickedoff">mbE <- tryTakeMVar eVar</span>
|
||||||
|
<span class="lineno"> 412 </span><span class="spaces"> </span><span class="nottickedoff">case mbE of</span>
|
||||||
|
<span class="lineno"> 413 </span><span class="spaces"> </span><span class="nottickedoff">Nothing -> return ()</span>
|
||||||
|
<span class="lineno"> 414 </span><span class="spaces"> </span><span class="nottickedoff">Just e -> throwIO (e :: SomeException)</span></span>
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -30,18 +30,18 @@ span.spaces { background: white }
|
||||||
<span class="lineno"> 11 </span> , svgWidth
|
<span class="lineno"> 11 </span> , svgWidth
|
||||||
<span class="lineno"> 12 </span> ) where
|
<span class="lineno"> 12 </span> ) where
|
||||||
<span class="lineno"> 13 </span>
|
<span class="lineno"> 13 </span>
|
||||||
<span class="lineno"> 14 </span>import Control.Arrow ((***))
|
<span class="lineno"> 14 </span>import Control.Arrow ((***))
|
||||||
<span class="lineno"> 15 </span>import Control.Lens ((^.))
|
<span class="lineno"> 15 </span>import Control.Lens ((^.))
|
||||||
<span class="lineno"> 16 </span>import Data.List
|
<span class="lineno"> 16 </span>import Data.List
|
||||||
<span class="lineno"> 17 </span>import Data.Maybe (mapMaybe)
|
<span class="lineno"> 17 </span>import Data.Maybe (mapMaybe)
|
||||||
<span class="lineno"> 18 </span>import Graphics.SvgTree hiding (height, line, path, use,
|
<span class="lineno"> 18 </span>import qualified Data.Vector.Unboxed as V
|
||||||
<span class="lineno"> 19 </span> width)
|
<span class="lineno"> 19 </span>import qualified Geom2D.CubicBezier.Linear as Bezier
|
||||||
<span class="lineno"> 20 </span>import Linear.V2 hiding (angle)
|
<span class="lineno"> 20 </span>import Graphics.SvgTree hiding (height, line, path, use, width)
|
||||||
<span class="lineno"> 21 </span>import Linear.Vector
|
<span class="lineno"> 21 </span>import Linear.V2 hiding (angle)
|
||||||
<span class="lineno"> 22 </span>import Reanimate.Constants
|
<span class="lineno"> 22 </span>import Linear.Vector
|
||||||
<span class="lineno"> 23 </span>import Reanimate.Svg.LineCommand
|
<span class="lineno"> 23 </span>import Reanimate.Constants
|
||||||
<span class="lineno"> 24 </span>import qualified Reanimate.Transform as Transform
|
<span class="lineno"> 24 </span>import Reanimate.Svg.LineCommand
|
||||||
<span class="lineno"> 25 </span>-- import qualified Geom2D.CubicBezier as Bezier
|
<span class="lineno"> 25 </span>import qualified Reanimate.Transform as Transform
|
||||||
<span class="lineno"> 26 </span>
|
<span class="lineno"> 26 </span>
|
||||||
<span class="lineno"> 27 </span>-- | Return bounding box of SVG tree.
|
<span class="lineno"> 27 </span>-- | Return bounding box of SVG tree.
|
||||||
<span class="lineno"> 28 </span>-- The four numbers returned are (minimal X-coordinate, minimal Y-coordinate, width, height)
|
<span class="lineno"> 28 </span>-- The four numbers returned are (minimal X-coordinate, minimal Y-coordinate, width, height)
|
||||||
|
|
@ -86,66 +86,67 @@ span.spaces { background: white }
|
||||||
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="nottickedoff">LineBezier [p] -></span>
|
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="nottickedoff">LineBezier [p] -></span>
|
||||||
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="nottickedoff">p : worker p xs</span>
|
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="nottickedoff">p : worker p xs</span>
|
||||||
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="nottickedoff">LineBezier ctrl -> -- approximation</span>
|
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="nottickedoff">LineBezier ctrl -> -- approximation</span>
|
||||||
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="nottickedoff">[ last (partialBezierPoints (from:ctrl) 0 (recip chunks*i)) | i <- [0..chunks]] ++</span>
|
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="nottickedoff">let bezier = Bezier.AnyBezier (V.fromList (from:ctrl))</span>
|
||||||
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="nottickedoff">worker (last ctrl) xs</span>
|
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="nottickedoff">in [ Bezier.evalBezier bezier (recip chunks*i) | i <- [0..chunks]] ++</span>
|
||||||
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="nottickedoff">LineEnd p -> p : worker p xs</span>
|
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="nottickedoff">worker (last ctrl) xs</span>
|
||||||
<span class="lineno"> 73 </span><span class="spaces"> </span><span class="nottickedoff">chunks = 10</span></span>
|
<span class="lineno"> 73 </span><span class="spaces"> </span><span class="nottickedoff">LineEnd p -> p : worker p xs</span>
|
||||||
<span class="lineno"> 74 </span>
|
<span class="lineno"> 74 </span><span class="spaces"> </span><span class="nottickedoff">chunks = 10</span></span>
|
||||||
<span class="lineno"> 75 </span>svgBoundingPoints :: Tree -> [RPoint]
|
<span class="lineno"> 75 </span>
|
||||||
<span class="lineno"> 76 </span><span class="decl"><span class="istickedoff">svgBoundingPoints t = map (Transform.transformPoint m) $</span>
|
<span class="lineno"> 76 </span>svgBoundingPoints :: Tree -> [RPoint]
|
||||||
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="istickedoff">case t of</span>
|
<span class="lineno"> 77 </span><span class="decl"><span class="istickedoff">svgBoundingPoints t = map (Transform.transformPoint m) $</span>
|
||||||
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="istickedoff">None -> <span class="nottickedoff">[]</span></span>
|
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="istickedoff">case t of</span>
|
||||||
<span class="lineno"> 79 </span><span class="spaces"> </span><span class="istickedoff">UseTree{} -> <span class="nottickedoff">[]</span></span>
|
<span class="lineno"> 79 </span><span class="spaces"> </span><span class="istickedoff">None -> <span class="nottickedoff">[]</span></span>
|
||||||
<span class="lineno"> 80 </span><span class="spaces"> </span><span class="istickedoff">GroupTree g -> concatMap svgBoundingPoints (g^.groupChildren)</span>
|
<span class="lineno"> 80 </span><span class="spaces"> </span><span class="istickedoff">UseTree{} -> <span class="nottickedoff">[]</span></span>
|
||||||
<span class="lineno"> 81 </span><span class="spaces"> </span><span class="istickedoff">SymbolTree (Symbol g) -> <span class="nottickedoff">concatMap svgBoundingPoints (g^.groupChildren)</span></span>
|
<span class="lineno"> 81 </span><span class="spaces"> </span><span class="istickedoff">GroupTree g -> concatMap svgBoundingPoints (g^.groupChildren)</span>
|
||||||
<span class="lineno"> 82 </span><span class="spaces"> </span><span class="istickedoff">FilterTree{} -> <span class="nottickedoff">[]</span></span>
|
<span class="lineno"> 82 </span><span class="spaces"> </span><span class="istickedoff">SymbolTree (Symbol g) -> <span class="nottickedoff">concatMap svgBoundingPoints (g^.groupChildren)</span></span>
|
||||||
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="istickedoff">DefinitionTree{} -> <span class="nottickedoff">[]</span></span>
|
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="istickedoff">FilterTree{} -> <span class="nottickedoff">[]</span></span>
|
||||||
<span class="lineno"> 84 </span><span class="spaces"> </span><span class="istickedoff">PathTree p -> <span class="nottickedoff">linePoints $ toLineCommands (p^.pathDefinition)</span></span>
|
<span class="lineno"> 84 </span><span class="spaces"> </span><span class="istickedoff">DefinitionTree{} -> <span class="nottickedoff">[]</span></span>
|
||||||
<span class="lineno"> 85 </span><span class="spaces"> </span><span class="istickedoff">CircleTree c -> <span class="nottickedoff">circleBoundingPoints c</span></span>
|
<span class="lineno"> 85 </span><span class="spaces"> </span><span class="istickedoff">PathTree p -> <span class="nottickedoff">linePoints $ toLineCommands (p^.pathDefinition)</span></span>
|
||||||
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="istickedoff">PolyLineTree pl -> <span class="nottickedoff">pl ^. polyLinePoints</span></span>
|
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="istickedoff">CircleTree c -> <span class="nottickedoff">circleBoundingPoints c</span></span>
|
||||||
<span class="lineno"> 87 </span><span class="spaces"> </span><span class="istickedoff">EllipseTree e -> <span class="nottickedoff">ellipseBoundingPoints e</span></span>
|
<span class="lineno"> 87 </span><span class="spaces"> </span><span class="istickedoff">PolyLineTree pl -> <span class="nottickedoff">pl ^. polyLinePoints</span></span>
|
||||||
<span class="lineno"> 88 </span><span class="spaces"> </span><span class="istickedoff">LineTree line -> <span class="nottickedoff">map pointToRPoint [line^.linePoint1, line^.linePoint2]</span></span>
|
<span class="lineno"> 88 </span><span class="spaces"> </span><span class="istickedoff">EllipseTree e -> <span class="nottickedoff">ellipseBoundingPoints e</span></span>
|
||||||
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="istickedoff">RectangleTree rect -></span>
|
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="istickedoff">LineTree line -> <span class="nottickedoff">map pointToRPoint [line^.linePoint1, line^.linePoint2]</span></span>
|
||||||
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">case pointToRPoint (rect^.rectUpperLeftCorner) of</span></span>
|
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="istickedoff">RectangleTree rect -></span>
|
||||||
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">V2 x y -> V2 x y :</span></span>
|
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">case pointToRPoint (rect^.rectUpperLeftCorner) of</span></span>
|
||||||
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">case mapTuple (fmap $ toUserUnit defaultDPI) (rect^.rectWidth, rect^.rectHeight) of</span></span>
|
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">V2 x y -> V2 x y :</span></span>
|
||||||
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">(Just (Num w), Just (Num h)) -> [V2 (x+w) (y+h)]</span></span>
|
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">case mapTuple (fmap $ toUserUnit defaultDPI) (rect^.rectWidth, rect^.rectHeight) of</span></span>
|
||||||
<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -> []</span></span>
|
<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">(Just (Num w), Just (Num h)) -> [V2 (x+w) (y+h)]</span></span>
|
||||||
<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">TextTree{} -> []</span>
|
<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -> []</span></span>
|
||||||
<span class="lineno"> 96 </span><span class="spaces"> </span><span class="istickedoff">ImageTree img -></span>
|
<span class="lineno"> 96 </span><span class="spaces"> </span><span class="istickedoff">TextTree{} -> []</span>
|
||||||
<span class="lineno"> 97 </span><span class="spaces"> </span><span class="istickedoff">case (img^.imageCornerUpperLeft, img^.imageWidth, img^.imageHeight) of</span>
|
<span class="lineno"> 97 </span><span class="spaces"> </span><span class="istickedoff">ImageTree img -></span>
|
||||||
<span class="lineno"> 98 </span><span class="spaces"> </span><span class="istickedoff">((Num x, Num y), Num w, Num h) -></span>
|
<span class="lineno"> 98 </span><span class="spaces"> </span><span class="istickedoff">case (img^.imageCornerUpperLeft, img^.imageWidth, img^.imageHeight) of</span>
|
||||||
<span class="lineno"> 99 </span><span class="spaces"> </span><span class="istickedoff">[V2 x y, V2 (x+w) (y+h)]</span>
|
<span class="lineno"> 99 </span><span class="spaces"> </span><span class="istickedoff">((Num x, Num y), Num w, Num h) -></span>
|
||||||
<span class="lineno"> 100 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">[]</span></span>
|
<span class="lineno"> 100 </span><span class="spaces"> </span><span class="istickedoff">[V2 x y, V2 (x+w) (y+h)]</span>
|
||||||
<span class="lineno"> 101 </span><span class="spaces"> </span><span class="istickedoff">MeshGradientTree{} -> <span class="nottickedoff">[]</span></span>
|
<span class="lineno"> 101 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">[]</span></span>
|
||||||
<span class="lineno"> 102 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">[]</span></span>
|
<span class="lineno"> 102 </span><span class="spaces"> </span><span class="istickedoff">MeshGradientTree{} -> <span class="nottickedoff">[]</span></span>
|
||||||
<span class="lineno"> 103 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 103 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">[]</span></span>
|
||||||
<span class="lineno"> 104 </span><span class="spaces"> </span><span class="istickedoff">m = Transform.mkMatrix (t^.transform)</span>
|
<span class="lineno"> 104 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
<span class="lineno"> 105 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">mapTuple f = f *** f</span></span>
|
<span class="lineno"> 105 </span><span class="spaces"> </span><span class="istickedoff">m = Transform.mkMatrix (t^.transform)</span>
|
||||||
<span class="lineno"> 106 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">pointToRPoint p =</span></span>
|
<span class="lineno"> 106 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">mapTuple f = f *** f</span></span>
|
||||||
<span class="lineno"> 107 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">case mapTuple (toUserUnit defaultDPI) p of</span></span>
|
<span class="lineno"> 107 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">pointToRPoint p =</span></span>
|
||||||
<span class="lineno"> 108 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">(Num x, Num y) -> V2 x y</span></span>
|
<span class="lineno"> 108 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">case mapTuple (toUserUnit defaultDPI) p of</span></span>
|
||||||
<span class="lineno"> 109 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -> error "Reanimate.Svg.svgBoundingPoints: Unrecognized number format."</span></span>
|
<span class="lineno"> 109 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">(Num x, Num y) -> V2 x y</span></span>
|
||||||
<span class="lineno"> 110 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 110 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -> error "Reanimate.Svg.svgBoundingPoints: Unrecognized number format."</span></span>
|
||||||
<span class="lineno"> 111 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">circleBoundingPoints circ =</span></span>
|
<span class="lineno"> 111 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 112 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let (xnum, ynum) = circ ^. circleCenter</span></span>
|
<span class="lineno"> 112 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">circleBoundingPoints circ =</span></span>
|
||||||
<span class="lineno"> 113 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">rnum = circ ^. circleRadius</span></span>
|
<span class="lineno"> 113 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let (xnum, ynum) = circ ^. circleCenter</span></span>
|
||||||
<span class="lineno"> 114 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">in case mapMaybe unpackNumber [xnum, ynum, rnum] of</span></span>
|
<span class="lineno"> 114 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">rnum = circ ^. circleRadius</span></span>
|
||||||
<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">[x, y, r] -> [ V2 (x + r * cos angle) (y + r * sin angle) | angle <- [0, pi/10 .. 2 * pi]]</span></span>
|
<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">in case mapMaybe unpackNumber [xnum, ynum, rnum] of</span></span>
|
||||||
<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -> []</span></span>
|
<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">[x, y, r] -> [ V2 (x + r * cos angle) (y + r * sin angle) | angle <- [0, pi/10 .. 2 * pi]]</span></span>
|
||||||
<span class="lineno"> 117 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -> []</span></span>
|
||||||
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">ellipseBoundingPoints e =</span></span>
|
<span class="lineno"> 118 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let (xnum,ynum) = e ^. ellipseCenter</span></span>
|
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">ellipseBoundingPoints e =</span></span>
|
||||||
<span class="lineno"> 120 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">xrnum = e ^. ellipseXRadius</span></span>
|
<span class="lineno"> 120 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let (xnum,ynum) = e ^. ellipseCenter</span></span>
|
||||||
<span class="lineno"> 121 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">yrnum = e ^. ellipseYRadius</span></span>
|
<span class="lineno"> 121 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">xrnum = e ^. ellipseXRadius</span></span>
|
||||||
<span class="lineno"> 122 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">in case mapMaybe unpackNumber [xnum, ynum, xrnum, yrnum] of</span></span>
|
<span class="lineno"> 122 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">yrnum = e ^. ellipseYRadius</span></span>
|
||||||
<span class="lineno"> 123 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">[x,y,xr,yr] -> [V2 (x + xr * cos angle) (y + yr * sin angle) | angle <- [0, pi/10 .. 2 * pi]]</span></span>
|
<span class="lineno"> 123 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">in case mapMaybe unpackNumber [xnum, ynum, xrnum, yrnum] of</span></span>
|
||||||
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -> []</span></span>
|
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">[x,y,xr,yr] -> [V2 (x + xr * cos angle) (y + yr * sin angle) | angle <- [0, pi/10 .. 2 * pi]]</span></span>
|
||||||
<span class="lineno"> 125 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -> []</span></span>
|
||||||
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">unpackNumber n =</span></span>
|
<span class="lineno"> 126 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 127 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">case toUserUnit defaultDPI n of</span></span>
|
<span class="lineno"> 127 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">unpackNumber n =</span></span>
|
||||||
<span class="lineno"> 128 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">Num d -> Just d</span></span>
|
<span class="lineno"> 128 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">case toUserUnit defaultDPI n of</span></span>
|
||||||
<span class="lineno"> 129 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -> Nothing</span></span></span>
|
<span class="lineno"> 129 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">Num d -> Just d</span></span>
|
||||||
|
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">_ -> Nothing</span></span></span>
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -17,267 +17,283 @@ 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.Svg.LineCommand where
|
<span class="lineno"> 1 </span>{-|
|
||||||
<span class="lineno"> 2 </span>
|
<span class="lineno"> 2 </span>Copyright : Written by David Himmelstrup
|
||||||
<span class="lineno"> 3 </span>import Control.Lens ((%~), (&), (.~))
|
<span class="lineno"> 3 </span>License : Unlicense
|
||||||
<span class="lineno"> 4 </span>import Control.Monad.Fix
|
<span class="lineno"> 4 </span>Maintainer : lemmih@gmail.com
|
||||||
<span class="lineno"> 5 </span>import Control.Monad.State
|
<span class="lineno"> 5 </span>Stability : experimental
|
||||||
<span class="lineno"> 6 </span>import Data.Functor
|
<span class="lineno"> 6 </span>Portability : POSIX
|
||||||
<span class="lineno"> 7 </span>import qualified Data.Vector.Unboxed as V
|
<span class="lineno"> 7 </span>-}
|
||||||
<span class="lineno"> 8 </span>import qualified Geom2D.CubicBezier.Linear as Bezier
|
<span class="lineno"> 8 </span>module Reanimate.Svg.LineCommand
|
||||||
<span class="lineno"> 9 </span>import Graphics.SvgTree hiding (height, line, path, use, width)
|
<span class="lineno"> 9 </span> ( LineCommand(..)
|
||||||
<span class="lineno"> 10 </span>import Linear.Metric
|
<span class="lineno"> 10 </span> , lineLength
|
||||||
<span class="lineno"> 11 </span>import Linear.V2 hiding (angle)
|
<span class="lineno"> 11 </span> , toLineCommands
|
||||||
<span class="lineno"> 12 </span>import Linear.Vector
|
<span class="lineno"> 12 </span> , lineToPath
|
||||||
<span class="lineno"> 13 </span>
|
<span class="lineno"> 13 </span> , lineToPoints
|
||||||
<span class="lineno"> 14 </span>type CmdM a = State RPoint a
|
<span class="lineno"> 14 </span> , partialSvg
|
||||||
<span class="lineno"> 15 </span>
|
<span class="lineno"> 15 </span> ) where
|
||||||
<span class="lineno"> 16 </span>data LineCommand
|
<span class="lineno"> 16 </span>
|
||||||
<span class="lineno"> 17 </span> = LineMove RPoint
|
<span class="lineno"> 17 </span>import Control.Lens ((%~), (&), (.~))
|
||||||
<span class="lineno"> 18 </span> -- | LineDraw RPoint
|
<span class="lineno"> 18 </span>import Control.Monad.Fix
|
||||||
<span class="lineno"> 19 </span> | LineBezier [RPoint]
|
<span class="lineno"> 19 </span>import Control.Monad.State
|
||||||
<span class="lineno"> 20 </span> | LineEnd RPoint
|
<span class="lineno"> 20 </span>import Data.Functor
|
||||||
<span class="lineno"> 21 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>)
|
<span class="lineno"> 21 </span>import qualified Data.Vector.Unboxed as V
|
||||||
<span class="lineno"> 22 </span>
|
<span class="lineno"> 22 </span>import qualified Geom2D.CubicBezier.Linear as Bezier
|
||||||
<span class="lineno"> 23 </span>lineToPath :: [LineCommand] -> [PathCommand]
|
<span class="lineno"> 23 </span>import Graphics.SvgTree hiding (height, line, path, use, width)
|
||||||
<span class="lineno"> 24 </span><span class="decl"><span class="istickedoff">lineToPath = map worker</span>
|
<span class="lineno"> 24 </span>import Linear.Metric
|
||||||
<span class="lineno"> 25 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 25 </span>import Linear.V2 hiding (angle)
|
||||||
<span class="lineno"> 26 </span><span class="spaces"> </span><span class="istickedoff">worker (LineMove p) = MoveTo OriginAbsolute [p]</span>
|
<span class="lineno"> 26 </span>import Linear.Vector
|
||||||
<span class="lineno"> 27 </span><span class="spaces"> </span><span class="istickedoff">-- worker (LineDraw p) = LineTo OriginAbsolute [p]</span>
|
<span class="lineno"> 27 </span>
|
||||||
<span class="lineno"> 28 </span><span class="spaces"> </span><span class="istickedoff">worker (LineBezier [a,b,c]) = CurveTo OriginAbsolute [(a,b,c)]</span>
|
<span class="lineno"> 28 </span>type CmdM a = State RPoint a
|
||||||
<span class="lineno"> 29 </span><span class="spaces"> </span><span class="istickedoff">worker (LineBezier [a,b]) = QuadraticBezier OriginAbsolute [(a,b)]</span>
|
<span class="lineno"> 29 </span>
|
||||||
<span class="lineno"> 30 </span><span class="spaces"> </span><span class="istickedoff">worker (LineBezier [a]) = LineTo OriginAbsolute [a]</span>
|
<span class="lineno"> 30 </span>-- | Simplified version of a PathCommand where all points are absolute.
|
||||||
<span class="lineno"> 31 </span><span class="spaces"> </span><span class="istickedoff">worker LineBezier{} = <span class="nottickedoff">error "Reanimate.Svg.lineToPath: invalid bezier curve"</span></span>
|
<span class="lineno"> 31 </span>data LineCommand
|
||||||
<span class="lineno"> 32 </span><span class="spaces"> </span><span class="istickedoff">worker LineEnd{} = EndPath</span></span>
|
<span class="lineno"> 32 </span> = LineMove RPoint
|
||||||
<span class="lineno"> 33 </span>
|
<span class="lineno"> 33 </span> -- | LineDraw RPoint
|
||||||
<span class="lineno"> 34 </span>lineToPoints :: Int -> [LineCommand] -> [RPoint]
|
<span class="lineno"> 34 </span> | LineBezier [RPoint]
|
||||||
<span class="lineno"> 35 </span><span class="decl"><span class="nottickedoff">lineToPoints nPoints cmds =</span>
|
<span class="lineno"> 35 </span> | LineEnd RPoint
|
||||||
<span class="lineno"> 36 </span><span class="spaces"> </span><span class="nottickedoff">map lineEnd lineSegments</span>
|
<span class="lineno"> 36 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>)
|
||||||
<span class="lineno"> 37 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
<span class="lineno"> 37 </span>
|
||||||
<span class="lineno"> 38 </span><span class="spaces"> </span><span class="nottickedoff">lineSegments = [ partialLine (fromIntegral n/ fromIntegral nPoints) cmds | n <- [0 .. nPoints-1] ]</span>
|
<span class="lineno"> 38 </span>-- | Convert from line commands to path commands.
|
||||||
<span class="lineno"> 39 </span><span class="spaces"> </span><span class="nottickedoff">lineEnd [LineBezier pts] = last pts</span>
|
<span class="lineno"> 39 </span>lineToPath :: [LineCommand] -> [PathCommand]
|
||||||
<span class="lineno"> 40 </span><span class="spaces"> </span><span class="nottickedoff">lineEnd (_:xs) = lineEnd xs</span>
|
<span class="lineno"> 40 </span><span class="decl"><span class="istickedoff">lineToPath = map worker</span>
|
||||||
<span class="lineno"> 41 </span><span class="spaces"> </span><span class="nottickedoff">lineEnd _ = error "invalid line"</span></span>
|
<span class="lineno"> 41 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
<span class="lineno"> 42 </span>
|
<span class="lineno"> 42 </span><span class="spaces"> </span><span class="istickedoff">worker (LineMove p) = MoveTo OriginAbsolute [p]</span>
|
||||||
<span class="lineno"> 43 </span>partialLine :: Double -> [LineCommand] -> [LineCommand]
|
<span class="lineno"> 43 </span><span class="spaces"> </span><span class="istickedoff">-- worker (LineDraw p) = LineTo OriginAbsolute [p]</span>
|
||||||
<span class="lineno"> 44 </span><span class="decl"><span class="istickedoff">partialLine alpha cmds = evalState (worker 0 cmds) <span class="nottickedoff">zero</span></span>
|
<span class="lineno"> 44 </span><span class="spaces"> </span><span class="istickedoff">worker (LineBezier [a,b,c]) = CurveTo OriginAbsolute [(a,b,c)]</span>
|
||||||
<span class="lineno"> 45 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 45 </span><span class="spaces"> </span><span class="istickedoff">worker (LineBezier [a,b]) = QuadraticBezier OriginAbsolute [(a,b)]</span>
|
||||||
<span class="lineno"> 46 </span><span class="spaces"> </span><span class="istickedoff">worker _d [] = <span class="nottickedoff">pure []</span></span>
|
<span class="lineno"> 46 </span><span class="spaces"> </span><span class="istickedoff">worker (LineBezier [a]) = LineTo OriginAbsolute [a]</span>
|
||||||
<span class="lineno"> 47 </span><span class="spaces"> </span><span class="istickedoff">worker d (cmd:xs) = do</span>
|
<span class="lineno"> 47 </span><span class="spaces"> </span><span class="istickedoff">worker LineBezier{} = <span class="nottickedoff">error "Reanimate.Svg.lineToPath: invalid bezier curve"</span></span>
|
||||||
<span class="lineno"> 48 </span><span class="spaces"> </span><span class="istickedoff">from <- get</span>
|
<span class="lineno"> 48 </span><span class="spaces"> </span><span class="istickedoff">worker LineEnd{} = EndPath</span></span>
|
||||||
<span class="lineno"> 49 </span><span class="spaces"> </span><span class="istickedoff">len <- lineLength cmd</span>
|
<span class="lineno"> 49 </span>
|
||||||
<span class="lineno"> 50 </span><span class="spaces"> </span><span class="istickedoff">let frac = (targetLen-d) / len</span>
|
<span class="lineno"> 50 </span>-- | Using @n@ control points, approximate the path of the curves.
|
||||||
<span class="lineno"> 51 </span><span class="spaces"> </span><span class="istickedoff">if len == 0 || frac >= 1</span>
|
<span class="lineno"> 51 </span>lineToPoints :: Int -> [LineCommand] -> [RPoint]
|
||||||
<span class="lineno"> 52 </span><span class="spaces"> </span><span class="istickedoff">then (cmd:) <$> worker (d+len) xs</span>
|
<span class="lineno"> 52 </span><span class="decl"><span class="nottickedoff">lineToPoints nPoints cmds =</span>
|
||||||
<span class="lineno"> 53 </span><span class="spaces"> </span><span class="istickedoff">else pure [adjustLineLength frac from cmd]</span>
|
<span class="lineno"> 53 </span><span class="spaces"> </span><span class="nottickedoff">map lineEnd lineSegments</span>
|
||||||
<span class="lineno"> 54 </span><span class="spaces"> </span><span class="istickedoff">totalLen = evalState (sum <$> mapM lineLength cmds) <span class="nottickedoff">zero</span></span>
|
<span class="lineno"> 54 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||||
<span class="lineno"> 55 </span><span class="spaces"> </span><span class="istickedoff">targetLen = totalLen * alpha</span></span>
|
<span class="lineno"> 55 </span><span class="spaces"> </span><span class="nottickedoff">lineSegments = [ partialLine (fromIntegral n/ fromIntegral nPoints) cmds | n <- [0 .. nPoints-1] ]</span>
|
||||||
<span class="lineno"> 56 </span>
|
<span class="lineno"> 56 </span><span class="spaces"> </span><span class="nottickedoff">lineEnd [LineBezier pts] = last pts</span>
|
||||||
<span class="lineno"> 57 </span>adjustLineLength :: Double -> RPoint -> LineCommand -> LineCommand
|
<span class="lineno"> 57 </span><span class="spaces"> </span><span class="nottickedoff">lineEnd (_:xs) = lineEnd xs</span>
|
||||||
<span class="lineno"> 58 </span><span class="decl"><span class="istickedoff">adjustLineLength alpha from cmd =</span>
|
<span class="lineno"> 58 </span><span class="spaces"> </span><span class="nottickedoff">lineEnd _ = error "invalid line"</span></span>
|
||||||
<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff">case cmd of</span>
|
<span class="lineno"> 59 </span>
|
||||||
<span class="lineno"> 60 </span><span class="spaces"> </span><span class="istickedoff">LineBezier points -> LineBezier $ drop 1 $ partialBezierPoints (from:points) 0 alpha</span>
|
<span class="lineno"> 60 </span>partialLine :: Double -> [LineCommand] -> [LineCommand]
|
||||||
<span class="lineno"> 61 </span><span class="spaces"> </span><span class="istickedoff">LineMove p -> <span class="nottickedoff">LineMove p</span></span>
|
<span class="lineno"> 61 </span><span class="decl"><span class="istickedoff">partialLine alpha cmds = evalState (worker 0 cmds) <span class="nottickedoff">zero</span></span>
|
||||||
<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff">-- LineDraw t -> LineDraw (lerp alpha t from)</span>
|
<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff">LineEnd p -> LineBezier [lerp alpha p from]</span></span>
|
<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff">worker _d [] = <span class="nottickedoff">pure []</span></span>
|
||||||
<span class="lineno"> 64 </span>
|
<span class="lineno"> 64 </span><span class="spaces"> </span><span class="istickedoff">worker d (cmd:xs) = do</span>
|
||||||
<span class="lineno"> 65 </span>lineLength :: LineCommand -> CmdM Double
|
<span class="lineno"> 65 </span><span class="spaces"> </span><span class="istickedoff">from <- get</span>
|
||||||
<span class="lineno"> 66 </span><span class="decl"><span class="istickedoff">lineLength cmd =</span>
|
<span class="lineno"> 66 </span><span class="spaces"> </span><span class="istickedoff">len <- lineLength cmd</span>
|
||||||
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="istickedoff">case cmd of</span>
|
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="istickedoff">let frac = (targetLen-d) / len</span>
|
||||||
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="istickedoff">LineMove to -> 0 <$ put to</span>
|
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="istickedoff">if len == 0 || frac >= 1</span>
|
||||||
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="istickedoff">-- Straight line:</span>
|
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="istickedoff">then (cmd:) <$> worker (d+len) xs</span>
|
||||||
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="istickedoff">LineBezier [dst] -> gets (distance dst) <* put dst</span>
|
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="istickedoff">else pure [adjustLineLength frac from cmd]</span>
|
||||||
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="istickedoff">-- Some kind of curve:</span>
|
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="istickedoff">totalLen = evalState (sum <$> mapM lineLength cmds) <span class="nottickedoff">zero</span></span>
|
||||||
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="istickedoff">LineBezier lst -> do</span>
|
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="istickedoff">targetLen = totalLen * alpha</span></span>
|
||||||
<span class="lineno"> 73 </span><span class="spaces"> </span><span class="istickedoff">from <- get</span>
|
<span class="lineno"> 73 </span>
|
||||||
<span class="lineno"> 74 </span><span class="spaces"> </span><span class="istickedoff">let bezier = rpointsToBezier (from:lst)</span>
|
<span class="lineno"> 74 </span>adjustLineLength :: Double -> RPoint -> LineCommand -> LineCommand
|
||||||
<span class="lineno"> 75 </span><span class="spaces"> </span><span class="istickedoff">tol = 0.0001</span>
|
<span class="lineno"> 75 </span><span class="decl"><span class="istickedoff">adjustLineLength alpha from cmd =</span>
|
||||||
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="istickedoff">put (last lst)</span>
|
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="istickedoff">case cmd of</span>
|
||||||
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="istickedoff">pure $ Bezier.arcLength bezier 1 tol</span>
|
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="istickedoff">LineBezier points -> LineBezier $ drop 1 $ partialBezierPoints (from:points) 0 alpha</span>
|
||||||
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="istickedoff">LineEnd to -> gets (distance to) <* <span class="nottickedoff">put to</span></span></span>
|
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="istickedoff">LineMove p -> <span class="nottickedoff">LineMove p</span></span>
|
||||||
<span class="lineno"> 79 </span>
|
<span class="lineno"> 79 </span><span class="spaces"> </span><span class="istickedoff">-- LineDraw t -> LineDraw (lerp alpha t from)</span>
|
||||||
<span class="lineno"> 80 </span>rpointsToBezier :: [RPoint] -> Bezier.CubicBezier Double
|
<span class="lineno"> 80 </span><span class="spaces"> </span><span class="istickedoff">LineEnd p -> LineBezier [lerp alpha p from]</span></span>
|
||||||
<span class="lineno"> 81 </span><span class="decl"><span class="istickedoff">rpointsToBezier lst =</span>
|
<span class="lineno"> 81 </span>
|
||||||
<span class="lineno"> 82 </span><span class="spaces"> </span><span class="istickedoff">case lst of</span>
|
<span class="lineno"> 82 </span>-- | Estimated length of all segments in a line.
|
||||||
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="istickedoff">[a,b] -> <span class="nottickedoff">Bezier.CubicBezier a a b b</span></span>
|
<span class="lineno"> 83 </span>lineLength :: LineCommand -> CmdM Double
|
||||||
<span class="lineno"> 84 </span><span class="spaces"> </span><span class="istickedoff">[a,b,c] -> <span class="nottickedoff">Bezier.quadToCubic (Bezier.QuadBezier a b c)</span></span>
|
<span class="lineno"> 84 </span><span class="decl"><span class="istickedoff">lineLength cmd =</span>
|
||||||
<span class="lineno"> 85 </span><span class="spaces"> </span><span class="istickedoff">[a,b,c,d] -> Bezier.CubicBezier a b c d</span>
|
<span class="lineno"> 85 </span><span class="spaces"> </span><span class="istickedoff">case cmd of</span>
|
||||||
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">error $ "rpointsToBezier: Invalid list of points: " ++ show lst</span></span></span>
|
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="istickedoff">LineMove to -> 0 <$ put to</span>
|
||||||
<span class="lineno"> 87 </span>
|
<span class="lineno"> 87 </span><span class="spaces"> </span><span class="istickedoff">-- Straight line:</span>
|
||||||
<span class="lineno"> 88 </span>toLineCommands :: [PathCommand] -> [LineCommand]
|
<span class="lineno"> 88 </span><span class="spaces"> </span><span class="istickedoff">LineBezier [dst] -> gets (distance dst) <* put dst</span>
|
||||||
<span class="lineno"> 89 </span><span class="decl"><span class="istickedoff">toLineCommands ps = evalState (worker <span class="nottickedoff">zero</span> <span class="nottickedoff">Nothing</span> ps) <span class="nottickedoff">zero</span></span>
|
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="istickedoff">-- Some kind of curve:</span>
|
||||||
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="istickedoff">LineBezier lst -> do</span>
|
||||||
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="istickedoff">worker _startPos _mbPrevControlPt [] = pure []</span>
|
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="istickedoff">from <- get</span>
|
||||||
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="istickedoff">worker startPos mbPrevControlPt (cmd:cmds) = do</span>
|
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="istickedoff">let bezier = rpointsToBezier (from:lst)</span>
|
||||||
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff">lcmds <- toLineCommand startPos <span class="nottickedoff">mbPrevControlPt</span> cmd</span>
|
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="istickedoff">tol = 0.0001</span>
|
||||||
<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff">let startPos' =</span>
|
<span class="lineno"> 94 </span><span class="spaces"> </span><span class="istickedoff">put (last lst)</span>
|
||||||
<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">case lcmds of</span>
|
<span class="lineno"> 95 </span><span class="spaces"> </span><span class="istickedoff">pure $ Bezier.arcLength bezier 1 tol</span>
|
||||||
<span class="lineno"> 96 </span><span class="spaces"> </span><span class="istickedoff">[LineMove pos] -> pos</span>
|
<span class="lineno"> 96 </span><span class="spaces"> </span><span class="istickedoff">LineEnd to -> gets (distance to) <* <span class="nottickedoff">put to</span></span></span>
|
||||||
<span class="lineno"> 97 </span><span class="spaces"> </span><span class="istickedoff">_ -> startPos</span>
|
<span class="lineno"> 97 </span>
|
||||||
<span class="lineno"> 98 </span><span class="spaces"> </span><span class="istickedoff">(lcmds++) <$> worker startPos' <span class="nottickedoff">(cmdToControlPoint $ last lcmds)</span> cmds</span></span>
|
<span class="lineno"> 98 </span>rpointsToBezier :: [RPoint] -> Bezier.CubicBezier Double
|
||||||
<span class="lineno"> 99 </span>
|
<span class="lineno"> 99 </span><span class="decl"><span class="istickedoff">rpointsToBezier lst =</span>
|
||||||
<span class="lineno"> 100 </span>cmdToControlPoint :: LineCommand -> Maybe RPoint
|
<span class="lineno"> 100 </span><span class="spaces"> </span><span class="istickedoff">case lst of</span>
|
||||||
<span class="lineno"> 101 </span><span class="decl"><span class="nottickedoff">cmdToControlPoint (LineBezier points) = Just (last (init points))</span>
|
<span class="lineno"> 101 </span><span class="spaces"> </span><span class="istickedoff">[a,b] -> <span class="nottickedoff">Bezier.CubicBezier a a b b</span></span>
|
||||||
<span class="lineno"> 102 </span><span class="spaces"></span><span class="nottickedoff">cmdToControlPoint _ = Nothing</span></span>
|
<span class="lineno"> 102 </span><span class="spaces"> </span><span class="istickedoff">[a,b,c] -> <span class="nottickedoff">Bezier.quadToCubic (Bezier.QuadBezier a b c)</span></span>
|
||||||
<span class="lineno"> 103 </span>
|
<span class="lineno"> 103 </span><span class="spaces"> </span><span class="istickedoff">[a,b,c,d] -> Bezier.CubicBezier a b c d</span>
|
||||||
<span class="lineno"> 104 </span>mkStraightLine :: RPoint -> LineCommand
|
<span class="lineno"> 104 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">error $ "rpointsToBezier: Invalid list of points: " ++ show lst</span></span></span>
|
||||||
<span class="lineno"> 105 </span><span class="decl"><span class="istickedoff">mkStraightLine p = LineBezier [p]</span></span>
|
<span class="lineno"> 105 </span>
|
||||||
<span class="lineno"> 106 </span>
|
<span class="lineno"> 106 </span>-- | Convert from path commands to line commands.
|
||||||
<span class="lineno"> 107 </span>toLineCommand :: RPoint -> Maybe RPoint -> PathCommand -> CmdM [LineCommand]
|
<span class="lineno"> 107 </span>toLineCommands :: [PathCommand] -> [LineCommand]
|
||||||
<span class="lineno"> 108 </span><span class="decl"><span class="istickedoff">toLineCommand startPos mbPrevControlPt cmd =</span>
|
<span class="lineno"> 108 </span><span class="decl"><span class="istickedoff">toLineCommands ps = evalState (worker <span class="nottickedoff">zero</span> <span class="nottickedoff">Nothing</span> ps) <span class="nottickedoff">zero</span></span>
|
||||||
<span class="lineno"> 109 </span><span class="spaces"> </span><span class="istickedoff">case cmd of</span>
|
<span class="lineno"> 109 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
<span class="lineno"> 110 </span><span class="spaces"> </span><span class="istickedoff">MoveTo OriginAbsolute [] -> <span class="nottickedoff">pure []</span></span>
|
<span class="lineno"> 110 </span><span class="spaces"> </span><span class="istickedoff">worker _startPos _mbPrevControlPt [] = pure []</span>
|
||||||
<span class="lineno"> 111 </span><span class="spaces"> </span><span class="istickedoff">MoveTo OriginAbsolute lst -> put (last lst) *> gets (pure.LineMove)</span>
|
<span class="lineno"> 111 </span><span class="spaces"> </span><span class="istickedoff">worker startPos mbPrevControlPt (cmd:cmds) = do</span>
|
||||||
<span class="lineno"> 112 </span><span class="spaces"> </span><span class="istickedoff">MoveTo OriginRelative lst -> <span class="nottickedoff">modify (+ sum lst) *> gets (pure.LineMove)</span></span>
|
<span class="lineno"> 112 </span><span class="spaces"> </span><span class="istickedoff">lcmds <- toLineCommand startPos <span class="nottickedoff">mbPrevControlPt</span> cmd</span>
|
||||||
<span class="lineno"> 113 </span><span class="spaces"> </span><span class="istickedoff">LineTo OriginAbsolute lst -> forM lst (\to -> <span class="nottickedoff">put to</span> $> mkStraightLine to)</span>
|
<span class="lineno"> 113 </span><span class="spaces"> </span><span class="istickedoff">let startPos' =</span>
|
||||||
<span class="lineno"> 114 </span><span class="spaces"> </span><span class="istickedoff">LineTo OriginRelative lst -> <span class="nottickedoff">forM lst (\to -> modify (+to) *> gets mkStraightLine)</span></span>
|
<span class="lineno"> 114 </span><span class="spaces"> </span><span class="istickedoff">case lcmds of</span>
|
||||||
<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff">HorizontalTo OriginAbsolute lst -></span>
|
<span class="lineno"> 115 </span><span class="spaces"> </span><span class="istickedoff">[LineMove pos] -> pos</span>
|
||||||
<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM lst $ \x -> modify (_x .~ x) *> gets mkStraightLine</span></span>
|
<span class="lineno"> 116 </span><span class="spaces"> </span><span class="istickedoff">_ -> startPos</span>
|
||||||
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="istickedoff">HorizontalTo OriginRelative lst -></span>
|
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="istickedoff">(lcmds++) <$> worker startPos' <span class="nottickedoff">(cmdToControlPoint $ last lcmds)</span> cmds</span></span>
|
||||||
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="istickedoff">forM lst $ \x -> modify (_x %~ (+x)) *> gets mkStraightLine</span>
|
<span class="lineno"> 118 </span>
|
||||||
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="istickedoff">VerticalTo OriginAbsolute lst -></span>
|
<span class="lineno"> 119 </span>cmdToControlPoint :: LineCommand -> Maybe RPoint
|
||||||
<span class="lineno"> 120 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM lst $ \y -> modify (_y .~ y) *> gets mkStraightLine</span></span>
|
<span class="lineno"> 120 </span><span class="decl"><span class="nottickedoff">cmdToControlPoint (LineBezier points) = Just (last (init points))</span>
|
||||||
<span class="lineno"> 121 </span><span class="spaces"> </span><span class="istickedoff">VerticalTo OriginRelative lst -></span>
|
<span class="lineno"> 121 </span><span class="spaces"></span><span class="nottickedoff">cmdToControlPoint _ = Nothing</span></span>
|
||||||
<span class="lineno"> 122 </span><span class="spaces"> </span><span class="istickedoff">forM lst $ \y -> modify (_y %~ (+y)) *> gets mkStraightLine</span>
|
<span class="lineno"> 122 </span>
|
||||||
<span class="lineno"> 123 </span><span class="spaces"> </span><span class="istickedoff">CurveTo OriginAbsolute quads -></span>
|
<span class="lineno"> 123 </span>mkStraightLine :: RPoint -> LineCommand
|
||||||
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM quads $ \(a,b,c) -> put c $> LineBezier [a,b,c]</span></span>
|
<span class="lineno"> 124 </span><span class="decl"><span class="istickedoff">mkStraightLine p = LineBezier [p]</span></span>
|
||||||
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="istickedoff">CurveTo OriginRelative quads -></span>
|
<span class="lineno"> 125 </span>
|
||||||
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM quads $ \(a,b,c) -> do</span></span>
|
<span class="lineno"> 126 </span>toLineCommand :: RPoint -> Maybe RPoint -> PathCommand -> CmdM [LineCommand]
|
||||||
<span class="lineno"> 127 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">from <- get <* modify (+c)</span></span>
|
<span class="lineno"> 127 </span><span class="decl"><span class="istickedoff">toLineCommand startPos mbPrevControlPt cmd =</span>
|
||||||
<span class="lineno"> 128 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">pure $ LineBezier $ map (+from) [a,b,c]</span></span>
|
<span class="lineno"> 128 </span><span class="spaces"> </span><span class="istickedoff">case cmd of</span>
|
||||||
<span class="lineno"> 129 </span><span class="spaces"> </span><span class="istickedoff">SmoothCurveTo o lst -> <span class="nottickedoff">mfix $ \result -> do</span></span>
|
<span class="lineno"> 129 </span><span class="spaces"> </span><span class="istickedoff">MoveTo OriginAbsolute [] -> <span class="nottickedoff">pure []</span></span>
|
||||||
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let ctrl = mbPrevControlPt : map cmdToControlPoint result</span></span>
|
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="istickedoff">MoveTo OriginAbsolute lst -> put (last lst) *> gets (pure.LineMove)</span>
|
||||||
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM (zip lst ctrl) $ \((c2,to), mbControl) -> do</span></span>
|
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="istickedoff">MoveTo OriginRelative lst -> <span class="nottickedoff">modify (+ sum lst) *> gets (pure.LineMove)</span></span>
|
||||||
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">from <- get <* adjustPosition o to</span></span>
|
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="istickedoff">LineTo OriginAbsolute lst -> forM lst (\to -> <span class="nottickedoff">put to</span> $> mkStraightLine to)</span>
|
||||||
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let c1 = maybe (makeAbsolute o from c2) (mirrorPoint from) mbControl</span></span>
|
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="istickedoff">LineTo OriginRelative lst -> <span class="nottickedoff">forM lst (\to -> modify (+to) *> gets mkStraightLine)</span></span>
|
||||||
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">pure $ LineBezier [c1,makeAbsolute o from c2,makeAbsolute o from to]</span></span>
|
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="istickedoff">HorizontalTo OriginAbsolute lst -></span>
|
||||||
<span class="lineno"> 135 </span><span class="spaces"> </span><span class="istickedoff">QuadraticBezier OriginAbsolute pairs -></span>
|
<span class="lineno"> 135 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM lst $ \x -> modify (_x .~ x) *> gets mkStraightLine</span></span>
|
||||||
<span class="lineno"> 136 </span><span class="spaces"> </span><span class="istickedoff">forM pairs $ \(a,b) -> <span class="nottickedoff">put b</span> $> LineBezier [a,b]</span>
|
<span class="lineno"> 136 </span><span class="spaces"> </span><span class="istickedoff">HorizontalTo OriginRelative lst -></span>
|
||||||
<span class="lineno"> 137 </span><span class="spaces"> </span><span class="istickedoff">QuadraticBezier OriginRelative pairs -></span>
|
<span class="lineno"> 137 </span><span class="spaces"> </span><span class="istickedoff">forM lst $ \x -> modify (_x %~ (+x)) *> gets mkStraightLine</span>
|
||||||
<span class="lineno"> 138 </span><span class="spaces"> </span><span class="istickedoff">forM pairs $ \(a,b) -> do</span>
|
<span class="lineno"> 138 </span><span class="spaces"> </span><span class="istickedoff">VerticalTo OriginAbsolute lst -></span>
|
||||||
<span class="lineno"> 139 </span><span class="spaces"> </span><span class="istickedoff">from <- get <* <span class="nottickedoff">modify (+b)</span></span>
|
<span class="lineno"> 139 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM lst $ \y -> modify (_y .~ y) *> gets mkStraightLine</span></span>
|
||||||
<span class="lineno"> 140 </span><span class="spaces"> </span><span class="istickedoff">pure $ LineBezier $ map (+from) [a,b]</span>
|
<span class="lineno"> 140 </span><span class="spaces"> </span><span class="istickedoff">VerticalTo OriginRelative lst -></span>
|
||||||
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="istickedoff">SmoothQuadraticBezierCurveTo o lst -> <span class="nottickedoff">mfix $ \result -> do</span></span>
|
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="istickedoff">forM lst $ \y -> modify (_y %~ (+y)) *> gets mkStraightLine</span>
|
||||||
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let ctrl = mbPrevControlPt : map cmdToControlPoint result</span></span>
|
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="istickedoff">CurveTo OriginAbsolute quads -></span>
|
||||||
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM (zip lst ctrl) $ \(to, mbControl) -> do</span></span>
|
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM quads $ \(a,b,c) -> put c $> LineBezier [a,b,c]</span></span>
|
||||||
<span class="lineno"> 144 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">from <- get <* adjustPosition o to</span></span>
|
<span class="lineno"> 144 </span><span class="spaces"> </span><span class="istickedoff">CurveTo OriginRelative quads -></span>
|
||||||
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let c1 = maybe from (mirrorPoint from) mbControl</span></span>
|
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM quads $ \(a,b,c) -> do</span></span>
|
||||||
<span class="lineno"> 146 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">pure $ LineBezier [c1,makeAbsolute o from to]</span></span>
|
<span class="lineno"> 146 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">from <- get <* modify (+c)</span></span>
|
||||||
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="istickedoff">EllipticalArc o points -> concat <$></span>
|
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">pure $ LineBezier $ map (+from) [a,b,c]</span></span>
|
||||||
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="istickedoff">forM points (\(rotX, rotY, angle, largeArc, sweepFlag, to) -> do</span>
|
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="istickedoff">SmoothCurveTo o lst -> <span class="nottickedoff">mfix $ \result -> do</span></span>
|
||||||
<span class="lineno"> 149 </span><span class="spaces"> </span><span class="istickedoff">from <- get <* adjustPosition o to</span>
|
<span class="lineno"> 149 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let ctrl = mbPrevControlPt : map cmdToControlPoint result</span></span>
|
||||||
<span class="lineno"> 150 </span><span class="spaces"> </span><span class="istickedoff">return $ convertSvgArc from rotX rotY angle largeArc sweepFlag (makeAbsolute o from to))</span>
|
<span class="lineno"> 150 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM (zip lst ctrl) $ \((c2,to), mbControl) -> do</span></span>
|
||||||
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="istickedoff">EndPath -> <span class="nottickedoff">put startPos</span> $> [LineEnd startPos]</span>
|
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">from <- get <* adjustPosition o to</span></span>
|
||||||
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let c1 = maybe (makeAbsolute o from c2) (mirrorPoint from) mbControl</span></span>
|
||||||
<span class="lineno"> 153 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">mirrorPoint c p = c*2-p</span></span>
|
<span class="lineno"> 153 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">pure $ LineBezier [c1,makeAbsolute o from c2,makeAbsolute o from to]</span></span>
|
||||||
<span class="lineno"> 154 </span><span class="spaces"> </span><span class="istickedoff">adjustPosition OriginRelative p = modify (+p)</span>
|
<span class="lineno"> 154 </span><span class="spaces"> </span><span class="istickedoff">QuadraticBezier OriginAbsolute pairs -></span>
|
||||||
<span class="lineno"> 155 </span><span class="spaces"> </span><span class="istickedoff">adjustPosition OriginAbsolute p = <span class="nottickedoff">put p</span></span>
|
<span class="lineno"> 155 </span><span class="spaces"> </span><span class="istickedoff">forM pairs $ \(a,b) -> <span class="nottickedoff">put b</span> $> LineBezier [a,b]</span>
|
||||||
<span class="lineno"> 156 </span><span class="spaces"> </span><span class="istickedoff">makeAbsolute OriginAbsolute _from p = <span class="nottickedoff">p</span></span>
|
<span class="lineno"> 156 </span><span class="spaces"> </span><span class="istickedoff">QuadraticBezier OriginRelative pairs -></span>
|
||||||
<span class="lineno"> 157 </span><span class="spaces"> </span><span class="istickedoff">makeAbsolute OriginRelative from p = from+p</span></span>
|
<span class="lineno"> 157 </span><span class="spaces"> </span><span class="istickedoff">forM pairs $ \(a,b) -> do</span>
|
||||||
<span class="lineno"> 158 </span>
|
<span class="lineno"> 158 </span><span class="spaces"> </span><span class="istickedoff">from <- get <* <span class="nottickedoff">modify (+b)</span></span>
|
||||||
<span class="lineno"> 159 </span>
|
<span class="lineno"> 159 </span><span class="spaces"> </span><span class="istickedoff">pure $ LineBezier $ map (+from) [a,b]</span>
|
||||||
<span class="lineno"> 160 </span>calculateVectorAngle :: Double -> Double -> Double -> Double -> Double
|
<span class="lineno"> 160 </span><span class="spaces"> </span><span class="istickedoff">SmoothQuadraticBezierCurveTo o lst -> <span class="nottickedoff">mfix $ \result -> do</span></span>
|
||||||
<span class="lineno"> 161 </span><span class="decl"><span class="istickedoff">calculateVectorAngle ux uy vx vy</span>
|
<span class="lineno"> 161 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let ctrl = mbPrevControlPt : map cmdToControlPoint result</span></span>
|
||||||
<span class="lineno"> 162 </span><span class="spaces"> </span><span class="istickedoff">| tb >= ta</span>
|
<span class="lineno"> 162 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">forM (zip lst ctrl) $ \(to, mbControl) -> do</span></span>
|
||||||
<span class="lineno"> 163 </span><span class="spaces"> </span><span class="istickedoff">= tb - ta</span>
|
<span class="lineno"> 163 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">from <- get <* adjustPosition o to</span></span>
|
||||||
<span class="lineno"> 164 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span></span>
|
<span class="lineno"> 164 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">let c1 = maybe from (mirrorPoint from) mbControl</span></span>
|
||||||
<span class="lineno"> 165 </span><span class="spaces"> </span><span class="istickedoff">= pi * 2 - (ta - tb)</span>
|
<span class="lineno"> 165 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">pure $ LineBezier [c1,makeAbsolute o from to]</span></span>
|
||||||
<span class="lineno"> 166 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 166 </span><span class="spaces"> </span><span class="istickedoff">EllipticalArc o points -> concat <$></span>
|
||||||
<span class="lineno"> 167 </span><span class="spaces"> </span><span class="istickedoff">ta = atan2 uy ux</span>
|
<span class="lineno"> 167 </span><span class="spaces"> </span><span class="istickedoff">forM points (\(rotX, rotY, angle, largeArc, sweepFlag, to) -> do</span>
|
||||||
<span class="lineno"> 168 </span><span class="spaces"> </span><span class="istickedoff">tb = atan2 vy vx</span></span>
|
<span class="lineno"> 168 </span><span class="spaces"> </span><span class="istickedoff">from <- get <* adjustPosition o to</span>
|
||||||
<span class="lineno"> 169 </span>
|
<span class="lineno"> 169 </span><span class="spaces"> </span><span class="istickedoff">return $ convertSvgArc from rotX rotY angle largeArc sweepFlag (makeAbsolute o from to))</span>
|
||||||
<span class="lineno"> 170 </span>-- ported from: https://github.com/vvvv/SVG/blob/master/Source/Paths/SvgArcSegment.cs
|
<span class="lineno"> 170 </span><span class="spaces"> </span><span class="istickedoff">EndPath -> <span class="nottickedoff">put startPos</span> $> [LineEnd startPos]</span>
|
||||||
<span class="lineno"> 171 </span>{- HLINT ignore convertSvgArc -}
|
<span class="lineno"> 171 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
<span class="lineno"> 172 </span>convertSvgArc :: RPoint -> Coord -> Coord -> Coord -> Bool -> Bool -> RPoint -> [LineCommand]
|
<span class="lineno"> 172 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">mirrorPoint c p = c*2-p</span></span>
|
||||||
<span class="lineno"> 173 </span><span class="decl"><span class="istickedoff">convertSvgArc (V2 x0 y0) radiusX radiusY angle largeArcFlag sweepFlag (V2 x y)</span>
|
<span class="lineno"> 173 </span><span class="spaces"> </span><span class="istickedoff">adjustPosition OriginRelative p = modify (+p)</span>
|
||||||
<span class="lineno"> 174 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">x0 == x && <span class="nottickedoff">y0 == y</span></span></span>
|
<span class="lineno"> 174 </span><span class="spaces"> </span><span class="istickedoff">adjustPosition OriginAbsolute p = <span class="nottickedoff">put p</span></span>
|
||||||
<span class="lineno"> 175 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">[]</span></span>
|
<span class="lineno"> 175 </span><span class="spaces"> </span><span class="istickedoff">makeAbsolute OriginAbsolute _from p = <span class="nottickedoff">p</span></span>
|
||||||
<span class="lineno"> 176 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">radiusX == 0.0 && <span class="nottickedoff">radiusY == 0.0</span></span></span>
|
<span class="lineno"> 176 </span><span class="spaces"> </span><span class="istickedoff">makeAbsolute OriginRelative from p = from+p</span></span>
|
||||||
<span class="lineno"> 177 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">[LineBezier [V2 x y]]</span></span>
|
<span class="lineno"> 177 </span>
|
||||||
<span class="lineno"> 178 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span></span>
|
<span class="lineno"> 178 </span>
|
||||||
<span class="lineno"> 179 </span><span class="spaces"> </span><span class="istickedoff">= calcSegments x0 y0 theta1' segments'</span>
|
<span class="lineno"> 179 </span>calculateVectorAngle :: Double -> Double -> Double -> Double -> Double
|
||||||
<span class="lineno"> 180 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 180 </span><span class="decl"><span class="istickedoff">calculateVectorAngle ux uy vx vy</span>
|
||||||
<span class="lineno"> 181 </span><span class="spaces"> </span><span class="istickedoff">sinPhi = sin (angle * pi/180)</span>
|
<span class="lineno"> 181 </span><span class="spaces"> </span><span class="istickedoff">| tb >= ta</span>
|
||||||
<span class="lineno"> 182 </span><span class="spaces"> </span><span class="istickedoff">cosPhi = cos (angle * pi/180)</span>
|
<span class="lineno"> 182 </span><span class="spaces"> </span><span class="istickedoff">= tb - ta</span>
|
||||||
<span class="lineno"> 183 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 183 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span></span>
|
||||||
<span class="lineno"> 184 </span><span class="spaces"> </span><span class="istickedoff">x1dash = cosPhi * (x0 - x) / 2.0 + sinPhi * (y0 - y) / 2.0</span>
|
<span class="lineno"> 184 </span><span class="spaces"> </span><span class="istickedoff">= pi * 2 - (ta - tb)</span>
|
||||||
<span class="lineno"> 185 </span><span class="spaces"> </span><span class="istickedoff">y1dash = -sinPhi * (x0 - x) / 2.0 + cosPhi * (y0 - y) / 2.0</span>
|
<span class="lineno"> 185 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
<span class="lineno"> 186 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 186 </span><span class="spaces"> </span><span class="istickedoff">ta = atan2 uy ux</span>
|
||||||
<span class="lineno"> 187 </span><span class="spaces"> </span><span class="istickedoff">numerator = radiusX * radiusX * radiusY * radiusY - radiusX * radiusX * y1dash * y1dash - radiusY * radiusY * x1dash * x1dash</span>
|
<span class="lineno"> 187 </span><span class="spaces"> </span><span class="istickedoff">tb = atan2 vy vx</span></span>
|
||||||
<span class="lineno"> 188 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 188 </span>
|
||||||
<span class="lineno"> 189 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">s = sqrt(1.0 - numerator / (radiusX * radiusX * radiusY * radiusY))</span></span>
|
<span class="lineno"> 189 </span>-- ported from: https://github.com/vvvv/SVG/blob/master/Source/Paths/SvgArcSegment.cs
|
||||||
<span class="lineno"> 190 </span><span class="spaces"> </span><span class="istickedoff">rx = if <span class="tickonlyfalse">(numerator < 0.0)</span> then <span class="nottickedoff">(radiusX * s)</span> else radiusX</span>
|
<span class="lineno"> 190 </span>{- HLINT ignore convertSvgArc -}
|
||||||
<span class="lineno"> 191 </span><span class="spaces"> </span><span class="istickedoff">ry = if <span class="tickonlyfalse">(numerator < 0.0)</span> then <span class="nottickedoff">(radiusY * s)</span> else radiusY</span>
|
<span class="lineno"> 191 </span>convertSvgArc :: RPoint -> Coord -> Coord -> Coord -> Bool -> Bool -> RPoint -> [LineCommand]
|
||||||
<span class="lineno"> 192 </span><span class="spaces"> </span><span class="istickedoff">root = if <span class="tickonlyfalse">(numerator < 0.0)</span></span>
|
<span class="lineno"> 192 </span><span class="decl"><span class="istickedoff">convertSvgArc (V2 x0 y0) radiusX radiusY angle largeArcFlag sweepFlag (V2 x y)</span>
|
||||||
<span class="lineno"> 193 </span><span class="spaces"> </span><span class="istickedoff">then <span class="nottickedoff">(0.0)</span></span>
|
<span class="lineno"> 193 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">x0 == x && <span class="nottickedoff">y0 == y</span></span></span>
|
||||||
<span class="lineno"> 194 </span><span class="spaces"> </span><span class="istickedoff">else ((if <span class="tickonlyfalse">((largeArcFlag && sweepFlag) || (not largeArcFlag && <span class="nottickedoff">not sweepFlag</span>))</span> then <span class="nottickedoff">(-1.0)</span> else 1.0) *</span>
|
<span class="lineno"> 194 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">[]</span></span>
|
||||||
<span class="lineno"> 195 </span><span class="spaces"> </span><span class="istickedoff">sqrt(numerator / (radiusX * radiusX * y1dash * y1dash + radiusY * radiusY * x1dash * x1dash)))</span>
|
<span class="lineno"> 195 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlyfalse">radiusX == 0.0 && <span class="nottickedoff">radiusY == 0.0</span></span></span>
|
||||||
<span class="lineno"> 196 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 196 </span><span class="spaces"> </span><span class="istickedoff">= <span class="nottickedoff">[LineBezier [V2 x y]]</span></span>
|
||||||
<span class="lineno"> 197 </span><span class="spaces"> </span><span class="istickedoff">cxdash = root * rx * y1dash / ry</span>
|
<span class="lineno"> 197 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span></span>
|
||||||
<span class="lineno"> 198 </span><span class="spaces"> </span><span class="istickedoff">cydash = -root * ry * x1dash / rx</span>
|
<span class="lineno"> 198 </span><span class="spaces"> </span><span class="istickedoff">= calcSegments x0 y0 theta1' segments'</span>
|
||||||
<span class="lineno"> 199 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 199 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
<span class="lineno"> 200 </span><span class="spaces"> </span><span class="istickedoff">cx = cosPhi * cxdash - sinPhi * cydash + (x0 + x) / 2.0</span>
|
<span class="lineno"> 200 </span><span class="spaces"> </span><span class="istickedoff">sinPhi = sin (angle * pi/180)</span>
|
||||||
<span class="lineno"> 201 </span><span class="spaces"> </span><span class="istickedoff">cy = sinPhi * cxdash + cosPhi * cydash + (y0 + y) / 2.0</span>
|
<span class="lineno"> 201 </span><span class="spaces"> </span><span class="istickedoff">cosPhi = cos (angle * pi/180)</span>
|
||||||
<span class="lineno"> 202 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 202 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 203 </span><span class="spaces"> </span><span class="istickedoff">theta1' = calculateVectorAngle 1.0 0.0 ((x1dash - cxdash) / rx) ((y1dash - cydash) / ry)</span>
|
<span class="lineno"> 203 </span><span class="spaces"> </span><span class="istickedoff">x1dash = cosPhi * (x0 - x) / 2.0 + sinPhi * (y0 - y) / 2.0</span>
|
||||||
<span class="lineno"> 204 </span><span class="spaces"> </span><span class="istickedoff">dtheta' = calculateVectorAngle ((x1dash - cxdash) / rx) ((y1dash - cydash) / ry) ((-x1dash - cxdash) / rx) ((-y1dash - cydash) / ry)</span>
|
<span class="lineno"> 204 </span><span class="spaces"> </span><span class="istickedoff">y1dash = -sinPhi * (x0 - x) / 2.0 + cosPhi * (y0 - y) / 2.0</span>
|
||||||
<span class="lineno"> 205 </span><span class="spaces"> </span><span class="istickedoff">dtheta = if <span class="tickonlytrue">(not sweepFlag && dtheta' > 0)</span></span>
|
<span class="lineno"> 205 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 206 </span><span class="spaces"> </span><span class="istickedoff">then (dtheta' - 2 * pi)</span>
|
<span class="lineno"> 206 </span><span class="spaces"> </span><span class="istickedoff">numerator = radiusX * radiusX * radiusY * radiusY - radiusX * radiusX * y1dash * y1dash - radiusY * radiusY * x1dash * x1dash</span>
|
||||||
<span class="lineno"> 207 </span><span class="spaces"> </span><span class="istickedoff">else <span class="nottickedoff">(if (sweepFlag && dtheta' < 0) then dtheta' + 2 * pi else dtheta')</span></span>
|
<span class="lineno"> 207 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 208 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 208 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">s = sqrt(1.0 - numerator / (radiusX * radiusX * radiusY * radiusY))</span></span>
|
||||||
<span class="lineno"> 209 </span><span class="spaces"> </span><span class="istickedoff">segments' = ceiling (abs (dtheta / (pi / 2.0)))</span>
|
<span class="lineno"> 209 </span><span class="spaces"> </span><span class="istickedoff">rx = if <span class="tickonlyfalse">(numerator < 0.0)</span> then <span class="nottickedoff">(radiusX * s)</span> else radiusX</span>
|
||||||
<span class="lineno"> 210 </span><span class="spaces"> </span><span class="istickedoff">delta = dtheta / fromInteger segments'</span>
|
<span class="lineno"> 210 </span><span class="spaces"> </span><span class="istickedoff">ry = if <span class="tickonlyfalse">(numerator < 0.0)</span> then <span class="nottickedoff">(radiusY * s)</span> else radiusY</span>
|
||||||
<span class="lineno"> 211 </span><span class="spaces"> </span><span class="istickedoff">t = 8.0 / 3.0 * sin(delta / 4.0) * sin(delta / 4.0) / sin(delta / 2.0)</span>
|
<span class="lineno"> 211 </span><span class="spaces"> </span><span class="istickedoff">root = if <span class="tickonlyfalse">(numerator < 0.0)</span></span>
|
||||||
<span class="lineno"> 212 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 212 </span><span class="spaces"> </span><span class="istickedoff">then <span class="nottickedoff">(0.0)</span></span>
|
||||||
<span class="lineno"> 213 </span><span class="spaces"> </span><span class="istickedoff">calcSegments startX startY theta1 segments</span>
|
<span class="lineno"> 213 </span><span class="spaces"> </span><span class="istickedoff">else ((if <span class="tickonlyfalse">((largeArcFlag && sweepFlag) || (not largeArcFlag && <span class="nottickedoff">not sweepFlag</span>))</span> then <span class="nottickedoff">(-1.0)</span> else 1.0) *</span>
|
||||||
<span class="lineno"> 214 </span><span class="spaces"> </span><span class="istickedoff">| segments == 0</span>
|
<span class="lineno"> 214 </span><span class="spaces"> </span><span class="istickedoff">sqrt(numerator / (radiusX * radiusX * y1dash * y1dash + radiusY * radiusY * x1dash * x1dash)))</span>
|
||||||
<span class="lineno"> 215 </span><span class="spaces"> </span><span class="istickedoff">= []</span>
|
<span class="lineno"> 215 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 216 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span></span>
|
<span class="lineno"> 216 </span><span class="spaces"> </span><span class="istickedoff">cxdash = root * rx * y1dash / ry</span>
|
||||||
<span class="lineno"> 217 </span><span class="spaces"> </span><span class="istickedoff">= LineBezier [ V2 (startX + dx1) (startY + dy1)</span>
|
<span class="lineno"> 217 </span><span class="spaces"> </span><span class="istickedoff">cydash = -root * ry * x1dash / rx</span>
|
||||||
<span class="lineno"> 218 </span><span class="spaces"> </span><span class="istickedoff">, V2 (endpointX + dxe) (endpointY + dye)</span>
|
<span class="lineno"> 218 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 219 </span><span class="spaces"> </span><span class="istickedoff">, V2 endpointX endpointY ] : calcSegments endpointX endpointY theta2 (segments - 1)</span>
|
<span class="lineno"> 219 </span><span class="spaces"> </span><span class="istickedoff">cx = cosPhi * cxdash - sinPhi * cydash + (x0 + x) / 2.0</span>
|
||||||
<span class="lineno"> 220 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 220 </span><span class="spaces"> </span><span class="istickedoff">cy = sinPhi * cxdash + cosPhi * cydash + (y0 + y) / 2.0</span>
|
||||||
<span class="lineno"> 221 </span><span class="spaces"> </span><span class="istickedoff">cosTheta1 = cos theta1</span>
|
<span class="lineno"> 221 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 222 </span><span class="spaces"> </span><span class="istickedoff">sinTheta1 = sin theta1</span>
|
<span class="lineno"> 222 </span><span class="spaces"> </span><span class="istickedoff">theta1' = calculateVectorAngle 1.0 0.0 ((x1dash - cxdash) / rx) ((y1dash - cydash) / ry)</span>
|
||||||
<span class="lineno"> 223 </span><span class="spaces"> </span><span class="istickedoff">theta2 = theta1 + delta</span>
|
<span class="lineno"> 223 </span><span class="spaces"> </span><span class="istickedoff">dtheta' = calculateVectorAngle ((x1dash - cxdash) / rx) ((y1dash - cydash) / ry) ((-x1dash - cxdash) / rx) ((-y1dash - cydash) / ry)</span>
|
||||||
<span class="lineno"> 224 </span><span class="spaces"> </span><span class="istickedoff">cosTheta2 = cos theta2</span>
|
<span class="lineno"> 224 </span><span class="spaces"> </span><span class="istickedoff">dtheta = if <span class="tickonlytrue">(not sweepFlag && dtheta' > 0)</span></span>
|
||||||
<span class="lineno"> 225 </span><span class="spaces"> </span><span class="istickedoff">sinTheta2 = sin theta2</span>
|
<span class="lineno"> 225 </span><span class="spaces"> </span><span class="istickedoff">then (dtheta' - 2 * pi)</span>
|
||||||
<span class="lineno"> 226 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 226 </span><span class="spaces"> </span><span class="istickedoff">else <span class="nottickedoff">(if (sweepFlag && dtheta' < 0) then dtheta' + 2 * pi else dtheta')</span></span>
|
||||||
<span class="lineno"> 227 </span><span class="spaces"> </span><span class="istickedoff">endpointX = cosPhi * rx * cosTheta2 - sinPhi * ry * sinTheta2 + cx</span>
|
<span class="lineno"> 227 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 228 </span><span class="spaces"> </span><span class="istickedoff">endpointY = sinPhi * rx * cosTheta2 + cosPhi * ry * sinTheta2 + cy</span>
|
<span class="lineno"> 228 </span><span class="spaces"> </span><span class="istickedoff">segments' = ceiling (abs (dtheta / (pi / 2.0)))</span>
|
||||||
<span class="lineno"> 229 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 229 </span><span class="spaces"> </span><span class="istickedoff">delta = dtheta / fromInteger segments'</span>
|
||||||
<span class="lineno"> 230 </span><span class="spaces"> </span><span class="istickedoff">dx1 = t * (-cosPhi * rx * sinTheta1 - sinPhi * ry * cosTheta1)</span>
|
<span class="lineno"> 230 </span><span class="spaces"> </span><span class="istickedoff">t = 8.0 / 3.0 * sin(delta / 4.0) * sin(delta / 4.0) / sin(delta / 2.0)</span>
|
||||||
<span class="lineno"> 231 </span><span class="spaces"> </span><span class="istickedoff">dy1 = t * (-sinPhi * rx * sinTheta1 + cosPhi * ry * cosTheta1)</span>
|
<span class="lineno"> 231 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 232 </span><span class="spaces"></span><span class="istickedoff"></span>
|
<span class="lineno"> 232 </span><span class="spaces"> </span><span class="istickedoff">calcSegments startX startY theta1 segments</span>
|
||||||
<span class="lineno"> 233 </span><span class="spaces"> </span><span class="istickedoff">dxe = t * (cosPhi * rx * sinTheta2 + sinPhi * ry * cosTheta2)</span>
|
<span class="lineno"> 233 </span><span class="spaces"> </span><span class="istickedoff">| segments == 0</span>
|
||||||
<span class="lineno"> 234 </span><span class="spaces"> </span><span class="istickedoff">dye = t * (sinPhi * rx * sinTheta2 - cosPhi * ry * cosTheta2)</span></span>
|
<span class="lineno"> 234 </span><span class="spaces"> </span><span class="istickedoff">= []</span>
|
||||||
<span class="lineno"> 235 </span>
|
<span class="lineno"> 235 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">otherwise</span></span>
|
||||||
<span class="lineno"> 236 </span>partialBezierPoints :: [RPoint] -> Double -> Double -> [RPoint]
|
<span class="lineno"> 236 </span><span class="spaces"> </span><span class="istickedoff">= LineBezier [ V2 (startX + dx1) (startY + dy1)</span>
|
||||||
<span class="lineno"> 237 </span><span class="decl"><span class="istickedoff">partialBezierPoints ps a b =</span>
|
<span class="lineno"> 237 </span><span class="spaces"> </span><span class="istickedoff">, V2 (endpointX + dxe) (endpointY + dye)</span>
|
||||||
<span class="lineno"> 238 </span><span class="spaces"> </span><span class="istickedoff">let c1 = Bezier.AnyBezier (V.fromList ps)</span>
|
<span class="lineno"> 238 </span><span class="spaces"> </span><span class="istickedoff">, V2 endpointX endpointY ] : calcSegments endpointX endpointY theta2 (segments - 1)</span>
|
||||||
<span class="lineno"> 239 </span><span class="spaces"> </span><span class="istickedoff">Bezier.AnyBezier os = Bezier.bezierSubsegment c1 a b</span>
|
<span class="lineno"> 239 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
<span class="lineno"> 240 </span><span class="spaces"> </span><span class="istickedoff">in V.toList os</span></span>
|
<span class="lineno"> 240 </span><span class="spaces"> </span><span class="istickedoff">cosTheta1 = cos theta1</span>
|
||||||
<span class="lineno"> 241 </span>
|
<span class="lineno"> 241 </span><span class="spaces"> </span><span class="istickedoff">sinTheta1 = sin theta1</span>
|
||||||
<span class="lineno"> 242 </span>interpolatePathCommands :: Double -> [PathCommand] -> [PathCommand]
|
<span class="lineno"> 242 </span><span class="spaces"> </span><span class="istickedoff">theta2 = theta1 + delta</span>
|
||||||
<span class="lineno"> 243 </span><span class="decl"><span class="nottickedoff">interpolatePathCommands alpha = lineToPath . partialLine alpha . toLineCommands</span></span>
|
<span class="lineno"> 243 </span><span class="spaces"> </span><span class="istickedoff">cosTheta2 = cos theta2</span>
|
||||||
<span class="lineno"> 244 </span>
|
<span class="lineno"> 244 </span><span class="spaces"> </span><span class="istickedoff">sinTheta2 = sin theta2</span>
|
||||||
<span class="lineno"> 245 </span>{- | Create an image showing portion of a path.
|
<span class="lineno"> 245 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 246 </span> Note that this only affects paths (see 'Reanimate.Svg.Constructors.mkPath').
|
<span class="lineno"> 246 </span><span class="spaces"> </span><span class="istickedoff">endpointX = cosPhi * rx * cosTheta2 - sinPhi * ry * sinTheta2 + cx</span>
|
||||||
<span class="lineno"> 247 </span> You can also use this with other SVG shapes if you convert them to path first (see 'Reanimate.Svg.pathify').
|
<span class="lineno"> 247 </span><span class="spaces"> </span><span class="istickedoff">endpointY = sinPhi * rx * cosTheta2 + cosPhi * ry * sinTheta2 + cy</span>
|
||||||
<span class="lineno"> 248 </span>
|
<span class="lineno"> 248 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 249 </span> Typical usage:
|
<span class="lineno"> 249 </span><span class="spaces"> </span><span class="istickedoff">dx1 = t * (-cosPhi * rx * sinTheta1 - sinPhi * ry * cosTheta1)</span>
|
||||||
<span class="lineno"> 250 </span>
|
<span class="lineno"> 250 </span><span class="spaces"> </span><span class="istickedoff">dy1 = t * (-sinPhi * rx * sinTheta1 + cosPhi * ry * cosTheta1)</span>
|
||||||
<span class="lineno"> 251 </span> > animate $ \t -> partialSvg t myPath
|
<span class="lineno"> 251 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||||
<span class="lineno"> 252 </span>-}
|
<span class="lineno"> 252 </span><span class="spaces"> </span><span class="istickedoff">dxe = t * (cosPhi * rx * sinTheta2 + sinPhi * ry * cosTheta2)</span>
|
||||||
<span class="lineno"> 253 </span>partialSvg :: Double -- ^ number between 0 and 1 inclusively, determining what portion of the path to show
|
<span class="lineno"> 253 </span><span class="spaces"> </span><span class="istickedoff">dye = t * (sinPhi * rx * sinTheta2 - cosPhi * ry * cosTheta2)</span></span>
|
||||||
<span class="lineno"> 254 </span> -> Tree -- ^ Image representing a path, of which we only want to display a portion determined by the first argument
|
<span class="lineno"> 254 </span>
|
||||||
<span class="lineno"> 255 </span> -> Tree
|
<span class="lineno"> 255 </span>partialBezierPoints :: [RPoint] -> Double -> Double -> [RPoint]
|
||||||
<span class="lineno"> 256 </span><span class="decl"><span class="istickedoff">partialSvg alpha | alpha >= 1 = id</span>
|
<span class="lineno"> 256 </span><span class="decl"><span class="istickedoff">partialBezierPoints ps a b =</span>
|
||||||
<span class="lineno"> 257 </span><span class="spaces"></span><span class="istickedoff">partialSvg alpha = mapTree worker</span>
|
<span class="lineno"> 257 </span><span class="spaces"> </span><span class="istickedoff">let c1 = Bezier.AnyBezier (V.fromList ps)</span>
|
||||||
<span class="lineno"> 258 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 258 </span><span class="spaces"> </span><span class="istickedoff">Bezier.AnyBezier os = Bezier.bezierSubsegment c1 a b</span>
|
||||||
<span class="lineno"> 259 </span><span class="spaces"> </span><span class="istickedoff">worker (PathTree path) =</span>
|
<span class="lineno"> 259 </span><span class="spaces"> </span><span class="istickedoff">in V.toList os</span></span>
|
||||||
<span class="lineno"> 260 </span><span class="spaces"> </span><span class="istickedoff">PathTree $ path & pathDefinition %~ lineToPath . partialLine alpha . toLineCommands</span>
|
<span class="lineno"> 260 </span>
|
||||||
<span class="lineno"> 261 </span><span class="spaces"> </span><span class="istickedoff">worker t = t</span></span>
|
<span class="lineno"> 261 </span>{- | Create an image showing portion of a path.
|
||||||
|
<span class="lineno"> 262 </span> Note that this only affects paths (see 'Reanimate.Svg.Constructors.mkPath').
|
||||||
|
<span class="lineno"> 263 </span> You can also use this with other SVG shapes if you convert them to path first (see 'Reanimate.Svg.pathify').
|
||||||
|
<span class="lineno"> 264 </span>
|
||||||
|
<span class="lineno"> 265 </span> Typical usage:
|
||||||
|
<span class="lineno"> 266 </span>
|
||||||
|
<span class="lineno"> 267 </span> > animate $ \t -> partialSvg t myPath
|
||||||
|
<span class="lineno"> 268 </span>-}
|
||||||
|
<span class="lineno"> 269 </span>partialSvg :: Double -- ^ number between 0 and 1 inclusively, determining what portion of the path to show
|
||||||
|
<span class="lineno"> 270 </span> -> Tree -- ^ Image representing a path, of which we only want to display a portion determined by the first argument
|
||||||
|
<span class="lineno"> 271 </span> -> Tree
|
||||||
|
<span class="lineno"> 272 </span><span class="decl"><span class="istickedoff">partialSvg alpha | alpha >= 1 = id</span>
|
||||||
|
<span class="lineno"> 273 </span><span class="spaces"></span><span class="istickedoff">partialSvg alpha = mapTree worker</span>
|
||||||
|
<span class="lineno"> 274 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
|
<span class="lineno"> 275 </span><span class="spaces"> </span><span class="istickedoff">worker (PathTree path) =</span>
|
||||||
|
<span class="lineno"> 276 </span><span class="spaces"> </span><span class="istickedoff">PathTree $ path & pathDefinition %~ lineToPath . partialLine alpha . toLineCommands</span>
|
||||||
|
<span class="lineno"> 277 </span><span class="spaces"> </span><span class="istickedoff">worker t = t</span></span>
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -37,57 +37,55 @@ span.spaces { background: white }
|
||||||
<span class="lineno"> 18 </span>import Graphics.SvgTree
|
<span class="lineno"> 18 </span>import Graphics.SvgTree
|
||||||
<span class="lineno"> 19 </span>import Linear.V2
|
<span class="lineno"> 19 </span>import Linear.V2
|
||||||
<span class="lineno"> 20 </span>
|
<span class="lineno"> 20 </span>
|
||||||
<span class="lineno"> 21 </span>type TMatrix = Matrix Coord
|
<span class="lineno"> 21 </span>-- | Identity matrix.
|
||||||
<span class="lineno"> 22 </span>
|
<span class="lineno"> 22 </span>--
|
||||||
<span class="lineno"> 23 </span>-- | Identity matrix.
|
<span class="lineno"> 23 </span>-- @transformPoints identity x = x@
|
||||||
<span class="lineno"> 24 </span>--
|
<span class="lineno"> 24 </span>identity :: Matrix Coord
|
||||||
<span class="lineno"> 25 </span>-- @transformPoints identity x = x@
|
<span class="lineno"> 25 </span><span class="decl"><span class="istickedoff">identity = M.identity 3</span></span>
|
||||||
<span class="lineno"> 26 </span>identity :: TMatrix
|
<span class="lineno"> 26 </span>
|
||||||
<span class="lineno"> 27 </span><span class="decl"><span class="istickedoff">identity = M.identity 3</span></span>
|
<span class="lineno"> 27 </span>fromList :: [Coord] -> Matrix Coord
|
||||||
<span class="lineno"> 28 </span>
|
<span class="lineno"> 28 </span><span class="decl"><span class="istickedoff">fromList [a,b,c,d,e,f] = M.fromList 3 3 [a,c,e,b,d,f,0,0,1]</span>
|
||||||
<span class="lineno"> 29 </span>fromList :: [Coord] -> TMatrix
|
<span class="lineno"> 29 </span><span class="spaces"></span><span class="istickedoff">fromList _ = <span class="nottickedoff">error "Reanimate.Transform.fromList: bad input"</span></span></span>
|
||||||
<span class="lineno"> 30 </span><span class="decl"><span class="istickedoff">fromList [a,b,c,d,e,f] = M.fromList 3 3 [a,c,e,b,d,f,0,0,1]</span>
|
<span class="lineno"> 30 </span>
|
||||||
<span class="lineno"> 31 </span><span class="spaces"></span><span class="istickedoff">fromList _ = <span class="nottickedoff">error "Reanimate.Transform.fromList: bad input"</span></span></span>
|
<span class="lineno"> 31 </span>-- | Apply a transformation matrix to a 2D point.
|
||||||
<span class="lineno"> 32 </span>
|
<span class="lineno"> 32 </span>transformPoint :: Matrix Coord -> RPoint -> RPoint
|
||||||
<span class="lineno"> 33 </span>-- | Apply a transformation matrix to a 2D point.
|
<span class="lineno"> 33 </span><span class="decl"><span class="istickedoff">transformPoint m (V2 x y) = V2 (a*x +c*y + e) (b*x + d*y +f)</span>
|
||||||
<span class="lineno"> 34 </span>transformPoint :: TMatrix -> RPoint -> RPoint
|
<span class="lineno"> 34 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||||
<span class="lineno"> 35 </span><span class="decl"><span class="istickedoff">transformPoint m (V2 x y) = V2 (a*x +c*y + e) (b*x + d*y +f)</span>
|
<span class="lineno"> 35 </span><span class="spaces"> </span><span class="istickedoff">!a = M.unsafeGet 1 1 m</span>
|
||||||
<span class="lineno"> 36 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 36 </span><span class="spaces"> </span><span class="istickedoff">!c = M.unsafeGet 1 2 m</span>
|
||||||
<span class="lineno"> 37 </span><span class="spaces"> </span><span class="istickedoff">!a = M.unsafeGet 1 1 m</span>
|
<span class="lineno"> 37 </span><span class="spaces"> </span><span class="istickedoff">!e = M.unsafeGet 1 3 m</span>
|
||||||
<span class="lineno"> 38 </span><span class="spaces"> </span><span class="istickedoff">!c = M.unsafeGet 1 2 m</span>
|
<span class="lineno"> 38 </span><span class="spaces"> </span><span class="istickedoff">!b = M.unsafeGet 2 1 m</span>
|
||||||
<span class="lineno"> 39 </span><span class="spaces"> </span><span class="istickedoff">!e = M.unsafeGet 1 3 m</span>
|
<span class="lineno"> 39 </span><span class="spaces"> </span><span class="istickedoff">!d = M.unsafeGet 2 2 m</span>
|
||||||
<span class="lineno"> 40 </span><span class="spaces"> </span><span class="istickedoff">!b = M.unsafeGet 2 1 m</span>
|
<span class="lineno"> 40 </span><span class="spaces"> </span><span class="istickedoff">!f = M.unsafeGet 2 3 m</span></span>
|
||||||
<span class="lineno"> 41 </span><span class="spaces"> </span><span class="istickedoff">!d = M.unsafeGet 2 2 m</span>
|
<span class="lineno"> 41 </span> -- (a:c:e:b:d:f:_) = M.toList m
|
||||||
<span class="lineno"> 42 </span><span class="spaces"> </span><span class="istickedoff">!f = M.unsafeGet 2 3 m</span></span>
|
<span class="lineno"> 42 </span>
|
||||||
<span class="lineno"> 43 </span> -- (a:c:e:b:d:f:_) = M.toList m
|
<span class="lineno"> 43 </span>-- | Convert multiple SVG transformations into a single transformation matrix.
|
||||||
<span class="lineno"> 44 </span>
|
<span class="lineno"> 44 </span>mkMatrix :: Maybe [Transformation] -> Matrix Coord
|
||||||
<span class="lineno"> 45 </span>-- | Convert multiple SVG transformations into a single transformation matrix.
|
<span class="lineno"> 45 </span><span class="decl"><span class="istickedoff">mkMatrix Nothing = identity</span>
|
||||||
<span class="lineno"> 46 </span>mkMatrix :: Maybe [Transformation] -> TMatrix
|
<span class="lineno"> 46 </span><span class="spaces"></span><span class="istickedoff">mkMatrix (Just ts) = foldl' (*) identity (map transformationMatrix ts)</span></span>
|
||||||
<span class="lineno"> 47 </span><span class="decl"><span class="istickedoff">mkMatrix Nothing = identity</span>
|
<span class="lineno"> 47 </span>
|
||||||
<span class="lineno"> 48 </span><span class="spaces"></span><span class="istickedoff">mkMatrix (Just ts) = foldl' (*) identity (map transformationMatrix ts)</span></span>
|
<span class="lineno"> 48 </span>-- | Convert an SVG transformation into a transformation matrix.
|
||||||
<span class="lineno"> 49 </span>
|
<span class="lineno"> 49 </span>transformationMatrix :: Transformation -> Matrix Coord
|
||||||
<span class="lineno"> 50 </span>-- | Convert an SVG transformation into a transformation matrix.
|
<span class="lineno"> 50 </span><span class="decl"><span class="istickedoff">transformationMatrix transformation =</span>
|
||||||
<span class="lineno"> 51 </span>transformationMatrix :: Transformation -> TMatrix
|
<span class="lineno"> 51 </span><span class="spaces"> </span><span class="istickedoff">case transformation of</span>
|
||||||
<span class="lineno"> 52 </span><span class="decl"><span class="istickedoff">transformationMatrix transformation =</span>
|
<span class="lineno"> 52 </span><span class="spaces"> </span><span class="istickedoff">TransformMatrix a b c d e f -> <span class="nottickedoff">fromList [a,b,c,d,e,f]</span></span>
|
||||||
<span class="lineno"> 53 </span><span class="spaces"> </span><span class="istickedoff">case transformation of</span>
|
<span class="lineno"> 53 </span><span class="spaces"> </span><span class="istickedoff">Translate x y -> <span class="nottickedoff">translate x y</span></span>
|
||||||
<span class="lineno"> 54 </span><span class="spaces"> </span><span class="istickedoff">TransformMatrix a b c d e f -> <span class="nottickedoff">fromList [a,b,c,d,e,f]</span></span>
|
<span class="lineno"> 54 </span><span class="spaces"> </span><span class="istickedoff">Scale sx mbSy -> fromList [sx,0,0,fromMaybe <span class="nottickedoff">sx</span> mbSy,0,0]</span>
|
||||||
<span class="lineno"> 55 </span><span class="spaces"> </span><span class="istickedoff">Translate x y -> <span class="nottickedoff">translate x y</span></span>
|
<span class="lineno"> 55 </span><span class="spaces"> </span><span class="istickedoff">Rotate a Nothing -> <span class="nottickedoff">rotate a</span></span>
|
||||||
<span class="lineno"> 56 </span><span class="spaces"> </span><span class="istickedoff">Scale sx mbSy -> fromList [sx,0,0,fromMaybe <span class="nottickedoff">sx</span> mbSy,0,0]</span>
|
<span class="lineno"> 56 </span><span class="spaces"> </span><span class="istickedoff">Rotate a (Just (x,y)) -> <span class="nottickedoff">translate x y * rotate a * translate (-x) (-y)</span></span>
|
||||||
<span class="lineno"> 57 </span><span class="spaces"> </span><span class="istickedoff">Rotate a Nothing -> <span class="nottickedoff">rotate a</span></span>
|
<span class="lineno"> 57 </span><span class="spaces"> </span><span class="istickedoff">SkewX a -> <span class="nottickedoff">fromList [1,0,tan (a*pi/180),1,0,0]</span></span>
|
||||||
<span class="lineno"> 58 </span><span class="spaces"> </span><span class="istickedoff">Rotate a (Just (x,y)) -> <span class="nottickedoff">translate x y * rotate a * translate (-x) (-y)</span></span>
|
<span class="lineno"> 58 </span><span class="spaces"> </span><span class="istickedoff">SkewY a -> <span class="nottickedoff">fromList [1,tan (a*pi/180),0,1,0,0]</span></span>
|
||||||
<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff">SkewX a -> <span class="nottickedoff">fromList [1,0,tan (a*pi/180),1,0,0]</span></span>
|
<span class="lineno"> 59 </span><span class="spaces"> </span><span class="istickedoff">TransformUnknown -> <span class="nottickedoff">identity</span></span>
|
||||||
<span class="lineno"> 60 </span><span class="spaces"> </span><span class="istickedoff">SkewY a -> <span class="nottickedoff">fromList [1,tan (a*pi/180),0,1,0,0]</span></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">TransformUnknown -> <span class="nottickedoff">identity</span></span>
|
<span class="lineno"> 61 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">translate x y = fromList [1,0,0,1,x,y]</span></span>
|
||||||
<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
<span class="lineno"> 62 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">rotate a = fromList [cos r,sin r,-sin r,cos r,0,0]</span></span>
|
||||||
<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">translate x y = fromList [1,0,0,1,x,y]</span></span>
|
<span class="lineno"> 63 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">where r = a * pi / 180</span></span></span>
|
||||||
<span class="lineno"> 64 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">rotate a = fromList [cos r,sin r,-sin r,cos r,0,0]</span></span>
|
<span class="lineno"> 64 </span>
|
||||||
<span class="lineno"> 65 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">where r = a * pi / 180</span></span></span>
|
<span class="lineno"> 65 </span>-- | Convert a transformation matrix back into an SVG transformation.
|
||||||
<span class="lineno"> 66 </span>
|
<span class="lineno"> 66 </span>toTransformation :: Matrix Coord -> Transformation
|
||||||
<span class="lineno"> 67 </span>-- | Convert a transformation matrix back into an SVG transformation.
|
<span class="lineno"> 67 </span><span class="decl"><span class="nottickedoff">toTransformation m = TransformMatrix a b c d e f</span>
|
||||||
<span class="lineno"> 68 </span>toTransformation :: TMatrix -> Transformation
|
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||||
<span class="lineno"> 69 </span><span class="decl"><span class="nottickedoff">toTransformation m = TransformMatrix a b c d e f</span>
|
<span class="lineno"> 69 </span><span class="spaces"> </span><span class="nottickedoff">[a,c,e,b,d,f,_,_,_] = M.toList m</span></span>
|
||||||
<span class="lineno"> 70 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
|
||||||
<span class="lineno"> 71 </span><span class="spaces"> </span><span class="nottickedoff">[a,c,e,b,d,f,_,_,_] = M.toList m</span></span>
|
|
||||||
|
|
||||||
</pre>
|
</pre>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue