roentgen b75cab
/* $Id: tiff2pdf.c,v 1.69 2012-07-19 15:43:41 tgl Exp $
roentgen b75cab
 *
roentgen b75cab
 * tiff2pdf - converts a TIFF image to a PDF document
roentgen b75cab
 *
roentgen b75cab
 * Copyright (c) 2003 Ross Finlayson
roentgen b75cab
 *
roentgen b75cab
 * Permission to use, copy, modify, distribute, and sell this software and 
roentgen b75cab
 * its documentation for any purpose is hereby granted without fee, provided
roentgen b75cab
 * that (i) the above copyright notices and this permission notice appear in
roentgen b75cab
 * all copies of the software and related documentation, and (ii) the name of
roentgen b75cab
 * Ross Finlayson may not be used in any advertising or
roentgen b75cab
 * publicity relating to the software without the specific, prior written
roentgen b75cab
 * permission of Ross Finlayson.
roentgen b75cab
 * 
roentgen b75cab
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
roentgen b75cab
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
roentgen b75cab
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
roentgen b75cab
 * 
roentgen b75cab
 * IN NO EVENT SHALL ROSS FINLAYSON BE LIABLE FOR
roentgen b75cab
 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
roentgen b75cab
 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
roentgen b75cab
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
roentgen b75cab
 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
roentgen b75cab
 * OF THIS SOFTWARE.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
#include "tif_config.h"
roentgen b75cab
roentgen b75cab
#include <stdio.h>
roentgen b75cab
#include <stdlib.h>
roentgen b75cab
#include <string.h>
roentgen b75cab
#include <ctype.h>
roentgen b75cab
#include <time.h>
roentgen b75cab
#include <errno.h>
roentgen b75cab
roentgen b75cab
#if HAVE_UNISTD_H
roentgen b75cab
# include <unistd.h>
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
#ifdef HAVE_FCNTL_H
roentgen b75cab
# include <fcntl.h>
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
#ifdef HAVE_IO_H
roentgen b75cab
# include <io.h>
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
#ifdef NEED_LIBPORT
roentgen b75cab
# include "libport.h"
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
#include "tiffiop.h"
roentgen b75cab
#include "tiffio.h"
roentgen b75cab
roentgen b75cab
#ifndef HAVE_GETOPT
roentgen b75cab
extern int getopt(int, char**, char*);
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
#ifndef EXIT_SUCCESS
roentgen b75cab
# define EXIT_SUCCESS	0
roentgen b75cab
#endif
roentgen b75cab
#ifndef EXIT_FAILURE
roentgen b75cab
# define EXIT_FAILURE	1
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
#define TIFF2PDF_MODULE "tiff2pdf"
roentgen b75cab
roentgen b75cab
#define PS_UNIT_SIZE	72.0F
roentgen b75cab
roentgen b75cab
/* This type is of PDF color spaces. */
roentgen b75cab
typedef enum {
roentgen b75cab
	T2P_CS_BILEVEL = 0x01,	/* Bilevel, black and white */
roentgen b75cab
	T2P_CS_GRAY = 0x02,	/* Single channel */
roentgen b75cab
	T2P_CS_RGB = 0x04,	/* Three channel tristimulus RGB */
roentgen b75cab
	T2P_CS_CMYK = 0x08,	/* Four channel CMYK print inkset */
roentgen b75cab
	T2P_CS_LAB = 0x10,	/* Three channel L*a*b* color space */
roentgen b75cab
	T2P_CS_PALETTE = 0x1000,/* One of the above with a color map */
roentgen b75cab
	T2P_CS_CALGRAY = 0x20,	/* Calibrated single channel */
roentgen b75cab
	T2P_CS_CALRGB = 0x40,	/* Calibrated three channel tristimulus RGB */
roentgen b75cab
	T2P_CS_ICCBASED = 0x80	/* ICC profile color specification */
roentgen b75cab
} t2p_cs_t;
roentgen b75cab
roentgen b75cab
/* This type is of PDF compression types.  */
roentgen b75cab
typedef enum{
roentgen b75cab
	T2P_COMPRESS_NONE=0x00
roentgen b75cab
#ifdef CCITT_SUPPORT
roentgen b75cab
	, T2P_COMPRESS_G4=0x01
roentgen b75cab
#endif
roentgen b75cab
#if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
roentgen b75cab
	, T2P_COMPRESS_JPEG=0x02
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
	, T2P_COMPRESS_ZIP=0x04
roentgen b75cab
#endif
roentgen b75cab
} t2p_compress_t;
roentgen b75cab
roentgen b75cab
/* This type is whether TIFF image data can be used in PDF without transcoding. */
roentgen b75cab
typedef enum{
roentgen b75cab
	T2P_TRANSCODE_RAW=0x01, /* The raw data from the input can be used without recompressing */
roentgen b75cab
	T2P_TRANSCODE_ENCODE=0x02 /* The data from the input is perhaps unencoded and reencoded */
roentgen b75cab
} t2p_transcode_t;
roentgen b75cab
roentgen b75cab
/* This type is of information about the data samples of the input image. */
roentgen b75cab
typedef enum{
roentgen b75cab
	T2P_SAMPLE_NOTHING=0x0000, /* The unencoded samples are normal for the output colorspace */
roentgen b75cab
	T2P_SAMPLE_ABGR_TO_RGB=0x0001, /* The unencoded samples are the result of ReadRGBAImage */
roentgen b75cab
	T2P_SAMPLE_RGBA_TO_RGB=0x0002, /* The unencoded samples are contiguous RGBA */
roentgen b75cab
	T2P_SAMPLE_RGBAA_TO_RGB=0x0004, /* The unencoded samples are RGBA with premultiplied alpha */
roentgen b75cab
	T2P_SAMPLE_YCBCR_TO_RGB=0x0008, 
roentgen b75cab
	T2P_SAMPLE_YCBCR_TO_LAB=0x0010, 
roentgen b75cab
	T2P_SAMPLE_REALIZE_PALETTE=0x0020, /* The unencoded samples are indexes into the color map */
roentgen b75cab
	T2P_SAMPLE_SIGNED_TO_UNSIGNED=0x0040, /* The unencoded samples are signed instead of unsignd */
roentgen b75cab
	T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED=0x0040, /* The L*a*b* samples have a* and b* signed */
roentgen b75cab
	T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG=0x0100 /* The unencoded samples are separate instead of contiguous */
roentgen b75cab
} t2p_sample_t;
roentgen b75cab
roentgen b75cab
/* This type is of error status of the T2P struct. */
roentgen b75cab
typedef enum{
roentgen b75cab
	T2P_ERR_OK = 0, /* This is the value of t2p->t2p_error when there is no error */
roentgen b75cab
	T2P_ERR_ERROR = 1 /* This is the value of t2p->t2p_error when there was an error */
roentgen b75cab
} t2p_err_t;
roentgen b75cab
roentgen b75cab
/* This struct defines a logical page of a TIFF. */
roentgen b75cab
typedef struct {
roentgen b75cab
	tdir_t page_directory;
roentgen b75cab
	uint32 page_number;
roentgen b75cab
	ttile_t page_tilecount;
roentgen b75cab
	uint32 page_extra;
roentgen b75cab
} T2P_PAGE;
roentgen b75cab
roentgen b75cab
/* This struct defines a PDF rectangle's coordinates. */
roentgen b75cab
typedef struct {
roentgen b75cab
	float x1;
roentgen b75cab
	float y1;
roentgen b75cab
	float x2;
roentgen b75cab
	float y2;
roentgen b75cab
	float mat[9];
roentgen b75cab
} T2P_BOX;
roentgen b75cab
roentgen b75cab
/* This struct defines a tile of a PDF.  */
roentgen b75cab
typedef struct {
roentgen b75cab
	T2P_BOX tile_box;
roentgen b75cab
} T2P_TILE;
roentgen b75cab
roentgen b75cab
/* This struct defines information about the tiles on a PDF page. */
roentgen b75cab
typedef struct {
roentgen b75cab
	ttile_t tiles_tilecount;
roentgen b75cab
	uint32 tiles_tilewidth;
roentgen b75cab
	uint32 tiles_tilelength;
roentgen b75cab
	uint32 tiles_tilecountx;
roentgen b75cab
	uint32 tiles_tilecounty;
roentgen b75cab
	uint32 tiles_edgetilewidth;
roentgen b75cab
	uint32 tiles_edgetilelength;
roentgen b75cab
	T2P_TILE* tiles_tiles;
roentgen b75cab
} T2P_TILES;
roentgen b75cab
roentgen b75cab
/* This struct is the context of a function to generate PDF from a TIFF. */
roentgen b75cab
typedef struct {
roentgen b75cab
	t2p_err_t t2p_error;
roentgen b75cab
	T2P_PAGE* tiff_pages;
roentgen b75cab
	T2P_TILES* tiff_tiles;
roentgen b75cab
	tdir_t tiff_pagecount;
roentgen b75cab
	uint16 tiff_compression;
roentgen b75cab
	uint16 tiff_photometric;
roentgen b75cab
	uint16 tiff_fillorder;
roentgen b75cab
	uint16 tiff_bitspersample;
roentgen b75cab
	uint16 tiff_samplesperpixel;
roentgen b75cab
	uint16 tiff_planar;
roentgen b75cab
	uint32 tiff_width;
roentgen b75cab
	uint32 tiff_length;
roentgen b75cab
	float tiff_xres;
roentgen b75cab
	float tiff_yres;
roentgen b75cab
	uint16 tiff_orientation;
roentgen b75cab
	toff_t tiff_dataoffset;
roentgen b75cab
	tsize_t tiff_datasize;
roentgen b75cab
	uint16 tiff_resunit;
roentgen b75cab
	uint16 pdf_centimeters;
roentgen b75cab
	uint16 pdf_overrideres;
roentgen b75cab
	uint16 pdf_overridepagesize;
roentgen b75cab
	float pdf_defaultxres;
roentgen b75cab
	float pdf_defaultyres;
roentgen b75cab
	float pdf_xres;
roentgen b75cab
	float pdf_yres;
roentgen b75cab
	float pdf_defaultpagewidth;
roentgen b75cab
	float pdf_defaultpagelength;
roentgen b75cab
	float pdf_pagewidth;
roentgen b75cab
	float pdf_pagelength;
roentgen b75cab
	float pdf_imagewidth;
roentgen b75cab
	float pdf_imagelength;
roentgen b75cab
	int pdf_image_fillpage; /* 0 (default: no scaling, 1:scale imagesize to pagesize */
roentgen b75cab
	T2P_BOX pdf_mediabox;
roentgen b75cab
	T2P_BOX pdf_imagebox;
roentgen b75cab
	uint16 pdf_majorversion;
roentgen b75cab
	uint16 pdf_minorversion;
roentgen b75cab
	uint32 pdf_catalog;
roentgen b75cab
	uint32 pdf_pages;
roentgen b75cab
	uint32 pdf_info;
roentgen b75cab
	uint32 pdf_palettecs;
roentgen b75cab
	uint16 pdf_fitwindow;
roentgen b75cab
	uint32 pdf_startxref;
roentgen b75cab
#define TIFF2PDF_FILEID_SIZE 33
roentgen b75cab
	char pdf_fileid[TIFF2PDF_FILEID_SIZE];
roentgen b75cab
#define TIFF2PDF_DATETIME_SIZE 17
roentgen b75cab
	char pdf_datetime[TIFF2PDF_DATETIME_SIZE];
roentgen b75cab
#define TIFF2PDF_CREATOR_SIZE 512
roentgen b75cab
	char pdf_creator[TIFF2PDF_CREATOR_SIZE];
roentgen b75cab
#define TIFF2PDF_AUTHOR_SIZE 512
roentgen b75cab
	char pdf_author[TIFF2PDF_AUTHOR_SIZE];
roentgen b75cab
#define TIFF2PDF_TITLE_SIZE 512
roentgen b75cab
	char pdf_title[TIFF2PDF_TITLE_SIZE];
roentgen b75cab
#define TIFF2PDF_SUBJECT_SIZE 512
roentgen b75cab
	char pdf_subject[TIFF2PDF_SUBJECT_SIZE];
roentgen b75cab
#define TIFF2PDF_KEYWORDS_SIZE 512
roentgen b75cab
	char pdf_keywords[TIFF2PDF_KEYWORDS_SIZE];
roentgen b75cab
	t2p_cs_t pdf_colorspace;
roentgen b75cab
	uint16 pdf_colorspace_invert;
roentgen b75cab
	uint16 pdf_switchdecode;
roentgen b75cab
	uint16 pdf_palettesize;
roentgen b75cab
	unsigned char* pdf_palette;
roentgen b75cab
	int pdf_labrange[4];
roentgen b75cab
	t2p_compress_t pdf_defaultcompression;
roentgen b75cab
	uint16 pdf_defaultcompressionquality;
roentgen b75cab
	t2p_compress_t pdf_compression;
roentgen b75cab
	uint16 pdf_compressionquality;
roentgen b75cab
	uint16 pdf_nopassthrough;
roentgen b75cab
	t2p_transcode_t pdf_transcode;
roentgen b75cab
	t2p_sample_t pdf_sample;
roentgen b75cab
	uint32* pdf_xrefoffsets;
roentgen b75cab
	uint32 pdf_xrefcount;
roentgen b75cab
	tdir_t pdf_page;
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
	tdata_t pdf_ojpegdata;
roentgen b75cab
	uint32 pdf_ojpegdatalength;
roentgen b75cab
	uint32 pdf_ojpegiflength;
roentgen b75cab
#endif
roentgen b75cab
	float tiff_whitechromaticities[2];
roentgen b75cab
	float tiff_primarychromaticities[6];
roentgen b75cab
	float tiff_referenceblackwhite[2];
roentgen b75cab
	float* tiff_transferfunction[3];
roentgen b75cab
	int pdf_image_interpolate;	/* 0 (default) : do not interpolate,
roentgen b75cab
					   1 : interpolate */
roentgen b75cab
	uint16 tiff_transferfunctioncount;
roentgen b75cab
	uint32 pdf_icccs;
roentgen b75cab
	uint32 tiff_iccprofilelength;
roentgen b75cab
	tdata_t tiff_iccprofile;
roentgen b75cab
roentgen b75cab
	/* fields for custom read/write procedures */
roentgen b75cab
	FILE *outputfile;
roentgen b75cab
	int outputdisable;
roentgen b75cab
	tsize_t outputwritten;
roentgen b75cab
} T2P;
roentgen b75cab
roentgen b75cab
/* These functions are called by main. */
roentgen b75cab
roentgen b75cab
void tiff2pdf_usage(void);
roentgen b75cab
int tiff2pdf_match_paper_size(float*, float*, char*);
roentgen b75cab
roentgen b75cab
/* These functions are used to generate a PDF from a TIFF. */ 
roentgen b75cab
roentgen b75cab
#ifdef __cplusplus
roentgen b75cab
extern "C" {
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
T2P* t2p_init(void);
roentgen b75cab
void t2p_validate(T2P*);
roentgen b75cab
tsize_t t2p_write_pdf(T2P*, TIFF*, TIFF*);
roentgen b75cab
void t2p_free(T2P*);
roentgen b75cab
roentgen b75cab
#ifdef __cplusplus
roentgen b75cab
}
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
void t2p_read_tiff_init(T2P*, TIFF*);
roentgen b75cab
int t2p_cmp_t2p_page(const void*, const void*);
roentgen b75cab
void t2p_read_tiff_data(T2P*, TIFF*);
roentgen b75cab
void t2p_read_tiff_size(T2P*, TIFF*);
roentgen b75cab
void t2p_read_tiff_size_tile(T2P*, TIFF*, ttile_t);
roentgen b75cab
int t2p_tile_is_right_edge(T2P_TILES, ttile_t);
roentgen b75cab
int t2p_tile_is_bottom_edge(T2P_TILES, ttile_t);
roentgen b75cab
int t2p_tile_is_edge(T2P_TILES, ttile_t);
roentgen b75cab
int t2p_tile_is_corner_edge(T2P_TILES, ttile_t);
roentgen b75cab
tsize_t t2p_readwrite_pdf_image(T2P*, TIFF*, TIFF*);
roentgen b75cab
tsize_t t2p_readwrite_pdf_image_tile(T2P*, TIFF*, TIFF*, ttile_t);
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
int t2p_process_ojpeg_tables(T2P*, TIFF*);
roentgen b75cab
#endif
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
int t2p_process_jpeg_strip(unsigned char*, tsize_t*, unsigned char*, tsize_t*, tstrip_t, uint32);
roentgen b75cab
#endif
roentgen b75cab
void t2p_tile_collapse_left(tdata_t, tsize_t, uint32, uint32, uint32);
roentgen b75cab
void t2p_write_advance_directory(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_sample_planar_separate_to_contig(T2P*, unsigned char*, unsigned char*, tsize_t);
roentgen b75cab
tsize_t t2p_sample_realize_palette(T2P*, unsigned char*);
roentgen b75cab
tsize_t t2p_sample_abgr_to_rgb(tdata_t, uint32);
roentgen b75cab
tsize_t t2p_sample_rgba_to_rgb(tdata_t, uint32);
roentgen b75cab
tsize_t t2p_sample_rgbaa_to_rgb(tdata_t, uint32);
roentgen b75cab
tsize_t t2p_sample_lab_signed_to_unsigned(tdata_t, uint32);
roentgen b75cab
tsize_t t2p_write_pdf_header(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_obj_start(uint32, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_obj_end(TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_name(unsigned char*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_string(char*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_stream(tdata_t, tsize_t, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_stream_start(TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_stream_end(TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_stream_dict(tsize_t, uint32, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_stream_dict_start(TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_stream_dict_end(TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_stream_length(tsize_t, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_catalog(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_info(T2P*, TIFF*, TIFF*);
roentgen b75cab
void t2p_pdf_currenttime(T2P*);
roentgen b75cab
void t2p_pdf_tifftime(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_pages(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_page(uint32, T2P*, TIFF*);
roentgen b75cab
void t2p_compose_pdf_page(T2P*);
roentgen b75cab
void t2p_compose_pdf_page_orient(T2P_BOX*, uint16);
roentgen b75cab
void t2p_compose_pdf_page_orient_flip(T2P_BOX*, uint16);
roentgen b75cab
tsize_t t2p_write_pdf_page_content(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_xobject_stream_dict(ttile_t, T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_xobject_cs(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_transfer(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_transfer_dict(T2P*, TIFF*, uint16);
roentgen b75cab
tsize_t t2p_write_pdf_transfer_stream(T2P*, TIFF*, uint16);
roentgen b75cab
tsize_t t2p_write_pdf_xobject_calcs(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_xobject_icccs(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_xobject_icccs_dict(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_xobject_icccs_stream(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_xobject_cs_stream(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_xobject_decode(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_xobject_stream_filter(ttile_t, T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_xreftable(T2P*, TIFF*);
roentgen b75cab
tsize_t t2p_write_pdf_trailer(T2P*, TIFF*);
roentgen b75cab
roentgen b75cab
static void
roentgen b75cab
t2p_disable(TIFF *tif)
roentgen b75cab
{
roentgen b75cab
	T2P *t2p = (T2P*) TIFFClientdata(tif);
roentgen b75cab
	t2p->outputdisable = 1;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static void
roentgen b75cab
t2p_enable(TIFF *tif)
roentgen b75cab
{
roentgen b75cab
	T2P *t2p = (T2P*) TIFFClientdata(tif);
roentgen b75cab
	t2p->outputdisable = 0;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * Procs for TIFFClientOpen
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
static tmsize_t 
roentgen b75cab
t2pReadFile(TIFF *tif, tdata_t data, tmsize_t size)
roentgen b75cab
{
roentgen b75cab
	thandle_t client = TIFFClientdata(tif);
roentgen b75cab
	TIFFReadWriteProc proc = TIFFGetReadProc(tif);
roentgen b75cab
	if (proc)
roentgen b75cab
		return proc(client, data, size);
roentgen b75cab
	return -1;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static tmsize_t 
roentgen b75cab
t2pWriteFile(TIFF *tif, tdata_t data, tmsize_t size)
roentgen b75cab
{
roentgen b75cab
	thandle_t client = TIFFClientdata(tif);
roentgen b75cab
	TIFFReadWriteProc proc = TIFFGetWriteProc(tif);
roentgen b75cab
	if (proc)
roentgen b75cab
		return proc(client, data, size);
roentgen b75cab
	return -1;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static uint64
roentgen b75cab
t2pSeekFile(TIFF *tif, toff_t offset, int whence)
roentgen b75cab
{
roentgen b75cab
	thandle_t client = TIFFClientdata(tif);
roentgen b75cab
	TIFFSeekProc proc = TIFFGetSeekProc(tif);
roentgen b75cab
	if (proc)
roentgen b75cab
		return proc(client, offset, whence);
roentgen b75cab
	return -1;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static tmsize_t 
roentgen b75cab
t2p_readproc(thandle_t handle, tdata_t data, tmsize_t size) 
roentgen b75cab
{
roentgen b75cab
	(void) handle, (void) data, (void) size;
roentgen b75cab
	return -1;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static tmsize_t 
roentgen b75cab
t2p_writeproc(thandle_t handle, tdata_t data, tmsize_t size) 
roentgen b75cab
{
roentgen b75cab
	T2P *t2p = (T2P*) handle;
roentgen b75cab
	if (t2p->outputdisable <= 0 && t2p->outputfile) {
roentgen b75cab
		tsize_t written = fwrite(data, 1, size, t2p->outputfile);
roentgen b75cab
		t2p->outputwritten += written;
roentgen b75cab
		return written;
roentgen b75cab
	}
roentgen b75cab
	return size; 
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static uint64 
roentgen b75cab
t2p_seekproc(thandle_t handle, uint64 offset, int whence) 
roentgen b75cab
{ 
roentgen b75cab
	T2P *t2p = (T2P*) handle;
roentgen b75cab
	if (t2p->outputdisable <= 0 && t2p->outputfile)
roentgen b75cab
		return fseek(t2p->outputfile, (long) offset, whence);
roentgen b75cab
	return offset;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static int 
roentgen b75cab
t2p_closeproc(thandle_t handle)
roentgen b75cab
{ 
roentgen b75cab
	(void) handle;
roentgen b75cab
	return 0; 
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static uint64 
roentgen b75cab
t2p_sizeproc(thandle_t handle) 
roentgen b75cab
{
roentgen b75cab
	(void) handle;
roentgen b75cab
	return -1;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static int 
roentgen b75cab
t2p_mapproc(thandle_t handle, void **data, toff_t *offset) 
roentgen b75cab
{ 
roentgen b75cab
	(void) handle, (void) data, (void) offset;
roentgen b75cab
	return -1; 
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static void 
roentgen b75cab
t2p_unmapproc(thandle_t handle, void *data, toff_t offset)
roentgen b75cab
{ 
roentgen b75cab
	(void) handle, (void) data, (void) offset;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static uint64
roentgen b75cab
checkAdd64(uint64 summand1, uint64 summand2, T2P* t2p)
roentgen b75cab
{
roentgen b75cab
	uint64 bytes = summand1 + summand2;
roentgen b75cab
roentgen b75cab
	if (bytes - summand1 != summand2) {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, "Integer overflow");
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		bytes = 0;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return bytes;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
static uint64
roentgen b75cab
checkMultiply64(uint64 first, uint64 second, T2P* t2p)
roentgen b75cab
{
roentgen b75cab
	uint64 bytes = first * second;
roentgen b75cab
roentgen b75cab
	if (second && bytes / second != first) {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, "Integer overflow");
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		bytes = 0;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return bytes;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
roentgen b75cab
  This is the main function.
roentgen b75cab
roentgen b75cab
  The program converts one TIFF file to one PDF file, including multiple page 
roentgen b75cab
  TIFF files, tiled TIFF files, black and white. grayscale, and color TIFF 
roentgen b75cab
  files that contain data of TIFF photometric interpretations of bilevel, 
roentgen b75cab
  grayscale, RGB, YCbCr, CMYK separation, and ICC L*a*b* as supported by 
roentgen b75cab
  libtiff and PDF.
roentgen b75cab
roentgen b75cab
  If you have multiple TIFF files to convert into one PDF file then use tiffcp 
roentgen b75cab
  or other program to concatenate the files into a multiple page TIFF file.  
roentgen b75cab
  If the input TIFF file is of huge dimensions (greater than 10000 pixels height
roentgen b75cab
  or width) convert the input image to a tiled TIFF if it is not already.
roentgen b75cab
roentgen b75cab
  The standard output is standard output.  Set the output file name with the 
roentgen b75cab
  "-o output.pdf" option.
roentgen b75cab
roentgen b75cab
  All black and white files are compressed into a single strip CCITT G4 Fax 
roentgen b75cab
  compressed PDF, unless tiled, where tiled black and white images are 
roentgen b75cab
  compressed into tiled CCITT G4 Fax compressed PDF, libtiff CCITT support 
roentgen b75cab
  is assumed.
roentgen b75cab
roentgen b75cab
  Color and grayscale data can be compressed using either JPEG compression, 
roentgen b75cab
  ITU-T T.81, or Zip/Deflate LZ77 compression, per PNG 1.2 and RFC 1951.  Set 
roentgen b75cab
  the compression type using the -j or -z options.  JPEG compression support 
roentgen b75cab
  requires that libtiff be configured with JPEG support, and Zip/Deflate 
roentgen b75cab
  compression support requires that libtiff is configured with Zip support, 
roentgen b75cab
  in tiffconf.h.  Use only one or the other of -j and -z.  The -q option 
roentgen b75cab
  sets the image compression quality, that is 1-100 with libjpeg JPEG 
roentgen b75cab
  compression and one of 1, 10, 11, 12, 13, 14, or 15 for PNG group compression 
roentgen b75cab
  predictor methods, add 100, 200, ..., 900 to set zlib compression quality 1-9.
roentgen b75cab
  PNG Group differencing predictor methods are not currently implemented.
roentgen b75cab
roentgen b75cab
  If the input TIFF contains single strip CCITT G4 Fax compressed information, 
roentgen b75cab
  then that is written to the PDF file without transcoding, unless the options 
roentgen b75cab
  of no compression and no passthrough are set, -d and -n.
roentgen b75cab
roentgen b75cab
  If the input TIFF contains JPEG or single strip Zip/Deflate compressed 
roentgen b75cab
  information, and they are configured, then that is written to the PDF file 
roentgen b75cab
  without transcoding, unless the options of no compression and no passthrough 
roentgen b75cab
  are set.
roentgen b75cab
roentgen b75cab
  The default page size upon which the TIFF image is placed is determined by 
roentgen b75cab
  the resolution and extent of the image data.  Default values for the TIFF 
roentgen b75cab
  image resolution can be set using the -x and -y options.  The page size can 
roentgen b75cab
  be set using the -p option for paper size, or -w and -l for paper width and 
roentgen b75cab
  length, then each page of the TIFF image is centered on its page.  The 
roentgen b75cab
  distance unit for default resolution and page width and length can be set 
roentgen b75cab
  by the -u option, the default unit is inch.
roentgen b75cab
roentgen b75cab
  Various items of the output document information can be set with the -e, -c, 
roentgen b75cab
  -a, -t, -s, and -k tags.  Setting the argument of the option to "" for these 
roentgen b75cab
  tags causes the relevant document information field to be not written.  Some 
roentgen b75cab
  of the document information values otherwise get their information from the 
roentgen b75cab
  input TIFF image, the software, author, document name, and image description.
roentgen b75cab
roentgen b75cab
  The output PDF file conforms to the PDF 1.1 specification or PDF 1.2 if using 
roentgen b75cab
  Zip/Deflate compression.  
roentgen b75cab
  
roentgen b75cab
  The Portable Document Format (PDF) specification is copyrighted by Adobe 
roentgen b75cab
  Systems, Incorporated.  Todos derechos reservados.
roentgen b75cab
roentgen b75cab
  Here is a listing of the usage example and the options to the tiff2pdf 
roentgen b75cab
  program that is part of the libtiff distribution.  Options followed by 
roentgen b75cab
  a colon have a required argument.
roentgen b75cab
  
roentgen b75cab
    usage:  tiff2pdf [options] input.tif
roentgen b75cab
roentgen b75cab
    options:
roentgen b75cab
    -o: output to file name
roentgen b75cab
roentgen b75cab
    -j: compress with JPEG (requires libjpeg configured with libtiff)
roentgen b75cab
    -z: compress with Zip/Deflate (requires zlib configured with libtiff)
roentgen b75cab
    -q: compression quality
roentgen b75cab
    -n: no compressed data passthrough
roentgen b75cab
    -d: do not compress (decompress)
roentgen b75cab
    -i: invert colors
roentgen b75cab
    -u: set distance unit, 'i' for inch, 'm' for centimeter
roentgen b75cab
    -x: set x resolution default
roentgen b75cab
    -y: set y resolution default
roentgen b75cab
    -w: width in units
roentgen b75cab
    -l: length in units
roentgen b75cab
    -r: 'd' for resolution default, 'o' for resolution override
roentgen b75cab
    -p: paper size, eg "letter", "legal", "a4"
roentgen b75cab
    -F: make the tiff fill the PDF page
roentgen b75cab
    -f: set pdf "fit window" user preference
roentgen b75cab
    -b:	set PDF "Interpolate" user preference
roentgen b75cab
    -e: date, overrides image or current date/time default, YYYYMMDDHHMMSS
roentgen b75cab
    -c: creator, overrides image software default
roentgen b75cab
    -a: author, overrides image artist default
roentgen b75cab
    -t: title, overrides image document name default
roentgen b75cab
    -s: subject, overrides image image description default
roentgen b75cab
    -k: keywords
roentgen b75cab
roentgen b75cab
    -h: usage
roentgen b75cab
roentgen b75cab
    examples:
roentgen b75cab
roentgen b75cab
        tiff2pdf -o output.pdf input.tiff
roentgen b75cab
roentgen b75cab
    The above example would generate the file output.pdf from input.tiff.
roentgen b75cab
roentgen b75cab
        tiff2pdf input.tiff
roentgen b75cab
roentgen b75cab
    The above example would generate PDF output from input.tiff and write it
roentgen b75cab
    to standard output.
roentgen b75cab
roentgen b75cab
        tiff2pdf -j -p letter -o output.pdf input.tiff
roentgen b75cab
roentgen b75cab
    The above example would generate the file output.pdf from input.tiff,
roentgen b75cab
    putting the image pages on a letter sized page, compressing the output
roentgen b75cab
    with JPEG.
roentgen b75cab
roentgen b75cab
	Please report bugs through:
roentgen b75cab
roentgen b75cab
	http://bugzilla.remotesensing.org/buglist.cgi?product=libtiff
roentgen b75cab
roentgen b75cab
    See also libtiff.3t, tiffcp.
roentgen b75cab
  */
roentgen b75cab
roentgen b75cab
int main(int argc, char** argv){
roentgen b75cab
roentgen b75cab
	extern char *optarg;
roentgen b75cab
	extern int optind;
roentgen b75cab
	const char *outfilename = NULL;
roentgen b75cab
	T2P *t2p = NULL;
roentgen b75cab
	TIFF *input = NULL, *output = NULL;
roentgen b75cab
	int c, ret = EXIT_SUCCESS;
roentgen b75cab
roentgen b75cab
	t2p = t2p_init();
roentgen b75cab
roentgen b75cab
	if (t2p == NULL){
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, "Can't initialize context");
roentgen b75cab
		goto fail;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	while (argv &&
roentgen b75cab
	       (c = getopt(argc, argv,
roentgen b75cab
			   "o:q:u:x:y:w:l:r:p:e:c:a:t:s:k:jzndifbhF")) != -1){
roentgen b75cab
		switch (c) {
roentgen b75cab
			case 'o':
roentgen b75cab
				outfilename = optarg;
roentgen b75cab
				break;
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
			case 'j':  
roentgen b75cab
				t2p->pdf_defaultcompression=T2P_COMPRESS_JPEG;
roentgen b75cab
				break;
roentgen b75cab
#endif
roentgen b75cab
#ifndef JPEG_SUPPORT
roentgen b75cab
			case 'j':  
roentgen b75cab
				TIFFWarning(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"JPEG support in libtiff required for JPEG compression, ignoring option");
roentgen b75cab
				break;
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
			case 'z':  
roentgen b75cab
				t2p->pdf_defaultcompression=T2P_COMPRESS_ZIP;
roentgen b75cab
				break;
roentgen b75cab
#endif
roentgen b75cab
#ifndef ZIP_SUPPORT
roentgen b75cab
			case 'z':  
roentgen b75cab
				TIFFWarning(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"Zip support in libtiff required for Zip compression, ignoring option");
roentgen b75cab
				break;
roentgen b75cab
#endif
roentgen b75cab
			case 'q': 
roentgen b75cab
				t2p->pdf_defaultcompressionquality=atoi(optarg);
roentgen b75cab
				break;
roentgen b75cab
			case 'n': 
roentgen b75cab
				t2p->pdf_nopassthrough=1;
roentgen b75cab
				break;
roentgen b75cab
			case 'd': 
roentgen b75cab
				t2p->pdf_defaultcompression=T2P_COMPRESS_NONE;
roentgen b75cab
				break;
roentgen b75cab
			case 'u': 
roentgen b75cab
				if(optarg[0]=='m'){
roentgen b75cab
					t2p->pdf_centimeters=1;
roentgen b75cab
				}
roentgen b75cab
				break;
roentgen b75cab
			case 'x': 
roentgen b75cab
				t2p->pdf_defaultxres = 
roentgen b75cab
					(float)atof(optarg) / (t2p->pdf_centimeters?2.54F:1.0F);
roentgen b75cab
				break;
roentgen b75cab
			case 'y': 
roentgen b75cab
				t2p->pdf_defaultyres = 
roentgen b75cab
					(float)atof(optarg) / (t2p->pdf_centimeters?2.54F:1.0F);
roentgen b75cab
				break;
roentgen b75cab
			case 'w': 
roentgen b75cab
				t2p->pdf_overridepagesize=1;
roentgen b75cab
				t2p->pdf_defaultpagewidth = 
roentgen b75cab
					((float)atof(optarg) * PS_UNIT_SIZE) / (t2p->pdf_centimeters?2.54F:1.0F);
roentgen b75cab
				break;
roentgen b75cab
			case 'l': 
roentgen b75cab
				t2p->pdf_overridepagesize=1;
roentgen b75cab
				t2p->pdf_defaultpagelength = 
roentgen b75cab
					((float)atof(optarg) * PS_UNIT_SIZE) / (t2p->pdf_centimeters?2.54F:1.0F);
roentgen b75cab
				break;
roentgen b75cab
			case 'r': 
roentgen b75cab
				if(optarg[0]=='o'){
roentgen b75cab
					t2p->pdf_overrideres=1;
roentgen b75cab
				}
roentgen b75cab
				break;
roentgen b75cab
			case 'p': 
roentgen b75cab
				if(tiff2pdf_match_paper_size(
roentgen b75cab
					&(t2p->pdf_defaultpagewidth), 
roentgen b75cab
					&(t2p->pdf_defaultpagelength), 
roentgen b75cab
					optarg)){
roentgen b75cab
					t2p->pdf_overridepagesize=1;
roentgen b75cab
				} else {
roentgen b75cab
					TIFFWarning(TIFF2PDF_MODULE, 
roentgen b75cab
					"Unknown paper size %s, ignoring option",
roentgen b75cab
						optarg);
roentgen b75cab
				}
roentgen b75cab
				break;
roentgen b75cab
			case 'i':
roentgen b75cab
				t2p->pdf_colorspace_invert=1;
roentgen b75cab
				break;
roentgen b75cab
			case 'F':
roentgen b75cab
				t2p->pdf_image_fillpage = 1;
roentgen b75cab
				break;
roentgen b75cab
			case 'f': 
roentgen b75cab
				t2p->pdf_fitwindow=1;
roentgen b75cab
				break;
roentgen b75cab
			case 'e':
roentgen b75cab
				if (strlen(optarg) == 0) {
roentgen b75cab
					t2p->pdf_datetime[0] = '\0';
roentgen b75cab
				} else {
roentgen b75cab
					t2p->pdf_datetime[0] = 'D';
roentgen b75cab
					t2p->pdf_datetime[1] = ':';
roentgen b75cab
					strncpy(t2p->pdf_datetime + 2, optarg,
roentgen b75cab
						sizeof(t2p->pdf_datetime) - 3);
roentgen b75cab
					t2p->pdf_datetime[sizeof(t2p->pdf_datetime) - 1] = '\0';
roentgen b75cab
				}
roentgen b75cab
				break;
roentgen b75cab
			case 'c': 
roentgen b75cab
				strncpy(t2p->pdf_creator, optarg, sizeof(t2p->pdf_creator) - 1);
roentgen b75cab
				t2p->pdf_creator[sizeof(t2p->pdf_creator) - 1] = '\0';
roentgen b75cab
				break;
roentgen b75cab
			case 'a': 
roentgen b75cab
				strncpy(t2p->pdf_author, optarg, sizeof(t2p->pdf_author) - 1);
roentgen b75cab
				t2p->pdf_author[sizeof(t2p->pdf_author) - 1] = '\0';
roentgen b75cab
				break;
roentgen b75cab
			case 't': 
roentgen b75cab
				strncpy(t2p->pdf_title, optarg, sizeof(t2p->pdf_title) - 1);
roentgen b75cab
				t2p->pdf_title[sizeof(t2p->pdf_title) - 1] = '\0';
roentgen b75cab
				break;
roentgen b75cab
			case 's': 
roentgen b75cab
				strncpy(t2p->pdf_subject, optarg, sizeof(t2p->pdf_subject) - 1);
roentgen b75cab
				t2p->pdf_subject[sizeof(t2p->pdf_subject) - 1] = '\0';
roentgen b75cab
				break;
roentgen b75cab
			case 'k': 
roentgen b75cab
				strncpy(t2p->pdf_keywords, optarg, sizeof(t2p->pdf_keywords) - 1);
roentgen b75cab
				t2p->pdf_keywords[sizeof(t2p->pdf_keywords) - 1] = '\0';
roentgen b75cab
				break;
roentgen b75cab
			case 'b':
roentgen b75cab
				t2p->pdf_image_interpolate = 1;
roentgen b75cab
				break;
roentgen b75cab
			case 'h': 
roentgen b75cab
			case '?': 
roentgen b75cab
				tiff2pdf_usage();
roentgen b75cab
				goto success;
roentgen b75cab
				break;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	/*
roentgen b75cab
	 * Input
roentgen b75cab
	 */
roentgen b75cab
	if(argc > optind) {
roentgen b75cab
		input = TIFFOpen(argv[optind++], "r");
roentgen b75cab
		if (input==NULL) {
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
				  "Can't open input file %s for reading", 
roentgen b75cab
				  argv[optind-1]);
roentgen b75cab
			goto fail;
roentgen b75cab
		}
roentgen b75cab
	} else {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, "No input file specified"); 
roentgen b75cab
		tiff2pdf_usage();
roentgen b75cab
		goto fail;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	if(argc > optind) {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
			  "No support for multiple input files"); 
roentgen b75cab
		tiff2pdf_usage();
roentgen b75cab
		goto fail;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	/*
roentgen b75cab
	 * Output
roentgen b75cab
	 */
roentgen b75cab
	t2p->outputdisable = 0;
roentgen b75cab
	if (outfilename) {
roentgen b75cab
		t2p->outputfile = fopen(outfilename, "wb");
roentgen b75cab
		if (t2p->outputfile == NULL) {
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE,
roentgen b75cab
				  "Can't open output file %s for writing",
roentgen b75cab
				  outfilename);
roentgen b75cab
			goto fail;
roentgen b75cab
		}
roentgen b75cab
	} else {
roentgen b75cab
		outfilename = "-";
roentgen b75cab
		t2p->outputfile = stdout;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	output = TIFFClientOpen(outfilename, "w", (thandle_t) t2p,
roentgen b75cab
				t2p_readproc, t2p_writeproc, t2p_seekproc, 
roentgen b75cab
				t2p_closeproc, t2p_sizeproc, 
roentgen b75cab
				t2p_mapproc, t2p_unmapproc);
roentgen b75cab
	if (output == NULL) {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE,
roentgen b75cab
			  "Can't initialize output descriptor");
roentgen b75cab
		goto fail;
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
	/*
roentgen b75cab
	 * Validate
roentgen b75cab
	 */
roentgen b75cab
	t2p_validate(t2p);
roentgen b75cab
	t2pSeekFile(output, (toff_t) 0, SEEK_SET);
roentgen b75cab
roentgen b75cab
	/*
roentgen b75cab
	 * Write
roentgen b75cab
	 */
roentgen b75cab
	t2p_write_pdf(t2p, input, output);
roentgen b75cab
	if (t2p->t2p_error != 0) {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE,
roentgen b75cab
			  "An error occurred creating output PDF file");
roentgen b75cab
		goto fail;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	goto success;
roentgen b75cab
fail:
roentgen b75cab
	ret = EXIT_FAILURE;
roentgen b75cab
success:
roentgen b75cab
	if(input != NULL)
roentgen b75cab
		TIFFClose(input);
roentgen b75cab
	if (output != NULL)
roentgen b75cab
		TIFFClose(output);
roentgen b75cab
	if (t2p != NULL)
roentgen b75cab
		t2p_free(t2p);
roentgen b75cab
	return ret;
roentgen b75cab
  
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
void tiff2pdf_usage(){
roentgen b75cab
	char* lines[]={
roentgen b75cab
	"usage:  tiff2pdf [options] input.tiff",
roentgen b75cab
	"options:",
roentgen b75cab
	" -o: output to file name",
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
	" -j: compress with JPEG", 
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
	" -z: compress with Zip/Deflate",
roentgen b75cab
#endif
roentgen b75cab
	" -q: compression quality",
roentgen b75cab
	" -n: no compressed data passthrough",
roentgen b75cab
	" -d: do not compress (decompress)",
roentgen b75cab
	" -i: invert colors",
roentgen b75cab
	" -u: set distance unit, 'i' for inch, 'm' for centimeter",
roentgen b75cab
	" -x: set x resolution default in dots per unit",
roentgen b75cab
	" -y: set y resolution default in dots per unit",
roentgen b75cab
	" -w: width in units",
roentgen b75cab
	" -l: length in units",
roentgen b75cab
	" -r: 'd' for resolution default, 'o' for resolution override",
roentgen b75cab
	" -p: paper size, eg \"letter\", \"legal\", \"A4\"",
roentgen b75cab
  " -F: make the tiff fill the PDF page",
roentgen b75cab
	" -f: set PDF \"Fit Window\" user preference",
roentgen b75cab
	" -e: date, overrides image or current date/time default, YYYYMMDDHHMMSS",
roentgen b75cab
	" -c: sets document creator, overrides image software default",
roentgen b75cab
	" -a: sets document author, overrides image artist default",
roentgen b75cab
	" -t: sets document title, overrides image document name default",
roentgen b75cab
	" -s: sets document subject, overrides image image description default",
roentgen b75cab
	" -k: sets document keywords",
roentgen b75cab
	" -b: set PDF \"Interpolate\" user preference",
roentgen b75cab
	" -h: usage",
roentgen b75cab
	NULL
roentgen b75cab
	};
roentgen b75cab
	int i=0;
roentgen b75cab
roentgen b75cab
	fprintf(stderr, "%s\n\n", TIFFGetVersion());
roentgen b75cab
	for (i=0;lines[i]!=NULL;i++){
roentgen b75cab
		fprintf(stderr, "%s\n", lines[i]);
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
int tiff2pdf_match_paper_size(float* width, float* length, char* papersize){
roentgen b75cab
roentgen b75cab
	size_t i, len;
roentgen b75cab
	const char* sizes[]={
roentgen b75cab
		"LETTER", "A4", "LEGAL",
roentgen b75cab
		"EXECUTIVE", "LETTER", "LEGAL", "LEDGER", "TABLOID", 
roentgen b75cab
		"A", "B", "C", "D", "E", "F", "G", "H", "J", "K", 
roentgen b75cab
		"A10", "A9", "A8", "A7", "A6", "A5", "A4", "A3", "A2", "A1", "A0", 
roentgen b75cab
		"2A0", "4A0", "2A", "4A", 
roentgen b75cab
		"B10", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "B2", "B1", "B0", 
roentgen b75cab
		"JISB10", "JISB9", "JISB8", "JISB7", "JISB6", "JISB5", "JISB4", 
roentgen b75cab
		"JISB3", "JISB2", "JISB1", "JISB0", 
roentgen b75cab
		"C10", "C9", "C8", "C7", "C6", "C5", "C4", "C3", "C2", "C1", "C0", 
roentgen b75cab
		"RA2", "RA1", "RA0", "SRA4", "SRA3", "SRA2", "SRA1", "SRA0", 
roentgen b75cab
		"A3EXTRA", "A4EXTRA", 
roentgen b75cab
		"STATEMENT", "FOLIO", "QUARTO", 
roentgen b75cab
		NULL
roentgen b75cab
	} ;
roentgen b75cab
	const int widths[]={
roentgen b75cab
		612, 595, 612,
roentgen b75cab
		522, 612,612,792,792,
roentgen b75cab
		612,792,1224,1584,2448,2016,792,2016,2448,2880,
roentgen b75cab
		74,105,147,210,298,420,595,842,1191,1684,2384,3370,4768,3370,4768,
roentgen b75cab
		88,125,176,249,354,499,709,1001,1417,2004,2835,
roentgen b75cab
		91,128,181,258,363,516,729,1032,1460,2064,2920,
roentgen b75cab
		79,113,162,230,323,459,649,918,1298,1298,2599,
roentgen b75cab
		1219,1729,2438,638,907,1276,1814,2551,
roentgen b75cab
		914,667,
roentgen b75cab
		396, 612, 609, 
roentgen b75cab
		0
roentgen b75cab
	};
roentgen b75cab
	const int lengths[]={
roentgen b75cab
		792,842,1008,
roentgen b75cab
		756,792,1008,1224,1224,
roentgen b75cab
		792,1224,1584,2448,3168,2880,6480,10296,12672,10296,
roentgen b75cab
		105,147,210,298,420,595,842,1191,1684,2384,3370,4768,6741,4768,6741,
roentgen b75cab
		125,176,249,354,499,709,1001,1417,2004,2835,4008,
roentgen b75cab
		128,181,258,363,516,729,1032,1460,2064,2920,4127,
roentgen b75cab
		113,162,230,323,459,649,918,1298,1837,1837,3677,
roentgen b75cab
		1729,2438,3458,907,1276,1814,2551,3628,
roentgen b75cab
		1262,914,
roentgen b75cab
		612, 936, 780, 
roentgen b75cab
		0
roentgen b75cab
	};
roentgen b75cab
roentgen b75cab
	len=strlen(papersize);
roentgen b75cab
	for(i=0;i<len;i++){
roentgen b75cab
		papersize[i]=toupper(papersize[i]);
roentgen b75cab
	}
roentgen b75cab
	for(i=0;sizes[i]!=NULL; i++){
roentgen b75cab
		if (strcmp( (const char*)papersize, sizes[i])==0){
roentgen b75cab
			*width=(float)widths[i];
roentgen b75cab
			*length=(float)lengths[i];
roentgen b75cab
			return(1);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return(0);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function allocates and initializes a T2P context struct pointer.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
T2P* t2p_init()
roentgen b75cab
{
roentgen b75cab
	T2P* t2p = (T2P*) _TIFFmalloc(sizeof(T2P));
roentgen b75cab
	if(t2p==NULL){
roentgen b75cab
		TIFFError(
roentgen b75cab
			TIFF2PDF_MODULE, 
roentgen b75cab
			"Can't allocate %lu bytes of memory for t2p_init", 
roentgen b75cab
			(unsigned long) sizeof(T2P));
roentgen b75cab
		return( (T2P*) NULL );
roentgen b75cab
	}
roentgen b75cab
	_TIFFmemset(t2p, 0x00, sizeof(T2P));
roentgen b75cab
	t2p->pdf_majorversion=1;
roentgen b75cab
	t2p->pdf_minorversion=1;
roentgen b75cab
	t2p->pdf_defaultxres=300.0;
roentgen b75cab
	t2p->pdf_defaultyres=300.0;
roentgen b75cab
	t2p->pdf_defaultpagewidth=612.0;
roentgen b75cab
	t2p->pdf_defaultpagelength=792.0;
roentgen b75cab
	t2p->pdf_xrefcount=3; /* Catalog, Info, Pages */
roentgen b75cab
	
roentgen b75cab
	return(t2p);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function frees a T2P context struct pointer and any allocated data fields of it.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
void t2p_free(T2P* t2p)
roentgen b75cab
{
roentgen b75cab
	int i = 0;
roentgen b75cab
roentgen b75cab
	if (t2p != NULL) {
roentgen b75cab
		if(t2p->pdf_xrefoffsets != NULL){
roentgen b75cab
			_TIFFfree( (tdata_t) t2p->pdf_xrefoffsets);
roentgen b75cab
		}
roentgen b75cab
		if(t2p->tiff_pages != NULL){
roentgen b75cab
			_TIFFfree( (tdata_t) t2p->tiff_pages);
roentgen b75cab
		}
roentgen b75cab
		for(i=0;i<t2p->tiff_pagecount;i++){
roentgen b75cab
			if(t2p->tiff_tiles[i].tiles_tiles != NULL){
roentgen b75cab
				_TIFFfree( (tdata_t) t2p->tiff_tiles[i].tiles_tiles);
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
		if(t2p->tiff_tiles != NULL){
roentgen b75cab
			_TIFFfree( (tdata_t) t2p->tiff_tiles);
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_palette != NULL){
roentgen b75cab
			_TIFFfree( (tdata_t) t2p->pdf_palette);
roentgen b75cab
		}
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
		if(t2p->pdf_ojpegdata != NULL){
roentgen b75cab
			_TIFFfree( (tdata_t) t2p->pdf_ojpegdata);
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
		_TIFFfree( (tdata_t) t2p );
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function validates the values of a T2P context struct pointer
roentgen b75cab
        before calling t2p_write_pdf with it.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
void t2p_validate(T2P* t2p){
roentgen b75cab
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
	if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){
roentgen b75cab
		if(t2p->pdf_defaultcompressionquality>100 ||
roentgen b75cab
			t2p->pdf_defaultcompressionquality<1){
roentgen b75cab
			t2p->pdf_defaultcompressionquality=0;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
	if(t2p->pdf_defaultcompression==T2P_COMPRESS_ZIP){
roentgen b75cab
 		uint16 m=t2p->pdf_defaultcompressionquality%100;
roentgen b75cab
 		if(t2p->pdf_defaultcompressionquality/100 > 9 ||
roentgen b75cab
 			(m>1 && m<10) || m>15){
roentgen b75cab
 			t2p->pdf_defaultcompressionquality=0;
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_defaultcompressionquality%100 !=0){
roentgen b75cab
 			t2p->pdf_defaultcompressionquality/=100;
roentgen b75cab
 			t2p->pdf_defaultcompressionquality*=100;
roentgen b75cab
			TIFFError(
roentgen b75cab
				TIFF2PDF_MODULE, 
roentgen b75cab
				"PNG Group predictor differencing not implemented, assuming compression quality %u", 
roentgen b75cab
				t2p->pdf_defaultcompressionquality);
roentgen b75cab
		}
roentgen b75cab
		t2p->pdf_defaultcompressionquality%=100;
roentgen b75cab
		if(t2p->pdf_minorversion<2){t2p->pdf_minorversion=2;}
roentgen b75cab
	}
roentgen b75cab
#endif
roentgen b75cab
	(void)0;
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function scans the input TIFF file for pages.  It attempts
roentgen b75cab
        to determine which IFD's of the TIFF file contain image document
roentgen b75cab
        pages.  For each, it gathers some information that has to do
roentgen b75cab
        with the output of the PDF document as a whole.  
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
void t2p_read_tiff_init(T2P* t2p, TIFF* input){
roentgen b75cab
roentgen b75cab
	tdir_t directorycount=0;
roentgen b75cab
	tdir_t i=0;
roentgen b75cab
	uint16 pagen=0;
roentgen b75cab
	uint16 paged=0;
roentgen b75cab
	uint16 xuint16=0;
roentgen b75cab
roentgen b75cab
	directorycount=TIFFNumberOfDirectories(input);
roentgen b75cab
	t2p->tiff_pages = (T2P_PAGE*) _TIFFmalloc(directorycount * sizeof(T2P_PAGE));
roentgen b75cab
	if(t2p->tiff_pages==NULL){
roentgen b75cab
		TIFFError(
roentgen b75cab
			TIFF2PDF_MODULE, 
roentgen b75cab
			"Can't allocate %lu bytes of memory for tiff_pages array, %s", 
roentgen b75cab
			(unsigned long) directorycount * sizeof(T2P_PAGE), 
roentgen b75cab
			TIFFFileName(input));
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return;
roentgen b75cab
	}
roentgen b75cab
	_TIFFmemset( t2p->tiff_pages, 0x00, directorycount * sizeof(T2P_PAGE));
roentgen b75cab
	t2p->tiff_tiles = (T2P_TILES*) _TIFFmalloc(directorycount * sizeof(T2P_TILES));
roentgen b75cab
	if(t2p->tiff_tiles==NULL){
roentgen b75cab
		TIFFError(
roentgen b75cab
			TIFF2PDF_MODULE, 
roentgen b75cab
			"Can't allocate %lu bytes of memory for tiff_tiles array, %s", 
roentgen b75cab
			(unsigned long) directorycount * sizeof(T2P_TILES), 
roentgen b75cab
			TIFFFileName(input));
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return;
roentgen b75cab
	}
roentgen b75cab
	_TIFFmemset( t2p->tiff_tiles, 0x00, directorycount * sizeof(T2P_TILES));
roentgen b75cab
	for(i=0;i<directorycount;i++){
roentgen b75cab
		uint32 subfiletype = 0;
roentgen b75cab
		
roentgen b75cab
		if(!TIFFSetDirectory(input, i)){
roentgen b75cab
			TIFFError(
roentgen b75cab
				TIFF2PDF_MODULE, 
roentgen b75cab
				"Can't set directory %u of input file %s", 
roentgen b75cab
				i,
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return;
roentgen b75cab
		}
roentgen b75cab
		if(TIFFGetField(input, TIFFTAG_PAGENUMBER, &pagen, &paged)){
roentgen b75cab
			if((pagen>paged) && (paged != 0)){
roentgen b75cab
				t2p->tiff_pages[t2p->tiff_pagecount].page_number = 
roentgen b75cab
					paged;
roentgen b75cab
			} else {
roentgen b75cab
				t2p->tiff_pages[t2p->tiff_pagecount].page_number = 
roentgen b75cab
					pagen;
roentgen b75cab
			}
roentgen b75cab
			goto ispage2;
roentgen b75cab
		}
roentgen b75cab
		if(TIFFGetField(input, TIFFTAG_SUBFILETYPE, &subfiletype)){
roentgen b75cab
			if ( ((subfiletype & FILETYPE_PAGE) != 0)
roentgen b75cab
                             || (subfiletype == 0)){
roentgen b75cab
				goto ispage;
roentgen b75cab
			} else {
roentgen b75cab
				goto isnotpage;
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
		if(TIFFGetField(input, TIFFTAG_OSUBFILETYPE, &subfiletype)){
roentgen b75cab
			if ((subfiletype == OFILETYPE_IMAGE) 
roentgen b75cab
				|| (subfiletype == OFILETYPE_PAGE)
roentgen b75cab
				|| (subfiletype == 0) ){
roentgen b75cab
				goto ispage;
roentgen b75cab
			} else {
roentgen b75cab
				goto isnotpage;
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
		ispage:
roentgen b75cab
		t2p->tiff_pages[t2p->tiff_pagecount].page_number=t2p->tiff_pagecount;
roentgen b75cab
		ispage2:
roentgen b75cab
		t2p->tiff_pages[t2p->tiff_pagecount].page_directory=i;
roentgen b75cab
		if(TIFFIsTiled(input)){
roentgen b75cab
			t2p->tiff_pages[t2p->tiff_pagecount].page_tilecount = 
roentgen b75cab
				TIFFNumberOfTiles(input);
roentgen b75cab
		}
roentgen b75cab
		t2p->tiff_pagecount++;
roentgen b75cab
		isnotpage:
roentgen b75cab
		(void)0;
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
	qsort((void*) t2p->tiff_pages, t2p->tiff_pagecount,
roentgen b75cab
              sizeof(T2P_PAGE), t2p_cmp_t2p_page);
roentgen b75cab
roentgen b75cab
	for(i=0;i<t2p->tiff_pagecount;i++){
roentgen b75cab
		t2p->pdf_xrefcount += 5;
roentgen b75cab
		TIFFSetDirectory(input, t2p->tiff_pages[i].page_directory );
roentgen b75cab
		if((TIFFGetField(input, TIFFTAG_PHOTOMETRIC, &xuint16)
roentgen b75cab
                    && (xuint16==PHOTOMETRIC_PALETTE))
roentgen b75cab
		   || TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)) {
roentgen b75cab
			t2p->tiff_pages[i].page_extra++;
roentgen b75cab
			t2p->pdf_xrefcount++;
roentgen b75cab
		}
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
		if (TIFFGetField(input, TIFFTAG_COMPRESSION, &xuint16)) {
roentgen b75cab
                        if( (xuint16== COMPRESSION_DEFLATE ||
roentgen b75cab
                             xuint16== COMPRESSION_ADOBE_DEFLATE) && 
roentgen b75cab
                            ((t2p->tiff_pages[i].page_tilecount != 0) 
roentgen b75cab
                             || TIFFNumberOfStrips(input)==1) &&
roentgen b75cab
                            (t2p->pdf_nopassthrough==0)	){
roentgen b75cab
                                if(t2p->pdf_minorversion<2){t2p->pdf_minorversion=2;}
roentgen b75cab
                        }
roentgen b75cab
                }
roentgen b75cab
#endif
roentgen b75cab
		if (TIFFGetField(input, TIFFTAG_TRANSFERFUNCTION,
roentgen b75cab
                                 &(t2p->tiff_transferfunction[0]),
roentgen b75cab
                                 &(t2p->tiff_transferfunction[1]),
roentgen b75cab
                                 &(t2p->tiff_transferfunction[2]))) {
roentgen b75cab
			if(t2p->tiff_transferfunction[1] !=
roentgen b75cab
			   t2p->tiff_transferfunction[0]) {
roentgen b75cab
				t2p->tiff_transferfunctioncount = 3;
roentgen b75cab
				t2p->tiff_pages[i].page_extra += 4;
roentgen b75cab
				t2p->pdf_xrefcount += 4;
roentgen b75cab
			} else {
roentgen b75cab
				t2p->tiff_transferfunctioncount = 1;
roentgen b75cab
				t2p->tiff_pages[i].page_extra += 2;
roentgen b75cab
				t2p->pdf_xrefcount += 2;
roentgen b75cab
			}
roentgen b75cab
			if(t2p->pdf_minorversion < 2)
roentgen b75cab
				t2p->pdf_minorversion = 2;
roentgen b75cab
                } else {
roentgen b75cab
			t2p->tiff_transferfunctioncount=0;
roentgen b75cab
		}
roentgen b75cab
		if( TIFFGetField(
roentgen b75cab
			input, 
roentgen b75cab
			TIFFTAG_ICCPROFILE, 
roentgen b75cab
			&(t2p->tiff_iccprofilelength), 
roentgen b75cab
			&(t2p->tiff_iccprofile)) != 0){
roentgen b75cab
			t2p->tiff_pages[i].page_extra++;
roentgen b75cab
			t2p->pdf_xrefcount++;
roentgen b75cab
			if(t2p->pdf_minorversion<3){t2p->pdf_minorversion=3;}
roentgen b75cab
		}
roentgen b75cab
		t2p->tiff_tiles[i].tiles_tilecount=
roentgen b75cab
			t2p->tiff_pages[i].page_tilecount;
roentgen b75cab
		if( (TIFFGetField(input, TIFFTAG_PLANARCONFIG, &xuint16) != 0)
roentgen b75cab
			&& (xuint16 == PLANARCONFIG_SEPARATE ) ){
roentgen b75cab
				TIFFGetField(input, TIFFTAG_SAMPLESPERPIXEL, &xuint16);
roentgen b75cab
				t2p->tiff_tiles[i].tiles_tilecount/= xuint16;
roentgen b75cab
		}
roentgen b75cab
		if( t2p->tiff_tiles[i].tiles_tilecount > 0){
roentgen b75cab
			t2p->pdf_xrefcount += 
roentgen b75cab
				(t2p->tiff_tiles[i].tiles_tilecount -1)*2;
roentgen b75cab
			TIFFGetField(input, 
roentgen b75cab
				TIFFTAG_TILEWIDTH, 
roentgen b75cab
				&( t2p->tiff_tiles[i].tiles_tilewidth) );
roentgen b75cab
			TIFFGetField(input, 
roentgen b75cab
				TIFFTAG_TILELENGTH, 
roentgen b75cab
				&( t2p->tiff_tiles[i].tiles_tilelength) );
roentgen b75cab
			t2p->tiff_tiles[i].tiles_tiles = 
roentgen b75cab
			(T2P_TILE*) _TIFFmalloc(
roentgen b75cab
				t2p->tiff_tiles[i].tiles_tilecount 
roentgen b75cab
				* sizeof(T2P_TILE) );
roentgen b75cab
			if( t2p->tiff_tiles[i].tiles_tiles == NULL){
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"Can't allocate %lu bytes of memory for t2p_read_tiff_init, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_tiles[i].tiles_tilecount * sizeof(T2P_TILE), 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function is used by qsort to sort a T2P_PAGE* array of page structures
roentgen b75cab
 * by page number.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
int t2p_cmp_t2p_page(const void* e1, const void* e2){
roentgen b75cab
roentgen b75cab
	return( ((T2P_PAGE*)e1)->page_number - ((T2P_PAGE*)e2)->page_number );
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function sets the input directory to the directory of a given
roentgen b75cab
	page and determines information about the image.  It checks
roentgen b75cab
	the image characteristics to determine if it is possible to convert
roentgen b75cab
	the image data into a page of PDF output, setting values of the T2P
roentgen b75cab
	struct for this page.  It determines what color space is used in
roentgen b75cab
	the output PDF to represent the image.
roentgen b75cab
	
roentgen b75cab
	It determines if the image can be converted as raw data without
roentgen b75cab
	requiring transcoding of the image data.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
void t2p_read_tiff_data(T2P* t2p, TIFF* input){
roentgen b75cab
roentgen b75cab
	int i=0;
roentgen b75cab
	uint16* r;
roentgen b75cab
	uint16* g;
roentgen b75cab
	uint16* b;
roentgen b75cab
	uint16* a;
roentgen b75cab
	uint16 xuint16;
roentgen b75cab
	uint16* xuint16p;
roentgen b75cab
	float* xfloatp;
roentgen b75cab
roentgen b75cab
	t2p->pdf_transcode = T2P_TRANSCODE_ENCODE;
roentgen b75cab
	t2p->pdf_sample = T2P_SAMPLE_NOTHING;
roentgen b75cab
        t2p->pdf_switchdecode = t2p->pdf_colorspace_invert;
roentgen b75cab
        
roentgen b75cab
	
roentgen b75cab
	TIFFSetDirectory(input, t2p->tiff_pages[t2p->pdf_page].page_directory);
roentgen b75cab
roentgen b75cab
	TIFFGetField(input, TIFFTAG_IMAGEWIDTH, &(t2p->tiff_width));
roentgen b75cab
	if(t2p->tiff_width == 0){
roentgen b75cab
		TIFFError(
roentgen b75cab
			TIFF2PDF_MODULE, 
roentgen b75cab
			"No support for %s with zero width", 
roentgen b75cab
			TIFFFileName(input)	);
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	TIFFGetField(input, TIFFTAG_IMAGELENGTH, &(t2p->tiff_length));
roentgen b75cab
	if(t2p->tiff_length == 0){
roentgen b75cab
		TIFFError(
roentgen b75cab
			TIFF2PDF_MODULE, 
roentgen b75cab
			"No support for %s with zero length", 
roentgen b75cab
			TIFFFileName(input)	);
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
        if(TIFFGetField(input, TIFFTAG_COMPRESSION, &(t2p->tiff_compression)) == 0){
roentgen b75cab
                TIFFError(
roentgen b75cab
                        TIFF2PDF_MODULE, 
roentgen b75cab
                        "No support for %s with no compression tag", 
roentgen b75cab
                        TIFFFileName(input)     );
roentgen b75cab
                t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
                return;
roentgen b75cab
roentgen b75cab
        }
roentgen b75cab
        if( TIFFIsCODECConfigured(t2p->tiff_compression) == 0){
roentgen b75cab
		TIFFError(
roentgen b75cab
			TIFF2PDF_MODULE, 
roentgen b75cab
			"No support for %s with compression type %u:  not configured", 
roentgen b75cab
			TIFFFileName(input), 
roentgen b75cab
			t2p->tiff_compression	
roentgen b75cab
			);
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return;
roentgen b75cab
	
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	TIFFGetFieldDefaulted(input, TIFFTAG_BITSPERSAMPLE, &(t2p->tiff_bitspersample));
roentgen b75cab
	switch(t2p->tiff_bitspersample){
roentgen b75cab
		case 1:
roentgen b75cab
		case 2:
roentgen b75cab
		case 4:
roentgen b75cab
		case 8:
roentgen b75cab
			break;
roentgen b75cab
		case 0:
roentgen b75cab
			TIFFWarning(
roentgen b75cab
				TIFF2PDF_MODULE, 
roentgen b75cab
				"Image %s has 0 bits per sample, assuming 1",
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
			t2p->tiff_bitspersample=1;
roentgen b75cab
			break;
roentgen b75cab
		default:
roentgen b75cab
			TIFFError(
roentgen b75cab
				TIFF2PDF_MODULE, 
roentgen b75cab
				"No support for %s with %u bits per sample",
roentgen b75cab
				TIFFFileName(input),
roentgen b75cab
				t2p->tiff_bitspersample);
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	TIFFGetFieldDefaulted(input, TIFFTAG_SAMPLESPERPIXEL, &(t2p->tiff_samplesperpixel));
roentgen b75cab
	if(t2p->tiff_samplesperpixel>4){
roentgen b75cab
		TIFFError(
roentgen b75cab
			TIFF2PDF_MODULE, 
roentgen b75cab
			"No support for %s with %u samples per pixel",
roentgen b75cab
			TIFFFileName(input),
roentgen b75cab
			t2p->tiff_samplesperpixel);
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return;
roentgen b75cab
	}
roentgen b75cab
	if(t2p->tiff_samplesperpixel==0){
roentgen b75cab
		TIFFWarning(
roentgen b75cab
			TIFF2PDF_MODULE, 
roentgen b75cab
			"Image %s has 0 samples per pixel, assuming 1",
roentgen b75cab
			TIFFFileName(input));
roentgen b75cab
		t2p->tiff_samplesperpixel=1;
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
	if(TIFFGetField(input, TIFFTAG_SAMPLEFORMAT, &xuint16) != 0 ){
roentgen b75cab
		switch(xuint16){
roentgen b75cab
			case 0:
roentgen b75cab
			case 1:
roentgen b75cab
			case 4:
roentgen b75cab
				break;
roentgen b75cab
			default:
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"No support for %s with sample format %u",
roentgen b75cab
					TIFFFileName(input),
roentgen b75cab
					xuint16);
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
				break;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
	TIFFGetFieldDefaulted(input, TIFFTAG_FILLORDER, &(t2p->tiff_fillorder));
roentgen b75cab
	
roentgen b75cab
        if(TIFFGetField(input, TIFFTAG_PHOTOMETRIC, &(t2p->tiff_photometric)) == 0){
roentgen b75cab
                TIFFError(
roentgen b75cab
                        TIFF2PDF_MODULE, 
roentgen b75cab
                        "No support for %s with no photometric interpretation tag", 
roentgen b75cab
                        TIFFFileName(input)     );
roentgen b75cab
                t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
                return;
roentgen b75cab
roentgen b75cab
        }
roentgen b75cab
        
roentgen b75cab
	switch(t2p->tiff_photometric){
roentgen b75cab
		case PHOTOMETRIC_MINISWHITE:
roentgen b75cab
		case PHOTOMETRIC_MINISBLACK: 
roentgen b75cab
			if (t2p->tiff_bitspersample==1){
roentgen b75cab
				t2p->pdf_colorspace=T2P_CS_BILEVEL;
roentgen b75cab
				if(t2p->tiff_photometric==PHOTOMETRIC_MINISWHITE){
roentgen b75cab
					t2p->pdf_switchdecode ^= 1;
roentgen b75cab
				}
roentgen b75cab
			} else {
roentgen b75cab
				t2p->pdf_colorspace=T2P_CS_GRAY;
roentgen b75cab
				if(t2p->tiff_photometric==PHOTOMETRIC_MINISWHITE){
roentgen b75cab
					t2p->pdf_switchdecode ^= 1;
roentgen b75cab
				} 
roentgen b75cab
			}
roentgen b75cab
			break;
roentgen b75cab
		case PHOTOMETRIC_RGB: 
roentgen b75cab
			t2p->pdf_colorspace=T2P_CS_RGB;
roentgen b75cab
			if(t2p->tiff_samplesperpixel == 3){
roentgen b75cab
				break;
roentgen b75cab
			}
roentgen b75cab
			if(TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)){
roentgen b75cab
				if(xuint16==1)
roentgen b75cab
					goto photometric_palette;
roentgen b75cab
			}
roentgen b75cab
			if(t2p->tiff_samplesperpixel > 3) {
roentgen b75cab
				if(t2p->tiff_samplesperpixel == 4) {
roentgen b75cab
					t2p->pdf_colorspace = T2P_CS_RGB;
roentgen b75cab
					if(TIFFGetField(input,
roentgen b75cab
							TIFFTAG_EXTRASAMPLES,
roentgen b75cab
							&xuint16, &xuint16p)
roentgen b75cab
					   && xuint16 == 1) {
roentgen b75cab
						if(xuint16p[0] == EXTRASAMPLE_ASSOCALPHA){
roentgen b75cab
							t2p->pdf_sample=T2P_SAMPLE_RGBAA_TO_RGB;
roentgen b75cab
							break;
roentgen b75cab
						}
roentgen b75cab
						if(xuint16p[0] == EXTRASAMPLE_UNASSALPHA){
roentgen b75cab
							t2p->pdf_sample=T2P_SAMPLE_RGBA_TO_RGB;
roentgen b75cab
							break;
roentgen b75cab
						}
roentgen b75cab
						TIFFWarning(
roentgen b75cab
							TIFF2PDF_MODULE, 
roentgen b75cab
							"RGB image %s has 4 samples per pixel, assuming RGBA",
roentgen b75cab
							TIFFFileName(input));
roentgen b75cab
							break;
roentgen b75cab
					}
roentgen b75cab
					t2p->pdf_colorspace=T2P_CS_CMYK;
roentgen b75cab
					t2p->pdf_switchdecode ^= 1;
roentgen b75cab
					TIFFWarning(
roentgen b75cab
						TIFF2PDF_MODULE, 
roentgen b75cab
						"RGB image %s has 4 samples per pixel, assuming inverse CMYK",
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
					break;
roentgen b75cab
				} else {
roentgen b75cab
					TIFFError(
roentgen b75cab
						TIFF2PDF_MODULE, 
roentgen b75cab
						"No support for RGB image %s with %u samples per pixel", 
roentgen b75cab
						TIFFFileName(input), 
roentgen b75cab
						t2p->tiff_samplesperpixel);
roentgen b75cab
					t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
					break;
roentgen b75cab
				}
roentgen b75cab
			} else {
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"No support for RGB image %s with %u samples per pixel", 
roentgen b75cab
					TIFFFileName(input), 
roentgen b75cab
					t2p->tiff_samplesperpixel);
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				break;
roentgen b75cab
			}
roentgen b75cab
		case PHOTOMETRIC_PALETTE: 
roentgen b75cab
			photometric_palette:
roentgen b75cab
			if(t2p->tiff_samplesperpixel!=1){
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"No support for palettized image %s with not one sample per pixel", 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
			}
roentgen b75cab
			t2p->pdf_colorspace=T2P_CS_RGB | T2P_CS_PALETTE;
roentgen b75cab
			t2p->pdf_palettesize=0x0001<<t2p->tiff_bitspersample;
roentgen b75cab
			if(!TIFFGetField(input, TIFFTAG_COLORMAP, &r, &g, &b)){
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"Palettized image %s has no color map", 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
			} 
roentgen b75cab
			if(t2p->pdf_palette != NULL){
roentgen b75cab
				_TIFFfree(t2p->pdf_palette);
roentgen b75cab
				t2p->pdf_palette=NULL;
roentgen b75cab
			}
roentgen b75cab
			t2p->pdf_palette = (unsigned char*)
roentgen b75cab
				_TIFFmalloc(t2p->pdf_palettesize*3);
roentgen b75cab
			if(t2p->pdf_palette==NULL){
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"Can't allocate %u bytes of memory for t2p_read_tiff_image, %s", 
roentgen b75cab
					t2p->pdf_palettesize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
			}
roentgen b75cab
			for(i=0;i<t2p->pdf_palettesize;i++){
roentgen b75cab
				t2p->pdf_palette[(i*3)]  = (unsigned char) (r[i]>>8);
roentgen b75cab
				t2p->pdf_palette[(i*3)+1]= (unsigned char) (g[i]>>8);
roentgen b75cab
				t2p->pdf_palette[(i*3)+2]= (unsigned char) (b[i]>>8);
roentgen b75cab
			}
roentgen b75cab
			t2p->pdf_palettesize *= 3;
roentgen b75cab
			break;
roentgen b75cab
		case PHOTOMETRIC_SEPARATED:
roentgen b75cab
			if(TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)){
roentgen b75cab
				if(xuint16==1){
roentgen b75cab
						goto photometric_palette_cmyk;
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
			if( TIFFGetField(input, TIFFTAG_INKSET, &xuint16) ){
roentgen b75cab
				if(xuint16 != INKSET_CMYK){
roentgen b75cab
					TIFFError(
roentgen b75cab
						TIFF2PDF_MODULE, 
roentgen b75cab
						"No support for %s because its inkset is not CMYK",
roentgen b75cab
						TIFFFileName(input) );
roentgen b75cab
					t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
					return;
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
			if(t2p->tiff_samplesperpixel==4){
roentgen b75cab
				t2p->pdf_colorspace=T2P_CS_CMYK;
roentgen b75cab
			} else {
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"No support for %s because it has %u samples per pixel",
roentgen b75cab
					TIFFFileName(input), 
roentgen b75cab
					t2p->tiff_samplesperpixel);
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
			}
roentgen b75cab
			break;
roentgen b75cab
			photometric_palette_cmyk:
roentgen b75cab
			if(t2p->tiff_samplesperpixel!=1){
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"No support for palettized CMYK image %s with not one sample per pixel", 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
			}
roentgen b75cab
			t2p->pdf_colorspace=T2P_CS_CMYK | T2P_CS_PALETTE;
roentgen b75cab
			t2p->pdf_palettesize=0x0001<<t2p->tiff_bitspersample;
roentgen b75cab
			if(!TIFFGetField(input, TIFFTAG_COLORMAP, &r, &g, &b, &a)){
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"Palettized image %s has no color map", 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
			} 
roentgen b75cab
			if(t2p->pdf_palette != NULL){
roentgen b75cab
				_TIFFfree(t2p->pdf_palette);
roentgen b75cab
				t2p->pdf_palette=NULL;
roentgen b75cab
			}
roentgen b75cab
			t2p->pdf_palette = (unsigned char*) 
roentgen b75cab
				_TIFFmalloc(t2p->pdf_palettesize*4);
roentgen b75cab
			if(t2p->pdf_palette==NULL){
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"Can't allocate %u bytes of memory for t2p_read_tiff_image, %s", 
roentgen b75cab
					t2p->pdf_palettesize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
			}
roentgen b75cab
			for(i=0;i<t2p->pdf_palettesize;i++){
roentgen b75cab
				t2p->pdf_palette[(i*4)]  = (unsigned char) (r[i]>>8);
roentgen b75cab
				t2p->pdf_palette[(i*4)+1]= (unsigned char) (g[i]>>8);
roentgen b75cab
				t2p->pdf_palette[(i*4)+2]= (unsigned char) (b[i]>>8);
roentgen b75cab
				t2p->pdf_palette[(i*4)+3]= (unsigned char) (a[i]>>8);
roentgen b75cab
			}
roentgen b75cab
			t2p->pdf_palettesize *= 4;
roentgen b75cab
			break;
roentgen b75cab
		case PHOTOMETRIC_YCBCR:
roentgen b75cab
			t2p->pdf_colorspace=T2P_CS_RGB;
roentgen b75cab
			if(t2p->tiff_samplesperpixel==1){
roentgen b75cab
				t2p->pdf_colorspace=T2P_CS_GRAY;
roentgen b75cab
				t2p->tiff_photometric=PHOTOMETRIC_MINISBLACK;
roentgen b75cab
				break;
roentgen b75cab
			}
roentgen b75cab
			t2p->pdf_sample=T2P_SAMPLE_YCBCR_TO_RGB;
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
			if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){
roentgen b75cab
				t2p->pdf_sample=T2P_SAMPLE_NOTHING;
roentgen b75cab
			}
roentgen b75cab
#endif
roentgen b75cab
			break;
roentgen b75cab
		case PHOTOMETRIC_CIELAB:
roentgen b75cab
			t2p->pdf_labrange[0]= -127;
roentgen b75cab
			t2p->pdf_labrange[1]= 127;
roentgen b75cab
			t2p->pdf_labrange[2]= -127;
roentgen b75cab
			t2p->pdf_labrange[3]= 127;
roentgen b75cab
			t2p->pdf_sample=T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED;
roentgen b75cab
			t2p->pdf_colorspace=T2P_CS_LAB;
roentgen b75cab
			break;
roentgen b75cab
		case PHOTOMETRIC_ICCLAB:
roentgen b75cab
			t2p->pdf_labrange[0]= 0;
roentgen b75cab
			t2p->pdf_labrange[1]= 255;
roentgen b75cab
			t2p->pdf_labrange[2]= 0;
roentgen b75cab
			t2p->pdf_labrange[3]= 255;
roentgen b75cab
			t2p->pdf_colorspace=T2P_CS_LAB;
roentgen b75cab
			break;
roentgen b75cab
		case PHOTOMETRIC_ITULAB:
roentgen b75cab
			t2p->pdf_labrange[0]=-85;
roentgen b75cab
			t2p->pdf_labrange[1]=85;
roentgen b75cab
			t2p->pdf_labrange[2]=-75;
roentgen b75cab
			t2p->pdf_labrange[3]=124;
roentgen b75cab
			t2p->pdf_sample=T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED;
roentgen b75cab
			t2p->pdf_colorspace=T2P_CS_LAB;
roentgen b75cab
			break;
roentgen b75cab
		case PHOTOMETRIC_LOGL:
roentgen b75cab
		case PHOTOMETRIC_LOGLUV:
roentgen b75cab
			TIFFError(
roentgen b75cab
				TIFF2PDF_MODULE, 
roentgen b75cab
				"No support for %s with photometric interpretation LogL/LogLuv", 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return;
roentgen b75cab
		default:
roentgen b75cab
			TIFFError(
roentgen b75cab
				TIFF2PDF_MODULE, 
roentgen b75cab
				"No support for %s with photometric interpretation %u", 
roentgen b75cab
				TIFFFileName(input),
roentgen b75cab
				t2p->tiff_photometric);
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	if(TIFFGetField(input, TIFFTAG_PLANARCONFIG, &(t2p->tiff_planar))){
roentgen b75cab
		switch(t2p->tiff_planar){
roentgen b75cab
			case 0:
roentgen b75cab
				TIFFWarning(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"Image %s has planar configuration 0, assuming 1", 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->tiff_planar=PLANARCONFIG_CONTIG;
roentgen b75cab
			case PLANARCONFIG_CONTIG:
roentgen b75cab
				break;
roentgen b75cab
			case PLANARCONFIG_SEPARATE:
roentgen b75cab
				t2p->pdf_sample=T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG;
roentgen b75cab
				if(t2p->tiff_bitspersample!=8){
roentgen b75cab
					TIFFError(
roentgen b75cab
						TIFF2PDF_MODULE, 
roentgen b75cab
						"No support for %s with separated planar configuration and %u bits per sample", 
roentgen b75cab
						TIFFFileName(input),
roentgen b75cab
						t2p->tiff_bitspersample);
roentgen b75cab
					t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
					return;
roentgen b75cab
				}
roentgen b75cab
				break;
roentgen b75cab
			default:
roentgen b75cab
				TIFFError(
roentgen b75cab
					TIFF2PDF_MODULE, 
roentgen b75cab
					"No support for %s with planar configuration %u", 
roentgen b75cab
					TIFFFileName(input),
roentgen b75cab
					t2p->tiff_planar);
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
        TIFFGetFieldDefaulted(input, TIFFTAG_ORIENTATION,
roentgen b75cab
                              &(t2p->tiff_orientation));
roentgen b75cab
        if(t2p->tiff_orientation>8){
roentgen b75cab
                TIFFWarning(TIFF2PDF_MODULE,
roentgen b75cab
                            "Image %s has orientation %u, assuming 0",
roentgen b75cab
                            TIFFFileName(input), t2p->tiff_orientation);
roentgen b75cab
                t2p->tiff_orientation=0;
roentgen b75cab
        }
roentgen b75cab
roentgen b75cab
        if(TIFFGetField(input, TIFFTAG_XRESOLUTION, &(t2p->tiff_xres) ) == 0){
roentgen b75cab
                t2p->tiff_xres=0.0;
roentgen b75cab
        }
roentgen b75cab
        if(TIFFGetField(input, TIFFTAG_YRESOLUTION, &(t2p->tiff_yres) ) == 0){
roentgen b75cab
                t2p->tiff_yres=0.0;
roentgen b75cab
        }
roentgen b75cab
	TIFFGetFieldDefaulted(input, TIFFTAG_RESOLUTIONUNIT,
roentgen b75cab
			      &(t2p->tiff_resunit));
roentgen b75cab
	if(t2p->tiff_resunit == RESUNIT_CENTIMETER) {
roentgen b75cab
		t2p->tiff_xres *= 2.54F;
roentgen b75cab
		t2p->tiff_yres *= 2.54F;
roentgen b75cab
	} else if (t2p->tiff_resunit != RESUNIT_INCH
roentgen b75cab
		   && t2p->pdf_centimeters != 0) {
roentgen b75cab
		t2p->tiff_xres *= 2.54F;
roentgen b75cab
		t2p->tiff_yres *= 2.54F;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	t2p_compose_pdf_page(t2p);
roentgen b75cab
roentgen b75cab
	t2p->pdf_transcode = T2P_TRANSCODE_ENCODE;
roentgen b75cab
	if(t2p->pdf_nopassthrough==0){
roentgen b75cab
#ifdef CCITT_SUPPORT
roentgen b75cab
		if(t2p->tiff_compression==COMPRESSION_CCITTFAX4  
roentgen b75cab
			){
roentgen b75cab
			if(TIFFIsTiled(input) || (TIFFNumberOfStrips(input)==1) ){
roentgen b75cab
				t2p->pdf_transcode = T2P_TRANSCODE_RAW;
roentgen b75cab
				t2p->pdf_compression=T2P_COMPRESS_G4;
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
		if(t2p->tiff_compression== COMPRESSION_ADOBE_DEFLATE 
roentgen b75cab
			|| t2p->tiff_compression==COMPRESSION_DEFLATE){
roentgen b75cab
			if(TIFFIsTiled(input) || (TIFFNumberOfStrips(input)==1) ){
roentgen b75cab
				t2p->pdf_transcode = T2P_TRANSCODE_RAW;
roentgen b75cab
				t2p->pdf_compression=T2P_COMPRESS_ZIP;
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
		if(t2p->tiff_compression==COMPRESSION_OJPEG){
roentgen b75cab
			t2p->pdf_transcode = T2P_TRANSCODE_RAW;
roentgen b75cab
			t2p->pdf_compression=T2P_COMPRESS_JPEG;
roentgen b75cab
			t2p_process_ojpeg_tables(t2p, input);
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
		if(t2p->tiff_compression==COMPRESSION_JPEG){
roentgen b75cab
			t2p->pdf_transcode = T2P_TRANSCODE_RAW;
roentgen b75cab
			t2p->pdf_compression=T2P_COMPRESS_JPEG;
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
		(void)0;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	if(t2p->pdf_transcode!=T2P_TRANSCODE_RAW){
roentgen b75cab
		t2p->pdf_compression = t2p->pdf_defaultcompression;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
	if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){
roentgen b75cab
		if(t2p->pdf_colorspace & T2P_CS_PALETTE){
roentgen b75cab
			t2p->pdf_sample|=T2P_SAMPLE_REALIZE_PALETTE;
roentgen b75cab
			t2p->pdf_colorspace ^= T2P_CS_PALETTE;
roentgen b75cab
			t2p->tiff_pages[t2p->pdf_page].page_extra--;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if(t2p->tiff_compression==COMPRESSION_JPEG){
roentgen b75cab
		if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
roentgen b75cab
			TIFFError(
roentgen b75cab
				TIFF2PDF_MODULE, 
roentgen b75cab
				"No support for %s with JPEG compression and separated planar configuration", 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error=T2P_ERR_ERROR;
roentgen b75cab
			return;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
#endif
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
	if(t2p->tiff_compression==COMPRESSION_OJPEG){
roentgen b75cab
		if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
roentgen b75cab
			TIFFError(
roentgen b75cab
				TIFF2PDF_MODULE, 
roentgen b75cab
				"No support for %s with OJPEG compression and separated planar configuration", 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error=T2P_ERR_ERROR;
roentgen b75cab
			return;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
	if(t2p->pdf_sample & T2P_SAMPLE_REALIZE_PALETTE){
roentgen b75cab
		if(t2p->pdf_colorspace & T2P_CS_CMYK){
roentgen b75cab
			t2p->tiff_samplesperpixel=4;
roentgen b75cab
			t2p->tiff_photometric=PHOTOMETRIC_SEPARATED;
roentgen b75cab
		} else {
roentgen b75cab
			t2p->tiff_samplesperpixel=3;
roentgen b75cab
			t2p->tiff_photometric=PHOTOMETRIC_RGB;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	if (TIFFGetField(input, TIFFTAG_TRANSFERFUNCTION,
roentgen b75cab
			 &(t2p->tiff_transferfunction[0]),
roentgen b75cab
			 &(t2p->tiff_transferfunction[1]),
roentgen b75cab
			 &(t2p->tiff_transferfunction[2]))) {
roentgen b75cab
		if(t2p->tiff_transferfunction[1] !=
roentgen b75cab
		   t2p->tiff_transferfunction[0]) {
roentgen b75cab
			t2p->tiff_transferfunctioncount=3;
roentgen b75cab
		} else {
roentgen b75cab
			t2p->tiff_transferfunctioncount=1;
roentgen b75cab
		}
roentgen b75cab
	} else {
roentgen b75cab
		t2p->tiff_transferfunctioncount=0;
roentgen b75cab
	}
roentgen b75cab
	if(TIFFGetField(input, TIFFTAG_WHITEPOINT, &xfloatp)!=0){
roentgen b75cab
		t2p->tiff_whitechromaticities[0]=xfloatp[0];
roentgen b75cab
		t2p->tiff_whitechromaticities[1]=xfloatp[1];
roentgen b75cab
		if(t2p->pdf_colorspace & T2P_CS_GRAY){
roentgen b75cab
			t2p->pdf_colorspace |= T2P_CS_CALGRAY;
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_colorspace & T2P_CS_RGB){
roentgen b75cab
			t2p->pdf_colorspace |= T2P_CS_CALRGB;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if(TIFFGetField(input, TIFFTAG_PRIMARYCHROMATICITIES, &xfloatp)!=0){
roentgen b75cab
		t2p->tiff_primarychromaticities[0]=xfloatp[0];
roentgen b75cab
		t2p->tiff_primarychromaticities[1]=xfloatp[1];
roentgen b75cab
		t2p->tiff_primarychromaticities[2]=xfloatp[2];
roentgen b75cab
		t2p->tiff_primarychromaticities[3]=xfloatp[3];
roentgen b75cab
		t2p->tiff_primarychromaticities[4]=xfloatp[4];
roentgen b75cab
		t2p->tiff_primarychromaticities[5]=xfloatp[5];
roentgen b75cab
		if(t2p->pdf_colorspace & T2P_CS_RGB){
roentgen b75cab
			t2p->pdf_colorspace |= T2P_CS_CALRGB;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_colorspace & T2P_CS_LAB){
roentgen b75cab
		if(TIFFGetField(input, TIFFTAG_WHITEPOINT, &xfloatp) != 0){
roentgen b75cab
			t2p->tiff_whitechromaticities[0]=xfloatp[0];
roentgen b75cab
			t2p->tiff_whitechromaticities[1]=xfloatp[1];
roentgen b75cab
		} else {
roentgen b75cab
			t2p->tiff_whitechromaticities[0]=0.3457F; /* 0.3127F; */
roentgen b75cab
			t2p->tiff_whitechromaticities[1]=0.3585F; /* 0.3290F; */
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if(TIFFGetField(input, 
roentgen b75cab
		TIFFTAG_ICCPROFILE, 
roentgen b75cab
		&(t2p->tiff_iccprofilelength), 
roentgen b75cab
		&(t2p->tiff_iccprofile))!=0){
roentgen b75cab
		t2p->pdf_colorspace |= T2P_CS_ICCBASED;
roentgen b75cab
	} else {
roentgen b75cab
		t2p->tiff_iccprofilelength=0;
roentgen b75cab
		t2p->tiff_iccprofile=NULL;
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
#ifdef CCITT_SUPPORT
roentgen b75cab
	if( t2p->tiff_bitspersample==1 &&
roentgen b75cab
		t2p->tiff_samplesperpixel==1){
roentgen b75cab
		t2p->pdf_compression = T2P_COMPRESS_G4;
roentgen b75cab
	}
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function returns the necessary size of a data buffer to contain the raw or 
roentgen b75cab
	uncompressed image data from the input TIFF for a page.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
void t2p_read_tiff_size(T2P* t2p, TIFF* input){
roentgen b75cab
roentgen b75cab
	uint64* sbc=NULL;
roentgen b75cab
#if defined(JPEG_SUPPORT) || defined (OJPEG_SUPPORT)
roentgen b75cab
	unsigned char* jpt=NULL;
roentgen b75cab
	tstrip_t i=0;
roentgen b75cab
	tstrip_t stripcount=0;
roentgen b75cab
#endif
roentgen b75cab
        uint64 k = 0;
roentgen b75cab
roentgen b75cab
	if(t2p->pdf_transcode == T2P_TRANSCODE_RAW){
roentgen b75cab
#ifdef CCITT_SUPPORT
roentgen b75cab
		if(t2p->pdf_compression == T2P_COMPRESS_G4 ){
roentgen b75cab
			TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc);
roentgen b75cab
			t2p->tiff_datasize=(tmsize_t)sbc[0];
roentgen b75cab
			return;
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
		if(t2p->pdf_compression == T2P_COMPRESS_ZIP){
roentgen b75cab
			TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc);
roentgen b75cab
			t2p->tiff_datasize=(tmsize_t)sbc[0];
roentgen b75cab
			return;
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
		if(t2p->tiff_compression == COMPRESSION_OJPEG){
roentgen b75cab
			if(!TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc)){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Input file %s missing field: TIFFTAG_STRIPBYTECOUNTS",
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
			}
roentgen b75cab
			stripcount=TIFFNumberOfStrips(input);
roentgen b75cab
			for(i=0;i<stripcount;i++){
roentgen b75cab
				k = checkAdd64(k, sbc[i], t2p);
roentgen b75cab
			}
roentgen b75cab
			if(TIFFGetField(input, TIFFTAG_JPEGIFOFFSET, &(t2p->tiff_dataoffset))){
roentgen b75cab
				if(t2p->tiff_dataoffset != 0){
roentgen b75cab
					if(TIFFGetField(input, TIFFTAG_JPEGIFBYTECOUNT, &(t2p->tiff_datasize))!=0){
roentgen b75cab
						if((uint64)t2p->tiff_datasize < k) {
roentgen b75cab
							TIFFWarning(TIFF2PDF_MODULE, 
roentgen b75cab
								"Input file %s has short JPEG interchange file byte count", 
roentgen b75cab
								TIFFFileName(input));
roentgen b75cab
							t2p->pdf_ojpegiflength=t2p->tiff_datasize;
roentgen b75cab
							k = checkAdd64(k, t2p->tiff_datasize, t2p);
roentgen b75cab
							k = checkAdd64(k, 6, t2p);
roentgen b75cab
							k = checkAdd64(k, stripcount, t2p);
roentgen b75cab
							k = checkAdd64(k, stripcount, t2p);
roentgen b75cab
							t2p->tiff_datasize = (tsize_t) k;
roentgen b75cab
							if ((uint64) t2p->tiff_datasize != k) {
roentgen b75cab
								TIFFError(TIFF2PDF_MODULE, "Integer overflow");
roentgen b75cab
								t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
							}
roentgen b75cab
							return;
roentgen b75cab
						}
roentgen b75cab
						return;
roentgen b75cab
					}else {
roentgen b75cab
						TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
							"Input file %s missing field: TIFFTAG_JPEGIFBYTECOUNT",
roentgen b75cab
							TIFFFileName(input));
roentgen b75cab
							t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
							return;
roentgen b75cab
					}
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
			k = checkAdd64(k, stripcount, t2p);
roentgen b75cab
			k = checkAdd64(k, stripcount, t2p);
roentgen b75cab
			k = checkAdd64(k, 2048, t2p);
roentgen b75cab
			t2p->tiff_datasize = (tsize_t) k;
roentgen b75cab
			if ((uint64) t2p->tiff_datasize != k) {
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, "Integer overflow");
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			}
roentgen b75cab
			return;
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
		if(t2p->tiff_compression == COMPRESSION_JPEG) {
roentgen b75cab
			uint32 count = 0;
roentgen b75cab
			if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0 ){
roentgen b75cab
				if(count > 4){
roentgen b75cab
					k += count;
roentgen b75cab
					k -= 2; /* don't use EOI of header */
roentgen b75cab
				}
roentgen b75cab
			} else {
roentgen b75cab
				k = 2; /* SOI for first strip */
roentgen b75cab
			}
roentgen b75cab
			stripcount=TIFFNumberOfStrips(input);
roentgen b75cab
			if(!TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc)){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Input file %s missing field: TIFFTAG_STRIPBYTECOUNTS",
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return;
roentgen b75cab
			}
roentgen b75cab
			for(i=0;i<stripcount;i++){
roentgen b75cab
				k = checkAdd64(k, sbc[i], t2p);
roentgen b75cab
				k -=4; /* don't use SOI or EOI of strip */
roentgen b75cab
			}
roentgen b75cab
			k = checkAdd64(k, 2, t2p); /* use EOI of last strip */
roentgen b75cab
			t2p->tiff_datasize = (tsize_t) k;
roentgen b75cab
			if ((uint64) t2p->tiff_datasize != k) {
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, "Integer overflow");
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			}
roentgen b75cab
			return;
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
		(void) 0;
roentgen b75cab
	}
roentgen b75cab
	k = checkMultiply64(TIFFScanlineSize(input), t2p->tiff_length, t2p);
roentgen b75cab
	if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
roentgen b75cab
		k = checkMultiply64(k, t2p->tiff_samplesperpixel, t2p);
roentgen b75cab
	}
roentgen b75cab
	if (k == 0) {
roentgen b75cab
		/* Assume we had overflow inside TIFFScanlineSize */
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	t2p->tiff_datasize = (tsize_t) k;
roentgen b75cab
	if ((uint64) t2p->tiff_datasize != k) {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, "Integer overflow");
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function returns the necessary size of a data buffer to contain the raw or 
roentgen b75cab
	uncompressed image data from the input TIFF for a tile of a page.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
void t2p_read_tiff_size_tile(T2P* t2p, TIFF* input, ttile_t tile){
roentgen b75cab
roentgen b75cab
	uint64* tbc = NULL;
roentgen b75cab
	uint16 edge=0;
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
	unsigned char* jpt;
roentgen b75cab
#endif
roentgen b75cab
        uint64 k;
roentgen b75cab
roentgen b75cab
	edge |= t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
roentgen b75cab
	edge |= t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
roentgen b75cab
	
roentgen b75cab
	if(t2p->pdf_transcode==T2P_TRANSCODE_RAW){
roentgen b75cab
		if(edge
roentgen b75cab
#if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
roentgen b75cab
		&& !(t2p->pdf_compression==T2P_COMPRESS_JPEG)
roentgen b75cab
#endif
roentgen b75cab
		){
roentgen b75cab
			t2p->tiff_datasize=TIFFTileSize(input);
roentgen b75cab
			if (t2p->tiff_datasize == 0) {
roentgen b75cab
				/* Assume we had overflow inside TIFFTileSize */
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			}
roentgen b75cab
			return;
roentgen b75cab
		} else {
roentgen b75cab
			TIFFGetField(input, TIFFTAG_TILEBYTECOUNTS, &tbc);
roentgen b75cab
			k=tbc[tile];
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
			if(t2p->tiff_compression==COMPRESSION_OJPEG){
roentgen b75cab
			  	k = checkAdd64(k, 2048, t2p);
roentgen b75cab
			}
roentgen b75cab
#endif
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
			if(t2p->tiff_compression==COMPRESSION_JPEG) {
roentgen b75cab
				uint32 count = 0;
roentgen b75cab
				if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt)!=0){
roentgen b75cab
					if(count > 4){
roentgen b75cab
						k = checkAdd64(k, count, t2p);
roentgen b75cab
						k -= 2; /* don't use EOI of header or SOI of tile */
roentgen b75cab
					}
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
#endif
roentgen b75cab
			t2p->tiff_datasize = (tsize_t) k;
roentgen b75cab
			if ((uint64) t2p->tiff_datasize != k) {
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, "Integer overflow");
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			}
roentgen b75cab
			return;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	k = TIFFTileSize(input);
roentgen b75cab
	if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
roentgen b75cab
		k = checkMultiply64(k, t2p->tiff_samplesperpixel, t2p);
roentgen b75cab
	}
roentgen b75cab
	if (k == 0) {
roentgen b75cab
		/* Assume we had overflow inside TIFFTileSize */
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	t2p->tiff_datasize = (tsize_t) k;
roentgen b75cab
	if ((uint64) t2p->tiff_datasize != k) {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, "Integer overflow");
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This functions returns a non-zero value when the tile is on the right edge
roentgen b75cab
 * and does not have full imaged tile width.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
int t2p_tile_is_right_edge(T2P_TILES tiles, ttile_t tile){
roentgen b75cab
roentgen b75cab
	if( ((tile+1) % tiles.tiles_tilecountx == 0) 
roentgen b75cab
		&& (tiles.tiles_edgetilewidth != 0) ){
roentgen b75cab
		return(1);
roentgen b75cab
	} else {
roentgen b75cab
		return(0);
roentgen b75cab
	}
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This functions returns a non-zero value when the tile is on the bottom edge
roentgen b75cab
 * and does not have full imaged tile length.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
int t2p_tile_is_bottom_edge(T2P_TILES tiles, ttile_t tile){
roentgen b75cab
roentgen b75cab
	if( ((tile+1) > (tiles.tiles_tilecount-tiles.tiles_tilecountx) )
roentgen b75cab
		&& (tiles.tiles_edgetilelength != 0) ){
roentgen b75cab
		return(1);
roentgen b75cab
	} else {
roentgen b75cab
		return(0);
roentgen b75cab
	}
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function returns a non-zero value when the tile is a right edge tile
roentgen b75cab
 * or a bottom edge tile.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
int t2p_tile_is_edge(T2P_TILES tiles, ttile_t tile){
roentgen b75cab
roentgen b75cab
	return(t2p_tile_is_right_edge(tiles, tile) | t2p_tile_is_bottom_edge(tiles, tile) );
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function returns a non-zero value when the tile is a right edge tile and a bottom 
roentgen b75cab
	edge tile.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
int t2p_tile_is_corner_edge(T2P_TILES tiles, ttile_t tile){
roentgen b75cab
roentgen b75cab
	return(t2p_tile_is_right_edge(tiles, tile) & t2p_tile_is_bottom_edge(tiles, tile) );
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function reads the raster image data from the input TIFF for an image and writes 
roentgen b75cab
	the data to the output PDF XObject image dictionary stream.  It returns the amount written 
roentgen b75cab
	or zero on error.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_readwrite_pdf_image(T2P* t2p, TIFF* input, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	unsigned char* buffer=NULL;
roentgen b75cab
	unsigned char* samplebuffer=NULL;
roentgen b75cab
	tsize_t bufferoffset=0;
roentgen b75cab
	tsize_t samplebufferoffset=0;
roentgen b75cab
	tsize_t read=0;
roentgen b75cab
	tstrip_t i=0;
roentgen b75cab
	tstrip_t j=0;
roentgen b75cab
	tstrip_t stripcount=0;
roentgen b75cab
	tsize_t stripsize=0;
roentgen b75cab
	tsize_t sepstripcount=0;
roentgen b75cab
	tsize_t sepstripsize=0;
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
	toff_t inputoffset=0;
roentgen b75cab
	uint16 h_samp=1;
roentgen b75cab
	uint16 v_samp=1;
roentgen b75cab
	uint16 ri=1;
roentgen b75cab
	uint32 rows=0;
roentgen b75cab
#endif
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
	unsigned char* jpt;
roentgen b75cab
	float* xfloatp;
roentgen b75cab
	uint64* sbc;
roentgen b75cab
	unsigned char* stripbuffer;
roentgen b75cab
	tsize_t striplength=0;
roentgen b75cab
	uint32 max_striplength=0;
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
	/* Fail if prior error (in particular, can't trust tiff_datasize) */
roentgen b75cab
	if (t2p->t2p_error != T2P_ERR_OK)
roentgen b75cab
		return(0);
roentgen b75cab
roentgen b75cab
	if(t2p->pdf_transcode == T2P_TRANSCODE_RAW){
roentgen b75cab
#ifdef CCITT_SUPPORT
roentgen b75cab
		if(t2p->pdf_compression == T2P_COMPRESS_G4){
roentgen b75cab
			buffer = (unsigned char*)
roentgen b75cab
				_TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if (buffer == NULL) {
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			TIFFReadRawStrip(input, 0, (tdata_t) buffer,
roentgen b75cab
					 t2p->tiff_datasize);
roentgen b75cab
			if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){
roentgen b75cab
					/*
roentgen b75cab
					 * make sure is lsb-to-msb
roentgen b75cab
					 * bit-endianness fill order
roentgen b75cab
					 */
roentgen b75cab
					TIFFReverseBits(buffer,
roentgen b75cab
							t2p->tiff_datasize);
roentgen b75cab
			}
roentgen b75cab
			t2pWriteFile(output, (tdata_t) buffer,
roentgen b75cab
				      t2p->tiff_datasize);
roentgen b75cab
			_TIFFfree(buffer);
roentgen b75cab
			return(t2p->tiff_datasize);
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
		if (t2p->pdf_compression == T2P_COMPRESS_ZIP) {
roentgen b75cab
			buffer = (unsigned char*)
roentgen b75cab
				_TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if(buffer == NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
                        memset(buffer, 0, t2p->tiff_datasize);
roentgen b75cab
			TIFFReadRawStrip(input, 0, (tdata_t) buffer,
roentgen b75cab
					 t2p->tiff_datasize);
roentgen b75cab
			if (t2p->tiff_fillorder==FILLORDER_LSB2MSB) {
roentgen b75cab
					TIFFReverseBits(buffer,
roentgen b75cab
							t2p->tiff_datasize);
roentgen b75cab
			}
roentgen b75cab
			t2pWriteFile(output, (tdata_t) buffer,
roentgen b75cab
				      t2p->tiff_datasize);
roentgen b75cab
			_TIFFfree(buffer);
roentgen b75cab
			return(t2p->tiff_datasize);
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
		if(t2p->tiff_compression == COMPRESSION_OJPEG) {
roentgen b75cab
roentgen b75cab
			if(t2p->tiff_dataoffset != 0) {
roentgen b75cab
				buffer = (unsigned char*)
roentgen b75cab
					_TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
				if(buffer == NULL) {
roentgen b75cab
					TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
						(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
						TIFFFileName(input));
roentgen b75cab
					t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
					return(0);
roentgen b75cab
				}
roentgen b75cab
                                memset(buffer, 0, t2p->tiff_datasize);
roentgen b75cab
				if(t2p->pdf_ojpegiflength==0){
roentgen b75cab
					inputoffset=t2pSeekFile(input, 0,
roentgen b75cab
								 SEEK_CUR);
roentgen b75cab
					t2pSeekFile(input,
roentgen b75cab
						     t2p->tiff_dataoffset,
roentgen b75cab
						     SEEK_SET);
roentgen b75cab
					t2pReadFile(input, (tdata_t) buffer,
roentgen b75cab
						     t2p->tiff_datasize);
roentgen b75cab
					t2pSeekFile(input, inputoffset,
roentgen b75cab
						     SEEK_SET);
roentgen b75cab
					t2pWriteFile(output, (tdata_t) buffer,
roentgen b75cab
						      t2p->tiff_datasize);
roentgen b75cab
					_TIFFfree(buffer);
roentgen b75cab
					return(t2p->tiff_datasize);
roentgen b75cab
				} else {
roentgen b75cab
					inputoffset=t2pSeekFile(input, 0,
roentgen b75cab
								 SEEK_CUR);
roentgen b75cab
					t2pSeekFile(input,
roentgen b75cab
						     t2p->tiff_dataoffset,
roentgen b75cab
						     SEEK_SET);
roentgen b75cab
					bufferoffset = t2pReadFile(input,
roentgen b75cab
						(tdata_t) buffer,
roentgen b75cab
						t2p->pdf_ojpegiflength);
roentgen b75cab
					t2p->pdf_ojpegiflength = 0;
roentgen b75cab
					t2pSeekFile(input, inputoffset,
roentgen b75cab
						     SEEK_SET);
roentgen b75cab
					TIFFGetField(input,
roentgen b75cab
						     TIFFTAG_YCBCRSUBSAMPLING,
roentgen b75cab
						     &h_samp, &v_samp);
roentgen b75cab
					buffer[bufferoffset++]= 0xff;
roentgen b75cab
					buffer[bufferoffset++]= 0xdd;
roentgen b75cab
					buffer[bufferoffset++]= 0x00;
roentgen b75cab
					buffer[bufferoffset++]= 0x04;
roentgen b75cab
					h_samp*=8;
roentgen b75cab
					v_samp*=8;
roentgen b75cab
					ri=(t2p->tiff_width+h_samp-1) / h_samp;
roentgen b75cab
					TIFFGetField(input,
roentgen b75cab
						     TIFFTAG_ROWSPERSTRIP,
roentgen b75cab
						     &rows);
roentgen b75cab
					ri*=(rows+v_samp-1)/v_samp;
roentgen b75cab
					buffer[bufferoffset++]= (ri>>8) & 0xff;
roentgen b75cab
					buffer[bufferoffset++]= ri & 0xff;
roentgen b75cab
					stripcount=TIFFNumberOfStrips(input);
roentgen b75cab
					for(i=0;i<stripcount;i++){
roentgen b75cab
						if(i != 0 ){ 
roentgen b75cab
							buffer[bufferoffset++]=0xff;
roentgen b75cab
							buffer[bufferoffset++]=(0xd0 | ((i-1)%8));
roentgen b75cab
						}
roentgen b75cab
						bufferoffset+=TIFFReadRawStrip(input, 
roentgen b75cab
							i, 
roentgen b75cab
							(tdata_t) &(((unsigned char*)buffer)[bufferoffset]), 
roentgen b75cab
							-1);
roentgen b75cab
					}
roentgen b75cab
					t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
roentgen b75cab
					_TIFFfree(buffer);
roentgen b75cab
					return(bufferoffset);
roentgen b75cab
				}
roentgen b75cab
			} else {
roentgen b75cab
				if(! t2p->pdf_ojpegdata){
roentgen b75cab
					TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
				"No support for OJPEG image %s with bad tables", 
roentgen b75cab
						TIFFFileName(input));
roentgen b75cab
					t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
					return(0);
roentgen b75cab
				}
roentgen b75cab
				buffer = (unsigned char*)
roentgen b75cab
					_TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
				if(buffer==NULL){
roentgen b75cab
					TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
						(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
						TIFFFileName(input));
roentgen b75cab
					t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
					return(0);
roentgen b75cab
				}
roentgen b75cab
                                memset(buffer, 0, t2p->tiff_datasize);
roentgen b75cab
				_TIFFmemcpy(buffer, t2p->pdf_ojpegdata, t2p->pdf_ojpegdatalength);
roentgen b75cab
				bufferoffset=t2p->pdf_ojpegdatalength;
roentgen b75cab
				stripcount=TIFFNumberOfStrips(input);
roentgen b75cab
				for(i=0;i<stripcount;i++){
roentgen b75cab
					if(i != 0){
roentgen b75cab
						buffer[bufferoffset++]=0xff;
roentgen b75cab
						buffer[bufferoffset++]=(0xd0 | ((i-1)%8));
roentgen b75cab
					}
roentgen b75cab
					bufferoffset+=TIFFReadRawStrip(input, 
roentgen b75cab
						i, 
roentgen b75cab
						(tdata_t) &(((unsigned char*)buffer)[bufferoffset]), 
roentgen b75cab
						-1);
roentgen b75cab
				}
roentgen b75cab
				if( ! ( (buffer[bufferoffset-1]==0xd9) && (buffer[bufferoffset-2]==0xff) ) ){
roentgen b75cab
						buffer[bufferoffset++]=0xff;
roentgen b75cab
						buffer[bufferoffset++]=0xd9;
roentgen b75cab
				}
roentgen b75cab
				t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
roentgen b75cab
				_TIFFfree(buffer);
roentgen b75cab
				return(bufferoffset);
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"No support for OJPEG image %s with no JPEG File Interchange offset", 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			return(t2p->tiff_datasize);
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
		if(t2p->tiff_compression == COMPRESSION_JPEG) {
roentgen b75cab
			uint32 count = 0;
roentgen b75cab
			buffer = (unsigned char*)
roentgen b75cab
				_TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if(buffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
                        memset(buffer, 0, t2p->tiff_datasize);
roentgen b75cab
			if (TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0) {
roentgen b75cab
				if(count > 4) {
roentgen b75cab
					_TIFFmemcpy(buffer, jpt, count);
roentgen b75cab
					bufferoffset += count - 2;
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
			stripcount=TIFFNumberOfStrips(input);
roentgen b75cab
			TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc);
roentgen b75cab
			for(i=0;i<stripcount;i++){
roentgen b75cab
				if(sbc[i]>max_striplength) max_striplength=sbc[i];
roentgen b75cab
			}
roentgen b75cab
			stripbuffer = (unsigned char*)
roentgen b75cab
				_TIFFmalloc(max_striplength);
roentgen b75cab
			if(stripbuffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %u bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
					max_striplength, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				_TIFFfree(buffer);
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			for(i=0;i<stripcount;i++){
roentgen b75cab
				striplength=TIFFReadRawStrip(input, i, (tdata_t) stripbuffer, -1);
roentgen b75cab
				if(!t2p_process_jpeg_strip(
roentgen b75cab
					stripbuffer, 
roentgen b75cab
					&striplength, 
roentgen b75cab
					buffer, 
roentgen b75cab
					&bufferoffset, 
roentgen b75cab
					i, 
roentgen b75cab
					t2p->tiff_length)){
roentgen b75cab
						TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
				"Can't process JPEG data in input file %s", 
roentgen b75cab
							TIFFFileName(input));
roentgen b75cab
						_TIFFfree(samplebuffer);
roentgen b75cab
						_TIFFfree(buffer);
roentgen b75cab
						t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
						return(0);
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
			buffer[bufferoffset++]=0xff; 
roentgen b75cab
			buffer[bufferoffset++]=0xd9;
roentgen b75cab
			t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
roentgen b75cab
			_TIFFfree(stripbuffer);
roentgen b75cab
			_TIFFfree(buffer);
roentgen b75cab
			return(bufferoffset);
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
		(void)0;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	if(t2p->pdf_sample==T2P_SAMPLE_NOTHING){
roentgen b75cab
		buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
		if(buffer==NULL){
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
				(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return(0);
roentgen b75cab
		}
roentgen b75cab
                memset(buffer, 0, t2p->tiff_datasize);
roentgen b75cab
		stripsize=TIFFStripSize(input);
roentgen b75cab
		stripcount=TIFFNumberOfStrips(input);
roentgen b75cab
		for(i=0;i<stripcount;i++){
roentgen b75cab
			read = 
roentgen b75cab
				TIFFReadEncodedStrip(input, 
roentgen b75cab
				i, 
roentgen b75cab
				(tdata_t) &buffer[bufferoffset], 
roentgen b75cab
				stripsize);
roentgen b75cab
			if(read==-1){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Error on decoding strip %u of %s", 
roentgen b75cab
					i, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				_TIFFfree(buffer);
roentgen b75cab
				t2p->t2p_error=T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			bufferoffset+=read;
roentgen b75cab
		}
roentgen b75cab
	} else {
roentgen b75cab
		if(t2p->pdf_sample & T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG){
roentgen b75cab
		
roentgen b75cab
			sepstripsize=TIFFStripSize(input);
roentgen b75cab
			sepstripcount=TIFFNumberOfStrips(input);
roentgen b75cab
		
roentgen b75cab
			stripsize=sepstripsize*t2p->tiff_samplesperpixel;
roentgen b75cab
			stripcount=sepstripcount/t2p->tiff_samplesperpixel;
roentgen b75cab
			
roentgen b75cab
			buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if(buffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
                        memset(buffer, 0, t2p->tiff_datasize);
roentgen b75cab
			samplebuffer = (unsigned char*) _TIFFmalloc(stripsize);
roentgen b75cab
			if(samplebuffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			for(i=0;i<stripcount;i++){
roentgen b75cab
				samplebufferoffset=0;
roentgen b75cab
				for(j=0;j<t2p->tiff_samplesperpixel;j++){
roentgen b75cab
					read = 
roentgen b75cab
						TIFFReadEncodedStrip(input, 
roentgen b75cab
							i + j*stripcount, 
roentgen b75cab
							(tdata_t) &(samplebuffer[samplebufferoffset]), 
roentgen b75cab
							sepstripsize);
roentgen b75cab
					if(read==-1){
roentgen b75cab
						TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Error on decoding strip %u of %s", 
roentgen b75cab
							i + j*stripcount, 
roentgen b75cab
							TIFFFileName(input));
roentgen b75cab
							_TIFFfree(buffer);
roentgen b75cab
						t2p->t2p_error=T2P_ERR_ERROR;
roentgen b75cab
						return(0);
roentgen b75cab
					}
roentgen b75cab
					samplebufferoffset+=read;
roentgen b75cab
				}
roentgen b75cab
				t2p_sample_planar_separate_to_contig(
roentgen b75cab
					t2p,
roentgen b75cab
					&(buffer[bufferoffset]),
roentgen b75cab
					samplebuffer, 
roentgen b75cab
					samplebufferoffset); 
roentgen b75cab
				bufferoffset+=samplebufferoffset;
roentgen b75cab
			}
roentgen b75cab
			_TIFFfree(samplebuffer);
roentgen b75cab
			goto dataready;
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
		if(buffer==NULL){
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
				(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return(0);
roentgen b75cab
		}
roentgen b75cab
                memset(buffer, 0, t2p->tiff_datasize);
roentgen b75cab
		stripsize=TIFFStripSize(input);
roentgen b75cab
		stripcount=TIFFNumberOfStrips(input);
roentgen b75cab
		for(i=0;i<stripcount;i++){
roentgen b75cab
			read = 
roentgen b75cab
				TIFFReadEncodedStrip(input, 
roentgen b75cab
				i, 
roentgen b75cab
				(tdata_t) &buffer[bufferoffset], 
roentgen b75cab
				stripsize);
roentgen b75cab
			if(read==-1){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Error on decoding strip %u of %s", 
roentgen b75cab
					i, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				_TIFFfree(samplebuffer);
roentgen b75cab
				_TIFFfree(buffer);
roentgen b75cab
				t2p->t2p_error=T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			bufferoffset+=read;
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_sample & T2P_SAMPLE_REALIZE_PALETTE){
roentgen b75cab
			// FIXME: overflow?
roentgen b75cab
			samplebuffer=(unsigned char*)_TIFFrealloc( 
roentgen b75cab
				(tdata_t) buffer, 
roentgen b75cab
				t2p->tiff_datasize * t2p->tiff_samplesperpixel);
roentgen b75cab
			if(samplebuffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			  _TIFFfree(buffer);
roentgen b75cab
			} else {
roentgen b75cab
				buffer=samplebuffer;
roentgen b75cab
				t2p->tiff_datasize *= t2p->tiff_samplesperpixel;
roentgen b75cab
			}
roentgen b75cab
			t2p_sample_realize_palette(t2p, buffer);
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_sample & T2P_SAMPLE_RGBA_TO_RGB){
roentgen b75cab
			t2p->tiff_datasize=t2p_sample_rgba_to_rgb(
roentgen b75cab
				(tdata_t)buffer, 
roentgen b75cab
				t2p->tiff_width*t2p->tiff_length);
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_sample & T2P_SAMPLE_RGBAA_TO_RGB){
roentgen b75cab
			t2p->tiff_datasize=t2p_sample_rgbaa_to_rgb(
roentgen b75cab
				(tdata_t)buffer, 
roentgen b75cab
				t2p->tiff_width*t2p->tiff_length);
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_sample & T2P_SAMPLE_YCBCR_TO_RGB){
roentgen b75cab
			samplebuffer=(unsigned char*)_TIFFrealloc(
roentgen b75cab
				(tdata_t)buffer, 
roentgen b75cab
				t2p->tiff_width*t2p->tiff_length*4);
roentgen b75cab
			if(samplebuffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				_TIFFfree(buffer);
roentgen b75cab
				return(0);
roentgen b75cab
			} else {
roentgen b75cab
				buffer=samplebuffer;
roentgen b75cab
			}
roentgen b75cab
			if(!TIFFReadRGBAImageOriented(
roentgen b75cab
				input, 
roentgen b75cab
				t2p->tiff_width, 
roentgen b75cab
				t2p->tiff_length, 
roentgen b75cab
				(uint32*)buffer, 
roentgen b75cab
				ORIENTATION_TOPLEFT,
roentgen b75cab
				0)){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
	"Can't use TIFFReadRGBAImageOriented to extract RGB image from %s", 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			t2p->tiff_datasize=t2p_sample_abgr_to_rgb(
roentgen b75cab
				(tdata_t) buffer, 
roentgen b75cab
				t2p->tiff_width*t2p->tiff_length);
roentgen b75cab
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_sample & T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED){
roentgen b75cab
			t2p->tiff_datasize=t2p_sample_lab_signed_to_unsigned(
roentgen b75cab
				(tdata_t)buffer, 
roentgen b75cab
				t2p->tiff_width*t2p->tiff_length);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
dataready:
roentgen b75cab
roentgen b75cab
	t2p_disable(output);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_PHOTOMETRIC, t2p->tiff_photometric);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_BITSPERSAMPLE, t2p->tiff_bitspersample);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_SAMPLESPERPIXEL, t2p->tiff_samplesperpixel);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_IMAGEWIDTH, t2p->tiff_width);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_IMAGELENGTH, t2p->tiff_length);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_ROWSPERSTRIP, t2p->tiff_length);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
roentgen b75cab
roentgen b75cab
	switch(t2p->pdf_compression){
roentgen b75cab
	case T2P_COMPRESS_NONE:
roentgen b75cab
		TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
roentgen b75cab
		break;
roentgen b75cab
#ifdef CCITT_SUPPORT
roentgen b75cab
	case T2P_COMPRESS_G4:
roentgen b75cab
		TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
roentgen b75cab
		break;
roentgen b75cab
#endif
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
	case T2P_COMPRESS_JPEG:
roentgen b75cab
		if(t2p->tiff_photometric==PHOTOMETRIC_YCBCR) {
roentgen b75cab
			uint16 hor = 0, ver = 0;
roentgen b75cab
			if (TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &hor, &ver) !=0 ) {
roentgen b75cab
				if(hor != 0 && ver != 0){
roentgen b75cab
					TIFFSetField(output, TIFFTAG_YCBCRSUBSAMPLING, hor, ver);
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
			if(TIFFGetField(input, TIFFTAG_REFERENCEBLACKWHITE, &xfloatp)!=0){
roentgen b75cab
				TIFFSetField(output, TIFFTAG_REFERENCEBLACKWHITE, xfloatp);
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
		if(TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_JPEG)==0){
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
		"Unable to use JPEG compression for input %s and output %s", 
roentgen b75cab
				TIFFFileName(input),
roentgen b75cab
				TIFFFileName(output));
roentgen b75cab
			_TIFFfree(buffer);
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return(0);
roentgen b75cab
		}
roentgen b75cab
		TIFFSetField(output, TIFFTAG_JPEGTABLESMODE, 0);
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_colorspace & (T2P_CS_RGB | T2P_CS_LAB)){
roentgen b75cab
			TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
roentgen b75cab
			if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR){
roentgen b75cab
				TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
roentgen b75cab
			} else {
roentgen b75cab
				TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RAW);
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_colorspace & T2P_CS_GRAY){
roentgen b75cab
			(void)0;
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_colorspace & T2P_CS_CMYK){
roentgen b75cab
			(void)0;
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_defaultcompressionquality != 0){
roentgen b75cab
			TIFFSetField(output, 
roentgen b75cab
				TIFFTAG_JPEGQUALITY, 
roentgen b75cab
				t2p->pdf_defaultcompressionquality);
roentgen b75cab
		}
roentgen b75cab
	
roentgen b75cab
		break;
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
	case T2P_COMPRESS_ZIP:
roentgen b75cab
		TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
roentgen b75cab
		if(t2p->pdf_defaultcompressionquality%100 != 0){
roentgen b75cab
			TIFFSetField(output, 
roentgen b75cab
				TIFFTAG_PREDICTOR, 
roentgen b75cab
				t2p->pdf_defaultcompressionquality % 100);
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_defaultcompressionquality/100 != 0){
roentgen b75cab
			TIFFSetField(output, 
roentgen b75cab
				TIFFTAG_ZIPQUALITY, 
roentgen b75cab
				(t2p->pdf_defaultcompressionquality / 100));
roentgen b75cab
		}
roentgen b75cab
		break;
roentgen b75cab
#endif
roentgen b75cab
	default:
roentgen b75cab
		break;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	t2p_enable(output);
roentgen b75cab
	t2p->outputwritten = 0;
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
	if(t2p->pdf_compression == T2P_COMPRESS_JPEG
roentgen b75cab
	   && t2p->tiff_photometric == PHOTOMETRIC_YCBCR){
roentgen b75cab
		bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t)0,
roentgen b75cab
						     buffer,
roentgen b75cab
						     stripsize * stripcount); 
roentgen b75cab
	} else
roentgen b75cab
#endif
roentgen b75cab
        {
roentgen b75cab
		bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t)0,
roentgen b75cab
						     buffer,
roentgen b75cab
						     t2p->tiff_datasize); 
roentgen b75cab
	}
roentgen b75cab
	if (buffer != NULL) {
roentgen b75cab
		_TIFFfree(buffer);
roentgen b75cab
		buffer=NULL;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	if (bufferoffset == (tsize_t)-1) {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
			  "Error writing encoded strip to output PDF %s", 
roentgen b75cab
			  TIFFFileName(output));
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return(0);
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
	written = t2p->outputwritten;
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function reads the raster image data from the input TIFF for an image
roentgen b75cab
 * tile and writes the data to the output PDF XObject image dictionary stream
roentgen b75cab
 * for the tile.  It returns the amount written or zero on error.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
tsize_t t2p_readwrite_pdf_image_tile(T2P* t2p, TIFF* input, TIFF* output, ttile_t tile){
roentgen b75cab
roentgen b75cab
	uint16 edge=0;
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	unsigned char* buffer=NULL;
roentgen b75cab
	tsize_t bufferoffset=0;
roentgen b75cab
	unsigned char* samplebuffer=NULL;
roentgen b75cab
	tsize_t samplebufferoffset=0;
roentgen b75cab
	tsize_t read=0;
roentgen b75cab
	uint16 i=0;
roentgen b75cab
	ttile_t tilecount=0;
roentgen b75cab
	tsize_t tilesize=0;
roentgen b75cab
	ttile_t septilecount=0;
roentgen b75cab
	tsize_t septilesize=0;
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
	unsigned char* jpt;
roentgen b75cab
	float* xfloatp;
roentgen b75cab
	uint32 xuint32=0;
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
	/* Fail if prior error (in particular, can't trust tiff_datasize) */
roentgen b75cab
	if (t2p->t2p_error != T2P_ERR_OK)
roentgen b75cab
		return(0);
roentgen b75cab
roentgen b75cab
	edge |= t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
roentgen b75cab
	edge |= t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
roentgen b75cab
roentgen b75cab
	if( (t2p->pdf_transcode == T2P_TRANSCODE_RAW) && ((edge == 0)
roentgen b75cab
#if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
roentgen b75cab
		|| (t2p->pdf_compression == T2P_COMPRESS_JPEG)
roentgen b75cab
#endif
roentgen b75cab
	)
roentgen b75cab
	){
roentgen b75cab
#ifdef CCITT_SUPPORT
roentgen b75cab
		if(t2p->pdf_compression == T2P_COMPRESS_G4){
roentgen b75cab
			buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if(buffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Can't allocate %lu bytes of memory "
roentgen b75cab
                                        "for t2p_readwrite_pdf_image_tile, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			TIFFReadRawTile(input, tile, (tdata_t) buffer, t2p->tiff_datasize);
roentgen b75cab
			if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){
roentgen b75cab
					TIFFReverseBits(buffer, t2p->tiff_datasize);
roentgen b75cab
			}
roentgen b75cab
			t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize);
roentgen b75cab
			_TIFFfree(buffer);
roentgen b75cab
			return(t2p->tiff_datasize);
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
		if(t2p->pdf_compression == T2P_COMPRESS_ZIP){
roentgen b75cab
			buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if(buffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Can't allocate %lu bytes of memory "
roentgen b75cab
                                        "for t2p_readwrite_pdf_image_tile, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			TIFFReadRawTile(input, tile, (tdata_t) buffer, t2p->tiff_datasize);
roentgen b75cab
			if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){
roentgen b75cab
					TIFFReverseBits(buffer, t2p->tiff_datasize);
roentgen b75cab
			}
roentgen b75cab
			t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize);
roentgen b75cab
			_TIFFfree(buffer);
roentgen b75cab
			return(t2p->tiff_datasize);
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
		if(t2p->tiff_compression == COMPRESSION_OJPEG){
roentgen b75cab
			if(! t2p->pdf_ojpegdata){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"No support for OJPEG image %s with "
roentgen b75cab
                                        "bad tables", 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			buffer=(unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if(buffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Can't allocate %lu bytes of memory "
roentgen b75cab
                                        "for t2p_readwrite_pdf_image, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			_TIFFmemcpy(buffer, t2p->pdf_ojpegdata, t2p->pdf_ojpegdatalength);
roentgen b75cab
			if(edge!=0){
roentgen b75cab
				if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile)){
roentgen b75cab
					buffer[7]=
roentgen b75cab
						(t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength >> 8) & 0xff;
roentgen b75cab
					buffer[8]=
roentgen b75cab
						(t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength ) & 0xff;
roentgen b75cab
				}
roentgen b75cab
				if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile)){
roentgen b75cab
					buffer[9]=
roentgen b75cab
						(t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth >> 8) & 0xff;
roentgen b75cab
					buffer[10]=
roentgen b75cab
						(t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth ) & 0xff;
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
			bufferoffset=t2p->pdf_ojpegdatalength;
roentgen b75cab
			bufferoffset+=TIFFReadRawTile(input, 
roentgen b75cab
					tile, 
roentgen b75cab
					(tdata_t) &(((unsigned char*)buffer)[bufferoffset]), 
roentgen b75cab
					-1);
roentgen b75cab
			((unsigned char*)buffer)[bufferoffset++]=0xff;
roentgen b75cab
			((unsigned char*)buffer)[bufferoffset++]=0xd9;
roentgen b75cab
			t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
roentgen b75cab
			_TIFFfree(buffer);
roentgen b75cab
			return(bufferoffset);
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
		if(t2p->tiff_compression == COMPRESSION_JPEG){
roentgen b75cab
			unsigned char table_end[2];
roentgen b75cab
			uint32 count = 0;
roentgen b75cab
			buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if(buffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Can't allocate %lu bytes of memory "
roentgen b75cab
                                        "for t2p_readwrite_pdf_image_tile, %s", 
roentgen b75cab
					t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0) {
roentgen b75cab
				if (count > 0) {
roentgen b75cab
					_TIFFmemcpy(buffer, jpt, count);
roentgen b75cab
					bufferoffset += count - 2;
roentgen b75cab
					table_end[0] = buffer[bufferoffset-2];
roentgen b75cab
					table_end[1] = buffer[bufferoffset-1];
roentgen b75cab
				}
roentgen b75cab
				if (count > 0) {
roentgen b75cab
					xuint32 = bufferoffset;
roentgen b75cab
					bufferoffset += TIFFReadRawTile(
roentgen b75cab
						input, 
roentgen b75cab
						tile, 
roentgen b75cab
						(tdata_t) &(((unsigned char*)buffer)[bufferoffset-2]), 
roentgen b75cab
						-1);
roentgen b75cab
						buffer[xuint32-2]=table_end[0];
roentgen b75cab
						buffer[xuint32-1]=table_end[1];
roentgen b75cab
				} else {
roentgen b75cab
					bufferoffset += TIFFReadRawTile(
roentgen b75cab
						input, 
roentgen b75cab
						tile, 
roentgen b75cab
						(tdata_t) &(((unsigned char*)buffer)[bufferoffset]), 
roentgen b75cab
						-1);
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
			t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
roentgen b75cab
			_TIFFfree(buffer);
roentgen b75cab
			return(bufferoffset);
roentgen b75cab
		}
roentgen b75cab
#endif
roentgen b75cab
		(void)0;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	if(t2p->pdf_sample==T2P_SAMPLE_NOTHING){
roentgen b75cab
		buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
		if(buffer==NULL){
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
				"Can't allocate %lu bytes of memory for "
roentgen b75cab
                                "t2p_readwrite_pdf_image_tile, %s", 
roentgen b75cab
				(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return(0);
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		read = TIFFReadEncodedTile(
roentgen b75cab
			input, 
roentgen b75cab
			tile, 
roentgen b75cab
			(tdata_t) &buffer[bufferoffset], 
roentgen b75cab
			t2p->tiff_datasize);
roentgen b75cab
		if(read==-1){
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
				"Error on decoding tile %u of %s", 
roentgen b75cab
				tile, 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
			_TIFFfree(buffer);
roentgen b75cab
			t2p->t2p_error=T2P_ERR_ERROR;
roentgen b75cab
			return(0);
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
	} else {
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_sample == T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG){
roentgen b75cab
			septilesize=TIFFTileSize(input);
roentgen b75cab
			septilecount=TIFFNumberOfTiles(input);
roentgen b75cab
			tilesize=septilesize*t2p->tiff_samplesperpixel;
roentgen b75cab
			tilecount=septilecount/t2p->tiff_samplesperpixel;
roentgen b75cab
			buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if(buffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Can't allocate %lu bytes of memory "
roentgen b75cab
                                        "for t2p_readwrite_pdf_image_tile, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			samplebuffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if(samplebuffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Can't allocate %lu bytes of memory "
roentgen b75cab
                                        "for t2p_readwrite_pdf_image_tile, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			samplebufferoffset=0;
roentgen b75cab
			for(i=0;i<t2p->tiff_samplesperpixel;i++){
roentgen b75cab
				read = 
roentgen b75cab
					TIFFReadEncodedTile(input, 
roentgen b75cab
						tile + i*tilecount, 
roentgen b75cab
						(tdata_t) &(samplebuffer[samplebufferoffset]), 
roentgen b75cab
						septilesize);
roentgen b75cab
				if(read==-1){
roentgen b75cab
					TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
						"Error on decoding tile %u of %s", 
roentgen b75cab
						tile + i*tilecount, 
roentgen b75cab
						TIFFFileName(input));
roentgen b75cab
						_TIFFfree(samplebuffer);
roentgen b75cab
						_TIFFfree(buffer);
roentgen b75cab
					t2p->t2p_error=T2P_ERR_ERROR;
roentgen b75cab
					return(0);
roentgen b75cab
				}
roentgen b75cab
				samplebufferoffset+=read;
roentgen b75cab
			}
roentgen b75cab
			t2p_sample_planar_separate_to_contig(
roentgen b75cab
				t2p,
roentgen b75cab
				&(buffer[bufferoffset]),
roentgen b75cab
				samplebuffer, 
roentgen b75cab
				samplebufferoffset); 
roentgen b75cab
			bufferoffset+=samplebufferoffset;
roentgen b75cab
			_TIFFfree(samplebuffer);
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		if(buffer==NULL){
roentgen b75cab
			buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
roentgen b75cab
			if(buffer==NULL){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Can't allocate %lu bytes of memory "
roentgen b75cab
                                        "for t2p_readwrite_pdf_image_tile, %s", 
roentgen b75cab
					(unsigned long) t2p->tiff_datasize, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
			read = TIFFReadEncodedTile(
roentgen b75cab
				input, 
roentgen b75cab
				tile, 
roentgen b75cab
				(tdata_t) &buffer[bufferoffset], 
roentgen b75cab
				t2p->tiff_datasize);
roentgen b75cab
			if(read==-1){
roentgen b75cab
				TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
					"Error on decoding tile %u of %s", 
roentgen b75cab
					tile, 
roentgen b75cab
					TIFFFileName(input));
roentgen b75cab
				_TIFFfree(buffer);
roentgen b75cab
				t2p->t2p_error=T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_sample & T2P_SAMPLE_RGBA_TO_RGB){
roentgen b75cab
			t2p->tiff_datasize=t2p_sample_rgba_to_rgb(
roentgen b75cab
				(tdata_t)buffer, 
roentgen b75cab
				t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth
roentgen b75cab
				*t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_sample & T2P_SAMPLE_RGBAA_TO_RGB){
roentgen b75cab
			t2p->tiff_datasize=t2p_sample_rgbaa_to_rgb(
roentgen b75cab
				(tdata_t)buffer, 
roentgen b75cab
				t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth
roentgen b75cab
				*t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_sample & T2P_SAMPLE_YCBCR_TO_RGB){
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
				"No support for YCbCr to RGB in tile for %s", 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
			_TIFFfree(buffer);
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return(0);
roentgen b75cab
		}
roentgen b75cab
roentgen b75cab
		if(t2p->pdf_sample & T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED){
roentgen b75cab
			t2p->tiff_datasize=t2p_sample_lab_signed_to_unsigned(
roentgen b75cab
				(tdata_t)buffer, 
roentgen b75cab
				t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth
roentgen b75cab
				*t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile) != 0){
roentgen b75cab
		t2p_tile_collapse_left(
roentgen b75cab
			buffer, 
roentgen b75cab
			TIFFTileRowSize(input),
roentgen b75cab
			t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth,
roentgen b75cab
			t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth, 
roentgen b75cab
			t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
roentgen b75cab
	t2p_disable(output);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_PHOTOMETRIC, t2p->tiff_photometric);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_BITSPERSAMPLE, t2p->tiff_bitspersample);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_SAMPLESPERPIXEL, t2p->tiff_samplesperpixel);
roentgen b75cab
	if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile) == 0){
roentgen b75cab
		TIFFSetField(
roentgen b75cab
			output, 
roentgen b75cab
			TIFFTAG_IMAGEWIDTH, 
roentgen b75cab
			t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
roentgen b75cab
	} else {
roentgen b75cab
		TIFFSetField(
roentgen b75cab
			output, 
roentgen b75cab
			TIFFTAG_IMAGEWIDTH, 
roentgen b75cab
			t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
roentgen b75cab
	}
roentgen b75cab
	if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile) == 0){
roentgen b75cab
		TIFFSetField(
roentgen b75cab
			output, 
roentgen b75cab
			TIFFTAG_IMAGELENGTH, 
roentgen b75cab
			t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
roentgen b75cab
		TIFFSetField(
roentgen b75cab
			output, 
roentgen b75cab
			TIFFTAG_ROWSPERSTRIP, 
roentgen b75cab
			t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
roentgen b75cab
	} else {
roentgen b75cab
		TIFFSetField(
roentgen b75cab
			output, 
roentgen b75cab
			TIFFTAG_IMAGELENGTH, 
roentgen b75cab
			t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
roentgen b75cab
		TIFFSetField(
roentgen b75cab
			output, 
roentgen b75cab
			TIFFTAG_ROWSPERSTRIP, 
roentgen b75cab
			t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
roentgen b75cab
	}
roentgen b75cab
	TIFFSetField(output, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
roentgen b75cab
	TIFFSetField(output, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
roentgen b75cab
roentgen b75cab
	switch(t2p->pdf_compression){
roentgen b75cab
	case T2P_COMPRESS_NONE:
roentgen b75cab
		TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
roentgen b75cab
		break;
roentgen b75cab
#ifdef CCITT_SUPPORT
roentgen b75cab
	case T2P_COMPRESS_G4:
roentgen b75cab
		TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
roentgen b75cab
		break;
roentgen b75cab
#endif
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
	case T2P_COMPRESS_JPEG:
roentgen b75cab
		if (t2p->tiff_photometric==PHOTOMETRIC_YCBCR) {
roentgen b75cab
			uint16 hor = 0, ver = 0;
roentgen b75cab
			if (TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &hor, &ver)!=0) {
roentgen b75cab
				if (hor != 0 && ver != 0) {
roentgen b75cab
					TIFFSetField(output, TIFFTAG_YCBCRSUBSAMPLING, hor, ver);
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
			if(TIFFGetField(input, TIFFTAG_REFERENCEBLACKWHITE, &xfloatp)!=0){
roentgen b75cab
				TIFFSetField(output, TIFFTAG_REFERENCEBLACKWHITE, xfloatp);
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
		TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_JPEG);
roentgen b75cab
		TIFFSetField(output, TIFFTAG_JPEGTABLESMODE, 0); /* JPEGTABLESMODE_NONE */
roentgen b75cab
		if(t2p->pdf_colorspace & (T2P_CS_RGB | T2P_CS_LAB)){
roentgen b75cab
			TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
roentgen b75cab
			if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR){
roentgen b75cab
				TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
roentgen b75cab
			} else {
roentgen b75cab
				TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RAW);
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_colorspace & T2P_CS_GRAY){
roentgen b75cab
			(void)0;
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_colorspace & T2P_CS_CMYK){
roentgen b75cab
			(void)0;
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_defaultcompressionquality != 0){
roentgen b75cab
			TIFFSetField(output, 
roentgen b75cab
				TIFFTAG_JPEGQUALITY, 
roentgen b75cab
				t2p->pdf_defaultcompressionquality);
roentgen b75cab
		}
roentgen b75cab
		break;
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
	case T2P_COMPRESS_ZIP:
roentgen b75cab
		TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
roentgen b75cab
		if(t2p->pdf_defaultcompressionquality%100 != 0){
roentgen b75cab
			TIFFSetField(output, 
roentgen b75cab
				TIFFTAG_PREDICTOR, 
roentgen b75cab
				t2p->pdf_defaultcompressionquality % 100);
roentgen b75cab
		}
roentgen b75cab
		if(t2p->pdf_defaultcompressionquality/100 != 0){
roentgen b75cab
			TIFFSetField(output, 
roentgen b75cab
				TIFFTAG_ZIPQUALITY, 
roentgen b75cab
				(t2p->pdf_defaultcompressionquality / 100));
roentgen b75cab
		}
roentgen b75cab
		break;
roentgen b75cab
#endif
roentgen b75cab
	default:
roentgen b75cab
		break;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	t2p_enable(output);
roentgen b75cab
	t2p->outputwritten = 0;
roentgen b75cab
	bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t) 0, buffer,
roentgen b75cab
					     TIFFStripSize(output)); 
roentgen b75cab
	if (buffer != NULL) {
roentgen b75cab
		_TIFFfree(buffer);
roentgen b75cab
		buffer = NULL;
roentgen b75cab
	}
roentgen b75cab
	if (bufferoffset == -1) {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
			  "Error writing encoded tile to output PDF %s", 
roentgen b75cab
			  TIFFFileName(output));
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return(0);
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
	written = t2p->outputwritten;
roentgen b75cab
	
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
#ifdef OJPEG_SUPPORT
roentgen b75cab
int t2p_process_ojpeg_tables(T2P* t2p, TIFF* input){
roentgen b75cab
	uint16 proc=0;
roentgen b75cab
	void* q;
roentgen b75cab
	uint32 q_length=0;
roentgen b75cab
	void* dc;
roentgen b75cab
	uint32 dc_length=0;
roentgen b75cab
	void* ac;
roentgen b75cab
	uint32 ac_length=0;
roentgen b75cab
	uint16* lp;
roentgen b75cab
	uint16* pt;
roentgen b75cab
	uint16 h_samp=1;
roentgen b75cab
	uint16 v_samp=1;
roentgen b75cab
	unsigned char* ojpegdata;
roentgen b75cab
	uint16 table_count;
roentgen b75cab
	uint32 offset_table;
roentgen b75cab
	uint32 offset_ms_l;
roentgen b75cab
	uint32 code_count;
roentgen b75cab
	uint32 i=0;
roentgen b75cab
	uint32 dest=0;
roentgen b75cab
	uint16 ri=0;
roentgen b75cab
	uint32 rows=0;
roentgen b75cab
	
roentgen b75cab
	if(!TIFFGetField(input, TIFFTAG_JPEGPROC, &proc)){
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
			"Missing JPEGProc field in OJPEG image %s", 
roentgen b75cab
			TIFFFileName(input));
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return(0);
roentgen b75cab
	}
roentgen b75cab
	if(proc!=JPEGPROC_BASELINE && proc!=JPEGPROC_LOSSLESS){
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
			"Bad JPEGProc field in OJPEG image %s", 
roentgen b75cab
			TIFFFileName(input));
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return(0);
roentgen b75cab
	}
roentgen b75cab
	if(!TIFFGetField(input, TIFFTAG_JPEGQTABLES, &q_length, &q)){
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
			"Missing JPEGQTables field in OJPEG image %s", 
roentgen b75cab
			TIFFFileName(input));
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return(0);
roentgen b75cab
	}
roentgen b75cab
	if(q_length < (64U * t2p->tiff_samplesperpixel)){
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
			"Bad JPEGQTables field in OJPEG image %s", 
roentgen b75cab
			TIFFFileName(input));
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return(0);
roentgen b75cab
	} 
roentgen b75cab
	if(!TIFFGetField(input, TIFFTAG_JPEGDCTABLES, &dc_length, &dc)){
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
			"Missing JPEGDCTables field in OJPEG image %s", 
roentgen b75cab
			TIFFFileName(input));
roentgen b75cab
			t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return(0);
roentgen b75cab
	}
roentgen b75cab
	if(proc==JPEGPROC_BASELINE){
roentgen b75cab
		if(!TIFFGetField(input, TIFFTAG_JPEGACTABLES, &ac_length, &ac)){
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
				"Missing JPEGACTables field in OJPEG image %s", 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return(0);
roentgen b75cab
		}
roentgen b75cab
	} else {
roentgen b75cab
		if(!TIFFGetField(input, TIFFTAG_JPEGLOSSLESSPREDICTORS, &lp)){
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
				"Missing JPEGLosslessPredictors field in OJPEG image %s", 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
				return(0);
roentgen b75cab
		}
roentgen b75cab
		if(!TIFFGetField(input, TIFFTAG_JPEGPOINTTRANSFORM, &pt)){
roentgen b75cab
			TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
				"Missing JPEGPointTransform field in OJPEG image %s", 
roentgen b75cab
				TIFFFileName(input));
roentgen b75cab
				t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
			return(0);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if(!TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &h_samp, &v_samp)){
roentgen b75cab
		h_samp=1;
roentgen b75cab
		v_samp=1;
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_ojpegdata != NULL){
roentgen b75cab
		_TIFFfree(t2p->pdf_ojpegdata);
roentgen b75cab
		t2p->pdf_ojpegdata=NULL;
roentgen b75cab
	} 
roentgen b75cab
	t2p->pdf_ojpegdata = _TIFFmalloc(2048);
roentgen b75cab
	if(t2p->pdf_ojpegdata == NULL){
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
			"Can't allocate %u bytes of memory for t2p_process_ojpeg_tables, %s", 
roentgen b75cab
			2048, 
roentgen b75cab
			TIFFFileName(input));
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return(0);
roentgen b75cab
	}
roentgen b75cab
	_TIFFmemset(t2p->pdf_ojpegdata, 0x00, 2048);
roentgen b75cab
	t2p->pdf_ojpegdatalength = 0;
roentgen b75cab
	table_count=t2p->tiff_samplesperpixel;
roentgen b75cab
	if(proc==JPEGPROC_BASELINE){
roentgen b75cab
		if(table_count>2) table_count=2;
roentgen b75cab
	}
roentgen b75cab
	ojpegdata=(unsigned char*)t2p->pdf_ojpegdata;
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=0xd8;
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
roentgen b75cab
	if(proc==JPEGPROC_BASELINE){
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0xc0;
roentgen b75cab
	} else {
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0xc3;
roentgen b75cab
	}
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=(8 + 3*t2p->tiff_samplesperpixel);
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=(t2p->tiff_bitspersample & 0xff);
roentgen b75cab
	if(TIFFIsTiled(input)){
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=
roentgen b75cab
			(t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength >> 8) & 0xff;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=
roentgen b75cab
			(t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength ) & 0xff;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=
roentgen b75cab
			(t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth >> 8) & 0xff;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=
roentgen b75cab
			(t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth ) & 0xff;
roentgen b75cab
	} else {
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=
roentgen b75cab
			(t2p->tiff_length >> 8) & 0xff;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=
roentgen b75cab
			(t2p->tiff_length ) & 0xff;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=
roentgen b75cab
			(t2p->tiff_width >> 8) & 0xff;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=
roentgen b75cab
			(t2p->tiff_width ) & 0xff;
roentgen b75cab
	}
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=(t2p->tiff_samplesperpixel & 0xff);
roentgen b75cab
	for(i=0;i<t2p->tiff_samplesperpixel;i++){
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=i;
roentgen b75cab
		if(i==0){
roentgen b75cab
			ojpegdata[t2p->pdf_ojpegdatalength] |= h_samp<<4 & 0xf0;;
roentgen b75cab
			ojpegdata[t2p->pdf_ojpegdatalength++] |= v_samp & 0x0f;
roentgen b75cab
		} else {
roentgen b75cab
				ojpegdata[t2p->pdf_ojpegdatalength++]= 0x11;
roentgen b75cab
		}
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=i;
roentgen b75cab
	}
roentgen b75cab
	for(dest=0;dest<t2p->tiff_samplesperpixel;dest++){
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0xdb;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0x43;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=dest;
roentgen b75cab
		_TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength++]), 
roentgen b75cab
			&(((unsigned char*)q)[64*dest]), 64);
roentgen b75cab
		t2p->pdf_ojpegdatalength+=64;
roentgen b75cab
	}
roentgen b75cab
	offset_table=0;
roentgen b75cab
	for(dest=0;dest<table_count;dest++){
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0xc4;
roentgen b75cab
		offset_ms_l=t2p->pdf_ojpegdatalength;
roentgen b75cab
		t2p->pdf_ojpegdatalength+=2;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=dest & 0x0f;
roentgen b75cab
		_TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]), 
roentgen b75cab
			&(((unsigned char*)dc)[offset_table]), 16);
roentgen b75cab
		code_count=0;
roentgen b75cab
		offset_table+=16;
roentgen b75cab
		for(i=0;i<16;i++){
roentgen b75cab
			code_count+=ojpegdata[t2p->pdf_ojpegdatalength++];
roentgen b75cab
		}
roentgen b75cab
		ojpegdata[offset_ms_l]=((19+code_count)>>8) & 0xff;
roentgen b75cab
		ojpegdata[offset_ms_l+1]=(19+code_count) & 0xff;
roentgen b75cab
		_TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]), 
roentgen b75cab
			&(((unsigned char*)dc)[offset_table]), code_count);
roentgen b75cab
		offset_table+=code_count;
roentgen b75cab
		t2p->pdf_ojpegdatalength+=code_count;
roentgen b75cab
	}
roentgen b75cab
	if(proc==JPEGPROC_BASELINE){
roentgen b75cab
	offset_table=0;
roentgen b75cab
		for(dest=0;dest<table_count;dest++){
roentgen b75cab
			ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
roentgen b75cab
			ojpegdata[t2p->pdf_ojpegdatalength++]=0xc4;
roentgen b75cab
			offset_ms_l=t2p->pdf_ojpegdatalength;
roentgen b75cab
			t2p->pdf_ojpegdatalength+=2;
roentgen b75cab
			ojpegdata[t2p->pdf_ojpegdatalength] |= 0x10;
roentgen b75cab
			ojpegdata[t2p->pdf_ojpegdatalength++] |=dest & 0x0f;
roentgen b75cab
			_TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]), 
roentgen b75cab
				&(((unsigned char*)ac)[offset_table]), 16);
roentgen b75cab
			code_count=0;
roentgen b75cab
			offset_table+=16;
roentgen b75cab
			for(i=0;i<16;i++){
roentgen b75cab
				code_count+=ojpegdata[t2p->pdf_ojpegdatalength++];
roentgen b75cab
			}	
roentgen b75cab
			ojpegdata[offset_ms_l]=((19+code_count)>>8) & 0xff;
roentgen b75cab
			ojpegdata[offset_ms_l+1]=(19+code_count) & 0xff;
roentgen b75cab
			_TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]), 
roentgen b75cab
				&(((unsigned char*)ac)[offset_table]), code_count);
roentgen b75cab
			offset_table+=code_count;
roentgen b75cab
			t2p->pdf_ojpegdatalength+=code_count;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if(TIFFNumberOfStrips(input)>1){
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0xdd;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0x04;
roentgen b75cab
		h_samp*=8;
roentgen b75cab
		v_samp*=8;
roentgen b75cab
		ri=(t2p->tiff_width+h_samp-1) / h_samp;
roentgen b75cab
		TIFFGetField(input, TIFFTAG_ROWSPERSTRIP, &rows);
roentgen b75cab
		ri*=(rows+v_samp-1)/v_samp;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]= (ri>>8) & 0xff;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]= ri & 0xff;
roentgen b75cab
	}
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=0xda;
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=(6 + 2*t2p->tiff_samplesperpixel);
roentgen b75cab
	ojpegdata[t2p->pdf_ojpegdatalength++]=t2p->tiff_samplesperpixel & 0xff;
roentgen b75cab
	for(i=0;i<t2p->tiff_samplesperpixel;i++){
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]= i & 0xff;
roentgen b75cab
		if(proc==JPEGPROC_BASELINE){
roentgen b75cab
			ojpegdata[t2p->pdf_ojpegdatalength] |= 
roentgen b75cab
				( ( (i>(table_count-1U)) ? (table_count-1U) : i) << 4U) & 0xf0;
roentgen b75cab
			ojpegdata[t2p->pdf_ojpegdatalength++] |= 
roentgen b75cab
				( (i>(table_count-1U)) ? (table_count-1U) : i) & 0x0f;
roentgen b75cab
		} else {
roentgen b75cab
			ojpegdata[t2p->pdf_ojpegdatalength++] =  (i << 4) & 0xf0;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if(proc==JPEGPROC_BASELINE){
roentgen b75cab
		t2p->pdf_ojpegdatalength++;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]=0x3f;
roentgen b75cab
		t2p->pdf_ojpegdatalength++;
roentgen b75cab
	} else {
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]= (lp[0] & 0xff);
roentgen b75cab
		t2p->pdf_ojpegdatalength++;
roentgen b75cab
		ojpegdata[t2p->pdf_ojpegdatalength++]= (pt[0] & 0x0f);
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return(1);
roentgen b75cab
}
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
int t2p_process_jpeg_strip(
roentgen b75cab
	unsigned char* strip, 
roentgen b75cab
	tsize_t* striplength, 
roentgen b75cab
	unsigned char* buffer, 
roentgen b75cab
	tsize_t* bufferoffset, 
roentgen b75cab
	tstrip_t no, 
roentgen b75cab
	uint32 height){
roentgen b75cab
roentgen b75cab
	tsize_t i=0;
roentgen b75cab
	uint16 ri =0;
roentgen b75cab
	uint16 v_samp=1;
roentgen b75cab
	uint16 h_samp=1;
roentgen b75cab
	int j=0;
roentgen b75cab
	
roentgen b75cab
	i++;
roentgen b75cab
	
roentgen b75cab
	while(i<(*striplength)){
roentgen b75cab
		switch( strip[i] ){
roentgen b75cab
			case 0xd8:
roentgen b75cab
				/* SOI - start of image */
roentgen b75cab
				_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), 2);
roentgen b75cab
				*bufferoffset+=2;
roentgen b75cab
				i+=2;
roentgen b75cab
				break;
roentgen b75cab
			case 0xc0:
roentgen b75cab
			case 0xc1:
roentgen b75cab
			case 0xc3:
roentgen b75cab
			case 0xc9:
roentgen b75cab
			case 0xca:
roentgen b75cab
				if(no==0){
roentgen b75cab
					_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
roentgen b75cab
					for(j=0;j<buffer[*bufferoffset+9];j++){
roentgen b75cab
						if( (buffer[*bufferoffset+11+(2*j)]>>4) > h_samp) 
roentgen b75cab
							h_samp = (buffer[*bufferoffset+11+(2*j)]>>4);
roentgen b75cab
						if( (buffer[*bufferoffset+11+(2*j)] & 0x0f) > v_samp) 
roentgen b75cab
							v_samp = (buffer[*bufferoffset+11+(2*j)] & 0x0f);
roentgen b75cab
					}
roentgen b75cab
					v_samp*=8;
roentgen b75cab
					h_samp*=8;
roentgen b75cab
					ri=((( ((uint16)(buffer[*bufferoffset+5])<<8) | 
roentgen b75cab
					(uint16)(buffer[*bufferoffset+6]) )+v_samp-1)/ 
roentgen b75cab
					v_samp);
roentgen b75cab
					ri*=((( ((uint16)(buffer[*bufferoffset+7])<<8) | 
roentgen b75cab
					(uint16)(buffer[*bufferoffset+8]) )+h_samp-1)/ 
roentgen b75cab
					h_samp);
roentgen b75cab
					buffer[*bufferoffset+5]=
roentgen b75cab
                                          (unsigned char) ((height>>8) & 0xff);
roentgen b75cab
					buffer[*bufferoffset+6]=
roentgen b75cab
                                            (unsigned char) (height & 0xff);
roentgen b75cab
					*bufferoffset+=strip[i+2]+2;
roentgen b75cab
					i+=strip[i+2]+2;
roentgen b75cab
roentgen b75cab
					buffer[(*bufferoffset)++]=0xff;
roentgen b75cab
					buffer[(*bufferoffset)++]=0xdd;
roentgen b75cab
					buffer[(*bufferoffset)++]=0x00;
roentgen b75cab
					buffer[(*bufferoffset)++]=0x04;
roentgen b75cab
					buffer[(*bufferoffset)++]=(ri >> 8) & 0xff;
roentgen b75cab
					buffer[(*bufferoffset)++]= ri & 0xff;
roentgen b75cab
				} else {
roentgen b75cab
					i+=strip[i+2]+2;
roentgen b75cab
				}
roentgen b75cab
				break;
roentgen b75cab
			case 0xc4:
roentgen b75cab
			case 0xdb:
roentgen b75cab
				_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
roentgen b75cab
				*bufferoffset+=strip[i+2]+2;
roentgen b75cab
				i+=strip[i+2]+2;
roentgen b75cab
				break;
roentgen b75cab
			case 0xda:
roentgen b75cab
				if(no==0){
roentgen b75cab
					_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
roentgen b75cab
					*bufferoffset+=strip[i+2]+2;
roentgen b75cab
					i+=strip[i+2]+2;
roentgen b75cab
				} else {
roentgen b75cab
					buffer[(*bufferoffset)++]=0xff;
roentgen b75cab
					buffer[(*bufferoffset)++]=
roentgen b75cab
                                            (unsigned char)(0xd0 | ((no-1)%8));
roentgen b75cab
					i+=strip[i+2]+2;
roentgen b75cab
				}
roentgen b75cab
				_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), (*striplength)-i-1);
roentgen b75cab
				*bufferoffset+=(*striplength)-i-1;
roentgen b75cab
				return(1);
roentgen b75cab
			default:
roentgen b75cab
				i+=strip[i+2]+2;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
roentgen b75cab
	return(0);
roentgen b75cab
}
roentgen b75cab
#endif
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This functions converts a tilewidth x tilelength buffer of samples into an edgetilewidth x 
roentgen b75cab
	tilelength buffer of samples.
roentgen b75cab
*/
roentgen b75cab
void t2p_tile_collapse_left(
roentgen b75cab
	tdata_t buffer, 
roentgen b75cab
	tsize_t scanwidth, 
roentgen b75cab
	uint32 tilewidth, 
roentgen b75cab
	uint32 edgetilewidth, 
roentgen b75cab
	uint32 tilelength){
roentgen b75cab
	
roentgen b75cab
	uint32 i;
roentgen b75cab
	tsize_t edgescanwidth=0;
roentgen b75cab
	
roentgen b75cab
	edgescanwidth = (scanwidth * edgetilewidth + (tilewidth - 1))/ tilewidth;
roentgen b75cab
	for(i=0;i<tilelength;i++){
roentgen b75cab
		_TIFFmemcpy( 
roentgen b75cab
			&(((char*)buffer)[edgescanwidth*i]), 
roentgen b75cab
			&(((char*)buffer)[scanwidth*i]), 
roentgen b75cab
			edgescanwidth);
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function calls TIFFWriteDirectory on the output after blanking its
roentgen b75cab
 * output by replacing the read, write, and seek procedures with empty
roentgen b75cab
 * implementations, then it replaces the original implementations.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
void
roentgen b75cab
t2p_write_advance_directory(T2P* t2p, TIFF* output)
roentgen b75cab
{
roentgen b75cab
	t2p_disable(output);
roentgen b75cab
	if(!TIFFWriteDirectory(output)){
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE, 
roentgen b75cab
			"Error writing virtual directory to output PDF %s", 
roentgen b75cab
			TIFFFileName(output));
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return;
roentgen b75cab
	}
roentgen b75cab
	t2p_enable(output);
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
tsize_t t2p_sample_planar_separate_to_contig(
roentgen b75cab
											T2P* t2p, 
roentgen b75cab
											unsigned char* buffer, 
roentgen b75cab
											unsigned char* samplebuffer, 
roentgen b75cab
											tsize_t samplebuffersize){
roentgen b75cab
roentgen b75cab
	tsize_t stride=0;
roentgen b75cab
	tsize_t i=0;
roentgen b75cab
	tsize_t j=0;
roentgen b75cab
	
roentgen b75cab
	stride=samplebuffersize/t2p->tiff_samplesperpixel;
roentgen b75cab
	for(i=0;i<stride;i++){
roentgen b75cab
		for(j=0;j<t2p->tiff_samplesperpixel;j++){
roentgen b75cab
			buffer[i*t2p->tiff_samplesperpixel + j] = samplebuffer[i + j*stride];
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return(samplebuffersize);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
tsize_t t2p_sample_realize_palette(T2P* t2p, unsigned char* buffer){
roentgen b75cab
roentgen b75cab
	uint32 sample_count=0;
roentgen b75cab
	uint16 component_count=0;
roentgen b75cab
	uint32 palette_offset=0;
roentgen b75cab
	uint32 sample_offset=0;
roentgen b75cab
	uint32 i=0;
roentgen b75cab
	uint32 j=0;
roentgen b75cab
	sample_count=t2p->tiff_width*t2p->tiff_length;
roentgen b75cab
	component_count=t2p->tiff_samplesperpixel;
roentgen b75cab
	
roentgen b75cab
	for(i=sample_count;i>0;i--){
roentgen b75cab
		palette_offset=buffer[i-1] * component_count;
roentgen b75cab
		sample_offset= (i-1) * component_count;
roentgen b75cab
		for(j=0;j<component_count;j++){
roentgen b75cab
			buffer[sample_offset+j]=t2p->pdf_palette[palette_offset+j];
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return(0);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This functions converts in place a buffer of ABGR interleaved data
roentgen b75cab
	into RGB interleaved data, discarding A.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_sample_abgr_to_rgb(tdata_t data, uint32 samplecount)
roentgen b75cab
{
roentgen b75cab
	uint32 i=0;
roentgen b75cab
	uint32 sample=0;
roentgen b75cab
	
roentgen b75cab
	for(i=0;i<samplecount;i++){
roentgen b75cab
		sample=((uint32*)data)[i];
roentgen b75cab
		((char*)data)[i*3]= (char) (sample & 0xff);
roentgen b75cab
		((char*)data)[i*3+1]= (char) ((sample>>8) & 0xff);
roentgen b75cab
		((char*)data)[i*3+2]= (char) ((sample>>16) & 0xff);
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return(i*3);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This functions converts in place a buffer of RGBA interleaved data
roentgen b75cab
 * into RGB interleaved data, discarding A.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
tsize_t
roentgen b75cab
t2p_sample_rgbaa_to_rgb(tdata_t data, uint32 samplecount)
roentgen b75cab
{
roentgen b75cab
	uint32 i;
roentgen b75cab
	
roentgen b75cab
	for(i = 0; i < samplecount; i++)
roentgen b75cab
		memcpy((uint8*)data + i * 3, (uint8*)data + i * 4, 3);
roentgen b75cab
roentgen b75cab
	return(i * 3);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This functions converts in place a buffer of RGBA interleaved data
roentgen b75cab
 * into RGB interleaved data, adding 255-A to each component sample.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
tsize_t
roentgen b75cab
t2p_sample_rgba_to_rgb(tdata_t data, uint32 samplecount)
roentgen b75cab
{
roentgen b75cab
	uint32 i = 0;
roentgen b75cab
	uint32 sample = 0;
roentgen b75cab
	uint8 alpha = 0;
roentgen b75cab
	
roentgen b75cab
	for (i = 0; i < samplecount; i++) {
roentgen b75cab
		sample=((uint32*)data)[i];
roentgen b75cab
		alpha=(uint8)((255 - ((sample >> 24) & 0xff)));
roentgen b75cab
		((uint8 *)data)[i * 3] = (uint8) ((sample >> 16) & 0xff) + alpha;
roentgen b75cab
		((uint8 *)data)[i * 3 + 1] = (uint8) ((sample >> 8) & 0xff) + alpha;
roentgen b75cab
		((uint8 *)data)[i * 3 + 2] = (uint8) (sample & 0xff) + alpha;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return (i * 3);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function converts the a and b samples of Lab data from signed
roentgen b75cab
	to unsigned.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_sample_lab_signed_to_unsigned(tdata_t buffer, uint32 samplecount){
roentgen b75cab
roentgen b75cab
	uint32 i=0;
roentgen b75cab
roentgen b75cab
	for(i=0;i<samplecount;i++){
roentgen b75cab
		if( (((unsigned char*)buffer)[(i*3)+1] & 0x80) !=0){
roentgen b75cab
			((unsigned char*)buffer)[(i*3)+1] =
roentgen b75cab
				(unsigned char)(0x80 + ((char*)buffer)[(i*3)+1]);
roentgen b75cab
		} else {
roentgen b75cab
			((unsigned char*)buffer)[(i*3)+1] |= 0x80;
roentgen b75cab
		}
roentgen b75cab
		if( (((unsigned char*)buffer)[(i*3)+2] & 0x80) !=0){
roentgen b75cab
			((unsigned char*)buffer)[(i*3)+2] =
roentgen b75cab
				(unsigned char)(0x80 + ((char*)buffer)[(i*3)+2]);
roentgen b75cab
		} else {
roentgen b75cab
			((unsigned char*)buffer)[(i*3)+2] |= 0x80;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return(samplecount*3);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/* 
roentgen b75cab
	This function writes the PDF header to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_header(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
	
roentgen b75cab
	buflen=sprintf(buffer, "%%PDF-%u.%u ", t2p->pdf_majorversion&0xff, t2p->pdf_minorversion&0xff);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t)"\n%\342\343\317\323\n", 7);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes the beginning of a PDF object to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_obj_start(uint32 number, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
roentgen b75cab
	buflen=sprintf(buffer, "%lu", (unsigned long)number);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen );
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " 0 obj\n", 7);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes the end of a PDF object to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_obj_end(TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "endobj\n", 7);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a PDF name object to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_name(unsigned char* name, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	uint32 i=0;
roentgen b75cab
	char buffer[64];
roentgen b75cab
	uint16 nextchar=0;
roentgen b75cab
	size_t namelen=0;
roentgen b75cab
	
roentgen b75cab
	namelen = strlen((char *)name);
roentgen b75cab
	if (namelen>126) {
roentgen b75cab
		namelen=126;
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/", 1);
roentgen b75cab
	for (i=0;i<namelen;i++){
roentgen b75cab
		if ( ((unsigned char)name[i]) < 0x21){
roentgen b75cab
			sprintf(buffer, "#%.2X", name[i]);
roentgen b75cab
			buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
			nextchar=1;
roentgen b75cab
		}
roentgen b75cab
		if ( ((unsigned char)name[i]) > 0x7E){
roentgen b75cab
			sprintf(buffer, "#%.2X", name[i]);
roentgen b75cab
			buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
			nextchar=1;
roentgen b75cab
		}
roentgen b75cab
		if (nextchar==0){
roentgen b75cab
			switch (name[i]){
roentgen b75cab
				case 0x23:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]);
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				case 0x25:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]);
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				case 0x28:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]);
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				case 0x29:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]); 
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				case 0x2F:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]); 
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				case 0x3C:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]); 
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				case 0x3E:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]);
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				case 0x5B:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]); 
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				case 0x5D:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]);
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				case 0x7B:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]); 
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				case 0x7D:
roentgen b75cab
					sprintf(buffer, "#%.2X", name[i]); 
roentgen b75cab
					buffer[sizeof(buffer) - 1] = '\0';
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, 3);
roentgen b75cab
					break;
roentgen b75cab
				default:
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) &name[i], 1);
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
		nextchar=0;
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " ", 1);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function writes a PDF string object to output.
roentgen b75cab
 */
roentgen b75cab
	
roentgen b75cab
tsize_t t2p_write_pdf_string(char* pdfstr, TIFF* output)
roentgen b75cab
{
roentgen b75cab
	tsize_t written = 0;
roentgen b75cab
	uint32 i = 0;
roentgen b75cab
	char buffer[64];
roentgen b75cab
	size_t len = 0;
roentgen b75cab
	
roentgen b75cab
	len = strlen(pdfstr);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "(", 1);
roentgen b75cab
	for (i=0; i
roentgen b75cab
		if((pdfstr[i]&0x80) || (pdfstr[i]==127) || (pdfstr[i]<32)){
roentgen b75cab
			snprintf(buffer, sizeof(buffer), "\\%.3o", ((unsigned char)pdfstr[i]));
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t)buffer, 4);
roentgen b75cab
		} else {
roentgen b75cab
			switch (pdfstr[i]){
roentgen b75cab
				case 0x08:
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) "\\b", 2);
roentgen b75cab
					break;
roentgen b75cab
				case 0x09:
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) "\\t", 2);
roentgen b75cab
					break;
roentgen b75cab
				case 0x0A:
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) "\\n", 2);
roentgen b75cab
					break;
roentgen b75cab
				case 0x0C:
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) "\\f", 2);
roentgen b75cab
					break;
roentgen b75cab
				case 0x0D:
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) "\\r", 2);
roentgen b75cab
					break;
roentgen b75cab
				case 0x28:
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) "\\(", 2);
roentgen b75cab
					break;
roentgen b75cab
				case 0x29:
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) "\\)", 2);
roentgen b75cab
					break;
roentgen b75cab
				case 0x5C:
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) "\\\\", 2);
roentgen b75cab
					break;
roentgen b75cab
				default:
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) &pdfstr[i], 1);
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) ") ", 1);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a buffer of data to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_stream(tdata_t buffer, tsize_t len, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, len);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This functions writes the beginning of a PDF stream to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_stream_start(TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "stream\n", 7);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes the end of a PDF stream to output. 
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_stream_end(TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "\nendstream\n", 11);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a stream dictionary for a PDF stream to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_stream_dict(tsize_t len, uint32 number, TIFF* output){
roentgen b75cab
	
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
	
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/Length ", 8);
roentgen b75cab
	if(len!=0){
roentgen b75cab
		written += t2p_write_pdf_stream_length(len, output);
roentgen b75cab
	} else {
roentgen b75cab
		buflen=sprintf(buffer, "%lu", (unsigned long)number);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This functions writes the beginning of a PDF stream dictionary to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_stream_dict_start(TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "<< \n", 4);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes the end of a PDF stream dictionary to output. 
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_stream_dict_end(TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " >>\n", 4);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a number to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_stream_length(tsize_t len, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
roentgen b75cab
	buflen=sprintf(buffer, "%lu", (unsigned long)len);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function writes the PDF Catalog structure to output.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_catalog(T2P* t2p, TIFF* output)
roentgen b75cab
{
roentgen b75cab
	tsize_t written = 0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen = 0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, 
roentgen b75cab
		(tdata_t)"<< \n/Type /Catalog \n/Pages ", 
roentgen b75cab
		27);
roentgen b75cab
	buflen = snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_pages);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer,
roentgen b75cab
				TIFFmin((size_t)buflen, sizeof(buffer) - 1));
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
roentgen b75cab
	if(t2p->pdf_fitwindow){
roentgen b75cab
		written += t2pWriteFile(output, 
roentgen b75cab
			(tdata_t) "/ViewerPreferences <</FitWindow true>>\n", 
roentgen b75cab
			39);
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t)">>\n", 3);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes the PDF Info structure to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_info(T2P* t2p, TIFF* input, TIFF* output)
roentgen b75cab
{
roentgen b75cab
	tsize_t written = 0;
roentgen b75cab
	char* info;
roentgen b75cab
	char buffer[512];
roentgen b75cab
roentgen b75cab
	if(t2p->pdf_datetime[0] == '\0')
roentgen b75cab
		t2p_pdf_tifftime(t2p, input);
roentgen b75cab
	if (strlen(t2p->pdf_datetime) > 0) {
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "<< \n/CreationDate ", 18);
roentgen b75cab
		written += t2p_write_pdf_string(t2p->pdf_datetime, output);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "\n/ModDate ", 10);
roentgen b75cab
		written += t2p_write_pdf_string(t2p->pdf_datetime, output);
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "\n/Producer ", 11);
roentgen b75cab
	_TIFFmemset((tdata_t)buffer, 0x00, sizeof(buffer));
roentgen b75cab
	snprintf(buffer, sizeof(buffer), "libtiff / tiff2pdf - %d", TIFFLIB_VERSION);
roentgen b75cab
	written += t2p_write_pdf_string(buffer, output);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
	if (t2p->pdf_creator[0] != '\0') {
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/Creator ", 9);
roentgen b75cab
		written += t2p_write_pdf_string(t2p->pdf_creator, output);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
	} else {
roentgen b75cab
		if (TIFFGetField(input, TIFFTAG_SOFTWARE, &info) != 0 && info) {
roentgen b75cab
			if(strlen(info) >= sizeof(t2p->pdf_creator))
roentgen b75cab
				info[sizeof(t2p->pdf_creator) - 1] = '\0';
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/Creator ", 9);
roentgen b75cab
			written += t2p_write_pdf_string(info, output);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if (t2p->pdf_author[0] != '\0') {
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/Author ", 8);
roentgen b75cab
		written += t2p_write_pdf_string(t2p->pdf_author, output);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
	} else {
roentgen b75cab
		if ((TIFFGetField(input, TIFFTAG_ARTIST, &info) != 0
roentgen b75cab
		     || TIFFGetField(input, TIFFTAG_COPYRIGHT, &info) != 0)
roentgen b75cab
		    && info) {
roentgen b75cab
			if (strlen(info) >= sizeof(t2p->pdf_author))
roentgen b75cab
				info[sizeof(t2p->pdf_author) - 1] = '\0';
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/Author ", 8);
roentgen b75cab
			written += t2p_write_pdf_string(info, output);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if (t2p->pdf_title[0] != '\0') {
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/Title ", 7);
roentgen b75cab
		written += t2p_write_pdf_string(t2p->pdf_title, output);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
	} else {
roentgen b75cab
		if (TIFFGetField(input, TIFFTAG_DOCUMENTNAME, &info) != 0){
roentgen b75cab
			if(strlen(info) > 511) {
roentgen b75cab
				info[512] = '\0';
roentgen b75cab
			}
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/Title ", 7);
roentgen b75cab
			written += t2p_write_pdf_string(info, output);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if (t2p->pdf_subject[0] != '\0') {
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/Subject ", 9);
roentgen b75cab
		written += t2p_write_pdf_string(t2p->pdf_subject, output);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
	} else {
roentgen b75cab
		if (TIFFGetField(input, TIFFTAG_IMAGEDESCRIPTION, &info) != 0 && info) {
roentgen b75cab
			if (strlen(info) >= sizeof(t2p->pdf_subject))
roentgen b75cab
				info[sizeof(t2p->pdf_subject) - 1] = '\0';
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/Subject ", 9);
roentgen b75cab
			written += t2p_write_pdf_string(info, output);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	if (t2p->pdf_keywords[0] != '\0') {
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/Keywords ", 10);
roentgen b75cab
		written += t2p_write_pdf_string(t2p->pdf_keywords, output);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) ">> \n", 4);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function fills a string of a T2P struct with the current time as a PDF
roentgen b75cab
 * date string, it is called by t2p_pdf_tifftime.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
void t2p_pdf_currenttime(T2P* t2p)
roentgen b75cab
{
roentgen b75cab
	struct tm* currenttime;
roentgen b75cab
	time_t timenow;
roentgen b75cab
roentgen b75cab
	if (time(&timenow) == (time_t) -1) {
roentgen b75cab
		TIFFError(TIFF2PDF_MODULE,
roentgen b75cab
			  "Can't get the current time: %s", strerror(errno));
roentgen b75cab
		timenow = (time_t) 0;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	currenttime = localtime(&timenow);
roentgen b75cab
	snprintf(t2p->pdf_datetime, sizeof(t2p->pdf_datetime),
roentgen b75cab
		 "D:%.4d%.2d%.2d%.2d%.2d%.2d",
roentgen b75cab
		 (currenttime->tm_year + 1900) % 65536,
roentgen b75cab
		 (currenttime->tm_mon + 1) % 256,
roentgen b75cab
		 (currenttime->tm_mday) % 256,
roentgen b75cab
		 (currenttime->tm_hour) % 256,
roentgen b75cab
		 (currenttime->tm_min) % 256,
roentgen b75cab
		 (currenttime->tm_sec) % 256);
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function fills a string of a T2P struct with the date and time of a
roentgen b75cab
 * TIFF file if it exists or the current time as a PDF date string.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
void t2p_pdf_tifftime(T2P* t2p, TIFF* input)
roentgen b75cab
{
roentgen b75cab
	char* datetime;
roentgen b75cab
roentgen b75cab
	if (TIFFGetField(input, TIFFTAG_DATETIME, &datetime) != 0
roentgen b75cab
	    && (strlen(datetime) >= 19) ){
roentgen b75cab
		t2p->pdf_datetime[0]='D';
roentgen b75cab
		t2p->pdf_datetime[1]=':';
roentgen b75cab
		t2p->pdf_datetime[2]=datetime[0];
roentgen b75cab
		t2p->pdf_datetime[3]=datetime[1];
roentgen b75cab
		t2p->pdf_datetime[4]=datetime[2];
roentgen b75cab
		t2p->pdf_datetime[5]=datetime[3];
roentgen b75cab
		t2p->pdf_datetime[6]=datetime[5];
roentgen b75cab
		t2p->pdf_datetime[7]=datetime[6];
roentgen b75cab
		t2p->pdf_datetime[8]=datetime[8];
roentgen b75cab
		t2p->pdf_datetime[9]=datetime[9];
roentgen b75cab
		t2p->pdf_datetime[10]=datetime[11];
roentgen b75cab
		t2p->pdf_datetime[11]=datetime[12];
roentgen b75cab
		t2p->pdf_datetime[12]=datetime[14];
roentgen b75cab
		t2p->pdf_datetime[13]=datetime[15];
roentgen b75cab
		t2p->pdf_datetime[14]=datetime[17];
roentgen b75cab
		t2p->pdf_datetime[15]=datetime[18];
roentgen b75cab
		t2p->pdf_datetime[16] = '\0';
roentgen b75cab
	} else {
roentgen b75cab
		t2p_pdf_currenttime(t2p);
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function writes a PDF Pages Tree structure to output.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_pages(T2P* t2p, TIFF* output)
roentgen b75cab
{
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	tdir_t i=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
roentgen b75cab
	int page=0;
roentgen b75cab
	written += t2pWriteFile(output,
roentgen b75cab
		(tdata_t) "<< \n/Type /Pages \n/Kids [ ", 26);
roentgen b75cab
	page = t2p->pdf_pages+1;
roentgen b75cab
	for (i=0;i<t2p->tiff_pagecount;i++){
roentgen b75cab
		buflen=sprintf(buffer, "%d", page);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
roentgen b75cab
		if ( ((i+1)%8)==0 ) {
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
		}
roentgen b75cab
		page +=3;
roentgen b75cab
		page += t2p->tiff_pages[i].page_extra;
roentgen b75cab
		if(t2p->tiff_pages[i].page_tilecount>0){
roentgen b75cab
			page += (2 * t2p->tiff_pages[i].page_tilecount);
roentgen b75cab
		} else {
roentgen b75cab
			page +=2;
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "] \n/Count ", 10);
roentgen b75cab
	_TIFFmemset(buffer, 0x00, 16);
roentgen b75cab
	buflen=sprintf(buffer, "%d", t2p->tiff_pagecount);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " \n>> \n", 6);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a PDF Page structure to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_page(uint32 object, T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	unsigned int i=0;
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "<<\n/Type /Page \n/Parent ", 24);
roentgen b75cab
	buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_pages);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/MediaBox [", 11); 
roentgen b75cab
	buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.x1);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " ", 1); 
roentgen b75cab
	buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.y1);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " ", 1); 
roentgen b75cab
	buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.x2);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " ", 1); 
roentgen b75cab
	buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.y2);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "] \n", 3); 
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/Contents ", 10);
roentgen b75cab
	buflen=sprintf(buffer, "%lu", (unsigned long)(object + 1));
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/Resources << \n", 15);
roentgen b75cab
	if( t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount != 0 ){
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/XObject <<\n", 12);
roentgen b75cab
		for(i=0;i<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount;i++){
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/Im", 3);
roentgen b75cab
			buflen = sprintf(buffer, "%u", t2p->pdf_page+1);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "_", 1);
roentgen b75cab
			buflen = sprintf(buffer, "%u", i+1);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) " ", 1);
roentgen b75cab
			buflen = sprintf(
roentgen b75cab
				buffer, 
roentgen b75cab
				"%lu", 
roentgen b75cab
				(unsigned long)(object+3+(2*i)+t2p->tiff_pages[t2p->pdf_page].page_extra)); 
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
roentgen b75cab
			if(i%4==3){
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) "\n", 1);
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
roentgen b75cab
	} else {
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/XObject <<\n", 12);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/Im", 3);
roentgen b75cab
			buflen = sprintf(buffer, "%u", t2p->pdf_page+1);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) " ", 1);
roentgen b75cab
			buflen = sprintf(
roentgen b75cab
				buffer, 
roentgen b75cab
				"%lu", 
roentgen b75cab
				(unsigned long)(object+3+(2*i)+t2p->tiff_pages[t2p->pdf_page].page_extra)); 
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
roentgen b75cab
	}
roentgen b75cab
	if(t2p->tiff_transferfunctioncount != 0) {
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/ExtGState <<", 13);
roentgen b75cab
		t2pWriteFile(output, (tdata_t) "/GS1 ", 5);
roentgen b75cab
		buflen = sprintf(
roentgen b75cab
			buffer, 
roentgen b75cab
			"%lu", 
roentgen b75cab
			(unsigned long)(object + 3)); 
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) ">> \n", 4);
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/ProcSet [ ", 11);
roentgen b75cab
	if(t2p->pdf_colorspace == T2P_CS_BILEVEL 
roentgen b75cab
		|| t2p->pdf_colorspace == T2P_CS_GRAY
roentgen b75cab
		){
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/ImageB ", 8);
roentgen b75cab
	} else {
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/ImageC ", 8);
roentgen b75cab
		if(t2p->pdf_colorspace & T2P_CS_PALETTE){
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/ImageI ", 8);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "]\n>>\n>>\n", 8);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function composes the page size and image and tile locations on a page.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
void t2p_compose_pdf_page(T2P* t2p){
roentgen b75cab
roentgen b75cab
	uint32 i=0;
roentgen b75cab
	uint32 i2=0;
roentgen b75cab
	T2P_TILE* tiles=NULL;
roentgen b75cab
	T2P_BOX* boxp=NULL;
roentgen b75cab
	uint32 tilecountx=0;
roentgen b75cab
	uint32 tilecounty=0;
roentgen b75cab
	uint32 tilewidth=0;
roentgen b75cab
	uint32 tilelength=0;
roentgen b75cab
	int istiled=0;
roentgen b75cab
	float f=0;
roentgen b75cab
	float width_ratio=0;
roentgen b75cab
	float length_ratio=0;
roentgen b75cab
	
roentgen b75cab
	t2p->pdf_xres = t2p->tiff_xres;
roentgen b75cab
	t2p->pdf_yres = t2p->tiff_yres;
roentgen b75cab
	if(t2p->pdf_overrideres) {
roentgen b75cab
		t2p->pdf_xres = t2p->pdf_defaultxres;
roentgen b75cab
		t2p->pdf_yres = t2p->pdf_defaultyres;
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_xres == 0.0)
roentgen b75cab
		t2p->pdf_xres = t2p->pdf_defaultxres;
roentgen b75cab
	if(t2p->pdf_yres == 0.0)
roentgen b75cab
		t2p->pdf_yres = t2p->pdf_defaultyres;
roentgen b75cab
	if (t2p->pdf_image_fillpage) {
roentgen b75cab
		width_ratio = t2p->pdf_defaultpagewidth/t2p->tiff_width;
roentgen b75cab
		length_ratio = t2p->pdf_defaultpagelength/t2p->tiff_length;
roentgen b75cab
		if (width_ratio < length_ratio ) {
roentgen b75cab
			t2p->pdf_imagewidth = t2p->pdf_defaultpagewidth;
roentgen b75cab
			t2p->pdf_imagelength = t2p->tiff_length * width_ratio;
roentgen b75cab
		} else {
roentgen b75cab
			t2p->pdf_imagewidth = t2p->tiff_width * length_ratio;
roentgen b75cab
			t2p->pdf_imagelength = t2p->pdf_defaultpagelength;
roentgen b75cab
		}
roentgen b75cab
	} else if (t2p->tiff_resunit != RESUNIT_CENTIMETER	/* RESUNIT_NONE and */
roentgen b75cab
		&& t2p->tiff_resunit != RESUNIT_INCH) {	/* other cases */
roentgen b75cab
		t2p->pdf_imagewidth = ((float)(t2p->tiff_width))/t2p->pdf_xres;
roentgen b75cab
		t2p->pdf_imagelength = ((float)(t2p->tiff_length))/t2p->pdf_yres;
roentgen b75cab
	} else {
roentgen b75cab
		t2p->pdf_imagewidth = 
roentgen b75cab
			((float)(t2p->tiff_width))*PS_UNIT_SIZE/t2p->pdf_xres;
roentgen b75cab
		t2p->pdf_imagelength = 
roentgen b75cab
			((float)(t2p->tiff_length))*PS_UNIT_SIZE/t2p->pdf_yres;
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_overridepagesize != 0) {
roentgen b75cab
		t2p->pdf_pagewidth = t2p->pdf_defaultpagewidth;
roentgen b75cab
		t2p->pdf_pagelength = t2p->pdf_defaultpagelength;
roentgen b75cab
	} else {
roentgen b75cab
		t2p->pdf_pagewidth = t2p->pdf_imagewidth;
roentgen b75cab
		t2p->pdf_pagelength = t2p->pdf_imagelength;
roentgen b75cab
	}
roentgen b75cab
	t2p->pdf_mediabox.x1=0.0;
roentgen b75cab
	t2p->pdf_mediabox.y1=0.0;
roentgen b75cab
	t2p->pdf_mediabox.x2=t2p->pdf_pagewidth;
roentgen b75cab
	t2p->pdf_mediabox.y2=t2p->pdf_pagelength;
roentgen b75cab
	t2p->pdf_imagebox.x1=0.0;
roentgen b75cab
	t2p->pdf_imagebox.y1=0.0;
roentgen b75cab
	t2p->pdf_imagebox.x2=t2p->pdf_imagewidth;
roentgen b75cab
	t2p->pdf_imagebox.y2=t2p->pdf_imagelength;
roentgen b75cab
	if(t2p->pdf_overridepagesize!=0){
roentgen b75cab
		t2p->pdf_imagebox.x1+=((t2p->pdf_pagewidth-t2p->pdf_imagewidth)/2.0F);
roentgen b75cab
		t2p->pdf_imagebox.y1+=((t2p->pdf_pagelength-t2p->pdf_imagelength)/2.0F);
roentgen b75cab
		t2p->pdf_imagebox.x2+=((t2p->pdf_pagewidth-t2p->pdf_imagewidth)/2.0F);
roentgen b75cab
		t2p->pdf_imagebox.y2+=((t2p->pdf_pagelength-t2p->pdf_imagelength)/2.0F);
roentgen b75cab
	}
roentgen b75cab
	if(t2p->tiff_orientation > 4){
roentgen b75cab
		f=t2p->pdf_mediabox.x2;
roentgen b75cab
		t2p->pdf_mediabox.x2=t2p->pdf_mediabox.y2;
roentgen b75cab
		t2p->pdf_mediabox.y2=f;
roentgen b75cab
	}
roentgen b75cab
	istiled=((t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount==0) ? 0 : 1;
roentgen b75cab
	if(istiled==0){
roentgen b75cab
		t2p_compose_pdf_page_orient(&(t2p->pdf_imagebox), t2p->tiff_orientation);
roentgen b75cab
		return;
roentgen b75cab
	} else {
roentgen b75cab
		tilewidth=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilewidth;
roentgen b75cab
		tilelength=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilelength;
roentgen b75cab
		tilecountx=(t2p->tiff_width + 
roentgen b75cab
			tilewidth -1)/ 
roentgen b75cab
			tilewidth;
roentgen b75cab
		(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecountx=tilecountx;
roentgen b75cab
		tilecounty=(t2p->tiff_length + 
roentgen b75cab
			tilelength -1)/ 
roentgen b75cab
			tilelength;
roentgen b75cab
		(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecounty=tilecounty;
roentgen b75cab
		(t2p->tiff_tiles[t2p->pdf_page]).tiles_edgetilewidth=
roentgen b75cab
			t2p->tiff_width % tilewidth;
roentgen b75cab
		(t2p->tiff_tiles[t2p->pdf_page]).tiles_edgetilelength=
roentgen b75cab
			t2p->tiff_length % tilelength;
roentgen b75cab
		tiles=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tiles;
roentgen b75cab
		for(i2=0;i2<tilecounty-1;i2++){
roentgen b75cab
			for(i=0;i<tilecountx-1;i++){
roentgen b75cab
				boxp=&(tiles[i2*tilecountx+i].tile_box);
roentgen b75cab
				boxp->x1 = 
roentgen b75cab
					t2p->pdf_imagebox.x1 
roentgen b75cab
					+ ((float)(t2p->pdf_imagewidth * i * tilewidth)
roentgen b75cab
					/ (float)t2p->tiff_width);
roentgen b75cab
				boxp->x2 = 
roentgen b75cab
					t2p->pdf_imagebox.x1 
roentgen b75cab
					+ ((float)(t2p->pdf_imagewidth * (i+1) * tilewidth)
roentgen b75cab
					/ (float)t2p->tiff_width);
roentgen b75cab
				boxp->y1 = 
roentgen b75cab
					t2p->pdf_imagebox.y2 
roentgen b75cab
					- ((float)(t2p->pdf_imagelength * (i2+1) * tilelength)
roentgen b75cab
					/ (float)t2p->tiff_length);
roentgen b75cab
				boxp->y2 = 
roentgen b75cab
					t2p->pdf_imagebox.y2 
roentgen b75cab
					- ((float)(t2p->pdf_imagelength * i2 * tilelength)
roentgen b75cab
					/ (float)t2p->tiff_length);
roentgen b75cab
			}
roentgen b75cab
			boxp=&(tiles[i2*tilecountx+i].tile_box);
roentgen b75cab
			boxp->x1 = 
roentgen b75cab
				t2p->pdf_imagebox.x1 
roentgen b75cab
				+ ((float)(t2p->pdf_imagewidth * i * tilewidth)
roentgen b75cab
				/ (float)t2p->tiff_width);
roentgen b75cab
			boxp->x2 = t2p->pdf_imagebox.x2;
roentgen b75cab
			boxp->y1 = 
roentgen b75cab
				t2p->pdf_imagebox.y2 
roentgen b75cab
				- ((float)(t2p->pdf_imagelength * (i2+1) * tilelength)
roentgen b75cab
				/ (float)t2p->tiff_length);
roentgen b75cab
			boxp->y2 = 
roentgen b75cab
				t2p->pdf_imagebox.y2 
roentgen b75cab
				- ((float)(t2p->pdf_imagelength * i2 * tilelength)
roentgen b75cab
				/ (float)t2p->tiff_length);
roentgen b75cab
		}
roentgen b75cab
		for(i=0;i<tilecountx-1;i++){
roentgen b75cab
			boxp=&(tiles[i2*tilecountx+i].tile_box);
roentgen b75cab
			boxp->x1 = 
roentgen b75cab
				t2p->pdf_imagebox.x1 
roentgen b75cab
				+ ((float)(t2p->pdf_imagewidth * i * tilewidth)
roentgen b75cab
				/ (float)t2p->tiff_width);
roentgen b75cab
			boxp->x2 = 
roentgen b75cab
				t2p->pdf_imagebox.x1 
roentgen b75cab
				+ ((float)(t2p->pdf_imagewidth * (i+1) * tilewidth)
roentgen b75cab
				/ (float)t2p->tiff_width);
roentgen b75cab
			boxp->y1 = t2p->pdf_imagebox.y1;
roentgen b75cab
			boxp->y2 = 
roentgen b75cab
				t2p->pdf_imagebox.y2 
roentgen b75cab
				- ((float)(t2p->pdf_imagelength * i2 * tilelength)
roentgen b75cab
				/ (float)t2p->tiff_length);
roentgen b75cab
		}
roentgen b75cab
		boxp=&(tiles[i2*tilecountx+i].tile_box);
roentgen b75cab
		boxp->x1 = 
roentgen b75cab
			t2p->pdf_imagebox.x1 
roentgen b75cab
			+ ((float)(t2p->pdf_imagewidth * i * tilewidth)
roentgen b75cab
			/ (float)t2p->tiff_width);
roentgen b75cab
		boxp->x2 = t2p->pdf_imagebox.x2;
roentgen b75cab
		boxp->y1 = t2p->pdf_imagebox.y1;
roentgen b75cab
		boxp->y2 = 
roentgen b75cab
			t2p->pdf_imagebox.y2 
roentgen b75cab
			- ((float)(t2p->pdf_imagelength * i2 * tilelength)
roentgen b75cab
			/ (float)t2p->tiff_length);
roentgen b75cab
	}
roentgen b75cab
	if(t2p->tiff_orientation==0 || t2p->tiff_orientation==1){
roentgen b75cab
		for(i=0;i<(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount;i++){
roentgen b75cab
			t2p_compose_pdf_page_orient( &(tiles[i].tile_box) , 0);
roentgen b75cab
		}
roentgen b75cab
		return;
roentgen b75cab
	}
roentgen b75cab
	for(i=0;i<(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount;i++){
roentgen b75cab
		boxp=&(tiles[i].tile_box);
roentgen b75cab
		boxp->x1 -= t2p->pdf_imagebox.x1;
roentgen b75cab
		boxp->x2 -= t2p->pdf_imagebox.x1;
roentgen b75cab
		boxp->y1 -= t2p->pdf_imagebox.y1;
roentgen b75cab
		boxp->y2 -= t2p->pdf_imagebox.y1;
roentgen b75cab
		if(t2p->tiff_orientation==2 || t2p->tiff_orientation==3){
roentgen b75cab
			boxp->x1 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x1;
roentgen b75cab
			boxp->x2 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x2;
roentgen b75cab
		}
roentgen b75cab
		if(t2p->tiff_orientation==3 || t2p->tiff_orientation==4){
roentgen b75cab
			boxp->y1 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y1;
roentgen b75cab
			boxp->y2 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y2;
roentgen b75cab
		}
roentgen b75cab
		if(t2p->tiff_orientation==8 || t2p->tiff_orientation==5){
roentgen b75cab
			boxp->y1 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y1;
roentgen b75cab
			boxp->y2 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y2;
roentgen b75cab
		}
roentgen b75cab
		if(t2p->tiff_orientation==5 || t2p->tiff_orientation==6){
roentgen b75cab
			boxp->x1 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x1;
roentgen b75cab
			boxp->x2 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x2;
roentgen b75cab
		}
roentgen b75cab
		if(t2p->tiff_orientation > 4){
roentgen b75cab
			f=boxp->x1;
roentgen b75cab
			boxp->x1 = boxp->y1;
roentgen b75cab
			boxp->y1 = f;
roentgen b75cab
			f=boxp->x2;
roentgen b75cab
			boxp->x2 = boxp->y2;
roentgen b75cab
			boxp->y2 = f; 
roentgen b75cab
			t2p_compose_pdf_page_orient_flip(boxp, t2p->tiff_orientation);
roentgen b75cab
		} else {
roentgen b75cab
			t2p_compose_pdf_page_orient(boxp, t2p->tiff_orientation);
roentgen b75cab
		}
roentgen b75cab
		
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
void t2p_compose_pdf_page_orient(T2P_BOX* boxp, uint16 orientation){
roentgen b75cab
roentgen b75cab
	float m1[9];
roentgen b75cab
	float f=0.0;
roentgen b75cab
	
roentgen b75cab
	if( boxp->x1 > boxp->x2){
roentgen b75cab
		f=boxp->x1;
roentgen b75cab
		boxp->x1=boxp->x2;
roentgen b75cab
		boxp->x2 = f;
roentgen b75cab
	}
roentgen b75cab
	if( boxp->y1 > boxp->y2){
roentgen b75cab
		f=boxp->y1;
roentgen b75cab
		boxp->y1=boxp->y2;
roentgen b75cab
		boxp->y2 = f;
roentgen b75cab
	}
roentgen b75cab
	boxp->mat[0]=m1[0]=boxp->x2-boxp->x1;
roentgen b75cab
	boxp->mat[1]=m1[1]=0.0;
roentgen b75cab
	boxp->mat[2]=m1[2]=0.0;
roentgen b75cab
	boxp->mat[3]=m1[3]=0.0;
roentgen b75cab
	boxp->mat[4]=m1[4]=boxp->y2-boxp->y1;
roentgen b75cab
	boxp->mat[5]=m1[5]=0.0;
roentgen b75cab
	boxp->mat[6]=m1[6]=boxp->x1;
roentgen b75cab
	boxp->mat[7]=m1[7]=boxp->y1;
roentgen b75cab
	boxp->mat[8]=m1[8]=1.0;
roentgen b75cab
	switch(orientation){
roentgen b75cab
		case 0:
roentgen b75cab
		case 1:
roentgen b75cab
			break;
roentgen b75cab
		case 2:
roentgen b75cab
			boxp->mat[0]=0.0F-m1[0];
roentgen b75cab
			boxp->mat[6]+=m1[0];
roentgen b75cab
			break;
roentgen b75cab
		case 3:
roentgen b75cab
			boxp->mat[0]=0.0F-m1[0];
roentgen b75cab
			boxp->mat[4]=0.0F-m1[4];
roentgen b75cab
			boxp->mat[6]+=m1[0];
roentgen b75cab
			boxp->mat[7]+=m1[4];
roentgen b75cab
			break;
roentgen b75cab
		case 4:
roentgen b75cab
			boxp->mat[4]=0.0F-m1[4];
roentgen b75cab
			boxp->mat[7]+=m1[4];
roentgen b75cab
			break;
roentgen b75cab
		case 5:
roentgen b75cab
			boxp->mat[0]=0.0F;
roentgen b75cab
			boxp->mat[1]=0.0F-m1[0];
roentgen b75cab
			boxp->mat[3]=0.0F-m1[4];
roentgen b75cab
			boxp->mat[4]=0.0F;
roentgen b75cab
			boxp->mat[6]+=m1[4];
roentgen b75cab
			boxp->mat[7]+=m1[0];
roentgen b75cab
			break;
roentgen b75cab
		case 6:
roentgen b75cab
			boxp->mat[0]=0.0F;
roentgen b75cab
			boxp->mat[1]=0.0F-m1[0];
roentgen b75cab
			boxp->mat[3]=m1[4];
roentgen b75cab
			boxp->mat[4]=0.0F;
roentgen b75cab
			boxp->mat[7]+=m1[0];
roentgen b75cab
			break;
roentgen b75cab
		case 7:
roentgen b75cab
			boxp->mat[0]=0.0F;
roentgen b75cab
			boxp->mat[1]=m1[0];
roentgen b75cab
			boxp->mat[3]=m1[4];
roentgen b75cab
			boxp->mat[4]=0.0F;
roentgen b75cab
			break;
roentgen b75cab
		case 8:
roentgen b75cab
			boxp->mat[0]=0.0F;
roentgen b75cab
			boxp->mat[1]=m1[0];
roentgen b75cab
			boxp->mat[3]=0.0F-m1[4];
roentgen b75cab
			boxp->mat[4]=0.0F;
roentgen b75cab
			boxp->mat[6]+=m1[4];
roentgen b75cab
			break;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
void t2p_compose_pdf_page_orient_flip(T2P_BOX* boxp, uint16 orientation){
roentgen b75cab
roentgen b75cab
	float m1[9];
roentgen b75cab
	float f=0.0;
roentgen b75cab
	
roentgen b75cab
	if( boxp->x1 > boxp->x2){
roentgen b75cab
		f=boxp->x1;
roentgen b75cab
		boxp->x1=boxp->x2;
roentgen b75cab
		boxp->x2 = f;
roentgen b75cab
	}
roentgen b75cab
	if( boxp->y1 > boxp->y2){
roentgen b75cab
		f=boxp->y1;
roentgen b75cab
		boxp->y1=boxp->y2;
roentgen b75cab
		boxp->y2 = f;
roentgen b75cab
	}
roentgen b75cab
	boxp->mat[0]=m1[0]=boxp->x2-boxp->x1;
roentgen b75cab
	boxp->mat[1]=m1[1]=0.0F;
roentgen b75cab
	boxp->mat[2]=m1[2]=0.0F;
roentgen b75cab
	boxp->mat[3]=m1[3]=0.0F;
roentgen b75cab
	boxp->mat[4]=m1[4]=boxp->y2-boxp->y1;
roentgen b75cab
	boxp->mat[5]=m1[5]=0.0F;
roentgen b75cab
	boxp->mat[6]=m1[6]=boxp->x1;
roentgen b75cab
	boxp->mat[7]=m1[7]=boxp->y1;
roentgen b75cab
	boxp->mat[8]=m1[8]=1.0F;
roentgen b75cab
	switch(orientation){
roentgen b75cab
		case 5:
roentgen b75cab
			boxp->mat[0]=0.0F;
roentgen b75cab
			boxp->mat[1]=0.0F-m1[4];
roentgen b75cab
			boxp->mat[3]=0.0F-m1[0];
roentgen b75cab
			boxp->mat[4]=0.0F;
roentgen b75cab
			boxp->mat[6]+=m1[0];
roentgen b75cab
			boxp->mat[7]+=m1[4];
roentgen b75cab
			break;
roentgen b75cab
		case 6:
roentgen b75cab
			boxp->mat[0]=0.0F;
roentgen b75cab
			boxp->mat[1]=0.0F-m1[4];
roentgen b75cab
			boxp->mat[3]=m1[0];
roentgen b75cab
			boxp->mat[4]=0.0F;
roentgen b75cab
			boxp->mat[7]+=m1[4];
roentgen b75cab
			break;
roentgen b75cab
		case 7:
roentgen b75cab
			boxp->mat[0]=0.0F;
roentgen b75cab
			boxp->mat[1]=m1[4];
roentgen b75cab
			boxp->mat[3]=m1[0];
roentgen b75cab
			boxp->mat[4]=0.0F;
roentgen b75cab
			break;
roentgen b75cab
		case 8:
roentgen b75cab
			boxp->mat[0]=0.0F;
roentgen b75cab
			boxp->mat[1]=m1[4];
roentgen b75cab
			boxp->mat[3]=0.0F-m1[0];
roentgen b75cab
			boxp->mat[4]=0.0F;
roentgen b75cab
			boxp->mat[6]+=m1[0];
roentgen b75cab
			break;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return;
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a PDF Contents stream to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_page_content_stream(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	ttile_t i=0;
roentgen b75cab
	char buffer[512];
roentgen b75cab
	int buflen=0;
roentgen b75cab
	T2P_BOX box;
roentgen b75cab
	
roentgen b75cab
	if(t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount>0){ 
roentgen b75cab
		for(i=0;i<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount; i++){
roentgen b75cab
			box=t2p->tiff_tiles[t2p->pdf_page].tiles_tiles[i].tile_box;
roentgen b75cab
			buflen=sprintf(buffer, 
roentgen b75cab
				"q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d_%ld Do Q\n", 
roentgen b75cab
				t2p->tiff_transferfunctioncount?"/GS1 gs ":"",
roentgen b75cab
				box.mat[0],
roentgen b75cab
				box.mat[1],
roentgen b75cab
				box.mat[3],
roentgen b75cab
				box.mat[4],
roentgen b75cab
				box.mat[6],
roentgen b75cab
				box.mat[7],
roentgen b75cab
				t2p->pdf_page + 1, 
roentgen b75cab
				(long)(i + 1));
roentgen b75cab
			written += t2p_write_pdf_stream(buffer, buflen, output);
roentgen b75cab
		}
roentgen b75cab
	} else {
roentgen b75cab
		box=t2p->pdf_imagebox;
roentgen b75cab
		buflen=sprintf(buffer, 
roentgen b75cab
			"q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n", 
roentgen b75cab
			t2p->tiff_transferfunctioncount?"/GS1 gs ":"",
roentgen b75cab
			box.mat[0],
roentgen b75cab
			box.mat[1],
roentgen b75cab
			box.mat[3],
roentgen b75cab
			box.mat[4],
roentgen b75cab
			box.mat[6],
roentgen b75cab
			box.mat[7],
roentgen b75cab
			t2p->pdf_page+1);
roentgen b75cab
		written += t2p_write_pdf_stream(buffer, buflen, output);
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a PDF Image XObject stream dictionary to output. 
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_xobject_stream_dict(ttile_t tile, 
roentgen b75cab
												T2P* t2p, 
roentgen b75cab
												TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
roentgen b75cab
	written += t2p_write_pdf_stream_dict(0, t2p->pdf_xrefcount+1, output); 
roentgen b75cab
	written += t2pWriteFile(output, 
roentgen b75cab
		(tdata_t) "/Type /XObject \n/Subtype /Image \n/Name /Im", 
roentgen b75cab
		42);
roentgen b75cab
	buflen=sprintf(buffer, "%u", t2p->pdf_page+1);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	if(tile != 0){
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "_", 1);
roentgen b75cab
		buflen=sprintf(buffer, "%lu", (unsigned long)tile);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "\n/Width ", 8);
roentgen b75cab
	_TIFFmemset((tdata_t)buffer, 0x00, 16);
roentgen b75cab
	if(tile==0){
roentgen b75cab
		buflen=sprintf(buffer, "%lu", (unsigned long)t2p->tiff_width);
roentgen b75cab
	} else {
roentgen b75cab
		if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)!=0){
roentgen b75cab
			buflen=sprintf(
roentgen b75cab
				buffer, 
roentgen b75cab
				"%lu", 
roentgen b75cab
				(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
roentgen b75cab
		} else {
roentgen b75cab
			buflen=sprintf(
roentgen b75cab
				buffer, 
roentgen b75cab
				"%lu", 
roentgen b75cab
				(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "\n/Height ", 9);
roentgen b75cab
	_TIFFmemset((tdata_t)buffer, 0x00, 16);
roentgen b75cab
	if(tile==0){
roentgen b75cab
		buflen=sprintf(buffer, "%lu", (unsigned long)t2p->tiff_length);
roentgen b75cab
	} else {
roentgen b75cab
		if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)!=0){
roentgen b75cab
			buflen=sprintf(
roentgen b75cab
				buffer, 
roentgen b75cab
				"%lu", 
roentgen b75cab
				(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
roentgen b75cab
		} else {
roentgen b75cab
			buflen=sprintf(
roentgen b75cab
				buffer, 
roentgen b75cab
				"%lu", 
roentgen b75cab
				(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "\n/BitsPerComponent ", 19);
roentgen b75cab
	_TIFFmemset((tdata_t)buffer, 0x00, 16);
roentgen b75cab
	buflen=sprintf(buffer, "%u", t2p->tiff_bitspersample);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "\n/ColorSpace ", 13);
roentgen b75cab
	written += t2p_write_pdf_xobject_cs(t2p, output);
roentgen b75cab
	if (t2p->pdf_image_interpolate)
roentgen b75cab
		written += t2pWriteFile(output,
roentgen b75cab
					 (tdata_t) "\n/Interpolate true", 18);
roentgen b75cab
	if( (t2p->pdf_switchdecode != 0)
roentgen b75cab
#ifdef CCITT_SUPPORT
roentgen b75cab
		&& ! (t2p->pdf_colorspace == T2P_CS_BILEVEL 
roentgen b75cab
		&& t2p->pdf_compression == T2P_COMPRESS_G4)
roentgen b75cab
#endif
roentgen b75cab
		){
roentgen b75cab
		written += t2p_write_pdf_xobject_decode(t2p, output);
roentgen b75cab
	}
roentgen b75cab
	written += t2p_write_pdf_xobject_stream_filter(tile, t2p, output);
roentgen b75cab
	
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * 	This function writes a PDF Image XObject Colorspace name to output.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_xobject_cs(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[128];
roentgen b75cab
	int buflen=0;
roentgen b75cab
roentgen b75cab
	float X_W=1.0;
roentgen b75cab
	float Y_W=1.0;
roentgen b75cab
	float Z_W=1.0;
roentgen b75cab
	
roentgen b75cab
	if( (t2p->pdf_colorspace & T2P_CS_ICCBASED) != 0){
roentgen b75cab
		written += t2p_write_pdf_xobject_icccs(t2p, output);
roentgen b75cab
		return(written);
roentgen b75cab
	}
roentgen b75cab
	if( (t2p->pdf_colorspace & T2P_CS_PALETTE) != 0){
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "[ /Indexed ", 11);
roentgen b75cab
		t2p->pdf_colorspace ^= T2P_CS_PALETTE;
roentgen b75cab
		written += t2p_write_pdf_xobject_cs(t2p, output);
roentgen b75cab
		t2p->pdf_colorspace |= T2P_CS_PALETTE;
roentgen b75cab
		buflen=sprintf(buffer, "%u", (0x0001 << t2p->tiff_bitspersample)-1 );
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) " ", 1);
roentgen b75cab
		_TIFFmemset(buffer, 0x00, 16);
roentgen b75cab
		buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_palettecs ); 
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) " 0 R ]\n", 7);
roentgen b75cab
		return(written);
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_colorspace & T2P_CS_BILEVEL){
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/DeviceGray \n", 13);
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_colorspace & T2P_CS_GRAY){
roentgen b75cab
			if(t2p->pdf_colorspace & T2P_CS_CALGRAY){
roentgen b75cab
				written += t2p_write_pdf_xobject_calcs(t2p, output);
roentgen b75cab
			} else {
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) "/DeviceGray \n", 13);
roentgen b75cab
			}
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_colorspace & T2P_CS_RGB){
roentgen b75cab
			if(t2p->pdf_colorspace & T2P_CS_CALRGB){
roentgen b75cab
				written += t2p_write_pdf_xobject_calcs(t2p, output);
roentgen b75cab
			} else {
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) "/DeviceRGB \n", 12);
roentgen b75cab
			}
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_colorspace & T2P_CS_CMYK){
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/DeviceCMYK \n", 13);
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_colorspace & T2P_CS_LAB){
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "[/Lab << \n", 10);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
roentgen b75cab
			X_W = t2p->tiff_whitechromaticities[0];
roentgen b75cab
			Y_W = t2p->tiff_whitechromaticities[1];
roentgen b75cab
			Z_W = 1.0F - (X_W + Y_W);
roentgen b75cab
			X_W /= Y_W;
roentgen b75cab
			Z_W /= Y_W;
roentgen b75cab
			Y_W = 1.0F;
roentgen b75cab
			buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/Range ", 7);
roentgen b75cab
			buflen=sprintf(buffer, "[%d %d %d %d] \n", 
roentgen b75cab
				t2p->pdf_labrange[0], 
roentgen b75cab
				t2p->pdf_labrange[1], 
roentgen b75cab
				t2p->pdf_labrange[2], 
roentgen b75cab
				t2p->pdf_labrange[3]);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) ">>] \n", 5);
roentgen b75cab
			
roentgen b75cab
	}
roentgen b75cab
	
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_transfer(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "<< /Type /ExtGState \n/TR ", 25);
roentgen b75cab
	if(t2p->tiff_transferfunctioncount == 1){
roentgen b75cab
		buflen=sprintf(buffer, "%lu",
roentgen b75cab
			       (unsigned long)(t2p->pdf_xrefcount + 1));
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
roentgen b75cab
	} else {
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "[ ", 2);
roentgen b75cab
		buflen=sprintf(buffer, "%lu",
roentgen b75cab
			       (unsigned long)(t2p->pdf_xrefcount + 1));
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
roentgen b75cab
		buflen=sprintf(buffer, "%lu",
roentgen b75cab
			       (unsigned long)(t2p->pdf_xrefcount + 2));
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
roentgen b75cab
		buflen=sprintf(buffer, "%lu",
roentgen b75cab
			       (unsigned long)(t2p->pdf_xrefcount + 3));
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/Identity ] ", 12);
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " >> \n", 5);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_transfer_dict(T2P* t2p, TIFF* output, uint16 i){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[32];
roentgen b75cab
	int buflen=0;
roentgen b75cab
	(void)i; /* XXX */
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/FunctionType 0 \n", 17);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/Domain [0.0 1.0] \n", 19);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/Range [0.0 1.0] \n", 18);
roentgen b75cab
	buflen=sprintf(buffer, "/Size [%u] \n", (1<<t2p->tiff_bitspersample));
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/BitsPerSample 16 \n", 19);
roentgen b75cab
	written += t2p_write_pdf_stream_dict(((tsize_t)1)<<(t2p->tiff_bitspersample+1), 0, output);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_transfer_stream(T2P* t2p, TIFF* output, uint16 i){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
roentgen b75cab
	written += t2p_write_pdf_stream(
roentgen b75cab
		t2p->tiff_transferfunction[i], 
roentgen b75cab
		(((tsize_t)1)<<(t2p->tiff_bitspersample+1)), 
roentgen b75cab
		output);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a PDF Image XObject Colorspace array to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_xobject_calcs(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[128];
roentgen b75cab
	int buflen=0;
roentgen b75cab
	
roentgen b75cab
	float X_W=0.0;
roentgen b75cab
	float Y_W=0.0;
roentgen b75cab
	float Z_W=0.0;
roentgen b75cab
	float X_R=0.0;
roentgen b75cab
	float Y_R=0.0;
roentgen b75cab
	float Z_R=0.0;
roentgen b75cab
	float X_G=0.0;
roentgen b75cab
	float Y_G=0.0;
roentgen b75cab
	float Z_G=0.0;
roentgen b75cab
	float X_B=0.0;
roentgen b75cab
	float Y_B=0.0;
roentgen b75cab
	float Z_B=0.0;
roentgen b75cab
	float x_w=0.0;
roentgen b75cab
	float y_w=0.0;
roentgen b75cab
	float z_w=0.0;
roentgen b75cab
	float x_r=0.0;
roentgen b75cab
	float y_r=0.0;
roentgen b75cab
	float x_g=0.0;
roentgen b75cab
	float y_g=0.0;
roentgen b75cab
	float x_b=0.0;
roentgen b75cab
	float y_b=0.0;
roentgen b75cab
	float R=1.0;
roentgen b75cab
	float G=1.0;
roentgen b75cab
	float B=1.0;
roentgen b75cab
	
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "[", 1);
roentgen b75cab
	if(t2p->pdf_colorspace & T2P_CS_CALGRAY){
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/CalGray ", 9);
roentgen b75cab
		X_W = t2p->tiff_whitechromaticities[0];
roentgen b75cab
		Y_W = t2p->tiff_whitechromaticities[1];
roentgen b75cab
		Z_W = 1.0F - (X_W + Y_W);
roentgen b75cab
		X_W /= Y_W;
roentgen b75cab
		Z_W /= Y_W;
roentgen b75cab
		Y_W = 1.0F;
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_colorspace & T2P_CS_CALRGB){
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/CalRGB ", 8);
roentgen b75cab
		x_w = t2p->tiff_whitechromaticities[0];
roentgen b75cab
		y_w = t2p->tiff_whitechromaticities[1];
roentgen b75cab
		x_r = t2p->tiff_primarychromaticities[0];
roentgen b75cab
		y_r = t2p->tiff_primarychromaticities[1];
roentgen b75cab
		x_g = t2p->tiff_primarychromaticities[2];
roentgen b75cab
		y_g = t2p->tiff_primarychromaticities[3];
roentgen b75cab
		x_b = t2p->tiff_primarychromaticities[4];
roentgen b75cab
		y_b = t2p->tiff_primarychromaticities[5];
roentgen b75cab
		z_w = y_w * ((x_g - x_b)*y_r - (x_r-x_b)*y_g + (x_r-x_g)*y_b);
roentgen b75cab
		Y_R = (y_r/R) * ((x_g-x_b)*y_w - (x_w-x_b)*y_g + (x_w-x_g)*y_b) / z_w;
roentgen b75cab
		X_R = Y_R * x_r / y_r;
roentgen b75cab
		Z_R = Y_R * (((1-x_r)/y_r)-1);
roentgen b75cab
		Y_G = ((0.0F-(y_g))/G) * ((x_r-x_b)*y_w - (x_w-x_b)*y_r + (x_w-x_r)*y_b) / z_w;
roentgen b75cab
		X_G = Y_G * x_g / y_g;
roentgen b75cab
		Z_G = Y_G * (((1-x_g)/y_g)-1);
roentgen b75cab
		Y_B = (y_b/B) * ((x_r-x_g)*y_w - (x_w-x_g)*y_r + (x_w-x_r)*y_g) / z_w;
roentgen b75cab
		X_B = Y_B * x_b / y_b;
roentgen b75cab
		Z_B = Y_B * (((1-x_b)/y_b)-1);
roentgen b75cab
		X_W = (X_R * R) + (X_G * G) + (X_B * B);
roentgen b75cab
		Y_W = (Y_R * R) + (Y_G * G) + (Y_B * B);
roentgen b75cab
		Z_W = (Z_R * R) + (Z_G * G) + (Z_B * B);
roentgen b75cab
		X_W /= Y_W;
roentgen b75cab
		Z_W /= Y_W;
roentgen b75cab
		Y_W = 1.0;
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "<< \n", 4);
roentgen b75cab
	if(t2p->pdf_colorspace & T2P_CS_CALGRAY){
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
roentgen b75cab
		buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/Gamma 2.2 \n", 12);
roentgen b75cab
	}
roentgen b75cab
	if(t2p->pdf_colorspace & T2P_CS_CALRGB){
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
roentgen b75cab
		buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/Matrix ", 8);
roentgen b75cab
		buflen=sprintf(buffer, "[%.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f] \n", 
roentgen b75cab
			X_R, Y_R, Z_R, 
roentgen b75cab
			X_G, Y_G, Z_G, 
roentgen b75cab
			X_B, Y_B, Z_B); 
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "/Gamma [2.2 2.2 2.2] \n", 22);
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) ">>] \n", 5);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a PDF Image XObject Colorspace array to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_xobject_icccs(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
	
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "[/ICCBased ", 11);
roentgen b75cab
	buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_icccs);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " 0 R] \n", 7);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_xobject_icccs_dict(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
	
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/N ", 3);
roentgen b75cab
	buflen=sprintf(buffer, "%u \n", t2p->tiff_samplesperpixel);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/Alternate ", 11);
roentgen b75cab
	t2p->pdf_colorspace ^= T2P_CS_ICCBASED;
roentgen b75cab
	written += t2p_write_pdf_xobject_cs(t2p, output);
roentgen b75cab
	t2p->pdf_colorspace |= T2P_CS_ICCBASED;
roentgen b75cab
	written += t2p_write_pdf_stream_dict(t2p->tiff_iccprofilelength, 0, output);
roentgen b75cab
	
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_xobject_icccs_stream(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
roentgen b75cab
	written += t2p_write_pdf_stream(
roentgen b75cab
				(tdata_t) t2p->tiff_iccprofile, 
roentgen b75cab
				(tsize_t) t2p->tiff_iccprofilelength, 
roentgen b75cab
				output);
roentgen b75cab
	
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a palette stream for an indexed color space to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_xobject_palettecs_stream(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
roentgen b75cab
	written += t2p_write_pdf_stream(
roentgen b75cab
				(tdata_t) t2p->pdf_palette, 
roentgen b75cab
				(tsize_t) t2p->pdf_palettesize, 
roentgen b75cab
				output);
roentgen b75cab
	
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a PDF Image XObject Decode array to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_xobject_decode(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	int i=0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/Decode [ ", 10);
roentgen b75cab
	for (i=0;i<t2p->tiff_samplesperpixel;i++){
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) "1 0 ", 4);
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "]\n", 2);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a PDF Image XObject stream filter name and parameters to 
roentgen b75cab
	output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_xobject_stream_filter(ttile_t tile, T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[16];
roentgen b75cab
	int buflen=0;
roentgen b75cab
roentgen b75cab
	if(t2p->pdf_compression==T2P_COMPRESS_NONE){
roentgen b75cab
		return(written);
roentgen b75cab
	}
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "/Filter ", 8);
roentgen b75cab
	switch(t2p->pdf_compression){
roentgen b75cab
#ifdef CCITT_SUPPORT
roentgen b75cab
		case T2P_COMPRESS_G4:
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/CCITTFaxDecode ", 16);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13);
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "<< /K -1 ", 9);
roentgen b75cab
			if(tile==0){
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
roentgen b75cab
				buflen=sprintf(buffer, "%lu",
roentgen b75cab
					       (unsigned long)t2p->tiff_width);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
roentgen b75cab
				buflen=sprintf(buffer, "%lu",
roentgen b75cab
					       (unsigned long)t2p->tiff_length);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
			} else {
roentgen b75cab
				if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)==0){
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
roentgen b75cab
					buflen=sprintf(
roentgen b75cab
						buffer, 
roentgen b75cab
						"%lu", 
roentgen b75cab
						(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
				} else {
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
roentgen b75cab
					buflen=sprintf(
roentgen b75cab
						buffer, 
roentgen b75cab
						"%lu", 
roentgen b75cab
						(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
				}
roentgen b75cab
				if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)==0){
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
roentgen b75cab
					buflen=sprintf(
roentgen b75cab
						buffer, 
roentgen b75cab
						"%lu", 
roentgen b75cab
						(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
				} else {
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
roentgen b75cab
					buflen=sprintf(
roentgen b75cab
						buffer, 
roentgen b75cab
						"%lu", 
roentgen b75cab
						(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
roentgen b75cab
					written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
				}
roentgen b75cab
			}
roentgen b75cab
			if(t2p->pdf_switchdecode == 0){
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) " /BlackIs1 true ", 16);
roentgen b75cab
			}
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
roentgen b75cab
			break;
roentgen b75cab
#endif
roentgen b75cab
#ifdef JPEG_SUPPORT
roentgen b75cab
		case T2P_COMPRESS_JPEG:
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/DCTDecode ", 11);
roentgen b75cab
roentgen b75cab
			if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR) {
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) "<< /ColorTransform 0 >>\n", 24);
roentgen b75cab
			}
roentgen b75cab
			break;
roentgen b75cab
#endif
roentgen b75cab
#ifdef ZIP_SUPPORT
roentgen b75cab
		case T2P_COMPRESS_ZIP:
roentgen b75cab
			written += t2pWriteFile(output, (tdata_t) "/FlateDecode ", 13);
roentgen b75cab
			if(t2p->pdf_compressionquality%100){
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) "<< /Predictor ", 14);
roentgen b75cab
				_TIFFmemset(buffer, 0x00, 16);
roentgen b75cab
				buflen=sprintf(buffer, "%u", t2p->pdf_compressionquality%100);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) " /Columns ", 10);
roentgen b75cab
				_TIFFmemset(buffer, 0x00, 16);
roentgen b75cab
				buflen = sprintf(buffer, "%lu",
roentgen b75cab
						 (unsigned long)t2p->tiff_width);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) " /Colors ", 9);
roentgen b75cab
				_TIFFmemset(buffer, 0x00, 16);
roentgen b75cab
				buflen=sprintf(buffer, "%u", t2p->tiff_samplesperpixel);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) " /BitsPerComponent ", 19);
roentgen b75cab
				_TIFFmemset(buffer, 0x00, 16);
roentgen b75cab
				buflen=sprintf(buffer, "%u", t2p->tiff_bitspersample);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
				written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
roentgen b75cab
			}
roentgen b75cab
			break;
roentgen b75cab
#endif
roentgen b75cab
		default:
roentgen b75cab
			break;
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
	This function writes a PDF xref table to output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_xreftable(T2P* t2p, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	char buffer[21];
roentgen b75cab
	int buflen=0;
roentgen b75cab
	uint32 i=0;
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "xref\n0 ", 7);
roentgen b75cab
	buflen=sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount + 1));
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " \n0000000000 65535 f \n", 22);
roentgen b75cab
	for (i=0;i<t2p->pdf_xrefcount;i++){
roentgen b75cab
		sprintf(buffer, "%.10lu 00000 n \n",
roentgen b75cab
			(unsigned long)t2p->pdf_xrefoffsets[i]);
roentgen b75cab
		written += t2pWriteFile(output, (tdata_t) buffer, 20);
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/*
roentgen b75cab
 * This function writes a PDF trailer to output.
roentgen b75cab
 */
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf_trailer(T2P* t2p, TIFF* output)
roentgen b75cab
{
roentgen b75cab
roentgen b75cab
	tsize_t written = 0;
roentgen b75cab
	char buffer[32];
roentgen b75cab
	int buflen = 0;
roentgen b75cab
	size_t i = 0;
roentgen b75cab
roentgen b75cab
	for (i = 0; i < sizeof(t2p->pdf_fileid) - 8; i += 8)
roentgen b75cab
		snprintf(t2p->pdf_fileid + i, 9, "%.8X", rand());
roentgen b75cab
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "trailer\n<<\n/Size ", 17);
roentgen b75cab
	buflen = sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount+1));
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	_TIFFmemset(buffer, 0x00, 32);	
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "\n/Root ", 7);
roentgen b75cab
	buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_catalog);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	_TIFFmemset(buffer, 0x00, 32);	
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " 0 R \n/Info ", 12);
roentgen b75cab
	buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_info);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	_TIFFmemset(buffer, 0x00, 32);	
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) " 0 R \n/ID[<", 11);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) t2p->pdf_fileid,
roentgen b75cab
				sizeof(t2p->pdf_fileid) - 1);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "><", 2);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) t2p->pdf_fileid,
roentgen b75cab
				sizeof(t2p->pdf_fileid) - 1);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) ">]\n>>\nstartxref\n", 16);
roentgen b75cab
	buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_startxref);
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) buffer, buflen);
roentgen b75cab
	_TIFFmemset(buffer, 0x00, 32);	
roentgen b75cab
	written += t2pWriteFile(output, (tdata_t) "\n%%EOF\n", 7);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
 
roentgen b75cab
/*
roentgen b75cab
roentgen b75cab
  This function writes a PDF to a file given a pointer to a TIFF.
roentgen b75cab
roentgen b75cab
  The idea with using a TIFF* as output for a PDF file is that the file 
roentgen b75cab
  can be created with TIFFClientOpen for memory-mapped use within the TIFF 
roentgen b75cab
  library, and TIFFWriteEncodedStrip can be used to write compressed data to 
roentgen b75cab
  the output.  The output is not actually a TIFF file, it is a PDF file.  
roentgen b75cab
roentgen b75cab
  This function uses only t2pWriteFile and TIFFWriteEncodedStrip to write to 
roentgen b75cab
  the output TIFF file.  When libtiff would otherwise be writing data to the 
roentgen b75cab
  output file, the write procedure of the TIFF structure is replaced with an 
roentgen b75cab
  empty implementation.
roentgen b75cab
roentgen b75cab
  The first argument to the function is an initialized and validated T2P 
roentgen b75cab
  context struct pointer.
roentgen b75cab
roentgen b75cab
  The second argument to the function is the TIFF* that is the input that has 
roentgen b75cab
  been opened for reading and no other functions have been called upon it.
roentgen b75cab
roentgen b75cab
  The third argument to the function is the TIFF* that is the output that has 
roentgen b75cab
  been opened for writing.  It has to be opened so that it hasn't written any 
roentgen b75cab
  data to the output.  If the output is seekable then it's OK to seek to the 
roentgen b75cab
  beginning of the file.  The function only writes to the output PDF and does 
roentgen b75cab
  not seek.  See the example usage in the main() function.
roentgen b75cab
roentgen b75cab
	TIFF* output = TIFFOpen("output.pdf", "w");
roentgen b75cab
	assert(output != NULL);
roentgen b75cab
roentgen b75cab
	if(output->tif_seekproc != NULL){
roentgen b75cab
		t2pSeekFile(output, (toff_t) 0, SEEK_SET);
roentgen b75cab
	}
roentgen b75cab
roentgen b75cab
  This function returns the file size of the output PDF file.  On error it 
roentgen b75cab
  returns zero and the t2p->t2p_error variable is set to T2P_ERR_ERROR.
roentgen b75cab
roentgen b75cab
  After this function completes, call t2p_free on t2p, TIFFClose on input, 
roentgen b75cab
  and TIFFClose on output.
roentgen b75cab
*/
roentgen b75cab
roentgen b75cab
tsize_t t2p_write_pdf(T2P* t2p, TIFF* input, TIFF* output){
roentgen b75cab
roentgen b75cab
	tsize_t written=0;
roentgen b75cab
	ttile_t i2=0;
roentgen b75cab
	tsize_t streamlen=0;
roentgen b75cab
	uint16 i=0;
roentgen b75cab
roentgen b75cab
	t2p_read_tiff_init(t2p, input);
roentgen b75cab
	if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
roentgen b75cab
	t2p->pdf_xrefoffsets= (uint32*) _TIFFmalloc(t2p->pdf_xrefcount * sizeof(uint32) );
roentgen b75cab
	if(t2p->pdf_xrefoffsets==NULL){
roentgen b75cab
		TIFFError(
roentgen b75cab
			TIFF2PDF_MODULE, 
roentgen b75cab
			"Can't allocate %u bytes of memory for t2p_write_pdf", 
roentgen b75cab
			(unsigned int) (t2p->pdf_xrefcount * sizeof(uint32)) );
roentgen b75cab
		t2p->t2p_error = T2P_ERR_ERROR;
roentgen b75cab
		return(written);
roentgen b75cab
	}
roentgen b75cab
	t2p->pdf_xrefcount=0;
roentgen b75cab
	t2p->pdf_catalog=1;
roentgen b75cab
	t2p->pdf_info=2;
roentgen b75cab
	t2p->pdf_pages=3;
roentgen b75cab
	written += t2p_write_pdf_header(t2p, output);
roentgen b75cab
	t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
	t2p->pdf_catalog=t2p->pdf_xrefcount;
roentgen b75cab
	written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
	written += t2p_write_pdf_catalog(t2p, output);
roentgen b75cab
	written += t2p_write_pdf_obj_end(output);
roentgen b75cab
	t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
	t2p->pdf_info=t2p->pdf_xrefcount;
roentgen b75cab
	written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
	written += t2p_write_pdf_info(t2p, input, output);
roentgen b75cab
	written += t2p_write_pdf_obj_end(output);
roentgen b75cab
	t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
	t2p->pdf_pages=t2p->pdf_xrefcount;
roentgen b75cab
	written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
	written += t2p_write_pdf_pages(t2p, output);
roentgen b75cab
	written += t2p_write_pdf_obj_end(output);
roentgen b75cab
	for(t2p->pdf_page=0;t2p->pdf_page<t2p->tiff_pagecount;t2p->pdf_page++){
roentgen b75cab
		t2p_read_tiff_data(t2p, input);
roentgen b75cab
		if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
roentgen b75cab
		t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
		written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
		written += t2p_write_pdf_page(t2p->pdf_xrefcount, t2p, output);
roentgen b75cab
		written += t2p_write_pdf_obj_end(output);
roentgen b75cab
		t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
		written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
		written += t2p_write_pdf_stream_dict_start(output);
roentgen b75cab
		written += t2p_write_pdf_stream_dict(0, t2p->pdf_xrefcount+1, output);
roentgen b75cab
		written += t2p_write_pdf_stream_dict_end(output);
roentgen b75cab
		written += t2p_write_pdf_stream_start(output);
roentgen b75cab
		streamlen=written;
roentgen b75cab
		written += t2p_write_pdf_page_content_stream(t2p, output);
roentgen b75cab
		streamlen=written-streamlen;
roentgen b75cab
		written += t2p_write_pdf_stream_end(output);
roentgen b75cab
		written += t2p_write_pdf_obj_end(output);
roentgen b75cab
		t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
		written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
		written += t2p_write_pdf_stream_length(streamlen, output);
roentgen b75cab
		written += t2p_write_pdf_obj_end(output);
roentgen b75cab
		if(t2p->tiff_transferfunctioncount != 0){
roentgen b75cab
			t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
			written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
			written += t2p_write_pdf_transfer(t2p, output);
roentgen b75cab
			written += t2p_write_pdf_obj_end(output);
roentgen b75cab
			for(i=0; i < t2p->tiff_transferfunctioncount; i++){
roentgen b75cab
				t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
				written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
				written += t2p_write_pdf_stream_dict_start(output);
roentgen b75cab
				written += t2p_write_pdf_transfer_dict(t2p, output, i);
roentgen b75cab
				written += t2p_write_pdf_stream_dict_end(output);
roentgen b75cab
				written += t2p_write_pdf_stream_start(output);
roentgen b75cab
				streamlen=written;
roentgen b75cab
				written += t2p_write_pdf_transfer_stream(t2p, output, i);
roentgen b75cab
				streamlen=written-streamlen;
roentgen b75cab
				written += t2p_write_pdf_stream_end(output);
roentgen b75cab
				written += t2p_write_pdf_obj_end(output);
roentgen b75cab
			}
roentgen b75cab
		}
roentgen b75cab
		if( (t2p->pdf_colorspace & T2P_CS_PALETTE) != 0){
roentgen b75cab
			t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
			t2p->pdf_palettecs=t2p->pdf_xrefcount;
roentgen b75cab
			written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
			written += t2p_write_pdf_stream_dict_start(output);
roentgen b75cab
			written += t2p_write_pdf_stream_dict(t2p->pdf_palettesize, 0, output);
roentgen b75cab
			written += t2p_write_pdf_stream_dict_end(output);
roentgen b75cab
			written += t2p_write_pdf_stream_start(output);
roentgen b75cab
			streamlen=written;
roentgen b75cab
			written += t2p_write_pdf_xobject_palettecs_stream(t2p, output);
roentgen b75cab
			streamlen=written-streamlen;
roentgen b75cab
			written += t2p_write_pdf_stream_end(output);
roentgen b75cab
			written += t2p_write_pdf_obj_end(output);
roentgen b75cab
		}
roentgen b75cab
		if( (t2p->pdf_colorspace & T2P_CS_ICCBASED) != 0){
roentgen b75cab
			t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
			t2p->pdf_icccs=t2p->pdf_xrefcount;
roentgen b75cab
			written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
			written += t2p_write_pdf_stream_dict_start(output);
roentgen b75cab
			written += t2p_write_pdf_xobject_icccs_dict(t2p, output);
roentgen b75cab
			written += t2p_write_pdf_stream_dict_end(output);
roentgen b75cab
			written += t2p_write_pdf_stream_start(output);
roentgen b75cab
			streamlen=written;
roentgen b75cab
			written += t2p_write_pdf_xobject_icccs_stream(t2p, output);
roentgen b75cab
			streamlen=written-streamlen;
roentgen b75cab
			written += t2p_write_pdf_stream_end(output);
roentgen b75cab
			written += t2p_write_pdf_obj_end(output);
roentgen b75cab
		}
roentgen b75cab
		if(t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount !=0){
roentgen b75cab
			for(i2=0;i2<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount;i2++){
roentgen b75cab
				t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
				written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
				written += t2p_write_pdf_stream_dict_start(output);
roentgen b75cab
				written += t2p_write_pdf_xobject_stream_dict(
roentgen b75cab
					i2+1, 
roentgen b75cab
					t2p, 
roentgen b75cab
					output);
roentgen b75cab
				written += t2p_write_pdf_stream_dict_end(output);
roentgen b75cab
				written += t2p_write_pdf_stream_start(output);
roentgen b75cab
				streamlen=written;
roentgen b75cab
				t2p_read_tiff_size_tile(t2p, input, i2);
roentgen b75cab
				written += t2p_readwrite_pdf_image_tile(t2p, input, output, i2);
roentgen b75cab
				t2p_write_advance_directory(t2p, output);
roentgen b75cab
				if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
roentgen b75cab
				streamlen=written-streamlen;
roentgen b75cab
				written += t2p_write_pdf_stream_end(output);
roentgen b75cab
				written += t2p_write_pdf_obj_end(output);
roentgen b75cab
				t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
				written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
				written += t2p_write_pdf_stream_length(streamlen, output);
roentgen b75cab
				written += t2p_write_pdf_obj_end(output);
roentgen b75cab
			}
roentgen b75cab
		} else {
roentgen b75cab
			t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
			written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
			written += t2p_write_pdf_stream_dict_start(output);
roentgen b75cab
			written += t2p_write_pdf_xobject_stream_dict(
roentgen b75cab
				0, 
roentgen b75cab
				t2p, 
roentgen b75cab
				output);
roentgen b75cab
			written += t2p_write_pdf_stream_dict_end(output);
roentgen b75cab
			written += t2p_write_pdf_stream_start(output);
roentgen b75cab
			streamlen=written;
roentgen b75cab
			t2p_read_tiff_size(t2p, input);
roentgen b75cab
			written += t2p_readwrite_pdf_image(t2p, input, output);
roentgen b75cab
			t2p_write_advance_directory(t2p, output);
roentgen b75cab
			if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
roentgen b75cab
			streamlen=written-streamlen;
roentgen b75cab
			written += t2p_write_pdf_stream_end(output);
roentgen b75cab
			written += t2p_write_pdf_obj_end(output);
roentgen b75cab
			t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
roentgen b75cab
			written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
roentgen b75cab
			written += t2p_write_pdf_stream_length(streamlen, output);
roentgen b75cab
			written += t2p_write_pdf_obj_end(output);
roentgen b75cab
		}
roentgen b75cab
	}
roentgen b75cab
	t2p->pdf_startxref = written;
roentgen b75cab
	written += t2p_write_pdf_xreftable(t2p, output);
roentgen b75cab
	written += t2p_write_pdf_trailer(t2p, output);
roentgen b75cab
	t2p_disable(output);
roentgen b75cab
roentgen b75cab
	return(written);
roentgen b75cab
}
roentgen b75cab
roentgen b75cab
/* vim: set ts=8 sts=8 sw=8 noet: */
roentgen b75cab
/*
roentgen b75cab
 * Local Variables:
roentgen b75cab
 * mode: c
roentgen b75cab
 * c-basic-offset: 8
roentgen b75cab
 * fill-column: 78
roentgen b75cab
 * End:
roentgen b75cab
 */