/* -*-ePiX-*- */
#include "epix.h"
using namespace ePiX;

void emph(const std::string& prog)
{
  if (prog == "all")
    black();
  else
    {
      bbold(Red());
      label_color(Blue());
      label_mask(Yellow(0.1));
      label_border(Red(), "0.1pt");
    }
}

void restore(const std::string& prog)
{
  if (prog == "all")
    emph(prog);

  else
    {
      plain();
      black(0.5);
      label_mask(Neutral());
    }
}

void diagram(const std::string& prog)
{
  font_size("footnotesize");
  arrow_width(1.5);
  restore(prog);

  if (prog != "laps")
    emph(prog);

  arrow(P(0,1), P(1,1));

  dot(P(0,1), P(0,4), "\\texttt{xp}, \\texttt{flx}", t);
  dot(P(1,1), P(2,4), "\\texttt{eepic}", t);
  restore(prog);

  if (prog != "epix")
    emph(prog);

  spline(P(1,1), P(1.2,1), P(1.3,0.5), P(1.5,0.5));
  arrow(P(1.5,0.5), P(2,0.5));
  arrow(P(2,0.5), P(3,0.5));

  dot(P(2,0.5), P(0,4), "\\texttt{dvi}", t);
  dot(P(3,0.5), P(-2,2), "\\texttt{ps}", tl);
  restore(prog);

  if(prog == "laps")
    emph(prog);

  spline(P(1,0), P(1.2,0), P(1.3,0.5), P(1.5,0.5));

  dot(P(1,0), P(2,-4), "\\texttt{tex}", b);

  if (prog == "elaps") // and laps
    emph(prog);

  arrow(P(3,0.5), P(3.5,0), P(4,0));

  dot(P(4,0), P(4,0), "\\texttt{pdf}", r);
  restore(prog);

  if (prog == "elaps" || prog == "flix")
    emph(prog);

  arrow(P(3,0.5), P(3.5,1), P(4,1));

  dot(P(4,1), P(-2,4), "\\texttt{eps}", t);
  restore(prog);

  if(prog == "flix")
    emph(prog);

  arrow(P(4,1), P(5,1));

  dot(P(5,1), P(4,0),
      "\\begin{minipage}{0.225in}\\texttt{png mng gif}\\end{minipage}", r);
  restore(prog);

  if (prog != "all")
    {
      font_size("Large");
      font_face("tt");
      label_color(Green(0.6));
      label(P(2.5,0), prog);
    }

}

int main()
{
#ifdef SHOW_ALL
  picture(P(-0.5,0), P(5.75,10), "4 x 7.5 in");
#else
  picture(P(-0.5,2), P(5.75,10), "4 x 7.5 in");
#endif

  begin();
  //  border();

  screen laps(P(0,0), P(5,1));
  activate(laps);

  diagram("laps");
  laps.v_scale(0.5, P(0,0.5));
  inset(laps, P(0,8), P(5,10));
  deactivate(laps);


  screen epix(P(0,0), P(5,1));
  activate(epix);

  diagram("epix");
  epix.v_scale(0.5, P(0,0.5));
  inset(epix, P(0,6), P(5,8));
  deactivate(epix);


  screen elaps(P(0,0), P(5,1));
  activate(elaps);

  diagram("elaps");
  elaps.v_scale(0.5, P(0,0.5));
  inset(elaps, P(0,4), P(5,6));
  deactivate(elaps);


  screen flix(P(0,0), P(5,1));
  activate(flix);

  diagram("flix");
  flix.v_scale(0.5, P(0,0.5));
  inset(flix, P(0,2), P(5,4));
  deactivate(flix);

#ifdef SHOW_ALL
  screen all(P(0,0), P(5,1));
  activate(all);

  diagram("all");
  all.v_scale(0.5, P(0,0.5));
  inset(all, P(0,0), P(5,2));
  deactivate(all);
#endif

  end();
}