// Thumbnail 1.00




int prthumbsame;
int prthumbmode;


int prthumbx;
int prthumby;
int prthumbxgap;
int prthumbygap;
int prthumbxborder;
int prthumbyborder;

int prthumbx0;
int prthumby0;
int prthumbxgap0;
int prthumbygap0;

int prthumbx1;
int prthumby1;
int prthumbxgap1;
int prthumbygap1;

int prthumbx2=1;
int prthumby2=1;
int prthumbxgap2;
int prthumbygap2;


void prthumbwriteset(int mode)
{
 if(mode==1)
 {
  prthumbx1=prthumbx;
  prthumby1=prthumby;
  prthumbxgap1=prthumbxgap;
  prthumbygap1=prthumbygap;
 }
 else
 {
  prthumbx0=prthumbx;
  prthumby0=prthumby;
  prthumbxgap0=prthumbxgap;
  prthumbygap0=prthumbygap;
 }
}

void prthumbreadset(int mode)
{
 if(mode==2)
 {
  prthumbx=prthumbx2;
  prthumby=prthumby2;
  prthumbxgap=prthumbxgap2;
  prthumbygap=prthumbygap2;
  prthumbxborder=prthumbxgap/2;
  prthumbyborder=prthumbygap/2;
 }
 else
 if(mode==1)
 {
  prthumbx=prthumbx1;
  prthumby=prthumby1;
  prthumbxgap=prthumbxgap1;
  prthumbygap=prthumbygap1;
  prthumbxborder=prthumbxgap/2;
  prthumbyborder=prthumbygap/2;
 }
 else
 {
  prthumbx=prthumbx0;
  prthumby=prthumby0;
  prthumbxgap=prthumbxgap0;
  prthumbygap=prthumbygap0;
  prthumbxborder=0;
  prthumbyborder=0;
 }
}
 




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

         
 for(set=0;set<2;set++)
 {
  if(set)
  {
   paperw=paperwidth();
   paperh=paperheight();
  }
  else
  {
   paperw=printerwidth();
   paperh=printerheight();
  }

  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)+dx,paperxscale(),0x10000);
  sh=scale(maxpageheight(file)+dy,paperyscale(),0x10000);

  prthumbx=paperw/sw;
  prthumby=paperh/sh;
  if(prthumbx<=0) prthumbx=1;
  if(prthumby<=0) prthumby=1;

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

  prthumbxgap=paperw-prthumbx*sw;
  if(prthumbxgap<0) prthumbxgap=0;
  prthumbxgap/=prthumbx;
  prthumbxgap=scale(prthumbxgap,0x10000,paperxscale());
  
  prthumbygap=paperh-prthumby*sh;
  if(prthumbygap<0) prthumbygap=0;
  prthumbygap/=prthumby;
  prthumbygap=scale(prthumbygap,0x10000,paperyscale());

  prthumbwriteset(set);
 }

 prthumbreadset(prthumbmode);
}




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

 switch(reason)
 {
  case 0:
         return(prthumbx*prthumby);
         break;

  case 1:
         paperarea(0,prthumbx*(arg1+prthumbxgap)-prthumbxgap,
                     prthumby*(arg2+prthumbygap)-prthumbygap,0,papermarks());
         papermaxarea(-prthumbxborder,
                       prthumbx*(arg1+prthumbxgap)-prthumbxgap+prthumbxborder,
                       prthumby*(arg2+prthumbygap)-prthumbygap+prthumbyborder,-prthumbyborder);
         return(0);

  case 2:
         prthumbinit(file,paperbits());
 case 10:
         return(1+8+16);

  case 3:
         return(0x10000);

  case 4:
  case 5:
         return(0);

  case 6:
         tagwrite(file,0x1000,prthumbsame,0);
         tagwrite(file,0x1000,prthumbmode,1);
         tagwrite(file,0x1000,prthumbx2,2);
         tagwrite(file,0x1000,prthumby2,3);
         tagwrite(file,0x1000,prthumbxgap2,4);
         tagwrite(file,0x1000,prthumbygap2,5);
         return(0);

  case 7:
         if(tagexists(file,0x1000,0))
         {
          return((prthumbsame!=tagread(file,0x1000,0)) ||
                 (prthumbmode!=tagread(file,0x1000,1)) ||
                 (prthumbx2!=tagread(file,0x1000,2)) ||
                 (prthumby2!=tagread(file,0x1000,3)) ||
                 (prthumbxgap2!=tagread(file,0x1000,4)) ||
                 (prthumbygap2!=tagread(file,0x1000,5)));
         }
         return(1);

  case 8:
         if(tagexists(file,0x1000,0))
         {
          prthumbsame=tagread(file,0x1000,0);
          prthumbmode=tagread(file,0x1000,1);
          prthumbx2=tagread(file,0x1000,2);
          prthumby2=tagread(file,0x1000,3);
          prthumbxgap2=tagread(file,0x1000,4);
          prthumbygap2=tagread(file,0x1000,5);
         }
         prthumbinit(file,paperbits());
         return(1+8+16);

 case  9:
         prthumbinit(file,paperbits());
         return(0);

 }

 return(0);
}


