// PSsupport 1.05


int pssupport_prtype;
int pssupport_printing = 0;
string pssupport_paper;


// when printer driver changes, read the printer driver type

void pssupport_prchange(int user)
{
 pssupport_prtype = (prinfo("") >> 16) & 0xFFFF;
}


void pssupport_prstart(int user, int view)
{
 int i;
 string c;
 string e = "PDriver$PSextra";
 string p = "PDriver$PSPaper";
 string t = "%%BeginFeature: PageSize ";

 if(pssupport_prtype)
  return;

 osclis("set OvationPro$PSextra <PDriver$PSextra>");
 osclis("set OvationPro$PSPaper <PDriver$PSPaper>");

 pssupport_paper = "";

 if(getenvs(e) && (i = e / t) >= 0)
 {
  osclis("set PDriver$PSextra %%BeginFeature: ManualFeed False|Jstatusdict begin /manualfeed false store end|J%%EndFeature|J");

  while(mids(e, i++ + slen(t), 1) != "\n");

  while((c = mids(e, i + slen(t), 1)) != "\n")
  {
   pssupport_paper += c;
   ++i;
  }
 }
 else
 if(getenvs(p))
 {
  osclis("set PDriver$PSPaper null:");

  for(i = slen(p); i > 0; --i)
  {
   if(mids(p, i - 1, 1) == ".")
   {
    pssupport_paper = p << i;
    break;
   }
  }
 }
 else
  messagebox("PDriver$PSextra and PDriver$PSPaper do not specify paper size.");
}


void pssupport_prend(int user, int view)
{
 string p = "PDriver$PSPaper";

 if(pssupport_prtype)
  return;

 // reset PDriver$PSextra
 osclis("set PDriver$PSextra <OvationPro$PSextra>");
 osclis("unset OvationPro$PSextra");

 // reset PDriver$PSPaper if it exists
 if(getenvs(p))
 {
  osclis("set PDriver$PSPaper <OvationPro$PSPaper>");
  osclis("unset OvationPro$PSPaper");
 }
}

void pssupport_goprinter(int user, int view)
{
 pssupport_printing = 1;
}


void pssupport_gonormal(int user, int view)
{
 pssupport_printing = 0;
}


void pssupport_prcache0(int user,int view)
{
 // set paper size

 if(pssupport_prtype == 0 && pssupport_printing)
 {
  int ps_file;
  string ps_error;
  string ps_line;
  
  ps_file=fileopen("Printers:ps.Paper."+pssupport_paper ,"r");
  if(!ps_file)
  {
   // file not in ps.paper so use normal Ovation Pro Code

   prprints("\nstatusdict /setpageparams known\n");
   prprints("{statusdict begin " + itos(paperwidth() / 1000) + " " + itos(paperheight() / 1000) + " 0 1 setpageparams end}\n");
   prprints("{" + pssupport_paper + "}\n");
   prprints("ifelse\n\n");
  }
  else
  {
   // Open the page definition file that is stored in !Printers.ps.Paper
   // if there is one and insert that code into the postscript that is generated.
   // If the page is not defined it uses the original OvationPro method.
   do 
   {
    if(!filereads(ps_line,ps_file) )
    {           
     prprints(ps_line);
    }
   }
   while(!fileeof(ps_file))
   fileclose(ps_file);
  }
 }
}


void pssupport_prcopies2(int user, int view)
{
 // re-insert Acorn PAR function to override ArtWorks version

 if(pssupport_prtype == 0 && pssupport_printing)
 {
  prprints("\n/PAR{6 -2 roll pop pop 10 dict begin dup 0 lt/hflip ED abs/h ED
dup 0 lt/wflip ED abs/w ED 256. div/uly ED 256. div/ulx ED 256. div/lry ED
256. div/lrx ED 256. div/lly ED 256. div/llx ED[lrx llx sub w div lry lly
sub w div ulx llx sub h div uly lly sub h div llx lly]concat hflip{0 h T 1
-1 scale}if wflip{w 0 T -1 1 scale}if end}BD\n\n");
 }
}


int pssupport_clipquery(int user, int claim)
{
 // if printing to PostScript, acknowledge that clipping is required
           
 if(!claim)
 {
  if(pssupport_prtype == 0 && pssupport_printing)
   claim = 1;
 }
 return(claim);
}


string pssupport_getx(int n)
{
 return(itos(getclipcurve(n) + prpagex() - prareax0())+" 400. div ");
}


string pssupport_gety(int n)
{
 return(itos((prpagey()/400)*400 - getclipcurve(n) - prareay0())+" 400. div ");
}


void pssupport_doclip(int user)
{
 int c, n;

 n = 0;

 while(c = getclipcurve(n++))
 {
  switch(c)
  {
   case 2:
          prprints(pssupport_getx(n++) + " " + pssupport_gety(n++) + " moveto\n");
          break;
   case 8:
          prprints(pssupport_getx(n++) + " " + pssupport_gety(n++) + " lineto\n");
          break;
   case 6:
          prprints(pssupport_getx(n++) + " " + pssupport_gety(n++) + " " + pssupport_getx(n++) + " " + pssupport_gety(n++) + " " + pssupport_getx(n++) + " " + pssupport_gety(n++) + " curveto\n");
          break;
   case 5:
          prprints("closepath\n");
          break;
  }
 }
 prprints("eoclip\n");
 prprints("newpath\n");
}


void main(void)
{
 addeventhandler(0x003,0,"pssupport_prchange");
 addeventhandler(0x116,0,"pssupport_prchange");
 addeventhandler(0x10C,0,"pssupport_prstart");
 addeventhandler(0x10D,0,"pssupport_prend");
 addeventhandler(0x100,0,"pssupport_goprinter");
 addeventhandler(0x102,0,"pssupport_gonormal");
 addeventhandler(0x10E,0,"pssupport_prcache0");
 addeventhandler(0x11A,0,"pssupport_prcopies2");
 addeventhandler(0x30A,0,"pssupport_clipquery");
 addeventhandler(0x30B,0,"pssupport_doclip");
}
