// Imposition 1.00 




int prgalley(int file,int keyn,int reason,int arg1,int arg2,int arg3)
{
 int width1;

 switch(reason)
 {
  case 0:
         return(2);

  case 1:
         paperarea(0,2*arg1,arg2,0,papermarks());
         papermaxarea(-paperbleed(),2*arg1+paperbleed(),arg2+paperbleed(),-paperbleed());
         return(0);

  case 2:
  case 8:
 case 10:
         return(1+2+4);

  case 3:
         return(scale(0x10000,arg2,2*arg1));

  case 4:
         return(1);

  case 5:     
         width1=maxpagewidth(file);

         if(arg3)
         {
          paperpage(0,width1-arg1,arg2,
                      width1-arg1-paperbleed(),
                      width1,
                      arg2+paperbleed(),
                                       -paperbleed(),0);
         }
         else
         {
          paperpage(0,width1,arg2,
                      width1,
                      width1+arg1+paperbleed(),
                      arg2+paperbleed(),
                                       -paperbleed(),0);

         }

         paperarea(0,2*width1,arg2,0,papermarks());
         papermaxarea(-paperbleed(),2*width1+paperbleed(),
                                  arg2+paperbleed(),-paperbleed());

         return(0);

  case 6:
  case 7:
  case 9:
         return(0);
 }

 return(0);
}


int prgalleycount(int file,int keyn,int paperbits)
{
 int paper;

 paper=papercount(1);

 if((paperbits & 0xF)!=2)
 {
  paper=((paper+0x3)&~0x3)/2;
  paper/=2;
 }
 else
 {
  paper=((paper+1)&~0x1)/2; /* avoid trailing blank pages */
 }

 return(paper);
}



void prgalleysetup(int file,int keyn,int paperbits,int paperno,int nopaper)
{
 int bits;
 int paper;
 int parity;
 int oddevenall;
 int width1;
 int side;
 int step;

 paperfirstpage();
 paper=0;
 parity=1;
 side=1;
 step=1;

 width1=maxpagewidth(file);

 oddevenall=(paperbits & 0xF);
 if(oddevenall==2)
 {
  nopaper/=2;
  oddevenall=paperno & 0x1;
  paperno/=2;
 }


 bits=papernextpage();

 if(bits) papermaxarea(-paperbleed(),2*width1+paperbleed(),
                                      paperpageheight()+paperbleed(),-paperbleed());

 while(bits)
 {
  if(bits<0)
  {
   if((oddevenall==1 && !side) || (oddevenall==0 &&  side))
   {
    if(paper==paperno)
    {
     if((bits & 0x1)==parity)
     {
      paperarea(0,2*width1,paperpageheight(),0,papermarks());
      papermaxarea(-paperbleed(),2*width1+paperbleed(),
                                  paperpageheight()+paperbleed(),-paperbleed());

      if(!parity) /* right hand */
      {
       paperpage(1,width1,paperpageheight(),
                                       width1,
                                       width1+paperpagewidth()+paperbleed(),
                                       paperpageheight()+paperbleed(),
                                       -paperbleed(),0);
       break;
      }
      else
      {
       paperpage(0,width1-paperpagewidth(),paperpageheight(),
                                       width1-paperpagewidth()-paperbleed(),
                                       width1,
                                       paperpageheight()+paperbleed(),
                                       -paperbleed(),0);
      }
     }
    }
   }

   if(!parity)    /* i.e. we have output a sheet of paper */
   {
    if(side==0) paper+=step;
    side=1-side;
   }

   if((bits & 0x1)==parity)
   {
    bits=papernextpage();
   }
   parity^=1;
  }
  else
  {
   bits=papernextpage();
  }
 }
}



/*****************************************************************************/



int prpair(int file,int keyn,int reason,int arg1,int arg2,int arg3)
{
 if(reason==2) return(1);
 else return(prgalley(file,keyn,reason,arg1,arg2,arg3));
}



int prpamcount(int file,int keyn,int paperbits)
{
 int paper;

 paper=papercount(0);

 paper=((paper+0x3)&~0x3)/2;
 if((paperbits & 0xF)!=2) paper/=2;

 return(paper);
}



