%D \module
%D   [      file=simpleslides-s-Automaton,
%D        version=2010-08-10-15:28:22+0200,
%D          title=\CONTEXT\ Style File,
%D       subtitle=Presentation Module --- Automaton Style,
%D         author=Philipp Gesang,
%D           date=\currentdate,
%D      copyright={Philipp Gesang}]
%C
%C Copyright 2007 Aditya Mahajan and Thomas A. Schmitz
%C This file may be distributed under the GNU General Public License v. 2.0.
%C Modified 2010 by Philipp Gesang

%D Providing presentation Backgrounds according to Conway's Game of Life.
%D Initially based on the BigNumber theme by A. Mahajan and Th. Schmitz. (Many,
%D many thanks!)

\writestatus{simpleslides}{loading Theme Automata}

\startmodule[simpleslides-s-Automaton]

\setupmodule[
  mode=,
  file=,
  rule=,
  extendxy=,
  clip=,
] % using defaults from lua config

\ctxlua{environment.loadluafile( "automata-main" )}
\ctxlua{mplife.slides = true}

\unprotect

%D First, we change the page layout to have more space all around

\setuplayout [              width=fit,
                           margin=2cm,
                           height=fit,
	             leftmargindistance=.2cm,
	            rightmargindistance=.2cm,
                           header=18mm, 
                   headerdistance=.3cm,
                           footer=0cm, 
                   footerdistance=0mm,
                         topspace=.5cm, 
                        backspace=1.9cm,
                         location=singlesided]

\setuplayout [simpleslides:layout:horizontal][header=14mm]
\setuplayout [simpleslides:layout:vertical]  [header=0mm]
\setuplayout [simpleslides:layout:title]     

\setuplayer[simpleslides:layer:slidetitle]
    [width=\paperwidth,
    height=\paperheight,x=20mm]

%D Next we a generic frames, which will be used by other macros to
%D get a consistent look and feel.

\defineframed[simpleslides:framed:small]
             [ frame=off,
              offset=0pt,
               width=1.7cm,
               align=middle]

\setupcombinations[distance=2.5em]

%D These macros are used for placing figures/pictures:

\define\NormalHeight        {\textheight}
\define\NormalWidth         {.46\textwidth}
\define\PictureFrameHeight  {\textheight}
\define\PictureFrameWidth   {.46\textwidth}

%D This module has two color schemes, a blue one and a red one.

\startsetups simpleslides:setups:blue
\definecolor [simpleslides:contrastcolor]      [r=0.7,g=0.7,b=0.9]
\definecolor [simpleslides:backgroundoutside]  [r=0.9,g=0.9,b=0.95]
\definecolor [simpleslides:backgroundscreen]	 [s=.975]
\definecolor [simpleslides:textcolor]          [s=0]
\stopsetups

\startsetups simpleslides:setups:red
\definecolor [simpleslides:contrastcolor]     [r=0.4]
\definecolor [simpleslides:backgroundoutside] [r=0.5,g=0.2,b=0.2]
\definecolor [simpleslides:backgroundscreen]	[s=.4]
\definecolor [simpleslides:textcolor]         [s=1]
\stopsetups

%D Now we choose the scheme that the user asked for

\doifsetupselse
    {simpleslides:setups:\moduleparameter{simpleslides}{color}}
    {\setups{simpleslides:setups:\moduleparameter{simpleslides}{color}}}
    {\setups{simpleslides:setups:blue}}

\setupcolors[textcolor={simpleslides:textcolor}]

%D Set the initial snapshot (from file) and the rule, if given.

\doifsomethingelse{\moduleparameter{simpleslides}{mode}}
{\ctxlua{
mplife.setup.current.mode = "\luaescapestring{\moduleparameter{simpleslides}{mode}}"
if mplife.setup.current.mode == "life" then
    mplife.successive = mplife.gol_successive
else
    environment.loadluafile("automata-eca")
    mplife.successive = mplife.eca_successive
end}}
{\ctxlua{mplife.successive = mplife.gol_successive}}

%D The number of dead cells to add left and right / before and after
%D the initial frame.

\doifsomething{\moduleparameter{simpleslides}{extendxy}}{\ctxlua
    {mplife.setup.current.extendx = tonumber("\luaescapestring{\moduleparameter{simpleslides}{extendxy}}")
     mplife.setup.current.extendy = tonumber("\luaescapestring{\moduleparameter{simpleslides}{extendxy}}") }}

\doifsomething{\moduleparameter{simpleslides}{extendx}}{\ctxlua
    {mplife.setup.current.extendx = tonumber("\luaescapestring{\moduleparameter{simpleslides}{extendx}}") }}

\doifsomething{\moduleparameter{simpleslides}{extendy}}{\ctxlua
    {mplife.setup.current.extendy = tonumber("\luaescapestring{\moduleparameter{simpleslides}{extendy}}") }}

