// Tile 1.01


int prtilex;
int prtiley;
int prtiledx;
int prtiledy;

int prtilemargin=8504; // 3mm


void prtileinit(int file,int paperbits)
{
 int paperw;
 int paperh;
 int temp;
 int sw;
 int sh;
 int dx;
 int dy;


 paperw=printerwidth()-2*prtilemargin;
 paperh=printerheight()-2*prtilemargin;

 if(paperw<0) {paperw=595276;paperh=841890;}
 if(paperbits & (1<<4)) {temp=paperw;paperw=paperh;paperh=temp;}

 dx=papermarkx(papermarks());
 if(dx<paperbleed()) dx=paperbleed();
 dy=papermarky(papermarks());
 if(dy<paperbleed()) dy=paperbleed();

 sw=scale(maxpagewidth(file),paperxscale(),0x10000);
 sh=scale(maxpageheight(file),paperyscale(),0x10000);

 prtilex=(sw+paperw-2*dx-1)/(paperw-2*dx);
 prtiley=(sh+paperh-2*dy-1)/(paperh-2*dy);

 prtiledx=scale(paperw,0x10000,paperxscale());
 prtiledy=scale(paperh,0x10000,paperyscale());
}






int prtile(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:
         prtileinit(file,paperbits());
 case 10:
         return(8+16);

  case 3:
         return(0x10000);

  case 4:
         return(0);

  case 5:
         return(0);

  case 6:
  case 7:
  case 9:
         prtileinit(file,paperbits());
         return(0);
 }

 return(0);
}



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

 prtileinit(file,paperbits);


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

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

 paper*=(prtilex*prtiley);

 return(paper);
}




void prtilesetup(int file,int keyn,int paperbits,int paperno,int nopaper)
{
 int bits;
 int paper;
 int parity;
 int tilex;
 int tiley;
 int pagemaxx;
 int pagemaxy;

 prtileinit(file,paperbits);

 tilex=paperno % prtilex;
 paperno/=prtilex;
 tiley=paperno % prtiley;
 paperno/=prtiley;


 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()+tilex*prtiledx,
                        (tilex+1)*prtiledx+paperbleed(),
                        (tiley+1)*prtiledy+paperbleed(),
                        tiley*prtiledy-paperbleed());

 while(bits)
 {
  if(bits<0)
  {
   if(paper==paperno)
   {
    pagemaxx=(tilex+1)*prtiledx;
    pagemaxy=(tiley+1)*prtiledy;
    if(pagemaxx>paperpagewidth())  pagemaxx=paperpagewidth();
    if(pagemaxy>paperpageheight()) pagemaxy=paperpageheight();

    paperarea(tilex*prtiledx,pagemaxx,pagemaxy,tiley*prtiledy,papermarks());

    papermaxarea(-paperbleed()+tilex*prtiledx,
                  (tilex+1)*prtiledx+paperbleed(),
                  (tiley+1)*prtiledy+paperbleed(),
                  tiley*prtiledy-paperbleed());

    paperpage(0,0,paperpageheight(),-paperbleed()+tilex*prtiledx,
                                    pagemaxx+paperbleed(),
                                    pagemaxy+paperbleed(),
                                     tiley*prtiledy-paperbleed(),0);
    break;
   }

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




int prtile_flags(int entry,string & text)
{
 text="Tile("+itos(prtilex)+"x"+itos(prtiley)+")";
 return(entry==getprintmode());
}



void main(void)
{
 paperaddformat("Tile",6,"prtile","prtilecount","prtilesetup");
 addentry_menu(print_handle,"print_entry","prtile_flags","","","Tile");
}


