// Booklet 1.01 


           

int prbookletgutter=17008; // 6mm
int prbookletpagesplit=0;
int prbookletdelta=0;


int prbooklet(int file,int keyn,int reason,int arg1,int arg2,int arg3)
{
 switch(reason)
 {
  case 0:
         return(4);
         break;

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

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

  case 3:
         return(0x10000);

  case 4:
         return(0);

  case 5:
         return(0);

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

 return(0);
}



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

 paper=papercount(0);

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

 return(paper);
}





void prbookletsetup(int file,int keyn,int paperbits,int paperno,int nopaper)
{
 int bits;
 int paper;
 int parity;
 int oddevenall;
 int width1;
 int side;
 int step;
 int upper;
 int yshift;
 int angle;
 int bleedr;
 int bleedl;
 int four;
 int right;
 int dx;

 width1=maxpagewidth(file);

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

 paper=papercount(0) & 0x7;
 four=(paper<=4 && paper>0);

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

 dx=prbookletpagesplit+(nopaper-paperno)*prbookletdelta;

 bits=papernextpage();

 if(bits) papermaxarea(-paperbleed()-dx,2*width1+dx+paperbleed(),
                        2*maxpageheight(file)+paperbleed(),-paperbleed());

 while(bits)
 {
  if(bits<0)
  {
   if((oddevenall==1 && !side) || (oddevenall==0 && side) || (four && paperno==0))
   {
    if(paper==paperno)
    {
     if((bits & 0x1)==parity)
     {
      yshift=upper?(maxpageheight(file)+prbookletgutter):0;
      angle=upper?180:0;
      if(upper) {bleedr=0;bleedl=paperbleed();}
      else      {bleedl=0;bleedr=paperbleed();}

      if(four && paperno==0) right=(step>0);
      else                   right=((step<0 && side==0) || (step>0 && side==1));

      if(right)    // right page
      {
       paperpage(1+upper*2,width1+dx+bleedl,paperpageheight()+yshift,
                                       width1+dx,
                                       width1+dx+paperpagewidth()+bleedr+bleedl,
                                       paperpageheight()+paperbleed()+yshift,
                                       -paperbleed()+yshift,angle);
       paperpagearea(1+upper*2,width1+dx,width1+dx+paperpagewidth(),
                     paperpageheight()+yshift,yshift,
                        papermarks() & (upper?(~0x7E6):(~0x3D5)));
      }
      else         // left page
      {
       paperpage(0+upper*2,width1-dx-paperpagewidth()-bleedl,paperpageheight()+yshift,
                                       width1-dx-paperpagewidth()-bleedr-bleedl,
                                       width1-dx,
                                       paperpageheight()+paperbleed()+yshift,
                                       -paperbleed()+yshift,angle);
       paperpagearea(upper*2,width1-dx-paperpagewidth(),width1-dx,
                               paperpageheight()+yshift,yshift,
                        papermarks() & (upper?(~0xE7A):(~0xDB9)));
      }
     }

     paperarea(-dx,2*width1+dx,2*maxpageheight(file)+prbookletgutter,0,papermarks() & (~0xF));
     papermaxarea(-paperbleed()-dx,2*width1+dx+paperbleed(),
                                2*maxpageheight(file)+paperbleed(),-paperbleed());

     if(step<0 && upper==0) break;
    }
   }



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

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



void main(void)
{
 paperaddformat("Booklet",4,"prbooklet","prbookletcount","prbookletsetup");
 addentry_menu(print_handle,"print_entry","print_flags","","","Booklet");
}