\doifsomething{\moduleparameter{simpleslides}{file}}{\ctxlua{
mplife.setup.current.file = "\luaescapestring{\moduleparameter{simpleslides}{file}}"
}}

\doifsomething{\moduleparameter{simpleslides}{clip}}{\ctxlua
    {mplife.setup.current.clip = "\luaescapestring{\moduleparameter{simpleslides}{clip}}" }}

\startluacode
do
    local c = mplife.setup.current
    if c.mode == "life" then
        c.init = gol.parse_file(c.file)
        c.last = c.init
    else
        c.init      = eca.parse_file(c.file)
        c.framesize = math.floor(c.aspect * c.init:len())
        c.pages     = structure.counters.record("realpage")["last"]
        -- Clipping is essential to cope with left/right propagation of
        -- patterns. E.g. with rule 158 the total propagation at iteration
        -- n is itself n to the left and n to the right. Whereas rule 102 
        -- (a Sierpiński fractal generator) protrudes only to the left at
        -- a rate of n.
        -- Frames cannot be simply cut off at the borders with adjacient 
        -- cells treated as “dead” because it would distort the pattern.
        -- Therefore, frames are generated as complete sections which are 
        -- clipped to the desired size, as specified by the initial row.
        -- To determine whether to clip your pattern to the left, right, 
        -- or in both directions, check the propagation at
        -- string.format("http://mathworld.wolfram.com/Rule%s.html", rule)
        -- or consult Wolfram's “A New Kind of Science” but beware not to
        -- buy everything he claims…
        if c.clip then
            c.xneeded   =   c.pages * c.framesize
            if c.clip == "both" then -- Assume initial pattern is centered.
                c.diff      = c.xneeded - math.ceil(c.init:len()/2)
            else
                c.diff      = c.xneeded - c.init:len()
            end
            if c.diff > 0 then
                local affix = ""
                for i=1, c.diff, 1 do
                    affix = affix .. "0"
                end
                if c.clip == "left"  or c.clip == "both" then
                    c.init = affix .. c.init
                end
                if c.clip == "right" or c.clip == "both" then
                    c.init = c.init .. affix
                end
            end
        end
    end
    mplife.setup.current = c
end
\stopluacode

\doifsomething{\moduleparameter{simpleslides}{rule}}{\ctxlua{
if mplife.setup.current.mode == "life" then
    mplife.setup.current.rule = gol.parse_rule("\luaescapestring{\moduleparameter{simpleslides}{rule}}") 
else
    mplife.setup.current.rule = eca.gen_rule(tonumber("\luaescapestring{\moduleparameter{simpleslides}{rule}}")) 
end
}}

%D We also use \METAPOST\ to draw the horizontal and vertical page backgrounds.
%D Backgrounds will be of solid color, the ornament gets the transparency.
                       
\startuniqueMPgraphic{simpleslides:MP:horizontal} 
StartPage ;
fill Page withcolor \MPcolor{simpleslides:backgroundoutside} ;
fill Field[Text][Text] enlarged 0.2cm
     withcolor \MPcolor{simpleslides:backgroundscreen} ;
StopPage ;
\stopuniqueMPgraphic 

\startuniqueMPgraphic{simpleslides:MP:vertical}
StartPage ;
fill Page withcolor \MPcolor{simpleslides:backgroundoutside} ;

z1 = urcorner Field[Text][Text] shifted (.2cm,0) ;
z2 = lrcorner Field[Text][Text] shifted (.2cm,-.2cm) ;
z3 = z1 shifted (-8.05cm,0) ;
z4 = (x3,y2) ;

save Main ;
path Main ;
Main := z1 -- z2 -- z4 -- z3 --cycle ;

fill Main withcolor \MPcolor{simpleslides:backgroundscreen} ;
StopPage ;
\stopuniqueMPgraphic


%D We define these backgrounds as overlays:

\defineoverlay 
  [simpleslides:background:horizontal] 
  [\useMPgraphic{simpleslides:MP:horizontal}] 

\defineoverlay 
  [simpleslides:background:vertical] 
  [\useMPgraphic{simpleslides:MP:vertical}] 

\defineoverlay 
  [simpleslides:background:title] 
  [\useMPgraphic{simpleslides:MP:horizontal}] 

\defineoverlay 
  [simpleslides:background:ornament] 
  [\ctxlua{mplife.successive()}] 

%D The slide title is placed on the top of the text area. The layer takes care
%D of the positioning.

\setupSlideTitle
   [\c!after=,
    \c!alternative=layer,
    \c!width=\textwidth,
    \c!height=2.5cm,
    \c!command=\doSlideTitle]


%D Squares are used as the first level of itemizations 

\definesymbol[1][$\square$]
\setupitemize[1][inmargin]
%\setupitemize[each][joinedup,unpacked]

\protect
\stopmodule

\endinput