int prthumbcount(int file,int keyn,int paperbits)
{
 int paper;
 int nmax;

 prthumbinit(file,paperbits);

 paper=papercount(-1);

 if(prthumbsame) nmax=1;
 else            nmax=prthumbx*prthumby;

 if((paperbits & 0xF)!=2) nmax*=2;
 paper=(paper+nmax-1)/(nmax);

 return(paper);
}



void prthumbsetup(int file,int keyn,int paperbits,int paperno,int nopaper)
{
 int bits;
 int paper;
 int oddevenall;
 int width1;
 int height1;
 int side;
 int step;
 int n;
 int nx;
 int ny;
 int nmax;
 int m;
 int mmin;
 int mmax;


 prthumbinit(file,paperbits);

 paperfirstpage();
 paper=0;
 side=1;
 step=1;
 n=0;
 nmax=prthumbx*prthumby;

 width1=maxpagewidth(file)+prthumbxgap;
 height1=maxpageheight(file)+prthumbygap;

 oddevenall=(paperbits & 0xF);

 papermaxarea(-prthumbxborder,
               prthumbx*width1-prthumbxgap+prthumbxborder,
               prthumby*height1-prthumbygap+prthumbyborder,-prthumbyborder);

 while((bits=papernextpage())!=0)
 {
  if(bits<0)
  {
   if((oddevenall==1 && !side) || (oddevenall==0 &&  side) || oddevenall==2)
   {
    if(paper==paperno)
    {
     if(prthumbsame) {mmin=0;mmax=nmax;}
     else            {mmin=n;mmax=n+1;}

     for(m=mmin;m<mmax;m++)
     {
      nx=m % prthumbx;
      ny=prthumby-(m/prthumbx)-1;

      paperpage(m,nx*width1,ny*height1+paperpageheight(),
                  nx*width1-paperbleed(),nx*width1+paperpagewidth()+paperbleed(),
                  ny*height1+paperpageheight()+paperbleed(),ny*height1-paperbleed(),0);
      paperpagearea(m,nx*width1,nx*width1+paperpagewidth(),
                                      ny*height1+paperpageheight(),ny*height1,papermarks());

      if(m==(nmax-1))
      {
       paperarea(0,prthumbx*width1-prthumbxgap,prthumby*height1-prthumbygap,0,0);
       papermaxarea(-prthumbxborder,
                    prthumbx*width1-prthumbxgap+prthumbxborder,
                    prthumby*height1-prthumbygap+prthumbyborder,-prthumbyborder);
       break;
      }
     }
    }
   }

   n++;
   if(n==nmax || prthumbsame)    /* i.e. we have output a sheet of paper */
   {
    n=0;
    if(oddevenall==2 || side==0) paper+=step;
    side=1-side;
   }
  }
 }
}




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


int prthumb_handle;
int prthumb_chandle;
int prthumb_ghandle;




int prthumb_gentry(int entry,int subcode)
{
 if(menuprevious(0)==0) prthumbxgap2=stringu(string_menu(prthumb_ghandle,0),-1);
 else                   prthumbygap2=stringu(string_menu(prthumb_ghandle,0),-1);
 return(0);
}



int prthumb_gflags(int entry,string & text)
{
 text=ustring((menuprevious(0)==0)?prthumbxgap2:prthumbygap2,-1);
 return((8<<24)|(8<<16)|WRITEABLE);
}



int prthumb_gap(int open)
{
 return(prthumb_ghandle);
}




