/* $Log:	doodevpages.c,v $
 * Revision 0.8  92/11/23  19:46:40  19:46:40  bt (Bo Thide')
 * Fixed resolution bug. Portable downloading. Added/changed options. PJXL color support
 * 
 * Revision 0.7  92/11/13  02:41:24  02:41:24  bt (Bo Thide')
 * More bug fixes and improvements. Support for PaintJet XL
 * 
 * Revision 0.6  92/11/10  21:47:41  21:47:41  bt (Bo Thide')
 * Bug fixes. Added -R option. Better font handling.
 * 
 * Revision 0.5  92/11/09  16:25:27  16:25:27  bt (Bo Thide')
 * Rewrite of dospecial.c. Extended \special support
 * 
 * Revision 0.4  92/11/08  02:45:43  02:45:43  bt (Bo Thide')
 * Changed to portable bit manipulations. Replaced strrstr for non-POSIX compliant C. Fixed numerous bugs. Added support for more \special's.
 * 
 * Revision 0.3  92/08/24  12:45:35  12:45:35  bt (Bo Thide')
 * Fixed 8 bit (dc font) support.
 * 
 * Revision 0.2  92/08/23  17:28:55  17:28:55  bt (Bo Thide')
 * Source cleaned up.  Changed certain function calls.  Removed globals.
 * 
 * Revision 0.1  92/08/22  23:58:47  23:58:47  bt (Bo Thide')
 * First Release.
 *  */

/*
 * This routine processes all pages in the 'two-sided' mode.
 * Reverse is true for LaserJet+, but false for LaserJet II.
 *
 * If reverse is true, all even pages are output first in reverse order,
 * then the odd pages are output in reverse order.
 *
 * Example:
 * First even pages are output: 6 4 2 (2 on top, printed side upwards).
 * Then you turn the stack of paper (6 on top, printed side downwards) and
 * feed in 6 4 2, and 5 3 1 are printed on the other side.
 * 1 is now on top of the stack, printed side upwards.
 *
 * If reverse is false, all odd pages are output first in normal order,
 * then the even pages are output in reverse order.
 *
 * Example:
 * First odd pages are output: 1 3 5 (5 on top of stack, printed side
 * downwards). Then you take the stack of paper and
 * feed in 5 3 1 (5 on top, printed side downwards), and 6 4 2 are printed on
 * the other side. 1 is now on top of the stack, printed side upwards.
 */

#include <stdio.h>
#include "globals.h"
#include "pcl.h"

static char rcsid[] = "$Header: doodevpages.c,v 0.8 92/11/23 19:46:40 bt Exp $";

void doodevpages(bitfile, dvifile, pcllevel, reverse, resolution, device)
FILE	*bitfile;
FILE	*dvifile;
short	pcllevel;
bool	reverse;
short	resolution;
short	device;
{ 
	long	 backpage, startpage;
	short	 is_odd = actualpagecount % 2;

	if(inpostamble)
		backpage = lastpage + 1;
	else
		backpage = prevpage + 1;
	maxpages = actualpagecount;

	if (reverse)
	{	/* Start with even pages. */

		/* Eject an empty paper if odd number of pages */
		if (is_odd)  fputs(PCL4_EJECT_PAGE,bitfile);

		startpage = backpage;
		h_offset = e_offset;

		while(maxpages--)
		{ 
			fseek(dvifile , backpage , 0);
			scanbop(dvifile);
			backpage = prevpage + 1;
			if (! is_odd)
			{
				printbop(startvals, count);
				dopage(bitfile, dvifile, pcllevel, resolution,
				  device);
			}
			if(maxpages > 0)
			{ 
				fseek(dvifile , backpage , 0);
				scanbop(dvifile);
				if (is_odd)
				{
					printbop(startvals, count);
					dopage(bitfile, dvifile, pcllevel,
					  resolution, device);
				}
				backpage = prevpage + 1;
				maxpages--;
			}
		}

		/* then do the odd pages */
		fprintf(stderr,"Reload paper cassette with output package\n");
		fputs(PCL4_MANUAL_FEED,bitfile);

		h_offset = o_offset;
		maxpages = actualpagecount;
		backpage = startpage;
		while (maxpages-- > 0)
		{
			fseek(dvifile , backpage , 0);
			scanbop(dvifile);
			backpage = prevpage + 1;
			if (is_odd)
			{
				printbop(startvals, count);
				dopage(bitfile, dvifile, pcllevel, resolution,
				  device);
			}
			if(maxpages > 0)
			{ 
				fseek(dvifile , backpage , 0);
				scanbop(dvifile);
				if (! is_odd)
				{
					printbop(startvals, count);
					dopage(bitfile, dvifile, pcllevel,
					  resolution, device);
				}
				backpage = prevpage + 1;
				maxpages--;
			}
		}
	}
	else
	{
		/* Do odd pages first */
		h_offset = o_offset;
		maxpages = actualpagecount;
		fseek(dvifile , firstpage-1 , 0);
		while(maxpages-- > 0)
		{ 
			if(betweenpages(dvifile, PRESCAN_OFF))
			{ 
				printbop(startvals, count);
				dopage(bitfile, dvifile, pcllevel, resolution,
				  device);
				maxpages--;
				skipnextpage(dvifile);
			}
		}
		/* Then do the even pages */
		fprintf(stderr,"Reload paper cassette with output package\n");
		fputs(PCL4_MANUAL_FEED,bitfile);

		h_offset = e_offset;
		maxpages = actualpagecount;
		if (is_odd)  fputs(PCL4_EJECT_PAGE,bitfile); /* Odd number of pages */

		while(maxpages--)
		{ 
			fseek(dvifile , backpage , 0);
			scanbop(dvifile);
			backpage = prevpage + 1;
			if (! is_odd)
			{
				printbop(startvals, count);
				dopage(bitfile, dvifile, pcllevel, resolution,
				  device);
			}
			if(maxpages > 0)
			{ 
				fseek(dvifile , backpage , 0);
				scanbop(dvifile);
				if (is_odd)
				{
					printbop(startvals, count);
					dopage(bitfile, dvifile, pcllevel,
					  resolution, device);
				}
				backpage = prevpage + 1;
				maxpages--;
			}
		}
	}

	fprintf(stderr,"\n");
}