void prpamsetup(int file,int keyn,int paperbits,int paperno,int nopaper)
{
 int bits;
 int paper;
 int parity;
 int oddevenall;
 int width1;
 int side;
 int step;


 paperfirstpage();
 paper=0;
 parity=0;
 side=1;
 step=1;

 width1=maxpagewidth(file);

 oddevenall=(paperbits & 0xF);
 if(oddevenall==2)
 {
  nopaper/=2;
  oddevenall=paperno & 0x1;
  paperno/=2;
 }


 bits=papernextpage();

 if(bits) papermaxarea(-paperbleed(),2*width1+paperbleed(),
                                       paperpageheight()+paperbleed(),-paperbleed());

 while(bits)
 {
  if(bits<0)
  {
   if((oddevenall==1 && !side) || (oddevenall==0 &&  side))
   {
    if(paper==paperno)
    {
     if((bits & 0x1)==parity)
     {
      if(!parity) /* right hand */
      {
       paperpage(1,width1,paperpageheight(),
                                       width1,
                                       width1+paperpagewidth()+paperbleed(),
                                       paperpageheight()+paperbleed(),
                                       -paperbleed(),0);
      }
      else
      {
       paperpage(0,width1-paperpagewidth(),paperpageheight(),
                                       width1-paperpagewidth()-paperbleed(),
                                       width1,
                                       paperpageheight()+paperbleed(),
                                       -paperbleed(),0);
      }
     }

     paperarea(0,2*width1,paperpageheight(),0,papermarks());
     papermaxarea(-paperbleed(),2*width1+paperbleed(),
                                  paperpageheight()+paperbleed(),-paperbleed());

     if(step<0) break;
    }
   }

   if(step>0)
   {
    if(side==0)
    {
     paper+=step;
     if(paper==nopaper)
     {
      step=-1;
      paper+=step;
     }
     else side=1;
    }
    else
    {
     side=0;
    }
   }
   else
   {
    if(side==1)
    {
     paper+=step;
     side=0;
    }
    else
    {
     side=1;
    }
   }

   if((bits & 0x1)==parity)
   {
    bits=papernextpage();
   }
   parity^=1;
  }
  else
  {
   bits=papernextpage();
  }
 }
}


/****************************************************************************/



int prnormal(int file,int keyn,int reason,int arg1,int arg2,int arg3)
{

 switch(reason)
 {
  case 0:
         return(1);

  case 1:
         paperarea(0,arg1,arg2,0,papermarks());
         papermaxarea(-paperbleed(),arg1+paperbleed(),arg2+paperbleed(),-paperbleed());
         return(0);

  case 2:
  case 8:
 case 10:
         return(2+4);

  case 3:
         return(0x10000);

  case 4:
         return(0);

  case 5:
         paperarea(0,arg1,arg2,0,papermarks());
         papermaxarea(-paperbleed(),arg1+paperbleed(),
                                    arg2+paperbleed(),-paperbleed());

         paperpage(0,0,arg2,-paperbleed(),
                                    arg1+paperbleed(),
                                    arg2+paperbleed(),
                                    -paperbleed(),0);
         return(0);

  case 6:
  case 7:
  case 9:
         return(0);
 }

 return(0);
}



int prnormalcount(int file,int keyn,int paperbits)
{
 int paper;

 paper=papercount(((paperbits & 0xF)==2)?-1:0);

 if((paperbits & 0xF)!=2) paper=((paper+1)&~0x1)/2;

 return(paper);
}




void prnormalsetup(int file,int keyn,int paperbits,int paperno,int nopaper)
{
 int bits;
 int paper;
 int parity;


 paperfirstpage();
 paper=0;

 if((paperbits & 0xF)==2) parity=-1;
 else
 if((paperbits & 0xF)==1) parity=1;
 else                     parity=0;


 bits=papernextpage();

 if(bits) papermaxarea(-paperbleed(),paperpagewidth()+paperbleed(),
                                     paperpageheight()+paperbleed(),-paperbleed());

 while(bits)
 {
  if(bits<0)
  {
   if(((bits & 0x1)==parity) || parity<0)
   {
    if(paper==paperno)
    {
     paperarea(0,paperpagewidth(),paperpageheight(),0,papermarks());
     papermaxarea(-paperbleed(),paperpagewidth()+paperbleed(),
                                paperpageheight()+paperbleed(),-paperbleed());
  
     paperpage(0,0,paperpageheight(),-paperbleed(),
                                     paperpagewidth()+paperbleed(),
                                     paperpageheight()+paperbleed(),
                                     -paperbleed(),0);
     break;
    }
    paper++;
   }
  }
  bits=papernextpage();
 }
}


/****************************************************************************/

int print_handle;

int print_entry(int entry,int subcode)
{
 if(subcode || getprintmode()!=entry) setprintmode(entry);
 return(0);
}

int print_flags(int entry,string & text)
{
 return(entry==getprintmode());
}

int print_menu(int open)
{
 return(print_handle);
}


void create_print_menu(void)
{
 print_handle=create_menu("{PRM00}");

 addentry_menu(print_handle,"print_entry","print_flags","","","{PRM01}");
 addentry_menu(print_handle,"print_entry","print_flags","","","{PRM02}");
 addentry_menu(print_handle,"print_entry","print_flags","","","{PRM03}");
 addentry_menu(print_handle,"print_entry","print_flags","","","{PRM04}");
}




void main(void)
{
 create_print_menu();
 paperaddformat("{PRM01}",0,"prnormal","prnormalcount","prnormalsetup");
 paperaddformat("{PRM02}",1,"prgalley","prpamcount","prpamsetup");
 paperaddformat("{PRM03}",2,"prgalley","prgalleycount","prgalleysetup");
 paperaddformat("{PRM04}",3,"prpair","prpamcount","prpamsetup");
}