int prthumb_centry(int entry,int subcode)
{
 string s;
 int    n;

 switch(entry)
 {
  case 2:
         prthumbx2=2;
         prthumby2=2;
         break;

  case 3:
         prthumbx2=3;
         prthumby2=3;
         break;

  case 4:
         prthumbx2=3;
         prthumby2=4;
         break;

  case 5:
         prthumbx2=4;
         prthumby2=3;
         break;

  case 6:
         prthumbx2=4;
         prthumby2=4;
         break;

  case 7:
         s=string_menu(prthumb_chandle,7);
         n=s/"x";
         if(n>=0)
         {
          prthumbx2=stoi(s>>n);
          prthumby2=stoi(s<<(n+1));
         }
         break;
 }


 return(0);
}



int prthumb_cflags(int entry,string & text)
{
 int code;
          
 code=0;

 switch(entry)
 {
  case 1:
         return(DOTTED);

  case 2:
         tick=0;
         code=(prthumbx2==2 && prthumby2==2);
         break;

  case 3:
         code=(prthumbx2==3 && prthumby2==3);
         break;

  case 4:
         code=(prthumbx2==3 && prthumby2==4);
         break;

  case 5:
         code=(prthumbx2==4 && prthumby2==3);
         break;

  case 6:
         code=(prthumbx2==4 && prthumby2==4);
         break;

  case 7:
         text=tick?"":(itos(prthumbx2)+"x"+itos(prthumby2));
         return((6<<24)|(6<<16)|WRITEABLE|!tick);
 }

 tick|=code;

 return(code);
}



int prthumb_custom(int open)
{
 return(prthumb_chandle);
}



int prthumb_entry(int entry,int subcode)
{
 switch(entry)
 {
  case 0:
         prthumbsame^=1;
         break;

  case 1:
  case 2:
  case 3:
         prthumbmode=entry-1;
         break;
 }

 prthumbreadset(prthumbmode);

 return(0);
}



int prthumb_flags(int entry,string & text)
{
 switch(entry)
 {
  case 0:
         return(DOTTED|prthumbsame);

  case 1:
         text="Print area("+itos(prthumbx0)+"x"+itos(prthumby0)+")";
         return(prthumbmode==0);

  case 2:
         text="Paper area("+itos(prthumbx1)+"x"+itos(prthumby1)+")";
         return(prthumbmode==1);

  case 3:
         text="Custom ("+itos(prthumbx2)+"x"+itos(prthumby2)+")";
         return(prthumbmode==2);
 }

 return(0);
}



int prthumb_menu(int open)
{

 return(prthumb_handle);
}


void prcreate_thumbmenu(void)
{
 prthumb_handle=create_menu("Thumbnail");
 addentry_menu(prthumb_handle,"prthumb_entry","prthumb_flags","","","All same");
 addentry_menu(prthumb_handle,"prthumb_entry","prthumb_flags","","","");
 addentry_menu(prthumb_handle,"prthumb_entry","prthumb_flags","","","");
 addentry_menu(prthumb_handle,"prthumb_entry","prthumb_flags","prthumb_custom","","");

 prthumb_chandle=create_menu("Custom");
 addentry_menu(prthumb_chandle,"prthumb_centry","prthumb_cflags","prthumb_gap","","X gap");
 addentry_menu(prthumb_chandle,"prthumb_centry","prthumb_cflags","prthumb_gap","","Y gap");
 addentry_menu(prthumb_chandle,"prthumb_centry","prthumb_cflags","","","2x2");
 addentry_menu(prthumb_chandle,"prthumb_centry","prthumb_cflags","","","3x3");
 addentry_menu(prthumb_chandle,"prthumb_centry","prthumb_cflags","","","3x4");
 addentry_menu(prthumb_chandle,"prthumb_centry","prthumb_cflags","","","4x3");
 addentry_menu(prthumb_chandle,"prthumb_centry","prthumb_cflags","","","4x4");
 addentry_menu(prthumb_chandle,"prthumb_centry","prthumb_cflags","","","4x4");

 prthumb_ghandle=create_menu("Gap");
 addentry_menu(prthumb_ghandle,"prthumb_gentry","prthumb_gflags","","","");

}




void main(void)
{
 paperaddformat("Thumbnails",5,"prthumb","prthumbcount","prthumbsetup");
 prcreate_thumbmenu();
 addentry_menu(print_handle,"print_entry","print_flags","prthumb_menu","","Thumbnails");
}


