1
/* $Id: tiff2pdf.c,v 1.67 2012-06-15 21:51:54 fwarmerdam Exp $
3
* tiff2pdf - converts a TIFF image to a PDF document
5
* Copyright (c) 2003 Ross Finlayson
7
* Permission to use, copy, modify, distribute, and sell this software and
8
* its documentation for any purpose is hereby granted without fee, provided
9
* that (i) the above copyright notices and this permission notice appear in
10
* all copies of the software and related documentation, and (ii) the name of
11
* Ross Finlayson may not be used in any advertising or
12
* publicity relating to the software without the specific, prior written
13
* permission of Ross Finlayson.
15
* THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16
* EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17
* WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
19
* IN NO EVENT SHALL ROSS FINLAYSON BE LIABLE FOR
20
* ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21
* OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22
* WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23
* LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
27
#include "tif_config.h"
56
extern int getopt(int, char**, char*);
60
# define EXIT_SUCCESS 0
63
# define EXIT_FAILURE 1
66
#define TIFF2PDF_MODULE "tiff2pdf"
68
#define PS_UNIT_SIZE 72.0F
70
/* This type is of PDF color spaces. */
72
T2P_CS_BILEVEL = 0x01, /* Bilevel, black and white */
73
T2P_CS_GRAY = 0x02, /* Single channel */
74
T2P_CS_RGB = 0x04, /* Three channel tristimulus RGB */
75
T2P_CS_CMYK = 0x08, /* Four channel CMYK print inkset */
76
T2P_CS_LAB = 0x10, /* Three channel L*a*b* color space */
77
T2P_CS_PALETTE = 0x1000,/* One of the above with a color map */
78
T2P_CS_CALGRAY = 0x20, /* Calibrated single channel */
79
T2P_CS_CALRGB = 0x40, /* Calibrated three channel tristimulus RGB */
80
T2P_CS_ICCBASED = 0x80 /* ICC profile color specification */
83
/* This type is of PDF compression types. */
85
T2P_COMPRESS_NONE=0x00
87
, T2P_COMPRESS_G4=0x01
89
#if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
90
, T2P_COMPRESS_JPEG=0x02
93
, T2P_COMPRESS_ZIP=0x04
97
/* This type is whether TIFF image data can be used in PDF without transcoding. */
99
T2P_TRANSCODE_RAW=0x01, /* The raw data from the input can be used without recompressing */
100
T2P_TRANSCODE_ENCODE=0x02 /* The data from the input is perhaps unencoded and reencoded */
103
/* This type is of information about the data samples of the input image. */
105
T2P_SAMPLE_NOTHING=0x0000, /* The unencoded samples are normal for the output colorspace */
106
T2P_SAMPLE_ABGR_TO_RGB=0x0001, /* The unencoded samples are the result of ReadRGBAImage */
107
T2P_SAMPLE_RGBA_TO_RGB=0x0002, /* The unencoded samples are contiguous RGBA */
108
T2P_SAMPLE_RGBAA_TO_RGB=0x0004, /* The unencoded samples are RGBA with premultiplied alpha */
109
T2P_SAMPLE_YCBCR_TO_RGB=0x0008,
110
T2P_SAMPLE_YCBCR_TO_LAB=0x0010,
111
T2P_SAMPLE_REALIZE_PALETTE=0x0020, /* The unencoded samples are indexes into the color map */
112
T2P_SAMPLE_SIGNED_TO_UNSIGNED=0x0040, /* The unencoded samples are signed instead of unsignd */
113
T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED=0x0040, /* The L*a*b* samples have a* and b* signed */
114
T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG=0x0100 /* The unencoded samples are separate instead of contiguous */
117
/* This type is of error status of the T2P struct. */
119
T2P_ERR_OK = 0, /* This is the value of t2p->t2p_error when there is no error */
120
T2P_ERR_ERROR = 1 /* This is the value of t2p->t2p_error when there was an error */
123
/* This struct defines a logical page of a TIFF. */
125
tdir_t page_directory;
127
ttile_t page_tilecount;
131
/* This struct defines a PDF rectangle's coordinates. */
140
/* This struct defines a tile of a PDF. */
145
/* This struct defines information about the tiles on a PDF page. */
147
ttile_t tiles_tilecount;
148
uint32 tiles_tilewidth;
149
uint32 tiles_tilelength;
150
uint32 tiles_tilecountx;
151
uint32 tiles_tilecounty;
152
uint32 tiles_edgetilewidth;
153
uint32 tiles_edgetilelength;
154
T2P_TILE* tiles_tiles;
157
/* This struct is the context of a function to generate PDF from a TIFF. */
160
T2P_PAGE* tiff_pages;
161
T2P_TILES* tiff_tiles;
162
tdir_t tiff_pagecount;
163
uint16 tiff_compression;
164
uint16 tiff_photometric;
165
uint16 tiff_fillorder;
166
uint16 tiff_bitspersample;
167
uint16 tiff_samplesperpixel;
173
uint16 tiff_orientation;
174
toff_t tiff_dataoffset;
175
tsize_t tiff_datasize;
177
uint16 pdf_centimeters;
178
uint16 pdf_overrideres;
179
uint16 pdf_overridepagesize;
180
float pdf_defaultxres;
181
float pdf_defaultyres;
184
float pdf_defaultpagewidth;
185
float pdf_defaultpagelength;
187
float pdf_pagelength;
188
float pdf_imagewidth;
189
float pdf_imagelength;
190
int pdf_image_fillpage; /* 0 (default: no scaling, 1:scale imagesize to pagesize */
191
T2P_BOX pdf_mediabox;
192
T2P_BOX pdf_imagebox;
193
uint16 pdf_majorversion;
194
uint16 pdf_minorversion;
198
uint32 pdf_palettecs;
199
uint16 pdf_fitwindow;
200
uint32 pdf_startxref;
201
#define TIFF2PDF_FILEID_SIZE 33
202
char pdf_fileid[TIFF2PDF_FILEID_SIZE];
203
#define TIFF2PDF_DATETIME_SIZE 17
204
char pdf_datetime[TIFF2PDF_DATETIME_SIZE];
205
#define TIFF2PDF_CREATOR_SIZE 512
206
char pdf_creator[TIFF2PDF_CREATOR_SIZE];
207
#define TIFF2PDF_AUTHOR_SIZE 512
208
char pdf_author[TIFF2PDF_AUTHOR_SIZE];
209
#define TIFF2PDF_TITLE_SIZE 512
210
char pdf_title[TIFF2PDF_TITLE_SIZE];
211
#define TIFF2PDF_SUBJECT_SIZE 512
212
char pdf_subject[TIFF2PDF_SUBJECT_SIZE];
213
#define TIFF2PDF_KEYWORDS_SIZE 512
214
char pdf_keywords[TIFF2PDF_KEYWORDS_SIZE];
215
t2p_cs_t pdf_colorspace;
216
uint16 pdf_colorspace_invert;
217
uint16 pdf_switchdecode;
218
uint16 pdf_palettesize;
219
unsigned char* pdf_palette;
221
t2p_compress_t pdf_defaultcompression;
222
uint16 pdf_defaultcompressionquality;
223
t2p_compress_t pdf_compression;
224
uint16 pdf_compressionquality;
225
uint16 pdf_nopassthrough;
226
t2p_transcode_t pdf_transcode;
227
t2p_sample_t pdf_sample;
228
uint32* pdf_xrefoffsets;
229
uint32 pdf_xrefcount;
232
tdata_t pdf_ojpegdata;
233
uint32 pdf_ojpegdatalength;
234
uint32 pdf_ojpegiflength;
236
float tiff_whitechromaticities[2];
237
float tiff_primarychromaticities[6];
238
float tiff_referenceblackwhite[2];
239
float* tiff_transferfunction[3];
240
int pdf_image_interpolate; /* 0 (default) : do not interpolate,
242
uint16 tiff_transferfunctioncount;
244
uint32 tiff_iccprofilelength;
245
tdata_t tiff_iccprofile;
247
/* fields for custom read/write procedures */
250
tsize_t outputwritten;
253
/* These functions are called by main. */
255
void tiff2pdf_usage(void);
256
int tiff2pdf_match_paper_size(float*, float*, char*);
258
/* These functions are used to generate a PDF from a TIFF. */
265
void t2p_validate(T2P*);
266
tsize_t t2p_write_pdf(T2P*, TIFF*, TIFF*);
273
void t2p_read_tiff_init(T2P*, TIFF*);
274
int t2p_cmp_t2p_page(const void*, const void*);
275
void t2p_read_tiff_data(T2P*, TIFF*);
276
void t2p_read_tiff_size(T2P*, TIFF*);
277
void t2p_read_tiff_size_tile(T2P*, TIFF*, ttile_t);
278
int t2p_tile_is_right_edge(T2P_TILES, ttile_t);
279
int t2p_tile_is_bottom_edge(T2P_TILES, ttile_t);
280
int t2p_tile_is_edge(T2P_TILES, ttile_t);
281
int t2p_tile_is_corner_edge(T2P_TILES, ttile_t);
282
tsize_t t2p_readwrite_pdf_image(T2P*, TIFF*, TIFF*);
283
tsize_t t2p_readwrite_pdf_image_tile(T2P*, TIFF*, TIFF*, ttile_t);
285
int t2p_process_ojpeg_tables(T2P*, TIFF*);
288
int t2p_process_jpeg_strip(unsigned char*, tsize_t*, unsigned char*, tsize_t*, tstrip_t, uint32);
290
void t2p_tile_collapse_left(tdata_t, tsize_t, uint32, uint32, uint32);
291
void t2p_write_advance_directory(T2P*, TIFF*);
292
tsize_t t2p_sample_planar_separate_to_contig(T2P*, unsigned char*, unsigned char*, tsize_t);
293
tsize_t t2p_sample_realize_palette(T2P*, unsigned char*);
294
tsize_t t2p_sample_abgr_to_rgb(tdata_t, uint32);
295
tsize_t t2p_sample_rgba_to_rgb(tdata_t, uint32);
296
tsize_t t2p_sample_rgbaa_to_rgb(tdata_t, uint32);
297
tsize_t t2p_sample_lab_signed_to_unsigned(tdata_t, uint32);
298
tsize_t t2p_write_pdf_header(T2P*, TIFF*);
299
tsize_t t2p_write_pdf_obj_start(uint32, TIFF*);
300
tsize_t t2p_write_pdf_obj_end(TIFF*);
301
tsize_t t2p_write_pdf_name(unsigned char*, TIFF*);
302
tsize_t t2p_write_pdf_string(char*, TIFF*);
303
tsize_t t2p_write_pdf_stream(tdata_t, tsize_t, TIFF*);
304
tsize_t t2p_write_pdf_stream_start(TIFF*);
305
tsize_t t2p_write_pdf_stream_end(TIFF*);
306
tsize_t t2p_write_pdf_stream_dict(tsize_t, uint32, TIFF*);
307
tsize_t t2p_write_pdf_stream_dict_start(TIFF*);
308
tsize_t t2p_write_pdf_stream_dict_end(TIFF*);
309
tsize_t t2p_write_pdf_stream_length(tsize_t, TIFF*);
310
tsize_t t2p_write_pdf_catalog(T2P*, TIFF*);
311
tsize_t t2p_write_pdf_info(T2P*, TIFF*, TIFF*);
312
void t2p_pdf_currenttime(T2P*);
313
void t2p_pdf_tifftime(T2P*, TIFF*);
314
tsize_t t2p_write_pdf_pages(T2P*, TIFF*);
315
tsize_t t2p_write_pdf_page(uint32, T2P*, TIFF*);
316
void t2p_compose_pdf_page(T2P*);
317
void t2p_compose_pdf_page_orient(T2P_BOX*, uint16);
318
void t2p_compose_pdf_page_orient_flip(T2P_BOX*, uint16);
319
tsize_t t2p_write_pdf_page_content(T2P*, TIFF*);
320
tsize_t t2p_write_pdf_xobject_stream_dict(ttile_t, T2P*, TIFF*);
321
tsize_t t2p_write_pdf_xobject_cs(T2P*, TIFF*);
322
tsize_t t2p_write_pdf_transfer(T2P*, TIFF*);
323
tsize_t t2p_write_pdf_transfer_dict(T2P*, TIFF*, uint16);
324
tsize_t t2p_write_pdf_transfer_stream(T2P*, TIFF*, uint16);
325
tsize_t t2p_write_pdf_xobject_calcs(T2P*, TIFF*);
326
tsize_t t2p_write_pdf_xobject_icccs(T2P*, TIFF*);
327
tsize_t t2p_write_pdf_xobject_icccs_dict(T2P*, TIFF*);
328
tsize_t t2p_write_pdf_xobject_icccs_stream(T2P*, TIFF*);
329
tsize_t t2p_write_pdf_xobject_cs_stream(T2P*, TIFF*);
330
tsize_t t2p_write_pdf_xobject_decode(T2P*, TIFF*);
331
tsize_t t2p_write_pdf_xobject_stream_filter(ttile_t, T2P*, TIFF*);
332
tsize_t t2p_write_pdf_xreftable(T2P*, TIFF*);
333
tsize_t t2p_write_pdf_trailer(T2P*, TIFF*);
336
t2p_disable(TIFF *tif)
338
T2P *t2p = (T2P*) TIFFClientdata(tif);
339
t2p->outputdisable = 1;
343
t2p_enable(TIFF *tif)
345
T2P *t2p = (T2P*) TIFFClientdata(tif);
346
t2p->outputdisable = 0;
350
* Procs for TIFFClientOpen
354
t2pReadFile(TIFF *tif, tdata_t data, tmsize_t size)
356
thandle_t client = TIFFClientdata(tif);
357
TIFFReadWriteProc proc = TIFFGetReadProc(tif);
359
return proc(client, data, size);
364
t2pWriteFile(TIFF *tif, tdata_t data, tmsize_t size)
366
thandle_t client = TIFFClientdata(tif);
367
TIFFReadWriteProc proc = TIFFGetWriteProc(tif);
369
return proc(client, data, size);
374
t2pSeekFile(TIFF *tif, toff_t offset, int whence)
376
thandle_t client = TIFFClientdata(tif);
377
TIFFSeekProc proc = TIFFGetSeekProc(tif);
379
return proc(client, offset, whence);
384
t2p_readproc(thandle_t handle, tdata_t data, tmsize_t size)
386
(void) handle, (void) data, (void) size;
391
t2p_writeproc(thandle_t handle, tdata_t data, tmsize_t size)
393
T2P *t2p = (T2P*) handle;
394
if (t2p->outputdisable <= 0 && t2p->outputfile) {
395
tsize_t written = fwrite(data, 1, size, t2p->outputfile);
396
t2p->outputwritten += written;
403
t2p_seekproc(thandle_t handle, uint64 offset, int whence)
405
T2P *t2p = (T2P*) handle;
406
if (t2p->outputdisable <= 0 && t2p->outputfile)
407
return fseek(t2p->outputfile, (long) offset, whence);
412
t2p_closeproc(thandle_t handle)
419
t2p_sizeproc(thandle_t handle)
426
t2p_mapproc(thandle_t handle, void **data, toff_t *offset)
428
(void) handle, (void) data, (void) offset;
433
t2p_unmapproc(thandle_t handle, void *data, toff_t offset)
435
(void) handle, (void) data, (void) offset;
439
checkAdd64(uint64 summand1, uint64 summand2, T2P* t2p)
441
uint64 bytes = summand1 + summand2;
443
if (bytes - summand1 != summand2) {
444
TIFFError(TIFF2PDF_MODULE, "Integer overflow");
445
t2p->t2p_error = T2P_ERR_ERROR;
453
checkMultiply64(uint64 first, uint64 second, T2P* t2p)
455
uint64 bytes = first * second;
457
if (second && bytes / second != first) {
458
TIFFError(TIFF2PDF_MODULE, "Integer overflow");
459
t2p->t2p_error = T2P_ERR_ERROR;
468
This is the main function.
470
The program converts one TIFF file to one PDF file, including multiple page
471
TIFF files, tiled TIFF files, black and white. grayscale, and color TIFF
472
files that contain data of TIFF photometric interpretations of bilevel,
473
grayscale, RGB, YCbCr, CMYK separation, and ICC L*a*b* as supported by
476
If you have multiple TIFF files to convert into one PDF file then use tiffcp
477
or other program to concatenate the files into a multiple page TIFF file.
478
If the input TIFF file is of huge dimensions (greater than 10000 pixels height
479
or width) convert the input image to a tiled TIFF if it is not already.
481
The standard output is standard output. Set the output file name with the
482
"-o output.pdf" option.
484
All black and white files are compressed into a single strip CCITT G4 Fax
485
compressed PDF, unless tiled, where tiled black and white images are
486
compressed into tiled CCITT G4 Fax compressed PDF, libtiff CCITT support
489
Color and grayscale data can be compressed using either JPEG compression,
490
ITU-T T.81, or Zip/Deflate LZ77 compression, per PNG 1.2 and RFC 1951. Set
491
the compression type using the -j or -z options. JPEG compression support
492
requires that libtiff be configured with JPEG support, and Zip/Deflate
493
compression support requires that libtiff is configured with Zip support,
494
in tiffconf.h. Use only one or the other of -j and -z. The -q option
495
sets the image compression quality, that is 1-100 with libjpeg JPEG
496
compression and one of 1, 10, 11, 12, 13, 14, or 15 for PNG group compression
497
predictor methods, add 100, 200, ..., 900 to set zlib compression quality 1-9.
498
PNG Group differencing predictor methods are not currently implemented.
500
If the input TIFF contains single strip CCITT G4 Fax compressed information,
501
then that is written to the PDF file without transcoding, unless the options
502
of no compression and no passthrough are set, -d and -n.
504
If the input TIFF contains JPEG or single strip Zip/Deflate compressed
505
information, and they are configured, then that is written to the PDF file
506
without transcoding, unless the options of no compression and no passthrough
509
The default page size upon which the TIFF image is placed is determined by
510
the resolution and extent of the image data. Default values for the TIFF
511
image resolution can be set using the -x and -y options. The page size can
512
be set using the -p option for paper size, or -w and -l for paper width and
513
length, then each page of the TIFF image is centered on its page. The
514
distance unit for default resolution and page width and length can be set
515
by the -u option, the default unit is inch.
517
Various items of the output document information can be set with the -e, -c,
518
-a, -t, -s, and -k tags. Setting the argument of the option to "" for these
519
tags causes the relevant document information field to be not written. Some
520
of the document information values otherwise get their information from the
521
input TIFF image, the software, author, document name, and image description.
523
The output PDF file conforms to the PDF 1.1 specification or PDF 1.2 if using
524
Zip/Deflate compression.
526
The Portable Document Format (PDF) specification is copyrighted by Adobe
527
Systems, Incorporated. Todos derechos reservados.
529
Here is a listing of the usage example and the options to the tiff2pdf
530
program that is part of the libtiff distribution. Options followed by
531
a colon have a required argument.
533
usage: tiff2pdf [options] input.tif
536
-o: output to file name
538
-j: compress with JPEG (requires libjpeg configured with libtiff)
539
-z: compress with Zip/Deflate (requires zlib configured with libtiff)
540
-q: compression quality
541
-n: no compressed data passthrough
542
-d: do not compress (decompress)
544
-u: set distance unit, 'i' for inch, 'm' for centimeter
545
-x: set x resolution default
546
-y: set y resolution default
549
-r: 'd' for resolution default, 'o' for resolution override
550
-p: paper size, eg "letter", "legal", "a4"
551
-F: make the tiff fill the PDF page
552
-f: set pdf "fit window" user preference
553
-b: set PDF "Interpolate" user preference
554
-e: date, overrides image or current date/time default, YYYYMMDDHHMMSS
555
-c: creator, overrides image software default
556
-a: author, overrides image artist default
557
-t: title, overrides image document name default
558
-s: subject, overrides image image description default
565
tiff2pdf -o output.pdf input.tiff
567
The above example would generate the file output.pdf from input.tiff.
571
The above example would generate PDF output from input.tiff and write it
574
tiff2pdf -j -p letter -o output.pdf input.tiff
576
The above example would generate the file output.pdf from input.tiff,
577
putting the image pages on a letter sized page, compressing the output
580
Please report bugs through:
582
http://bugzilla.remotesensing.org/buglist.cgi?product=libtiff
584
See also libtiff.3t, tiffcp.
587
int main(int argc, char** argv){
591
const char *outfilename = NULL;
593
TIFF *input = NULL, *output = NULL;
594
int c, ret = EXIT_SUCCESS;
599
TIFFError(TIFF2PDF_MODULE, "Can't initialize context");
604
(c = getopt(argc, argv,
605
"o:q:u:x:y:w:l:r:p:e:c:a:t:s:k:jzndifbhF")) != -1){
608
outfilename = optarg;
612
t2p->pdf_defaultcompression=T2P_COMPRESS_JPEG;
619
"JPEG support in libtiff required for JPEG compression, ignoring option");
624
t2p->pdf_defaultcompression=T2P_COMPRESS_ZIP;
631
"Zip support in libtiff required for Zip compression, ignoring option");
635
t2p->pdf_defaultcompressionquality=atoi(optarg);
638
t2p->pdf_nopassthrough=1;
641
t2p->pdf_defaultcompression=T2P_COMPRESS_NONE;
645
t2p->pdf_centimeters=1;
649
t2p->pdf_defaultxres =
650
(float)atof(optarg) / (t2p->pdf_centimeters?2.54F:1.0F);
653
t2p->pdf_defaultyres =
654
(float)atof(optarg) / (t2p->pdf_centimeters?2.54F:1.0F);
657
t2p->pdf_overridepagesize=1;
658
t2p->pdf_defaultpagewidth =
659
((float)atof(optarg) * PS_UNIT_SIZE) / (t2p->pdf_centimeters?2.54F:1.0F);
662
t2p->pdf_overridepagesize=1;
663
t2p->pdf_defaultpagelength =
664
((float)atof(optarg) * PS_UNIT_SIZE) / (t2p->pdf_centimeters?2.54F:1.0F);
668
t2p->pdf_overrideres=1;
672
if(tiff2pdf_match_paper_size(
673
&(t2p->pdf_defaultpagewidth),
674
&(t2p->pdf_defaultpagelength),
676
t2p->pdf_overridepagesize=1;
678
TIFFWarning(TIFF2PDF_MODULE,
679
"Unknown paper size %s, ignoring option",
684
t2p->pdf_colorspace_invert=1;
687
t2p->pdf_image_fillpage = 1;
690
t2p->pdf_fitwindow=1;
693
if (strlen(optarg) == 0) {
694
t2p->pdf_datetime[0] = '\0';
696
t2p->pdf_datetime[0] = 'D';
697
t2p->pdf_datetime[1] = ':';
698
strncpy(t2p->pdf_datetime + 2, optarg,
699
sizeof(t2p->pdf_datetime) - 3);
700
t2p->pdf_datetime[sizeof(t2p->pdf_datetime) - 1] = '\0';
704
strncpy(t2p->pdf_creator, optarg, sizeof(t2p->pdf_creator) - 1);
705
t2p->pdf_creator[sizeof(t2p->pdf_creator) - 1] = '\0';
708
strncpy(t2p->pdf_author, optarg, sizeof(t2p->pdf_author) - 1);
709
t2p->pdf_author[sizeof(t2p->pdf_author) - 1] = '\0';
712
strncpy(t2p->pdf_title, optarg, sizeof(t2p->pdf_title) - 1);
713
t2p->pdf_title[sizeof(t2p->pdf_title) - 1] = '\0';
716
strncpy(t2p->pdf_subject, optarg, sizeof(t2p->pdf_subject) - 1);
717
t2p->pdf_subject[sizeof(t2p->pdf_subject) - 1] = '\0';
720
strncpy(t2p->pdf_keywords, optarg, sizeof(t2p->pdf_keywords) - 1);
721
t2p->pdf_keywords[sizeof(t2p->pdf_keywords) - 1] = '\0';
724
t2p->pdf_image_interpolate = 1;
738
input = TIFFOpen(argv[optind++], "r");
740
TIFFError(TIFF2PDF_MODULE,
741
"Can't open input file %s for reading",
746
TIFFError(TIFF2PDF_MODULE, "No input file specified");
752
TIFFError(TIFF2PDF_MODULE,
753
"No support for multiple input files");
761
t2p->outputdisable = 0;
763
t2p->outputfile = fopen(outfilename, "wb");
764
if (t2p->outputfile == NULL) {
765
TIFFError(TIFF2PDF_MODULE,
766
"Can't open output file %s for writing",
772
t2p->outputfile = stdout;
775
output = TIFFClientOpen(outfilename, "w", (thandle_t) t2p,
776
t2p_readproc, t2p_writeproc, t2p_seekproc,
777
t2p_closeproc, t2p_sizeproc,
778
t2p_mapproc, t2p_unmapproc);
779
if (output == NULL) {
780
TIFFError(TIFF2PDF_MODULE,
781
"Can't initialize output descriptor");
789
t2pSeekFile(output, (toff_t) 0, SEEK_SET);
794
t2p_write_pdf(t2p, input, output);
795
if (t2p->t2p_error != 0) {
796
TIFFError(TIFF2PDF_MODULE,
797
"An error occurred creating output PDF file");
815
void tiff2pdf_usage(){
817
"usage: tiff2pdf [options] input.tiff",
819
" -o: output to file name",
821
" -j: compress with JPEG",
824
" -z: compress with Zip/Deflate",
826
" -q: compression quality",
827
" -n: no compressed data passthrough",
828
" -d: do not compress (decompress)",
829
" -i: invert colors",
830
" -u: set distance unit, 'i' for inch, 'm' for centimeter",
831
" -x: set x resolution default in dots per unit",
832
" -y: set y resolution default in dots per unit",
833
" -w: width in units",
834
" -l: length in units",
835
" -r: 'd' for resolution default, 'o' for resolution override",
836
" -p: paper size, eg \"letter\", \"legal\", \"A4\"",
837
" -F: make the tiff fill the PDF page",
838
" -f: set PDF \"Fit Window\" user preference",
839
" -e: date, overrides image or current date/time default, YYYYMMDDHHMMSS",
840
" -c: sets document creator, overrides image software default",
841
" -a: sets document author, overrides image artist default",
842
" -t: sets document title, overrides image document name default",
843
" -s: sets document subject, overrides image image description default",
844
" -k: sets document keywords",
845
" -b: set PDF \"Interpolate\" user preference",
851
fprintf(stderr, "%s\n\n", TIFFGetVersion());
852
for (i=0;lines[i]!=NULL;i++){
853
fprintf(stderr, "%s\n", lines[i]);
859
int tiff2pdf_match_paper_size(float* width, float* length, char* papersize){
862
const char* sizes[]={
863
"LETTER", "A4", "LEGAL",
864
"EXECUTIVE", "LETTER", "LEGAL", "LEDGER", "TABLOID",
865
"A", "B", "C", "D", "E", "F", "G", "H", "J", "K",
866
"A10", "A9", "A8", "A7", "A6", "A5", "A4", "A3", "A2", "A1", "A0",
867
"2A0", "4A0", "2A", "4A",
868
"B10", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "B2", "B1", "B0",
869
"JISB10", "JISB9", "JISB8", "JISB7", "JISB6", "JISB5", "JISB4",
870
"JISB3", "JISB2", "JISB1", "JISB0",
871
"C10", "C9", "C8", "C7", "C6", "C5", "C4", "C3", "C2", "C1", "C0",
872
"RA2", "RA1", "RA0", "SRA4", "SRA3", "SRA2", "SRA1", "SRA0",
873
"A3EXTRA", "A4EXTRA",
874
"STATEMENT", "FOLIO", "QUARTO",
879
522, 612,612,792,792,
880
612,792,1224,1584,2448,2016,792,2016,2448,2880,
881
74,105,147,210,298,420,595,842,1191,1684,2384,3370,4768,3370,4768,
882
88,125,176,249,354,499,709,1001,1417,2004,2835,
883
91,128,181,258,363,516,729,1032,1460,2064,2920,
884
79,113,162,230,323,459,649,918,1298,1298,2599,
885
1219,1729,2438,638,907,1276,1814,2551,
890
const int lengths[]={
892
756,792,1008,1224,1224,
893
792,1224,1584,2448,3168,2880,6480,10296,12672,10296,
894
105,147,210,298,420,595,842,1191,1684,2384,3370,4768,6741,4768,6741,
895
125,176,249,354,499,709,1001,1417,2004,2835,4008,
896
128,181,258,363,516,729,1032,1460,2064,2920,4127,
897
113,162,230,323,459,649,918,1298,1837,1837,3677,
898
1729,2438,3458,907,1276,1814,2551,3628,
904
len=strlen(papersize);
906
papersize[i]=toupper(papersize[i]);
908
for(i=0;sizes[i]!=NULL; i++){
909
if (strcmp( (const char*)papersize, sizes[i])==0){
910
*width=(float)widths[i];
911
*length=(float)lengths[i];
920
* This function allocates and initializes a T2P context struct pointer.
925
T2P* t2p = (T2P*) _TIFFmalloc(sizeof(T2P));
929
"Can't allocate %lu bytes of memory for t2p_init",
930
(unsigned long) sizeof(T2P));
931
return( (T2P*) NULL );
933
_TIFFmemset(t2p, 0x00, sizeof(T2P));
934
t2p->pdf_majorversion=1;
935
t2p->pdf_minorversion=1;
936
t2p->pdf_defaultxres=300.0;
937
t2p->pdf_defaultyres=300.0;
938
t2p->pdf_defaultpagewidth=612.0;
939
t2p->pdf_defaultpagelength=792.0;
940
t2p->pdf_xrefcount=3; /* Catalog, Info, Pages */
946
* This function frees a T2P context struct pointer and any allocated data fields of it.
949
void t2p_free(T2P* t2p)
954
if(t2p->pdf_xrefoffsets != NULL){
955
_TIFFfree( (tdata_t) t2p->pdf_xrefoffsets);
957
if(t2p->tiff_pages != NULL){
958
_TIFFfree( (tdata_t) t2p->tiff_pages);
960
for(i=0;i<t2p->tiff_pagecount;i++){
961
if(t2p->tiff_tiles[i].tiles_tiles != NULL){
962
_TIFFfree( (tdata_t) t2p->tiff_tiles[i].tiles_tiles);
965
if(t2p->tiff_tiles != NULL){
966
_TIFFfree( (tdata_t) t2p->tiff_tiles);
968
if(t2p->pdf_palette != NULL){
969
_TIFFfree( (tdata_t) t2p->pdf_palette);
972
if(t2p->pdf_ojpegdata != NULL){
973
_TIFFfree( (tdata_t) t2p->pdf_ojpegdata);
976
_TIFFfree( (tdata_t) t2p );
983
This function validates the values of a T2P context struct pointer
984
before calling t2p_write_pdf with it.
987
void t2p_validate(T2P* t2p){
990
if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){
991
if(t2p->pdf_defaultcompressionquality>100 ||
992
t2p->pdf_defaultcompressionquality<1){
993
t2p->pdf_defaultcompressionquality=0;
998
if(t2p->pdf_defaultcompression==T2P_COMPRESS_ZIP){
999
uint16 m=t2p->pdf_defaultcompressionquality%100;
1000
if(t2p->pdf_defaultcompressionquality/100 > 9 ||
1001
(m>1 && m<10) || m>15){
1002
t2p->pdf_defaultcompressionquality=0;
1004
if(t2p->pdf_defaultcompressionquality%100 !=0){
1005
t2p->pdf_defaultcompressionquality/=100;
1006
t2p->pdf_defaultcompressionquality*=100;
1009
"PNG Group predictor differencing not implemented, assuming compression quality %u",
1010
t2p->pdf_defaultcompressionquality);
1012
t2p->pdf_defaultcompressionquality%=100;
1013
if(t2p->pdf_minorversion<2){t2p->pdf_minorversion=2;}
1023
This function scans the input TIFF file for pages. It attempts
1024
to determine which IFD's of the TIFF file contain image document
1025
pages. For each, it gathers some information that has to do
1026
with the output of the PDF document as a whole.
1029
void t2p_read_tiff_init(T2P* t2p, TIFF* input){
1031
tdir_t directorycount=0;
1037
directorycount=TIFFNumberOfDirectories(input);
1038
t2p->tiff_pages = (T2P_PAGE*) _TIFFmalloc(directorycount * sizeof(T2P_PAGE));
1039
if(t2p->tiff_pages==NULL){
1042
"Can't allocate %lu bytes of memory for tiff_pages array, %s",
1043
(unsigned long) directorycount * sizeof(T2P_PAGE),
1044
TIFFFileName(input));
1045
t2p->t2p_error = T2P_ERR_ERROR;
1048
_TIFFmemset( t2p->tiff_pages, 0x00, directorycount * sizeof(T2P_PAGE));
1049
t2p->tiff_tiles = (T2P_TILES*) _TIFFmalloc(directorycount * sizeof(T2P_TILES));
1050
if(t2p->tiff_tiles==NULL){
1053
"Can't allocate %lu bytes of memory for tiff_tiles array, %s",
1054
(unsigned long) directorycount * sizeof(T2P_TILES),
1055
TIFFFileName(input));
1056
t2p->t2p_error = T2P_ERR_ERROR;
1059
_TIFFmemset( t2p->tiff_tiles, 0x00, directorycount * sizeof(T2P_TILES));
1060
for(i=0;i<directorycount;i++){
1061
uint32 subfiletype = 0;
1063
if(!TIFFSetDirectory(input, i)){
1066
"Can't set directory %u of input file %s",
1068
TIFFFileName(input));
1069
t2p->t2p_error = T2P_ERR_ERROR;
1072
if(TIFFGetField(input, TIFFTAG_PAGENUMBER, &pagen, &paged)){
1073
if((pagen>paged) && (paged != 0)){
1074
t2p->tiff_pages[t2p->tiff_pagecount].page_number =
1077
t2p->tiff_pages[t2p->tiff_pagecount].page_number =
1082
if(TIFFGetField(input, TIFFTAG_SUBFILETYPE, &subfiletype)){
1083
if ( ((subfiletype & FILETYPE_PAGE) != 0)
1084
|| (subfiletype == 0)){
1090
if(TIFFGetField(input, TIFFTAG_OSUBFILETYPE, &subfiletype)){
1091
if ((subfiletype == OFILETYPE_IMAGE)
1092
|| (subfiletype == OFILETYPE_PAGE)
1093
|| (subfiletype == 0) ){
1100
t2p->tiff_pages[t2p->tiff_pagecount].page_number=t2p->tiff_pagecount;
1102
t2p->tiff_pages[t2p->tiff_pagecount].page_directory=i;
1103
if(TIFFIsTiled(input)){
1104
t2p->tiff_pages[t2p->tiff_pagecount].page_tilecount =
1105
TIFFNumberOfTiles(input);
1107
t2p->tiff_pagecount++;
1112
qsort((void*) t2p->tiff_pages, t2p->tiff_pagecount,
1113
sizeof(T2P_PAGE), t2p_cmp_t2p_page);
1115
for(i=0;i<t2p->tiff_pagecount;i++){
1116
t2p->pdf_xrefcount += 5;
1117
TIFFSetDirectory(input, t2p->tiff_pages[i].page_directory );
1118
if((TIFFGetField(input, TIFFTAG_PHOTOMETRIC, &xuint16)
1119
&& (xuint16==PHOTOMETRIC_PALETTE))
1120
|| TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)) {
1121
t2p->tiff_pages[i].page_extra++;
1122
t2p->pdf_xrefcount++;
1125
if (TIFFGetField(input, TIFFTAG_COMPRESSION, &xuint16)) {
1126
if( (xuint16== COMPRESSION_DEFLATE ||
1127
xuint16== COMPRESSION_ADOBE_DEFLATE) &&
1128
((t2p->tiff_pages[i].page_tilecount != 0)
1129
|| TIFFNumberOfStrips(input)==1) &&
1130
(t2p->pdf_nopassthrough==0) ){
1131
if(t2p->pdf_minorversion<2){t2p->pdf_minorversion=2;}
1135
if (TIFFGetField(input, TIFFTAG_TRANSFERFUNCTION,
1136
&(t2p->tiff_transferfunction[0]),
1137
&(t2p->tiff_transferfunction[1]),
1138
&(t2p->tiff_transferfunction[2]))) {
1139
if(t2p->tiff_transferfunction[1] !=
1140
t2p->tiff_transferfunction[0]) {
1141
t2p->tiff_transferfunctioncount = 3;
1142
t2p->tiff_pages[i].page_extra += 4;
1143
t2p->pdf_xrefcount += 4;
1145
t2p->tiff_transferfunctioncount = 1;
1146
t2p->tiff_pages[i].page_extra += 2;
1147
t2p->pdf_xrefcount += 2;
1149
if(t2p->pdf_minorversion < 2)
1150
t2p->pdf_minorversion = 2;
1152
t2p->tiff_transferfunctioncount=0;
1157
&(t2p->tiff_iccprofilelength),
1158
&(t2p->tiff_iccprofile)) != 0){
1159
t2p->tiff_pages[i].page_extra++;
1160
t2p->pdf_xrefcount++;
1161
if(t2p->pdf_minorversion<3){t2p->pdf_minorversion=3;}
1163
t2p->tiff_tiles[i].tiles_tilecount=
1164
t2p->tiff_pages[i].page_tilecount;
1165
if( (TIFFGetField(input, TIFFTAG_PLANARCONFIG, &xuint16) != 0)
1166
&& (xuint16 == PLANARCONFIG_SEPARATE ) ){
1167
TIFFGetField(input, TIFFTAG_SAMPLESPERPIXEL, &xuint16);
1168
t2p->tiff_tiles[i].tiles_tilecount/= xuint16;
1170
if( t2p->tiff_tiles[i].tiles_tilecount > 0){
1171
t2p->pdf_xrefcount +=
1172
(t2p->tiff_tiles[i].tiles_tilecount -1)*2;
1175
&( t2p->tiff_tiles[i].tiles_tilewidth) );
1178
&( t2p->tiff_tiles[i].tiles_tilelength) );
1179
t2p->tiff_tiles[i].tiles_tiles =
1180
(T2P_TILE*) _TIFFmalloc(
1181
t2p->tiff_tiles[i].tiles_tilecount
1182
* sizeof(T2P_TILE) );
1183
if( t2p->tiff_tiles[i].tiles_tiles == NULL){
1186
"Can't allocate %lu bytes of memory for t2p_read_tiff_init, %s",
1187
(unsigned long) t2p->tiff_tiles[i].tiles_tilecount * sizeof(T2P_TILE),
1188
TIFFFileName(input));
1189
t2p->t2p_error = T2P_ERR_ERROR;
1199
* This function is used by qsort to sort a T2P_PAGE* array of page structures
1203
int t2p_cmp_t2p_page(const void* e1, const void* e2){
1205
return( ((T2P_PAGE*)e1)->page_number - ((T2P_PAGE*)e2)->page_number );
1209
This function sets the input directory to the directory of a given
1210
page and determines information about the image. It checks
1211
the image characteristics to determine if it is possible to convert
1212
the image data into a page of PDF output, setting values of the T2P
1213
struct for this page. It determines what color space is used in
1214
the output PDF to represent the image.
1216
It determines if the image can be converted as raw data without
1217
requiring transcoding of the image data.
1220
void t2p_read_tiff_data(T2P* t2p, TIFF* input){
1231
t2p->pdf_transcode = T2P_TRANSCODE_ENCODE;
1232
t2p->pdf_sample = T2P_SAMPLE_NOTHING;
1233
t2p->pdf_switchdecode = t2p->pdf_colorspace_invert;
1236
TIFFSetDirectory(input, t2p->tiff_pages[t2p->pdf_page].page_directory);
1238
TIFFGetField(input, TIFFTAG_IMAGEWIDTH, &(t2p->tiff_width));
1239
if(t2p->tiff_width == 0){
1242
"No support for %s with zero width",
1243
TIFFFileName(input) );
1244
t2p->t2p_error = T2P_ERR_ERROR;
1248
TIFFGetField(input, TIFFTAG_IMAGELENGTH, &(t2p->tiff_length));
1249
if(t2p->tiff_length == 0){
1252
"No support for %s with zero length",
1253
TIFFFileName(input) );
1254
t2p->t2p_error = T2P_ERR_ERROR;
1258
if(TIFFGetField(input, TIFFTAG_COMPRESSION, &(t2p->tiff_compression)) == 0){
1261
"No support for %s with no compression tag",
1262
TIFFFileName(input) );
1263
t2p->t2p_error = T2P_ERR_ERROR;
1267
if( TIFFIsCODECConfigured(t2p->tiff_compression) == 0){
1270
"No support for %s with compression type %u: not configured",
1271
TIFFFileName(input),
1272
t2p->tiff_compression
1274
t2p->t2p_error = T2P_ERR_ERROR;
1279
TIFFGetFieldDefaulted(input, TIFFTAG_BITSPERSAMPLE, &(t2p->tiff_bitspersample));
1280
switch(t2p->tiff_bitspersample){
1289
"Image %s has 0 bits per sample, assuming 1",
1290
TIFFFileName(input));
1291
t2p->tiff_bitspersample=1;
1296
"No support for %s with %u bits per sample",
1297
TIFFFileName(input),
1298
t2p->tiff_bitspersample);
1299
t2p->t2p_error = T2P_ERR_ERROR;
1303
TIFFGetFieldDefaulted(input, TIFFTAG_SAMPLESPERPIXEL, &(t2p->tiff_samplesperpixel));
1304
if(t2p->tiff_samplesperpixel>4){
1307
"No support for %s with %u samples per pixel",
1308
TIFFFileName(input),
1309
t2p->tiff_samplesperpixel);
1310
t2p->t2p_error = T2P_ERR_ERROR;
1313
if(t2p->tiff_samplesperpixel==0){
1316
"Image %s has 0 samples per pixel, assuming 1",
1317
TIFFFileName(input));
1318
t2p->tiff_samplesperpixel=1;
1321
if(TIFFGetField(input, TIFFTAG_SAMPLEFORMAT, &xuint16) != 0 ){
1330
"No support for %s with sample format %u",
1331
TIFFFileName(input),
1333
t2p->t2p_error = T2P_ERR_ERROR;
1339
TIFFGetFieldDefaulted(input, TIFFTAG_FILLORDER, &(t2p->tiff_fillorder));
1341
if(TIFFGetField(input, TIFFTAG_PHOTOMETRIC, &(t2p->tiff_photometric)) == 0){
1344
"No support for %s with no photometric interpretation tag",
1345
TIFFFileName(input) );
1346
t2p->t2p_error = T2P_ERR_ERROR;
1351
switch(t2p->tiff_photometric){
1352
case PHOTOMETRIC_MINISWHITE:
1353
case PHOTOMETRIC_MINISBLACK:
1354
if (t2p->tiff_bitspersample==1){
1355
t2p->pdf_colorspace=T2P_CS_BILEVEL;
1356
if(t2p->tiff_photometric==PHOTOMETRIC_MINISWHITE){
1357
t2p->pdf_switchdecode ^= 1;
1360
t2p->pdf_colorspace=T2P_CS_GRAY;
1361
if(t2p->tiff_photometric==PHOTOMETRIC_MINISWHITE){
1362
t2p->pdf_switchdecode ^= 1;
1366
case PHOTOMETRIC_RGB:
1367
t2p->pdf_colorspace=T2P_CS_RGB;
1368
if(t2p->tiff_samplesperpixel == 3){
1371
if(TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)){
1373
goto photometric_palette;
1375
if(t2p->tiff_samplesperpixel > 3) {
1376
if(t2p->tiff_samplesperpixel == 4) {
1377
t2p->pdf_colorspace = T2P_CS_RGB;
1378
if(TIFFGetField(input,
1379
TIFFTAG_EXTRASAMPLES,
1380
&xuint16, &xuint16p)
1382
if(xuint16p[0] == EXTRASAMPLE_ASSOCALPHA){
1383
t2p->pdf_sample=T2P_SAMPLE_RGBAA_TO_RGB;
1386
if(xuint16p[0] == EXTRASAMPLE_UNASSALPHA){
1387
t2p->pdf_sample=T2P_SAMPLE_RGBA_TO_RGB;
1392
"RGB image %s has 4 samples per pixel, assuming RGBA",
1393
TIFFFileName(input));
1396
t2p->pdf_colorspace=T2P_CS_CMYK;
1397
t2p->pdf_switchdecode ^= 1;
1400
"RGB image %s has 4 samples per pixel, assuming inverse CMYK",
1401
TIFFFileName(input));
1406
"No support for RGB image %s with %u samples per pixel",
1407
TIFFFileName(input),
1408
t2p->tiff_samplesperpixel);
1409
t2p->t2p_error = T2P_ERR_ERROR;
1415
"No support for RGB image %s with %u samples per pixel",
1416
TIFFFileName(input),
1417
t2p->tiff_samplesperpixel);
1418
t2p->t2p_error = T2P_ERR_ERROR;
1421
case PHOTOMETRIC_PALETTE:
1422
photometric_palette:
1423
if(t2p->tiff_samplesperpixel!=1){
1426
"No support for palettized image %s with not one sample per pixel",
1427
TIFFFileName(input));
1428
t2p->t2p_error = T2P_ERR_ERROR;
1431
t2p->pdf_colorspace=T2P_CS_RGB | T2P_CS_PALETTE;
1432
t2p->pdf_palettesize=0x0001<<t2p->tiff_bitspersample;
1433
if(!TIFFGetField(input, TIFFTAG_COLORMAP, &r, &g, &b)){
1436
"Palettized image %s has no color map",
1437
TIFFFileName(input));
1438
t2p->t2p_error = T2P_ERR_ERROR;
1441
if(t2p->pdf_palette != NULL){
1442
_TIFFfree(t2p->pdf_palette);
1443
t2p->pdf_palette=NULL;
1445
t2p->pdf_palette = (unsigned char*)
1446
_TIFFmalloc(t2p->pdf_palettesize*3);
1447
if(t2p->pdf_palette==NULL){
1450
"Can't allocate %u bytes of memory for t2p_read_tiff_image, %s",
1451
t2p->pdf_palettesize,
1452
TIFFFileName(input));
1453
t2p->t2p_error = T2P_ERR_ERROR;
1456
for(i=0;i<t2p->pdf_palettesize;i++){
1457
t2p->pdf_palette[(i*3)] = (unsigned char) (r[i]>>8);
1458
t2p->pdf_palette[(i*3)+1]= (unsigned char) (g[i]>>8);
1459
t2p->pdf_palette[(i*3)+2]= (unsigned char) (b[i]>>8);
1461
t2p->pdf_palettesize *= 3;
1463
case PHOTOMETRIC_SEPARATED:
1464
if(TIFFGetField(input, TIFFTAG_INDEXED, &xuint16)){
1466
goto photometric_palette_cmyk;
1469
if( TIFFGetField(input, TIFFTAG_INKSET, &xuint16) ){
1470
if(xuint16 != INKSET_CMYK){
1473
"No support for %s because its inkset is not CMYK",
1474
TIFFFileName(input) );
1475
t2p->t2p_error = T2P_ERR_ERROR;
1479
if(t2p->tiff_samplesperpixel==4){
1480
t2p->pdf_colorspace=T2P_CS_CMYK;
1484
"No support for %s because it has %u samples per pixel",
1485
TIFFFileName(input),
1486
t2p->tiff_samplesperpixel);
1487
t2p->t2p_error = T2P_ERR_ERROR;
1491
photometric_palette_cmyk:
1492
if(t2p->tiff_samplesperpixel!=1){
1495
"No support for palettized CMYK image %s with not one sample per pixel",
1496
TIFFFileName(input));
1497
t2p->t2p_error = T2P_ERR_ERROR;
1500
t2p->pdf_colorspace=T2P_CS_CMYK | T2P_CS_PALETTE;
1501
t2p->pdf_palettesize=0x0001<<t2p->tiff_bitspersample;
1502
if(!TIFFGetField(input, TIFFTAG_COLORMAP, &r, &g, &b, &a)){
1505
"Palettized image %s has no color map",
1506
TIFFFileName(input));
1507
t2p->t2p_error = T2P_ERR_ERROR;
1510
if(t2p->pdf_palette != NULL){
1511
_TIFFfree(t2p->pdf_palette);
1512
t2p->pdf_palette=NULL;
1514
t2p->pdf_palette = (unsigned char*)
1515
_TIFFmalloc(t2p->pdf_palettesize*4);
1516
if(t2p->pdf_palette==NULL){
1519
"Can't allocate %u bytes of memory for t2p_read_tiff_image, %s",
1520
t2p->pdf_palettesize,
1521
TIFFFileName(input));
1522
t2p->t2p_error = T2P_ERR_ERROR;
1525
for(i=0;i<t2p->pdf_palettesize;i++){
1526
t2p->pdf_palette[(i*4)] = (unsigned char) (r[i]>>8);
1527
t2p->pdf_palette[(i*4)+1]= (unsigned char) (g[i]>>8);
1528
t2p->pdf_palette[(i*4)+2]= (unsigned char) (b[i]>>8);
1529
t2p->pdf_palette[(i*4)+3]= (unsigned char) (a[i]>>8);
1531
t2p->pdf_palettesize *= 4;
1533
case PHOTOMETRIC_YCBCR:
1534
t2p->pdf_colorspace=T2P_CS_RGB;
1535
if(t2p->tiff_samplesperpixel==1){
1536
t2p->pdf_colorspace=T2P_CS_GRAY;
1537
t2p->tiff_photometric=PHOTOMETRIC_MINISBLACK;
1540
t2p->pdf_sample=T2P_SAMPLE_YCBCR_TO_RGB;
1542
if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){
1543
t2p->pdf_sample=T2P_SAMPLE_NOTHING;
1547
case PHOTOMETRIC_CIELAB:
1548
t2p->pdf_labrange[0]= -127;
1549
t2p->pdf_labrange[1]= 127;
1550
t2p->pdf_labrange[2]= -127;
1551
t2p->pdf_labrange[3]= 127;
1552
t2p->pdf_sample=T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED;
1553
t2p->pdf_colorspace=T2P_CS_LAB;
1555
case PHOTOMETRIC_ICCLAB:
1556
t2p->pdf_labrange[0]= 0;
1557
t2p->pdf_labrange[1]= 255;
1558
t2p->pdf_labrange[2]= 0;
1559
t2p->pdf_labrange[3]= 255;
1560
t2p->pdf_colorspace=T2P_CS_LAB;
1562
case PHOTOMETRIC_ITULAB:
1563
t2p->pdf_labrange[0]=-85;
1564
t2p->pdf_labrange[1]=85;
1565
t2p->pdf_labrange[2]=-75;
1566
t2p->pdf_labrange[3]=124;
1567
t2p->pdf_sample=T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED;
1568
t2p->pdf_colorspace=T2P_CS_LAB;
1570
case PHOTOMETRIC_LOGL:
1571
case PHOTOMETRIC_LOGLUV:
1574
"No support for %s with photometric interpretation LogL/LogLuv",
1575
TIFFFileName(input));
1576
t2p->t2p_error = T2P_ERR_ERROR;
1581
"No support for %s with photometric interpretation %u",
1582
TIFFFileName(input),
1583
t2p->tiff_photometric);
1584
t2p->t2p_error = T2P_ERR_ERROR;
1588
if(TIFFGetField(input, TIFFTAG_PLANARCONFIG, &(t2p->tiff_planar))){
1589
switch(t2p->tiff_planar){
1593
"Image %s has planar configuration 0, assuming 1",
1594
TIFFFileName(input));
1595
t2p->tiff_planar=PLANARCONFIG_CONTIG;
1596
case PLANARCONFIG_CONTIG:
1598
case PLANARCONFIG_SEPARATE:
1599
t2p->pdf_sample=T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG;
1600
if(t2p->tiff_bitspersample!=8){
1603
"No support for %s with separated planar configuration and %u bits per sample",
1604
TIFFFileName(input),
1605
t2p->tiff_bitspersample);
1606
t2p->t2p_error = T2P_ERR_ERROR;
1613
"No support for %s with planar configuration %u",
1614
TIFFFileName(input),
1616
t2p->t2p_error = T2P_ERR_ERROR;
1621
TIFFGetFieldDefaulted(input, TIFFTAG_ORIENTATION,
1622
&(t2p->tiff_orientation));
1623
if(t2p->tiff_orientation>8){
1624
TIFFWarning(TIFF2PDF_MODULE,
1625
"Image %s has orientation %u, assuming 0",
1626
TIFFFileName(input), t2p->tiff_orientation);
1627
t2p->tiff_orientation=0;
1630
if(TIFFGetField(input, TIFFTAG_XRESOLUTION, &(t2p->tiff_xres) ) == 0){
1633
if(TIFFGetField(input, TIFFTAG_YRESOLUTION, &(t2p->tiff_yres) ) == 0){
1636
TIFFGetFieldDefaulted(input, TIFFTAG_RESOLUTIONUNIT,
1637
&(t2p->tiff_resunit));
1638
if(t2p->tiff_resunit == RESUNIT_CENTIMETER) {
1639
t2p->tiff_xres *= 2.54F;
1640
t2p->tiff_yres *= 2.54F;
1641
} else if (t2p->tiff_resunit != RESUNIT_INCH
1642
&& t2p->pdf_centimeters != 0) {
1643
t2p->tiff_xres *= 2.54F;
1644
t2p->tiff_yres *= 2.54F;
1647
t2p_compose_pdf_page(t2p);
1649
t2p->pdf_transcode = T2P_TRANSCODE_ENCODE;
1650
if(t2p->pdf_nopassthrough==0){
1651
#ifdef CCITT_SUPPORT
1652
if(t2p->tiff_compression==COMPRESSION_CCITTFAX4
1654
if(TIFFIsTiled(input) || (TIFFNumberOfStrips(input)==1) ){
1655
t2p->pdf_transcode = T2P_TRANSCODE_RAW;
1656
t2p->pdf_compression=T2P_COMPRESS_G4;
1661
if(t2p->tiff_compression== COMPRESSION_ADOBE_DEFLATE
1662
|| t2p->tiff_compression==COMPRESSION_DEFLATE){
1663
if(TIFFIsTiled(input) || (TIFFNumberOfStrips(input)==1) ){
1664
t2p->pdf_transcode = T2P_TRANSCODE_RAW;
1665
t2p->pdf_compression=T2P_COMPRESS_ZIP;
1669
#ifdef OJPEG_SUPPORT
1670
if(t2p->tiff_compression==COMPRESSION_OJPEG){
1671
t2p->pdf_transcode = T2P_TRANSCODE_RAW;
1672
t2p->pdf_compression=T2P_COMPRESS_JPEG;
1673
t2p_process_ojpeg_tables(t2p, input);
1677
if(t2p->tiff_compression==COMPRESSION_JPEG){
1678
t2p->pdf_transcode = T2P_TRANSCODE_RAW;
1679
t2p->pdf_compression=T2P_COMPRESS_JPEG;
1685
if(t2p->pdf_transcode!=T2P_TRANSCODE_RAW){
1686
t2p->pdf_compression = t2p->pdf_defaultcompression;
1690
if(t2p->pdf_defaultcompression==T2P_COMPRESS_JPEG){
1691
if(t2p->pdf_colorspace & T2P_CS_PALETTE){
1692
t2p->pdf_sample|=T2P_SAMPLE_REALIZE_PALETTE;
1693
t2p->pdf_colorspace ^= T2P_CS_PALETTE;
1694
t2p->tiff_pages[t2p->pdf_page].page_extra--;
1697
if(t2p->tiff_compression==COMPRESSION_JPEG){
1698
if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
1701
"No support for %s with JPEG compression and separated planar configuration",
1702
TIFFFileName(input));
1703
t2p->t2p_error=T2P_ERR_ERROR;
1708
#ifdef OJPEG_SUPPORT
1709
if(t2p->tiff_compression==COMPRESSION_OJPEG){
1710
if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
1713
"No support for %s with OJPEG compression and separated planar configuration",
1714
TIFFFileName(input));
1715
t2p->t2p_error=T2P_ERR_ERROR;
1721
if(t2p->pdf_sample & T2P_SAMPLE_REALIZE_PALETTE){
1722
if(t2p->pdf_colorspace & T2P_CS_CMYK){
1723
t2p->tiff_samplesperpixel=4;
1724
t2p->tiff_photometric=PHOTOMETRIC_SEPARATED;
1726
t2p->tiff_samplesperpixel=3;
1727
t2p->tiff_photometric=PHOTOMETRIC_RGB;
1731
if (TIFFGetField(input, TIFFTAG_TRANSFERFUNCTION,
1732
&(t2p->tiff_transferfunction[0]),
1733
&(t2p->tiff_transferfunction[1]),
1734
&(t2p->tiff_transferfunction[2]))) {
1735
if(t2p->tiff_transferfunction[1] !=
1736
t2p->tiff_transferfunction[0]) {
1737
t2p->tiff_transferfunctioncount=3;
1739
t2p->tiff_transferfunctioncount=1;
1742
t2p->tiff_transferfunctioncount=0;
1744
if(TIFFGetField(input, TIFFTAG_WHITEPOINT, &xfloatp)!=0){
1745
t2p->tiff_whitechromaticities[0]=xfloatp[0];
1746
t2p->tiff_whitechromaticities[1]=xfloatp[1];
1747
if(t2p->pdf_colorspace & T2P_CS_GRAY){
1748
t2p->pdf_colorspace |= T2P_CS_CALGRAY;
1750
if(t2p->pdf_colorspace & T2P_CS_RGB){
1751
t2p->pdf_colorspace |= T2P_CS_CALRGB;
1754
if(TIFFGetField(input, TIFFTAG_PRIMARYCHROMATICITIES, &xfloatp)!=0){
1755
t2p->tiff_primarychromaticities[0]=xfloatp[0];
1756
t2p->tiff_primarychromaticities[1]=xfloatp[1];
1757
t2p->tiff_primarychromaticities[2]=xfloatp[2];
1758
t2p->tiff_primarychromaticities[3]=xfloatp[3];
1759
t2p->tiff_primarychromaticities[4]=xfloatp[4];
1760
t2p->tiff_primarychromaticities[5]=xfloatp[5];
1761
if(t2p->pdf_colorspace & T2P_CS_RGB){
1762
t2p->pdf_colorspace |= T2P_CS_CALRGB;
1765
if(t2p->pdf_colorspace & T2P_CS_LAB){
1766
if(TIFFGetField(input, TIFFTAG_WHITEPOINT, &xfloatp) != 0){
1767
t2p->tiff_whitechromaticities[0]=xfloatp[0];
1768
t2p->tiff_whitechromaticities[1]=xfloatp[1];
1770
t2p->tiff_whitechromaticities[0]=0.3457F; /* 0.3127F; */
1771
t2p->tiff_whitechromaticities[1]=0.3585F; /* 0.3290F; */
1774
if(TIFFGetField(input,
1776
&(t2p->tiff_iccprofilelength),
1777
&(t2p->tiff_iccprofile))!=0){
1778
t2p->pdf_colorspace |= T2P_CS_ICCBASED;
1780
t2p->tiff_iccprofilelength=0;
1781
t2p->tiff_iccprofile=NULL;
1784
#ifdef CCITT_SUPPORT
1785
if( t2p->tiff_bitspersample==1 &&
1786
t2p->tiff_samplesperpixel==1){
1787
t2p->pdf_compression = T2P_COMPRESS_G4;
1796
This function returns the necessary size of a data buffer to contain the raw or
1797
uncompressed image data from the input TIFF for a page.
1800
void t2p_read_tiff_size(T2P* t2p, TIFF* input){
1803
#if defined(JPEG_SUPPORT) || defined (OJPEG_SUPPORT)
1804
unsigned char* jpt=NULL;
1806
tstrip_t stripcount=0;
1810
if(t2p->pdf_transcode == T2P_TRANSCODE_RAW){
1811
#ifdef CCITT_SUPPORT
1812
if(t2p->pdf_compression == T2P_COMPRESS_G4 ){
1813
TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc);
1814
t2p->tiff_datasize=(tmsize_t)sbc[0];
1819
if(t2p->pdf_compression == T2P_COMPRESS_ZIP){
1820
TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc);
1821
t2p->tiff_datasize=(tmsize_t)sbc[0];
1825
#ifdef OJPEG_SUPPORT
1826
if(t2p->tiff_compression == COMPRESSION_OJPEG){
1827
if(!TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc)){
1828
TIFFError(TIFF2PDF_MODULE,
1829
"Input file %s missing field: TIFFTAG_STRIPBYTECOUNTS",
1830
TIFFFileName(input));
1831
t2p->t2p_error = T2P_ERR_ERROR;
1834
stripcount=TIFFNumberOfStrips(input);
1835
for(i=0;i<stripcount;i++){
1836
k = checkAdd64(k, sbc[i], t2p);
1838
if(TIFFGetField(input, TIFFTAG_JPEGIFOFFSET, &(t2p->tiff_dataoffset))){
1839
if(t2p->tiff_dataoffset != 0){
1840
if(TIFFGetField(input, TIFFTAG_JPEGIFBYTECOUNT, &(t2p->tiff_datasize))!=0){
1841
if((uint64)t2p->tiff_datasize < k) {
1842
TIFFWarning(TIFF2PDF_MODULE,
1843
"Input file %s has short JPEG interchange file byte count",
1844
TIFFFileName(input));
1845
t2p->pdf_ojpegiflength=t2p->tiff_datasize;
1846
k = checkAdd64(k, t2p->tiff_datasize, t2p);
1847
k = checkAdd64(k, 6, t2p);
1848
k = checkAdd64(k, stripcount, t2p);
1849
k = checkAdd64(k, stripcount, t2p);
1850
t2p->tiff_datasize = (tsize_t) k;
1851
if ((uint64) t2p->tiff_datasize != k) {
1852
TIFFError(TIFF2PDF_MODULE, "Integer overflow");
1853
t2p->t2p_error = T2P_ERR_ERROR;
1859
TIFFError(TIFF2PDF_MODULE,
1860
"Input file %s missing field: TIFFTAG_JPEGIFBYTECOUNT",
1861
TIFFFileName(input));
1862
t2p->t2p_error = T2P_ERR_ERROR;
1867
k = checkAdd64(k, stripcount, t2p);
1868
k = checkAdd64(k, stripcount, t2p);
1869
k = checkAdd64(k, 2048, t2p);
1870
t2p->tiff_datasize = (tsize_t) k;
1871
if ((uint64) t2p->tiff_datasize != k) {
1872
TIFFError(TIFF2PDF_MODULE, "Integer overflow");
1873
t2p->t2p_error = T2P_ERR_ERROR;
1879
if(t2p->tiff_compression == COMPRESSION_JPEG) {
1881
if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0 ){
1884
k -= 2; /* don't use EOI of header */
1887
k = 2; /* SOI for first strip */
1889
stripcount=TIFFNumberOfStrips(input);
1890
if(!TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc)){
1891
TIFFError(TIFF2PDF_MODULE,
1892
"Input file %s missing field: TIFFTAG_STRIPBYTECOUNTS",
1893
TIFFFileName(input));
1894
t2p->t2p_error = T2P_ERR_ERROR;
1897
for(i=0;i<stripcount;i++){
1898
k = checkAdd64(k, sbc[i], t2p);
1899
k -=4; /* don't use SOI or EOI of strip */
1901
k = checkAdd64(k, 2, t2p); /* use EOI of last strip */
1902
t2p->tiff_datasize = (tsize_t) k;
1903
if ((uint64) t2p->tiff_datasize != k) {
1904
TIFFError(TIFF2PDF_MODULE, "Integer overflow");
1905
t2p->t2p_error = T2P_ERR_ERROR;
1912
k = checkMultiply64(TIFFScanlineSize(input), t2p->tiff_length, t2p);
1913
if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
1914
k = checkMultiply64(k, t2p->tiff_samplesperpixel, t2p);
1917
/* Assume we had overflow inside TIFFScanlineSize */
1918
t2p->t2p_error = T2P_ERR_ERROR;
1921
t2p->tiff_datasize = (tsize_t) k;
1922
if ((uint64) t2p->tiff_datasize != k) {
1923
TIFFError(TIFF2PDF_MODULE, "Integer overflow");
1924
t2p->t2p_error = T2P_ERR_ERROR;
1931
This function returns the necessary size of a data buffer to contain the raw or
1932
uncompressed image data from the input TIFF for a tile of a page.
1935
void t2p_read_tiff_size_tile(T2P* t2p, TIFF* input, ttile_t tile){
1944
edge |= t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
1945
edge |= t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
1947
if(t2p->pdf_transcode==T2P_TRANSCODE_RAW){
1949
#if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
1950
&& !(t2p->pdf_compression==T2P_COMPRESS_JPEG)
1953
t2p->tiff_datasize=TIFFTileSize(input);
1954
if (t2p->tiff_datasize == 0) {
1955
/* Assume we had overflow inside TIFFTileSize */
1956
t2p->t2p_error = T2P_ERR_ERROR;
1960
TIFFGetField(input, TIFFTAG_TILEBYTECOUNTS, &tbc);
1962
#ifdef OJPEG_SUPPORT
1963
if(t2p->tiff_compression==COMPRESSION_OJPEG){
1964
k = checkAdd64(k, 2048, t2p);
1968
if(t2p->tiff_compression==COMPRESSION_JPEG) {
1970
if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt)!=0){
1972
k = checkAdd64(k, count, t2p);
1973
k -= 2; /* don't use EOI of header or SOI of tile */
1978
t2p->tiff_datasize = (tsize_t) k;
1979
if ((uint64) t2p->tiff_datasize != k) {
1980
TIFFError(TIFF2PDF_MODULE, "Integer overflow");
1981
t2p->t2p_error = T2P_ERR_ERROR;
1986
k = TIFFTileSize(input);
1987
if(t2p->tiff_planar==PLANARCONFIG_SEPARATE){
1988
k = checkMultiply64(k, t2p->tiff_samplesperpixel, t2p);
1991
/* Assume we had overflow inside TIFFTileSize */
1992
t2p->t2p_error = T2P_ERR_ERROR;
1995
t2p->tiff_datasize = (tsize_t) k;
1996
if ((uint64) t2p->tiff_datasize != k) {
1997
TIFFError(TIFF2PDF_MODULE, "Integer overflow");
1998
t2p->t2p_error = T2P_ERR_ERROR;
2005
* This functions returns a non-zero value when the tile is on the right edge
2006
* and does not have full imaged tile width.
2009
int t2p_tile_is_right_edge(T2P_TILES tiles, ttile_t tile){
2011
if( ((tile+1) % tiles.tiles_tilecountx == 0)
2012
&& (tiles.tiles_edgetilewidth != 0) ){
2020
* This functions returns a non-zero value when the tile is on the bottom edge
2021
* and does not have full imaged tile length.
2024
int t2p_tile_is_bottom_edge(T2P_TILES tiles, ttile_t tile){
2026
if( ((tile+1) > (tiles.tiles_tilecount-tiles.tiles_tilecountx) )
2027
&& (tiles.tiles_edgetilelength != 0) ){
2035
* This function returns a non-zero value when the tile is a right edge tile
2036
* or a bottom edge tile.
2039
int t2p_tile_is_edge(T2P_TILES tiles, ttile_t tile){
2041
return(t2p_tile_is_right_edge(tiles, tile) | t2p_tile_is_bottom_edge(tiles, tile) );
2045
This function returns a non-zero value when the tile is a right edge tile and a bottom
2049
int t2p_tile_is_corner_edge(T2P_TILES tiles, ttile_t tile){
2051
return(t2p_tile_is_right_edge(tiles, tile) & t2p_tile_is_bottom_edge(tiles, tile) );
2056
This function reads the raster image data from the input TIFF for an image and writes
2057
the data to the output PDF XObject image dictionary stream. It returns the amount written
2061
tsize_t t2p_readwrite_pdf_image(T2P* t2p, TIFF* input, TIFF* output){
2064
unsigned char* buffer=NULL;
2065
unsigned char* samplebuffer=NULL;
2066
tsize_t bufferoffset=0;
2067
tsize_t samplebufferoffset=0;
2071
tstrip_t stripcount=0;
2072
tsize_t stripsize=0;
2073
tsize_t sepstripcount=0;
2074
tsize_t sepstripsize=0;
2075
#ifdef OJPEG_SUPPORT
2076
toff_t inputoffset=0;
2086
unsigned char* stripbuffer;
2087
tsize_t striplength=0;
2088
uint32 max_striplength=0;
2091
/* Fail if prior error (in particular, can't trust tiff_datasize) */
2092
if (t2p->t2p_error != T2P_ERR_OK)
2095
if(t2p->pdf_transcode == T2P_TRANSCODE_RAW){
2096
#ifdef CCITT_SUPPORT
2097
if(t2p->pdf_compression == T2P_COMPRESS_G4){
2098
buffer = (unsigned char*)
2099
_TIFFmalloc(t2p->tiff_datasize);
2100
if (buffer == NULL) {
2101
TIFFError(TIFF2PDF_MODULE,
2102
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2103
(unsigned long) t2p->tiff_datasize,
2104
TIFFFileName(input));
2105
t2p->t2p_error = T2P_ERR_ERROR;
2108
TIFFReadRawStrip(input, 0, (tdata_t) buffer,
2109
t2p->tiff_datasize);
2110
if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){
2112
* make sure is lsb-to-msb
2113
* bit-endianness fill order
2115
TIFFReverseBits(buffer,
2116
t2p->tiff_datasize);
2118
t2pWriteFile(output, (tdata_t) buffer,
2119
t2p->tiff_datasize);
2121
return(t2p->tiff_datasize);
2125
if (t2p->pdf_compression == T2P_COMPRESS_ZIP) {
2126
buffer = (unsigned char*)
2127
_TIFFmalloc(t2p->tiff_datasize);
2129
TIFFError(TIFF2PDF_MODULE,
2130
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2131
(unsigned long) t2p->tiff_datasize,
2132
TIFFFileName(input));
2133
t2p->t2p_error = T2P_ERR_ERROR;
2136
memset(buffer, 0, t2p->tiff_datasize);
2137
TIFFReadRawStrip(input, 0, (tdata_t) buffer,
2138
t2p->tiff_datasize);
2139
if (t2p->tiff_fillorder==FILLORDER_LSB2MSB) {
2140
TIFFReverseBits(buffer,
2141
t2p->tiff_datasize);
2143
t2pWriteFile(output, (tdata_t) buffer,
2144
t2p->tiff_datasize);
2146
return(t2p->tiff_datasize);
2149
#ifdef OJPEG_SUPPORT
2150
if(t2p->tiff_compression == COMPRESSION_OJPEG) {
2152
if(t2p->tiff_dataoffset != 0) {
2153
buffer = (unsigned char*)
2154
_TIFFmalloc(t2p->tiff_datasize);
2155
if(buffer == NULL) {
2156
TIFFError(TIFF2PDF_MODULE,
2157
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2158
(unsigned long) t2p->tiff_datasize,
2159
TIFFFileName(input));
2160
t2p->t2p_error = T2P_ERR_ERROR;
2163
memset(buffer, 0, t2p->tiff_datasize);
2164
if(t2p->pdf_ojpegiflength==0){
2165
inputoffset=t2pSeekFile(input, 0,
2168
t2p->tiff_dataoffset,
2170
t2pReadFile(input, (tdata_t) buffer,
2171
t2p->tiff_datasize);
2172
t2pSeekFile(input, inputoffset,
2174
t2pWriteFile(output, (tdata_t) buffer,
2175
t2p->tiff_datasize);
2177
return(t2p->tiff_datasize);
2179
inputoffset=t2pSeekFile(input, 0,
2182
t2p->tiff_dataoffset,
2184
bufferoffset = t2pReadFile(input,
2186
t2p->pdf_ojpegiflength);
2187
t2p->pdf_ojpegiflength = 0;
2188
t2pSeekFile(input, inputoffset,
2191
TIFFTAG_YCBCRSUBSAMPLING,
2193
buffer[bufferoffset++]= 0xff;
2194
buffer[bufferoffset++]= 0xdd;
2195
buffer[bufferoffset++]= 0x00;
2196
buffer[bufferoffset++]= 0x04;
2199
ri=(t2p->tiff_width+h_samp-1) / h_samp;
2201
TIFFTAG_ROWSPERSTRIP,
2203
ri*=(rows+v_samp-1)/v_samp;
2204
buffer[bufferoffset++]= (ri>>8) & 0xff;
2205
buffer[bufferoffset++]= ri & 0xff;
2206
stripcount=TIFFNumberOfStrips(input);
2207
for(i=0;i<stripcount;i++){
2209
buffer[bufferoffset++]=0xff;
2210
buffer[bufferoffset++]=(0xd0 | ((i-1)%8));
2212
bufferoffset+=TIFFReadRawStrip(input,
2214
(tdata_t) &(((unsigned char*)buffer)[bufferoffset]),
2217
t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
2219
return(bufferoffset);
2222
if(! t2p->pdf_ojpegdata){
2223
TIFFError(TIFF2PDF_MODULE,
2224
"No support for OJPEG image %s with bad tables",
2225
TIFFFileName(input));
2226
t2p->t2p_error = T2P_ERR_ERROR;
2229
buffer = (unsigned char*)
2230
_TIFFmalloc(t2p->tiff_datasize);
2232
TIFFError(TIFF2PDF_MODULE,
2233
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2234
(unsigned long) t2p->tiff_datasize,
2235
TIFFFileName(input));
2236
t2p->t2p_error = T2P_ERR_ERROR;
2239
memset(buffer, 0, t2p->tiff_datasize);
2240
_TIFFmemcpy(buffer, t2p->pdf_ojpegdata, t2p->pdf_ojpegdatalength);
2241
bufferoffset=t2p->pdf_ojpegdatalength;
2242
stripcount=TIFFNumberOfStrips(input);
2243
for(i=0;i<stripcount;i++){
2245
buffer[bufferoffset++]=0xff;
2246
buffer[bufferoffset++]=(0xd0 | ((i-1)%8));
2248
bufferoffset+=TIFFReadRawStrip(input,
2250
(tdata_t) &(((unsigned char*)buffer)[bufferoffset]),
2253
if( ! ( (buffer[bufferoffset-1]==0xd9) && (buffer[bufferoffset-2]==0xff) ) ){
2254
buffer[bufferoffset++]=0xff;
2255
buffer[bufferoffset++]=0xd9;
2257
t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
2259
return(bufferoffset);
2260
TIFFError(TIFF2PDF_MODULE,
2261
"No support for OJPEG image %s with no JPEG File Interchange offset",
2262
TIFFFileName(input));
2263
t2p->t2p_error = T2P_ERR_ERROR;
2266
return(t2p->tiff_datasize);
2270
if(t2p->tiff_compression == COMPRESSION_JPEG) {
2272
buffer = (unsigned char*)
2273
_TIFFmalloc(t2p->tiff_datasize);
2275
TIFFError(TIFF2PDF_MODULE,
2276
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2277
(unsigned long) t2p->tiff_datasize,
2278
TIFFFileName(input));
2279
t2p->t2p_error = T2P_ERR_ERROR;
2282
memset(buffer, 0, t2p->tiff_datasize);
2283
if (TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0) {
2285
_TIFFmemcpy(buffer, jpt, count);
2286
bufferoffset += count - 2;
2289
stripcount=TIFFNumberOfStrips(input);
2290
TIFFGetField(input, TIFFTAG_STRIPBYTECOUNTS, &sbc);
2291
for(i=0;i<stripcount;i++){
2292
if(sbc[i]>max_striplength) max_striplength=sbc[i];
2294
stripbuffer = (unsigned char*)
2295
_TIFFmalloc(max_striplength);
2296
if(stripbuffer==NULL){
2297
TIFFError(TIFF2PDF_MODULE,
2298
"Can't allocate %u bytes of memory for t2p_readwrite_pdf_image, %s",
2300
TIFFFileName(input));
2302
t2p->t2p_error = T2P_ERR_ERROR;
2305
for(i=0;i<stripcount;i++){
2306
striplength=TIFFReadRawStrip(input, i, (tdata_t) stripbuffer, -1);
2307
if(!t2p_process_jpeg_strip(
2314
TIFFError(TIFF2PDF_MODULE,
2315
"Can't process JPEG data in input file %s",
2316
TIFFFileName(input));
2317
_TIFFfree(samplebuffer);
2319
t2p->t2p_error = T2P_ERR_ERROR;
2323
buffer[bufferoffset++]=0xff;
2324
buffer[bufferoffset++]=0xd9;
2325
t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
2326
_TIFFfree(stripbuffer);
2328
return(bufferoffset);
2334
if(t2p->pdf_sample==T2P_SAMPLE_NOTHING){
2335
buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2337
TIFFError(TIFF2PDF_MODULE,
2338
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2339
(unsigned long) t2p->tiff_datasize,
2340
TIFFFileName(input));
2341
t2p->t2p_error = T2P_ERR_ERROR;
2344
memset(buffer, 0, t2p->tiff_datasize);
2345
stripsize=TIFFStripSize(input);
2346
stripcount=TIFFNumberOfStrips(input);
2347
for(i=0;i<stripcount;i++){
2349
TIFFReadEncodedStrip(input,
2351
(tdata_t) &buffer[bufferoffset],
2354
TIFFError(TIFF2PDF_MODULE,
2355
"Error on decoding strip %u of %s",
2357
TIFFFileName(input));
2359
t2p->t2p_error=T2P_ERR_ERROR;
2365
if(t2p->pdf_sample & T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG){
2367
sepstripsize=TIFFStripSize(input);
2368
sepstripcount=TIFFNumberOfStrips(input);
2370
stripsize=sepstripsize*t2p->tiff_samplesperpixel;
2371
stripcount=sepstripcount/t2p->tiff_samplesperpixel;
2373
buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2375
TIFFError(TIFF2PDF_MODULE,
2376
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2377
(unsigned long) t2p->tiff_datasize,
2378
TIFFFileName(input));
2379
t2p->t2p_error = T2P_ERR_ERROR;
2382
memset(buffer, 0, t2p->tiff_datasize);
2383
samplebuffer = (unsigned char*) _TIFFmalloc(stripsize);
2384
if(samplebuffer==NULL){
2385
TIFFError(TIFF2PDF_MODULE,
2386
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2387
(unsigned long) t2p->tiff_datasize,
2388
TIFFFileName(input));
2389
t2p->t2p_error = T2P_ERR_ERROR;
2392
for(i=0;i<stripcount;i++){
2393
samplebufferoffset=0;
2394
for(j=0;j<t2p->tiff_samplesperpixel;j++){
2396
TIFFReadEncodedStrip(input,
2398
(tdata_t) &(samplebuffer[samplebufferoffset]),
2401
TIFFError(TIFF2PDF_MODULE,
2402
"Error on decoding strip %u of %s",
2404
TIFFFileName(input));
2406
t2p->t2p_error=T2P_ERR_ERROR;
2409
samplebufferoffset+=read;
2411
t2p_sample_planar_separate_to_contig(
2413
&(buffer[bufferoffset]),
2415
samplebufferoffset);
2416
bufferoffset+=samplebufferoffset;
2418
_TIFFfree(samplebuffer);
2422
buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2424
TIFFError(TIFF2PDF_MODULE,
2425
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2426
(unsigned long) t2p->tiff_datasize,
2427
TIFFFileName(input));
2428
t2p->t2p_error = T2P_ERR_ERROR;
2431
memset(buffer, 0, t2p->tiff_datasize);
2432
stripsize=TIFFStripSize(input);
2433
stripcount=TIFFNumberOfStrips(input);
2434
for(i=0;i<stripcount;i++){
2436
TIFFReadEncodedStrip(input,
2438
(tdata_t) &buffer[bufferoffset],
2441
TIFFError(TIFF2PDF_MODULE,
2442
"Error on decoding strip %u of %s",
2444
TIFFFileName(input));
2445
_TIFFfree(samplebuffer);
2447
t2p->t2p_error=T2P_ERR_ERROR;
2453
if(t2p->pdf_sample & T2P_SAMPLE_REALIZE_PALETTE){
2455
samplebuffer=(unsigned char*)_TIFFrealloc(
2457
t2p->tiff_datasize * t2p->tiff_samplesperpixel);
2458
if(samplebuffer==NULL){
2459
TIFFError(TIFF2PDF_MODULE,
2460
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2461
(unsigned long) t2p->tiff_datasize,
2462
TIFFFileName(input));
2463
t2p->t2p_error = T2P_ERR_ERROR;
2466
buffer=samplebuffer;
2467
t2p->tiff_datasize *= t2p->tiff_samplesperpixel;
2469
t2p_sample_realize_palette(t2p, buffer);
2472
if(t2p->pdf_sample & T2P_SAMPLE_RGBA_TO_RGB){
2473
t2p->tiff_datasize=t2p_sample_rgba_to_rgb(
2475
t2p->tiff_width*t2p->tiff_length);
2478
if(t2p->pdf_sample & T2P_SAMPLE_RGBAA_TO_RGB){
2479
t2p->tiff_datasize=t2p_sample_rgbaa_to_rgb(
2481
t2p->tiff_width*t2p->tiff_length);
2484
if(t2p->pdf_sample & T2P_SAMPLE_YCBCR_TO_RGB){
2485
samplebuffer=(unsigned char*)_TIFFrealloc(
2487
t2p->tiff_width*t2p->tiff_length*4);
2488
if(samplebuffer==NULL){
2489
TIFFError(TIFF2PDF_MODULE,
2490
"Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2491
(unsigned long) t2p->tiff_datasize,
2492
TIFFFileName(input));
2493
t2p->t2p_error = T2P_ERR_ERROR;
2497
buffer=samplebuffer;
2499
if(!TIFFReadRGBAImageOriented(
2504
ORIENTATION_TOPLEFT,
2506
TIFFError(TIFF2PDF_MODULE,
2507
"Can't use TIFFReadRGBAImageOriented to extract RGB image from %s",
2508
TIFFFileName(input));
2509
t2p->t2p_error = T2P_ERR_ERROR;
2512
t2p->tiff_datasize=t2p_sample_abgr_to_rgb(
2514
t2p->tiff_width*t2p->tiff_length);
2518
if(t2p->pdf_sample & T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED){
2519
t2p->tiff_datasize=t2p_sample_lab_signed_to_unsigned(
2521
t2p->tiff_width*t2p->tiff_length);
2527
t2p_disable(output);
2528
TIFFSetField(output, TIFFTAG_PHOTOMETRIC, t2p->tiff_photometric);
2529
TIFFSetField(output, TIFFTAG_BITSPERSAMPLE, t2p->tiff_bitspersample);
2530
TIFFSetField(output, TIFFTAG_SAMPLESPERPIXEL, t2p->tiff_samplesperpixel);
2531
TIFFSetField(output, TIFFTAG_IMAGEWIDTH, t2p->tiff_width);
2532
TIFFSetField(output, TIFFTAG_IMAGELENGTH, t2p->tiff_length);
2533
TIFFSetField(output, TIFFTAG_ROWSPERSTRIP, t2p->tiff_length);
2534
TIFFSetField(output, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
2535
TIFFSetField(output, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
2537
switch(t2p->pdf_compression){
2538
case T2P_COMPRESS_NONE:
2539
TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
2541
#ifdef CCITT_SUPPORT
2542
case T2P_COMPRESS_G4:
2543
TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
2547
case T2P_COMPRESS_JPEG:
2548
if(t2p->tiff_photometric==PHOTOMETRIC_YCBCR) {
2549
uint16 hor = 0, ver = 0;
2550
if (TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &hor, &ver) !=0 ) {
2551
if(hor != 0 && ver != 0){
2552
TIFFSetField(output, TIFFTAG_YCBCRSUBSAMPLING, hor, ver);
2555
if(TIFFGetField(input, TIFFTAG_REFERENCEBLACKWHITE, &xfloatp)!=0){
2556
TIFFSetField(output, TIFFTAG_REFERENCEBLACKWHITE, xfloatp);
2559
if(TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_JPEG)==0){
2560
TIFFError(TIFF2PDF_MODULE,
2561
"Unable to use JPEG compression for input %s and output %s",
2562
TIFFFileName(input),
2563
TIFFFileName(output));
2565
t2p->t2p_error = T2P_ERR_ERROR;
2568
TIFFSetField(output, TIFFTAG_JPEGTABLESMODE, 0);
2570
if(t2p->pdf_colorspace & (T2P_CS_RGB | T2P_CS_LAB)){
2571
TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
2572
if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR){
2573
TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
2575
TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RAW);
2578
if(t2p->pdf_colorspace & T2P_CS_GRAY){
2581
if(t2p->pdf_colorspace & T2P_CS_CMYK){
2584
if(t2p->pdf_defaultcompressionquality != 0){
2585
TIFFSetField(output,
2586
TIFFTAG_JPEGQUALITY,
2587
t2p->pdf_defaultcompressionquality);
2593
case T2P_COMPRESS_ZIP:
2594
TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
2595
if(t2p->pdf_defaultcompressionquality%100 != 0){
2596
TIFFSetField(output,
2598
t2p->pdf_defaultcompressionquality % 100);
2600
if(t2p->pdf_defaultcompressionquality/100 != 0){
2601
TIFFSetField(output,
2603
(t2p->pdf_defaultcompressionquality / 100));
2612
t2p->outputwritten = 0;
2614
if(t2p->pdf_compression == T2P_COMPRESS_JPEG
2615
&& t2p->tiff_photometric == PHOTOMETRIC_YCBCR){
2616
bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t)0,
2618
stripsize * stripcount);
2622
bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t)0,
2624
t2p->tiff_datasize);
2626
if (buffer != NULL) {
2631
if (bufferoffset == (tsize_t)-1) {
2632
TIFFError(TIFF2PDF_MODULE,
2633
"Error writing encoded strip to output PDF %s",
2634
TIFFFileName(output));
2635
t2p->t2p_error = T2P_ERR_ERROR;
2639
written = t2p->outputwritten;
2644
* This function reads the raster image data from the input TIFF for an image
2645
* tile and writes the data to the output PDF XObject image dictionary stream
2646
* for the tile. It returns the amount written or zero on error.
2649
tsize_t t2p_readwrite_pdf_image_tile(T2P* t2p, TIFF* input, TIFF* output, ttile_t tile){
2653
unsigned char* buffer=NULL;
2654
tsize_t bufferoffset=0;
2655
unsigned char* samplebuffer=NULL;
2656
tsize_t samplebufferoffset=0;
2659
ttile_t tilecount=0;
2661
ttile_t septilecount=0;
2662
tsize_t septilesize=0;
2669
/* Fail if prior error (in particular, can't trust tiff_datasize) */
2670
if (t2p->t2p_error != T2P_ERR_OK)
2673
edge |= t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
2674
edge |= t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile);
2676
if( (t2p->pdf_transcode == T2P_TRANSCODE_RAW) && ((edge == 0)
2677
#if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
2678
|| (t2p->pdf_compression == T2P_COMPRESS_JPEG)
2682
#ifdef CCITT_SUPPORT
2683
if(t2p->pdf_compression == T2P_COMPRESS_G4){
2684
buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2686
TIFFError(TIFF2PDF_MODULE,
2687
"Can't allocate %lu bytes of memory "
2688
"for t2p_readwrite_pdf_image_tile, %s",
2689
(unsigned long) t2p->tiff_datasize,
2690
TIFFFileName(input));
2691
t2p->t2p_error = T2P_ERR_ERROR;
2694
TIFFReadRawTile(input, tile, (tdata_t) buffer, t2p->tiff_datasize);
2695
if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){
2696
TIFFReverseBits(buffer, t2p->tiff_datasize);
2698
t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize);
2700
return(t2p->tiff_datasize);
2704
if(t2p->pdf_compression == T2P_COMPRESS_ZIP){
2705
buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2707
TIFFError(TIFF2PDF_MODULE,
2708
"Can't allocate %lu bytes of memory "
2709
"for t2p_readwrite_pdf_image_tile, %s",
2710
(unsigned long) t2p->tiff_datasize,
2711
TIFFFileName(input));
2712
t2p->t2p_error = T2P_ERR_ERROR;
2715
TIFFReadRawTile(input, tile, (tdata_t) buffer, t2p->tiff_datasize);
2716
if (t2p->tiff_fillorder==FILLORDER_LSB2MSB){
2717
TIFFReverseBits(buffer, t2p->tiff_datasize);
2719
t2pWriteFile(output, (tdata_t) buffer, t2p->tiff_datasize);
2721
return(t2p->tiff_datasize);
2724
#ifdef OJPEG_SUPPORT
2725
if(t2p->tiff_compression == COMPRESSION_OJPEG){
2726
if(! t2p->pdf_ojpegdata){
2727
TIFFError(TIFF2PDF_MODULE,
2728
"No support for OJPEG image %s with "
2730
TIFFFileName(input));
2731
t2p->t2p_error = T2P_ERR_ERROR;
2734
buffer=(unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2736
TIFFError(TIFF2PDF_MODULE,
2737
"Can't allocate %lu bytes of memory "
2738
"for t2p_readwrite_pdf_image, %s",
2739
(unsigned long) t2p->tiff_datasize,
2740
TIFFFileName(input));
2741
t2p->t2p_error = T2P_ERR_ERROR;
2744
_TIFFmemcpy(buffer, t2p->pdf_ojpegdata, t2p->pdf_ojpegdatalength);
2746
if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile)){
2748
(t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength >> 8) & 0xff;
2750
(t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength ) & 0xff;
2752
if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile)){
2754
(t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth >> 8) & 0xff;
2756
(t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth ) & 0xff;
2759
bufferoffset=t2p->pdf_ojpegdatalength;
2760
bufferoffset+=TIFFReadRawTile(input,
2762
(tdata_t) &(((unsigned char*)buffer)[bufferoffset]),
2764
((unsigned char*)buffer)[bufferoffset++]=0xff;
2765
((unsigned char*)buffer)[bufferoffset++]=0xd9;
2766
t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
2768
return(bufferoffset);
2772
if(t2p->tiff_compression == COMPRESSION_JPEG){
2773
unsigned char table_end[2];
2775
buffer= (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2777
TIFFError(TIFF2PDF_MODULE,
2778
"Can't allocate %lu bytes of memory "
2779
"for t2p_readwrite_pdf_image_tile, %s",
2781
TIFFFileName(input));
2782
t2p->t2p_error = T2P_ERR_ERROR;
2785
if(TIFFGetField(input, TIFFTAG_JPEGTABLES, &count, &jpt) != 0) {
2787
_TIFFmemcpy(buffer, jpt, count);
2788
bufferoffset += count - 2;
2789
table_end[0] = buffer[bufferoffset-2];
2790
table_end[1] = buffer[bufferoffset-1];
2793
xuint32 = bufferoffset;
2794
bufferoffset += TIFFReadRawTile(
2797
(tdata_t) &(((unsigned char*)buffer)[bufferoffset-2]),
2799
buffer[xuint32-2]=table_end[0];
2800
buffer[xuint32-1]=table_end[1];
2802
bufferoffset += TIFFReadRawTile(
2805
(tdata_t) &(((unsigned char*)buffer)[bufferoffset]),
2809
t2pWriteFile(output, (tdata_t) buffer, bufferoffset);
2811
return(bufferoffset);
2817
if(t2p->pdf_sample==T2P_SAMPLE_NOTHING){
2818
buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2820
TIFFError(TIFF2PDF_MODULE,
2821
"Can't allocate %lu bytes of memory for "
2822
"t2p_readwrite_pdf_image_tile, %s",
2823
(unsigned long) t2p->tiff_datasize,
2824
TIFFFileName(input));
2825
t2p->t2p_error = T2P_ERR_ERROR;
2829
read = TIFFReadEncodedTile(
2832
(tdata_t) &buffer[bufferoffset],
2833
t2p->tiff_datasize);
2835
TIFFError(TIFF2PDF_MODULE,
2836
"Error on decoding tile %u of %s",
2838
TIFFFileName(input));
2840
t2p->t2p_error=T2P_ERR_ERROR;
2846
if(t2p->pdf_sample == T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG){
2847
septilesize=TIFFTileSize(input);
2848
septilecount=TIFFNumberOfTiles(input);
2849
tilesize=septilesize*t2p->tiff_samplesperpixel;
2850
tilecount=septilecount/t2p->tiff_samplesperpixel;
2851
buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2853
TIFFError(TIFF2PDF_MODULE,
2854
"Can't allocate %lu bytes of memory "
2855
"for t2p_readwrite_pdf_image_tile, %s",
2856
(unsigned long) t2p->tiff_datasize,
2857
TIFFFileName(input));
2858
t2p->t2p_error = T2P_ERR_ERROR;
2861
samplebuffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2862
if(samplebuffer==NULL){
2863
TIFFError(TIFF2PDF_MODULE,
2864
"Can't allocate %lu bytes of memory "
2865
"for t2p_readwrite_pdf_image_tile, %s",
2866
(unsigned long) t2p->tiff_datasize,
2867
TIFFFileName(input));
2868
t2p->t2p_error = T2P_ERR_ERROR;
2871
samplebufferoffset=0;
2872
for(i=0;i<t2p->tiff_samplesperpixel;i++){
2874
TIFFReadEncodedTile(input,
2876
(tdata_t) &(samplebuffer[samplebufferoffset]),
2879
TIFFError(TIFF2PDF_MODULE,
2880
"Error on decoding tile %u of %s",
2882
TIFFFileName(input));
2883
_TIFFfree(samplebuffer);
2885
t2p->t2p_error=T2P_ERR_ERROR;
2888
samplebufferoffset+=read;
2890
t2p_sample_planar_separate_to_contig(
2892
&(buffer[bufferoffset]),
2894
samplebufferoffset);
2895
bufferoffset+=samplebufferoffset;
2896
_TIFFfree(samplebuffer);
2900
buffer = (unsigned char*) _TIFFmalloc(t2p->tiff_datasize);
2902
TIFFError(TIFF2PDF_MODULE,
2903
"Can't allocate %lu bytes of memory "
2904
"for t2p_readwrite_pdf_image_tile, %s",
2905
(unsigned long) t2p->tiff_datasize,
2906
TIFFFileName(input));
2907
t2p->t2p_error = T2P_ERR_ERROR;
2910
read = TIFFReadEncodedTile(
2913
(tdata_t) &buffer[bufferoffset],
2914
t2p->tiff_datasize);
2916
TIFFError(TIFF2PDF_MODULE,
2917
"Error on decoding tile %u of %s",
2919
TIFFFileName(input));
2921
t2p->t2p_error=T2P_ERR_ERROR;
2926
if(t2p->pdf_sample & T2P_SAMPLE_RGBA_TO_RGB){
2927
t2p->tiff_datasize=t2p_sample_rgba_to_rgb(
2929
t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth
2930
*t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
2933
if(t2p->pdf_sample & T2P_SAMPLE_RGBAA_TO_RGB){
2934
t2p->tiff_datasize=t2p_sample_rgbaa_to_rgb(
2936
t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth
2937
*t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
2940
if(t2p->pdf_sample & T2P_SAMPLE_YCBCR_TO_RGB){
2941
TIFFError(TIFF2PDF_MODULE,
2942
"No support for YCbCr to RGB in tile for %s",
2943
TIFFFileName(input));
2945
t2p->t2p_error = T2P_ERR_ERROR;
2949
if(t2p->pdf_sample & T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED){
2950
t2p->tiff_datasize=t2p_sample_lab_signed_to_unsigned(
2952
t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth
2953
*t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
2957
if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile) != 0){
2958
t2p_tile_collapse_left(
2960
TIFFTileRowSize(input),
2961
t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth,
2962
t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth,
2963
t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
2967
t2p_disable(output);
2968
TIFFSetField(output, TIFFTAG_PHOTOMETRIC, t2p->tiff_photometric);
2969
TIFFSetField(output, TIFFTAG_BITSPERSAMPLE, t2p->tiff_bitspersample);
2970
TIFFSetField(output, TIFFTAG_SAMPLESPERPIXEL, t2p->tiff_samplesperpixel);
2971
if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile) == 0){
2975
t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
2980
t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
2982
if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile) == 0){
2985
TIFFTAG_IMAGELENGTH,
2986
t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
2989
TIFFTAG_ROWSPERSTRIP,
2990
t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
2994
TIFFTAG_IMAGELENGTH,
2995
t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
2998
TIFFTAG_ROWSPERSTRIP,
2999
t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
3001
TIFFSetField(output, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
3002
TIFFSetField(output, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
3004
switch(t2p->pdf_compression){
3005
case T2P_COMPRESS_NONE:
3006
TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
3008
#ifdef CCITT_SUPPORT
3009
case T2P_COMPRESS_G4:
3010
TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
3014
case T2P_COMPRESS_JPEG:
3015
if (t2p->tiff_photometric==PHOTOMETRIC_YCBCR) {
3016
uint16 hor = 0, ver = 0;
3017
if (TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &hor, &ver)!=0) {
3018
if (hor != 0 && ver != 0) {
3019
TIFFSetField(output, TIFFTAG_YCBCRSUBSAMPLING, hor, ver);
3022
if(TIFFGetField(input, TIFFTAG_REFERENCEBLACKWHITE, &xfloatp)!=0){
3023
TIFFSetField(output, TIFFTAG_REFERENCEBLACKWHITE, xfloatp);
3026
TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_JPEG);
3027
TIFFSetField(output, TIFFTAG_JPEGTABLESMODE, 0); /* JPEGTABLESMODE_NONE */
3028
if(t2p->pdf_colorspace & (T2P_CS_RGB | T2P_CS_LAB)){
3029
TIFFSetField(output, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
3030
if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR){
3031
TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
3033
TIFFSetField(output, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RAW);
3036
if(t2p->pdf_colorspace & T2P_CS_GRAY){
3039
if(t2p->pdf_colorspace & T2P_CS_CMYK){
3042
if(t2p->pdf_defaultcompressionquality != 0){
3043
TIFFSetField(output,
3044
TIFFTAG_JPEGQUALITY,
3045
t2p->pdf_defaultcompressionquality);
3050
case T2P_COMPRESS_ZIP:
3051
TIFFSetField(output, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
3052
if(t2p->pdf_defaultcompressionquality%100 != 0){
3053
TIFFSetField(output,
3055
t2p->pdf_defaultcompressionquality % 100);
3057
if(t2p->pdf_defaultcompressionquality/100 != 0){
3058
TIFFSetField(output,
3060
(t2p->pdf_defaultcompressionquality / 100));
3069
t2p->outputwritten = 0;
3070
bufferoffset = TIFFWriteEncodedStrip(output, (tstrip_t) 0, buffer,
3071
TIFFStripSize(output));
3072
if (buffer != NULL) {
3076
if (bufferoffset == -1) {
3077
TIFFError(TIFF2PDF_MODULE,
3078
"Error writing encoded tile to output PDF %s",
3079
TIFFFileName(output));
3080
t2p->t2p_error = T2P_ERR_ERROR;
3084
written = t2p->outputwritten;
3089
#ifdef OJPEG_SUPPORT
3090
int t2p_process_ojpeg_tables(T2P* t2p, TIFF* input){
3102
unsigned char* ojpegdata;
3104
uint32 offset_table;
3112
if(!TIFFGetField(input, TIFFTAG_JPEGPROC, &proc)){
3113
TIFFError(TIFF2PDF_MODULE,
3114
"Missing JPEGProc field in OJPEG image %s",
3115
TIFFFileName(input));
3116
t2p->t2p_error = T2P_ERR_ERROR;
3119
if(proc!=JPEGPROC_BASELINE && proc!=JPEGPROC_LOSSLESS){
3120
TIFFError(TIFF2PDF_MODULE,
3121
"Bad JPEGProc field in OJPEG image %s",
3122
TIFFFileName(input));
3123
t2p->t2p_error = T2P_ERR_ERROR;
3126
if(!TIFFGetField(input, TIFFTAG_JPEGQTABLES, &q_length, &q)){
3127
TIFFError(TIFF2PDF_MODULE,
3128
"Missing JPEGQTables field in OJPEG image %s",
3129
TIFFFileName(input));
3130
t2p->t2p_error = T2P_ERR_ERROR;
3133
if(q_length < (64U * t2p->tiff_samplesperpixel)){
3134
TIFFError(TIFF2PDF_MODULE,
3135
"Bad JPEGQTables field in OJPEG image %s",
3136
TIFFFileName(input));
3137
t2p->t2p_error = T2P_ERR_ERROR;
3140
if(!TIFFGetField(input, TIFFTAG_JPEGDCTABLES, &dc_length, &dc)){
3141
TIFFError(TIFF2PDF_MODULE,
3142
"Missing JPEGDCTables field in OJPEG image %s",
3143
TIFFFileName(input));
3144
t2p->t2p_error = T2P_ERR_ERROR;
3147
if(proc==JPEGPROC_BASELINE){
3148
if(!TIFFGetField(input, TIFFTAG_JPEGACTABLES, &ac_length, &ac)){
3149
TIFFError(TIFF2PDF_MODULE,
3150
"Missing JPEGACTables field in OJPEG image %s",
3151
TIFFFileName(input));
3152
t2p->t2p_error = T2P_ERR_ERROR;
3156
if(!TIFFGetField(input, TIFFTAG_JPEGLOSSLESSPREDICTORS, &lp)){
3157
TIFFError(TIFF2PDF_MODULE,
3158
"Missing JPEGLosslessPredictors field in OJPEG image %s",
3159
TIFFFileName(input));
3160
t2p->t2p_error = T2P_ERR_ERROR;
3163
if(!TIFFGetField(input, TIFFTAG_JPEGPOINTTRANSFORM, &pt)){
3164
TIFFError(TIFF2PDF_MODULE,
3165
"Missing JPEGPointTransform field in OJPEG image %s",
3166
TIFFFileName(input));
3167
t2p->t2p_error = T2P_ERR_ERROR;
3171
if(!TIFFGetField(input, TIFFTAG_YCBCRSUBSAMPLING, &h_samp, &v_samp)){
3175
if(t2p->pdf_ojpegdata != NULL){
3176
_TIFFfree(t2p->pdf_ojpegdata);
3177
t2p->pdf_ojpegdata=NULL;
3179
t2p->pdf_ojpegdata = _TIFFmalloc(2048);
3180
if(t2p->pdf_ojpegdata == NULL){
3181
TIFFError(TIFF2PDF_MODULE,
3182
"Can't allocate %u bytes of memory for t2p_process_ojpeg_tables, %s",
3184
TIFFFileName(input));
3187
_TIFFmemset(t2p->pdf_ojpegdata, 0x00, 2048);
3188
t2p->pdf_ojpegdatalength = 0;
3189
table_count=t2p->tiff_samplesperpixel;
3190
if(proc==JPEGPROC_BASELINE){
3191
if(table_count>2) table_count=2;
3193
ojpegdata=(unsigned char*)t2p->pdf_ojpegdata;
3194
ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
3195
ojpegdata[t2p->pdf_ojpegdatalength++]=0xd8;
3196
ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
3197
if(proc==JPEGPROC_BASELINE){
3198
ojpegdata[t2p->pdf_ojpegdatalength++]=0xc0;
3200
ojpegdata[t2p->pdf_ojpegdatalength++]=0xc3;
3202
ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
3203
ojpegdata[t2p->pdf_ojpegdatalength++]=(8 + 3*t2p->tiff_samplesperpixel);
3204
ojpegdata[t2p->pdf_ojpegdatalength++]=(t2p->tiff_bitspersample & 0xff);
3205
if(TIFFIsTiled(input)){
3206
ojpegdata[t2p->pdf_ojpegdatalength++]=
3207
(t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength >> 8) & 0xff;
3208
ojpegdata[t2p->pdf_ojpegdatalength++]=
3209
(t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength ) & 0xff;
3210
ojpegdata[t2p->pdf_ojpegdatalength++]=
3211
(t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth >> 8) & 0xff;
3212
ojpegdata[t2p->pdf_ojpegdatalength++]=
3213
(t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth ) & 0xff;
3215
ojpegdata[t2p->pdf_ojpegdatalength++]=
3216
(t2p->tiff_length >> 8) & 0xff;
3217
ojpegdata[t2p->pdf_ojpegdatalength++]=
3218
(t2p->tiff_length ) & 0xff;
3219
ojpegdata[t2p->pdf_ojpegdatalength++]=
3220
(t2p->tiff_width >> 8) & 0xff;
3221
ojpegdata[t2p->pdf_ojpegdatalength++]=
3222
(t2p->tiff_width ) & 0xff;
3224
ojpegdata[t2p->pdf_ojpegdatalength++]=(t2p->tiff_samplesperpixel & 0xff);
3225
for(i=0;i<t2p->tiff_samplesperpixel;i++){
3226
ojpegdata[t2p->pdf_ojpegdatalength++]=i;
3228
ojpegdata[t2p->pdf_ojpegdatalength] |= h_samp<<4 & 0xf0;;
3229
ojpegdata[t2p->pdf_ojpegdatalength++] |= v_samp & 0x0f;
3231
ojpegdata[t2p->pdf_ojpegdatalength++]= 0x11;
3233
ojpegdata[t2p->pdf_ojpegdatalength++]=i;
3235
for(dest=0;dest<t2p->tiff_samplesperpixel;dest++){
3236
ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
3237
ojpegdata[t2p->pdf_ojpegdatalength++]=0xdb;
3238
ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
3239
ojpegdata[t2p->pdf_ojpegdatalength++]=0x43;
3240
ojpegdata[t2p->pdf_ojpegdatalength++]=dest;
3241
_TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength++]),
3242
&(((unsigned char*)q)[64*dest]), 64);
3243
t2p->pdf_ojpegdatalength+=64;
3246
for(dest=0;dest<table_count;dest++){
3247
ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
3248
ojpegdata[t2p->pdf_ojpegdatalength++]=0xc4;
3249
offset_ms_l=t2p->pdf_ojpegdatalength;
3250
t2p->pdf_ojpegdatalength+=2;
3251
ojpegdata[t2p->pdf_ojpegdatalength++]=dest & 0x0f;
3252
_TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]),
3253
&(((unsigned char*)dc)[offset_table]), 16);
3257
code_count+=ojpegdata[t2p->pdf_ojpegdatalength++];
3259
ojpegdata[offset_ms_l]=((19+code_count)>>8) & 0xff;
3260
ojpegdata[offset_ms_l+1]=(19+code_count) & 0xff;
3261
_TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]),
3262
&(((unsigned char*)dc)[offset_table]), code_count);
3263
offset_table+=code_count;
3264
t2p->pdf_ojpegdatalength+=code_count;
3266
if(proc==JPEGPROC_BASELINE){
3268
for(dest=0;dest<table_count;dest++){
3269
ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
3270
ojpegdata[t2p->pdf_ojpegdatalength++]=0xc4;
3271
offset_ms_l=t2p->pdf_ojpegdatalength;
3272
t2p->pdf_ojpegdatalength+=2;
3273
ojpegdata[t2p->pdf_ojpegdatalength] |= 0x10;
3274
ojpegdata[t2p->pdf_ojpegdatalength++] |=dest & 0x0f;
3275
_TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]),
3276
&(((unsigned char*)ac)[offset_table]), 16);
3280
code_count+=ojpegdata[t2p->pdf_ojpegdatalength++];
3282
ojpegdata[offset_ms_l]=((19+code_count)>>8) & 0xff;
3283
ojpegdata[offset_ms_l+1]=(19+code_count) & 0xff;
3284
_TIFFmemcpy( &(ojpegdata[t2p->pdf_ojpegdatalength]),
3285
&(((unsigned char*)ac)[offset_table]), code_count);
3286
offset_table+=code_count;
3287
t2p->pdf_ojpegdatalength+=code_count;
3290
if(TIFFNumberOfStrips(input)>1){
3291
ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
3292
ojpegdata[t2p->pdf_ojpegdatalength++]=0xdd;
3293
ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
3294
ojpegdata[t2p->pdf_ojpegdatalength++]=0x04;
3297
ri=(t2p->tiff_width+h_samp-1) / h_samp;
3298
TIFFGetField(input, TIFFTAG_ROWSPERSTRIP, &rows);
3299
ri*=(rows+v_samp-1)/v_samp;
3300
ojpegdata[t2p->pdf_ojpegdatalength++]= (ri>>8) & 0xff;
3301
ojpegdata[t2p->pdf_ojpegdatalength++]= ri & 0xff;
3303
ojpegdata[t2p->pdf_ojpegdatalength++]=0xff;
3304
ojpegdata[t2p->pdf_ojpegdatalength++]=0xda;
3305
ojpegdata[t2p->pdf_ojpegdatalength++]=0x00;
3306
ojpegdata[t2p->pdf_ojpegdatalength++]=(6 + 2*t2p->tiff_samplesperpixel);
3307
ojpegdata[t2p->pdf_ojpegdatalength++]=t2p->tiff_samplesperpixel & 0xff;
3308
for(i=0;i<t2p->tiff_samplesperpixel;i++){
3309
ojpegdata[t2p->pdf_ojpegdatalength++]= i & 0xff;
3310
if(proc==JPEGPROC_BASELINE){
3311
ojpegdata[t2p->pdf_ojpegdatalength] |=
3312
( ( (i>(table_count-1U)) ? (table_count-1U) : i) << 4U) & 0xf0;
3313
ojpegdata[t2p->pdf_ojpegdatalength++] |=
3314
( (i>(table_count-1U)) ? (table_count-1U) : i) & 0x0f;
3316
ojpegdata[t2p->pdf_ojpegdatalength++] = (i << 4) & 0xf0;
3319
if(proc==JPEGPROC_BASELINE){
3320
t2p->pdf_ojpegdatalength++;
3321
ojpegdata[t2p->pdf_ojpegdatalength++]=0x3f;
3322
t2p->pdf_ojpegdatalength++;
3324
ojpegdata[t2p->pdf_ojpegdatalength++]= (lp[0] & 0xff);
3325
t2p->pdf_ojpegdatalength++;
3326
ojpegdata[t2p->pdf_ojpegdatalength++]= (pt[0] & 0x0f);
3334
int t2p_process_jpeg_strip(
3335
unsigned char* strip,
3336
tsize_t* striplength,
3337
unsigned char* buffer,
3338
tsize_t* bufferoffset,
3350
while(i<(*striplength)){
3353
/* SOI - start of image */
3354
_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), 2);
3364
_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
3365
for(j=0;j<buffer[*bufferoffset+9];j++){
3366
if( (buffer[*bufferoffset+11+(2*j)]>>4) > h_samp)
3367
h_samp = (buffer[*bufferoffset+11+(2*j)]>>4);
3368
if( (buffer[*bufferoffset+11+(2*j)] & 0x0f) > v_samp)
3369
v_samp = (buffer[*bufferoffset+11+(2*j)] & 0x0f);
3373
ri=((( ((uint16)(buffer[*bufferoffset+5])<<8) |
3374
(uint16)(buffer[*bufferoffset+6]) )+v_samp-1)/
3376
ri*=((( ((uint16)(buffer[*bufferoffset+7])<<8) |
3377
(uint16)(buffer[*bufferoffset+8]) )+h_samp-1)/
3379
buffer[*bufferoffset+5]=
3380
(unsigned char) ((height>>8) & 0xff);
3381
buffer[*bufferoffset+6]=
3382
(unsigned char) (height & 0xff);
3383
*bufferoffset+=strip[i+2]+2;
3386
buffer[(*bufferoffset)++]=0xff;
3387
buffer[(*bufferoffset)++]=0xdd;
3388
buffer[(*bufferoffset)++]=0x00;
3389
buffer[(*bufferoffset)++]=0x04;
3390
buffer[(*bufferoffset)++]=(ri >> 8) & 0xff;
3391
buffer[(*bufferoffset)++]= ri & 0xff;
3398
_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
3399
*bufferoffset+=strip[i+2]+2;
3404
_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), strip[i+2]+2);
3405
*bufferoffset+=strip[i+2]+2;
3408
buffer[(*bufferoffset)++]=0xff;
3409
buffer[(*bufferoffset)++]=
3410
(unsigned char)(0xd0 | ((no-1)%8));
3413
_TIFFmemcpy(&(buffer[*bufferoffset]), &(strip[i-1]), (*striplength)-i-1);
3414
*bufferoffset+=(*striplength)-i-1;
3427
This functions converts a tilewidth x tilelength buffer of samples into an edgetilewidth x
3428
tilelength buffer of samples.
3430
void t2p_tile_collapse_left(
3434
uint32 edgetilewidth,
3438
tsize_t edgescanwidth=0;
3440
edgescanwidth = (scanwidth * edgetilewidth + (tilewidth - 1))/ tilewidth;
3441
for(i=0;i<tilelength;i++){
3443
&(((char*)buffer)[edgescanwidth*i]),
3444
&(((char*)buffer)[scanwidth*i]),
3453
* This function calls TIFFWriteDirectory on the output after blanking its
3454
* output by replacing the read, write, and seek procedures with empty
3455
* implementations, then it replaces the original implementations.
3459
t2p_write_advance_directory(T2P* t2p, TIFF* output)
3461
t2p_disable(output);
3462
if(!TIFFWriteDirectory(output)){
3463
TIFFError(TIFF2PDF_MODULE,
3464
"Error writing virtual directory to output PDF %s",
3465
TIFFFileName(output));
3466
t2p->t2p_error = T2P_ERR_ERROR;
3473
tsize_t t2p_sample_planar_separate_to_contig(
3475
unsigned char* buffer,
3476
unsigned char* samplebuffer,
3477
tsize_t samplebuffersize){
3483
stride=samplebuffersize/t2p->tiff_samplesperpixel;
3484
for(i=0;i<stride;i++){
3485
for(j=0;j<t2p->tiff_samplesperpixel;j++){
3486
buffer[i*t2p->tiff_samplesperpixel + j] = samplebuffer[i + j*stride];
3490
return(samplebuffersize);
3493
tsize_t t2p_sample_realize_palette(T2P* t2p, unsigned char* buffer){
3495
uint32 sample_count=0;
3496
uint16 component_count=0;
3497
uint32 palette_offset=0;
3498
uint32 sample_offset=0;
3501
sample_count=t2p->tiff_width*t2p->tiff_length;
3502
component_count=t2p->tiff_samplesperpixel;
3504
for(i=sample_count;i>0;i--){
3505
palette_offset=buffer[i-1] * component_count;
3506
sample_offset= (i-1) * component_count;
3507
for(j=0;j<component_count;j++){
3508
buffer[sample_offset+j]=t2p->pdf_palette[palette_offset+j];
3516
This functions converts in place a buffer of ABGR interleaved data
3517
into RGB interleaved data, discarding A.
3520
tsize_t t2p_sample_abgr_to_rgb(tdata_t data, uint32 samplecount)
3525
for(i=0;i<samplecount;i++){
3526
sample=((uint32*)data)[i];
3527
((char*)data)[i*3]= (char) (sample & 0xff);
3528
((char*)data)[i*3+1]= (char) ((sample>>8) & 0xff);
3529
((char*)data)[i*3+2]= (char) ((sample>>16) & 0xff);
3536
* This functions converts in place a buffer of RGBA interleaved data
3537
* into RGB interleaved data, discarding A.
3541
t2p_sample_rgbaa_to_rgb(tdata_t data, uint32 samplecount)
3545
for(i = 0; i < samplecount; i++)
3546
memcpy((uint8*)data + i * 3, (uint8*)data + i * 4, 3);
3552
* This functions converts in place a buffer of RGBA interleaved data
3553
* into RGB interleaved data, adding 255-A to each component sample.
3557
t2p_sample_rgba_to_rgb(tdata_t data, uint32 samplecount)
3563
for (i = 0; i < samplecount; i++) {
3564
sample=((uint32*)data)[i];
3565
alpha=(uint8)((255 - ((sample >> 24) & 0xff)));
3566
((uint8 *)data)[i * 3] = (uint8) ((sample >> 16) & 0xff) + alpha;
3567
((uint8 *)data)[i * 3 + 1] = (uint8) ((sample >> 8) & 0xff) + alpha;
3568
((uint8 *)data)[i * 3 + 2] = (uint8) (sample & 0xff) + alpha;
3575
This function converts the a and b samples of Lab data from signed
3579
tsize_t t2p_sample_lab_signed_to_unsigned(tdata_t buffer, uint32 samplecount){
3583
for(i=0;i<samplecount;i++){
3584
if( (((unsigned char*)buffer)[(i*3)+1] & 0x80) !=0){
3585
((unsigned char*)buffer)[(i*3)+1] =
3586
(unsigned char)(0x80 + ((char*)buffer)[(i*3)+1]);
3588
((unsigned char*)buffer)[(i*3)+1] |= 0x80;
3590
if( (((unsigned char*)buffer)[(i*3)+2] & 0x80) !=0){
3591
((unsigned char*)buffer)[(i*3)+2] =
3592
(unsigned char)(0x80 + ((char*)buffer)[(i*3)+2]);
3594
((unsigned char*)buffer)[(i*3)+2] |= 0x80;
3598
return(samplecount*3);
3602
This function writes the PDF header to output.
3605
tsize_t t2p_write_pdf_header(T2P* t2p, TIFF* output){
3611
buflen=sprintf(buffer, "%%PDF-%u.%u ", t2p->pdf_majorversion&0xff, t2p->pdf_minorversion&0xff);
3612
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
3613
written += t2pWriteFile(output, (tdata_t)"\n%\342\343\317\323\n", 7);
3619
This function writes the beginning of a PDF object to output.
3622
tsize_t t2p_write_pdf_obj_start(uint32 number, TIFF* output){
3628
buflen=sprintf(buffer, "%lu", (unsigned long)number);
3629
written += t2pWriteFile(output, (tdata_t) buffer, buflen );
3630
written += t2pWriteFile(output, (tdata_t) " 0 obj\n", 7);
3636
This function writes the end of a PDF object to output.
3639
tsize_t t2p_write_pdf_obj_end(TIFF* output){
3643
written += t2pWriteFile(output, (tdata_t) "endobj\n", 7);
3649
This function writes a PDF name object to output.
3652
tsize_t t2p_write_pdf_name(unsigned char* name, TIFF* output){
3660
namelen = strlen((char *)name);
3664
written += t2pWriteFile(output, (tdata_t) "/", 1);
3665
for (i=0;i<namelen;i++){
3666
if ( ((unsigned char)name[i]) < 0x21){
3667
sprintf(buffer, "#%.2X", name[i]);
3668
buffer[sizeof(buffer) - 1] = '\0';
3669
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3672
if ( ((unsigned char)name[i]) > 0x7E){
3673
sprintf(buffer, "#%.2X", name[i]);
3674
buffer[sizeof(buffer) - 1] = '\0';
3675
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3681
sprintf(buffer, "#%.2X", name[i]);
3682
buffer[sizeof(buffer) - 1] = '\0';
3683
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3686
sprintf(buffer, "#%.2X", name[i]);
3687
buffer[sizeof(buffer) - 1] = '\0';
3688
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3691
sprintf(buffer, "#%.2X", name[i]);
3692
buffer[sizeof(buffer) - 1] = '\0';
3693
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3696
sprintf(buffer, "#%.2X", name[i]);
3697
buffer[sizeof(buffer) - 1] = '\0';
3698
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3701
sprintf(buffer, "#%.2X", name[i]);
3702
buffer[sizeof(buffer) - 1] = '\0';
3703
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3706
sprintf(buffer, "#%.2X", name[i]);
3707
buffer[sizeof(buffer) - 1] = '\0';
3708
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3711
sprintf(buffer, "#%.2X", name[i]);
3712
buffer[sizeof(buffer) - 1] = '\0';
3713
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3716
sprintf(buffer, "#%.2X", name[i]);
3717
buffer[sizeof(buffer) - 1] = '\0';
3718
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3721
sprintf(buffer, "#%.2X", name[i]);
3722
buffer[sizeof(buffer) - 1] = '\0';
3723
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3726
sprintf(buffer, "#%.2X", name[i]);
3727
buffer[sizeof(buffer) - 1] = '\0';
3728
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3731
sprintf(buffer, "#%.2X", name[i]);
3732
buffer[sizeof(buffer) - 1] = '\0';
3733
written += t2pWriteFile(output, (tdata_t) buffer, 3);
3736
written += t2pWriteFile(output, (tdata_t) &name[i], 1);
3741
written += t2pWriteFile(output, (tdata_t) " ", 1);
3747
* This function writes a PDF string object to output.
3750
tsize_t t2p_write_pdf_string(char* pdfstr, TIFF* output)
3752
tsize_t written = 0;
3757
len = strlen(pdfstr);
3758
written += t2pWriteFile(output, (tdata_t) "(", 1);
3759
for (i=0; i<len; i++) {
3760
if((pdfstr[i]&0x80) || (pdfstr[i]==127) || (pdfstr[i]<32)){
3761
snprintf(buffer, sizeof(buffer), "\\%.3o", ((unsigned char)pdfstr[i]));
3762
written += t2pWriteFile(output, (tdata_t)buffer, 4);
3766
written += t2pWriteFile(output, (tdata_t) "\\b", 2);
3769
written += t2pWriteFile(output, (tdata_t) "\\t", 2);
3772
written += t2pWriteFile(output, (tdata_t) "\\n", 2);
3775
written += t2pWriteFile(output, (tdata_t) "\\f", 2);
3778
written += t2pWriteFile(output, (tdata_t) "\\r", 2);
3781
written += t2pWriteFile(output, (tdata_t) "\\(", 2);
3784
written += t2pWriteFile(output, (tdata_t) "\\)", 2);
3787
written += t2pWriteFile(output, (tdata_t) "\\\\", 2);
3790
written += t2pWriteFile(output, (tdata_t) &pdfstr[i], 1);
3794
written += t2pWriteFile(output, (tdata_t) ") ", 1);
3801
This function writes a buffer of data to output.
3804
tsize_t t2p_write_pdf_stream(tdata_t buffer, tsize_t len, TIFF* output){
3808
written += t2pWriteFile(output, (tdata_t) buffer, len);
3814
This functions writes the beginning of a PDF stream to output.
3817
tsize_t t2p_write_pdf_stream_start(TIFF* output){
3821
written += t2pWriteFile(output, (tdata_t) "stream\n", 7);
3827
This function writes the end of a PDF stream to output.
3830
tsize_t t2p_write_pdf_stream_end(TIFF* output){
3834
written += t2pWriteFile(output, (tdata_t) "\nendstream\n", 11);
3840
This function writes a stream dictionary for a PDF stream to output.
3843
tsize_t t2p_write_pdf_stream_dict(tsize_t len, uint32 number, TIFF* output){
3849
written += t2pWriteFile(output, (tdata_t) "/Length ", 8);
3851
written += t2p_write_pdf_stream_length(len, output);
3853
buflen=sprintf(buffer, "%lu", (unsigned long)number);
3854
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
3855
written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
3862
This functions writes the beginning of a PDF stream dictionary to output.
3865
tsize_t t2p_write_pdf_stream_dict_start(TIFF* output){
3869
written += t2pWriteFile(output, (tdata_t) "<< \n", 4);
3875
This function writes the end of a PDF stream dictionary to output.
3878
tsize_t t2p_write_pdf_stream_dict_end(TIFF* output){
3882
written += t2pWriteFile(output, (tdata_t) " >>\n", 4);
3888
This function writes a number to output.
3891
tsize_t t2p_write_pdf_stream_length(tsize_t len, TIFF* output){
3897
buflen=sprintf(buffer, "%lu", (unsigned long)len);
3898
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
3899
written += t2pWriteFile(output, (tdata_t) "\n", 1);
3905
* This function writes the PDF Catalog structure to output.
3908
tsize_t t2p_write_pdf_catalog(T2P* t2p, TIFF* output)
3910
tsize_t written = 0;
3914
written += t2pWriteFile(output,
3915
(tdata_t)"<< \n/Type /Catalog \n/Pages ",
3917
buflen = snprintf(buffer, sizeof(buffer), "%lu", (unsigned long)t2p->pdf_pages);
3918
written += t2pWriteFile(output, (tdata_t) buffer,
3919
TIFFmin((size_t)buflen, sizeof(buffer) - 1));
3920
written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
3921
if(t2p->pdf_fitwindow){
3922
written += t2pWriteFile(output,
3923
(tdata_t) "/ViewerPreferences <</FitWindow true>>\n",
3926
written += t2pWriteFile(output, (tdata_t)">>\n", 3);
3932
This function writes the PDF Info structure to output.
3935
tsize_t t2p_write_pdf_info(T2P* t2p, TIFF* input, TIFF* output)
3937
tsize_t written = 0;
3941
if(t2p->pdf_datetime[0] == '\0')
3942
t2p_pdf_tifftime(t2p, input);
3943
if (strlen(t2p->pdf_datetime) > 0) {
3944
written += t2pWriteFile(output, (tdata_t) "<< \n/CreationDate ", 18);
3945
written += t2p_write_pdf_string(t2p->pdf_datetime, output);
3946
written += t2pWriteFile(output, (tdata_t) "\n/ModDate ", 10);
3947
written += t2p_write_pdf_string(t2p->pdf_datetime, output);
3949
written += t2pWriteFile(output, (tdata_t) "\n/Producer ", 11);
3950
_TIFFmemset((tdata_t)buffer, 0x00, sizeof(buffer));
3951
snprintf(buffer, sizeof(buffer), "libtiff / tiff2pdf - %d", TIFFLIB_VERSION);
3952
written += t2p_write_pdf_string(buffer, output);
3953
written += t2pWriteFile(output, (tdata_t) "\n", 1);
3954
if (t2p->pdf_creator[0] != '\0') {
3955
written += t2pWriteFile(output, (tdata_t) "/Creator ", 9);
3956
written += t2p_write_pdf_string(t2p->pdf_creator, output);
3957
written += t2pWriteFile(output, (tdata_t) "\n", 1);
3959
if (TIFFGetField(input, TIFFTAG_SOFTWARE, &info) != 0 && info) {
3960
if(strlen(info) >= sizeof(t2p->pdf_creator))
3961
info[sizeof(t2p->pdf_creator) - 1] = '\0';
3962
written += t2pWriteFile(output, (tdata_t) "/Creator ", 9);
3963
written += t2p_write_pdf_string(info, output);
3964
written += t2pWriteFile(output, (tdata_t) "\n", 1);
3967
if (t2p->pdf_author[0] != '\0') {
3968
written += t2pWriteFile(output, (tdata_t) "/Author ", 8);
3969
written += t2p_write_pdf_string(t2p->pdf_author, output);
3970
written += t2pWriteFile(output, (tdata_t) "\n", 1);
3972
if ((TIFFGetField(input, TIFFTAG_ARTIST, &info) != 0
3973
|| TIFFGetField(input, TIFFTAG_COPYRIGHT, &info) != 0)
3975
if (strlen(info) >= sizeof(t2p->pdf_author))
3976
info[sizeof(t2p->pdf_author) - 1] = '\0';
3977
written += t2pWriteFile(output, (tdata_t) "/Author ", 8);
3978
written += t2p_write_pdf_string(info, output);
3979
written += t2pWriteFile(output, (tdata_t) "\n", 1);
3982
if (t2p->pdf_title[0] != '\0') {
3983
written += t2pWriteFile(output, (tdata_t) "/Title ", 7);
3984
written += t2p_write_pdf_string(t2p->pdf_title, output);
3985
written += t2pWriteFile(output, (tdata_t) "\n", 1);
3987
if (TIFFGetField(input, TIFFTAG_DOCUMENTNAME, &info) != 0){
3988
if(strlen(info) > 511) {
3991
written += t2pWriteFile(output, (tdata_t) "/Title ", 7);
3992
written += t2p_write_pdf_string(info, output);
3993
written += t2pWriteFile(output, (tdata_t) "\n", 1);
3996
if (t2p->pdf_subject[0] != '\0') {
3997
written += t2pWriteFile(output, (tdata_t) "/Subject ", 9);
3998
written += t2p_write_pdf_string(t2p->pdf_subject, output);
3999
written += t2pWriteFile(output, (tdata_t) "\n", 1);
4001
if (TIFFGetField(input, TIFFTAG_IMAGEDESCRIPTION, &info) != 0 && info) {
4002
if (strlen(info) >= sizeof(t2p->pdf_subject))
4003
info[sizeof(t2p->pdf_subject) - 1] = '\0';
4004
written += t2pWriteFile(output, (tdata_t) "/Subject ", 9);
4005
written += t2p_write_pdf_string(info, output);
4006
written += t2pWriteFile(output, (tdata_t) "\n", 1);
4009
if (t2p->pdf_keywords[0] != '\0') {
4010
written += t2pWriteFile(output, (tdata_t) "/Keywords ", 10);
4011
written += t2p_write_pdf_string(t2p->pdf_keywords, output);
4012
written += t2pWriteFile(output, (tdata_t) "\n", 1);
4014
written += t2pWriteFile(output, (tdata_t) ">> \n", 4);
4020
* This function fills a string of a T2P struct with the current time as a PDF
4021
* date string, it is called by t2p_pdf_tifftime.
4024
void t2p_pdf_currenttime(T2P* t2p)
4026
struct tm* currenttime;
4029
if (time(&timenow) == (time_t) -1) {
4030
TIFFError(TIFF2PDF_MODULE,
4031
"Can't get the current time: %s", strerror(errno));
4032
timenow = (time_t) 0;
4035
currenttime = localtime(&timenow);
4036
snprintf(t2p->pdf_datetime, sizeof(t2p->pdf_datetime),
4037
"D:%.4d%.2d%.2d%.2d%.2d%.2d",
4038
(currenttime->tm_year + 1900) % 65536,
4039
(currenttime->tm_mon + 1) % 256,
4040
(currenttime->tm_mday) % 256,
4041
(currenttime->tm_hour) % 256,
4042
(currenttime->tm_min) % 256,
4043
(currenttime->tm_sec) % 256);
4049
* This function fills a string of a T2P struct with the date and time of a
4050
* TIFF file if it exists or the current time as a PDF date string.
4053
void t2p_pdf_tifftime(T2P* t2p, TIFF* input)
4057
if (TIFFGetField(input, TIFFTAG_DATETIME, &datetime) != 0
4058
&& (strlen(datetime) >= 19) ){
4059
t2p->pdf_datetime[0]='D';
4060
t2p->pdf_datetime[1]=':';
4061
t2p->pdf_datetime[2]=datetime[0];
4062
t2p->pdf_datetime[3]=datetime[1];
4063
t2p->pdf_datetime[4]=datetime[2];
4064
t2p->pdf_datetime[5]=datetime[3];
4065
t2p->pdf_datetime[6]=datetime[5];
4066
t2p->pdf_datetime[7]=datetime[6];
4067
t2p->pdf_datetime[8]=datetime[8];
4068
t2p->pdf_datetime[9]=datetime[9];
4069
t2p->pdf_datetime[10]=datetime[11];
4070
t2p->pdf_datetime[11]=datetime[12];
4071
t2p->pdf_datetime[12]=datetime[14];
4072
t2p->pdf_datetime[13]=datetime[15];
4073
t2p->pdf_datetime[14]=datetime[17];
4074
t2p->pdf_datetime[15]=datetime[18];
4075
t2p->pdf_datetime[16] = '\0';
4077
t2p_pdf_currenttime(t2p);
4084
* This function writes a PDF Pages Tree structure to output.
4087
tsize_t t2p_write_pdf_pages(T2P* t2p, TIFF* output)
4095
written += t2pWriteFile(output,
4096
(tdata_t) "<< \n/Type /Pages \n/Kids [ ", 26);
4097
page = t2p->pdf_pages+1;
4098
for (i=0;i<t2p->tiff_pagecount;i++){
4099
buflen=sprintf(buffer, "%d", page);
4100
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4101
written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
4102
if ( ((i+1)%8)==0 ) {
4103
written += t2pWriteFile(output, (tdata_t) "\n", 1);
4106
page += t2p->tiff_pages[i].page_extra;
4107
if(t2p->tiff_pages[i].page_tilecount>0){
4108
page += (2 * t2p->tiff_pages[i].page_tilecount);
4113
written += t2pWriteFile(output, (tdata_t) "] \n/Count ", 10);
4114
_TIFFmemset(buffer, 0x00, 16);
4115
buflen=sprintf(buffer, "%d", t2p->tiff_pagecount);
4116
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4117
written += t2pWriteFile(output, (tdata_t) " \n>> \n", 6);
4123
This function writes a PDF Page structure to output.
4126
tsize_t t2p_write_pdf_page(uint32 object, T2P* t2p, TIFF* output){
4133
written += t2pWriteFile(output, (tdata_t) "<<\n/Type /Page \n/Parent ", 24);
4134
buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_pages);
4135
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4136
written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
4137
written += t2pWriteFile(output, (tdata_t) "/MediaBox [", 11);
4138
buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.x1);
4139
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4140
written += t2pWriteFile(output, (tdata_t) " ", 1);
4141
buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.y1);
4142
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4143
written += t2pWriteFile(output, (tdata_t) " ", 1);
4144
buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.x2);
4145
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4146
written += t2pWriteFile(output, (tdata_t) " ", 1);
4147
buflen=sprintf(buffer, "%.4f",t2p->pdf_mediabox.y2);
4148
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4149
written += t2pWriteFile(output, (tdata_t) "] \n", 3);
4150
written += t2pWriteFile(output, (tdata_t) "/Contents ", 10);
4151
buflen=sprintf(buffer, "%lu", (unsigned long)(object + 1));
4152
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4153
written += t2pWriteFile(output, (tdata_t) " 0 R \n", 6);
4154
written += t2pWriteFile(output, (tdata_t) "/Resources << \n", 15);
4155
if( t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount != 0 ){
4156
written += t2pWriteFile(output, (tdata_t) "/XObject <<\n", 12);
4157
for(i=0;i<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount;i++){
4158
written += t2pWriteFile(output, (tdata_t) "/Im", 3);
4159
buflen = sprintf(buffer, "%u", t2p->pdf_page+1);
4160
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4161
written += t2pWriteFile(output, (tdata_t) "_", 1);
4162
buflen = sprintf(buffer, "%u", i+1);
4163
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4164
written += t2pWriteFile(output, (tdata_t) " ", 1);
4168
(unsigned long)(object+3+(2*i)+t2p->tiff_pages[t2p->pdf_page].page_extra));
4169
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4170
written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
4172
written += t2pWriteFile(output, (tdata_t) "\n", 1);
4175
written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
4177
written += t2pWriteFile(output, (tdata_t) "/XObject <<\n", 12);
4178
written += t2pWriteFile(output, (tdata_t) "/Im", 3);
4179
buflen = sprintf(buffer, "%u", t2p->pdf_page+1);
4180
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4181
written += t2pWriteFile(output, (tdata_t) " ", 1);
4185
(unsigned long)(object+3+(2*i)+t2p->tiff_pages[t2p->pdf_page].page_extra));
4186
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4187
written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
4188
written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
4190
if(t2p->tiff_transferfunctioncount != 0) {
4191
written += t2pWriteFile(output, (tdata_t) "/ExtGState <<", 13);
4192
t2pWriteFile(output, (tdata_t) "/GS1 ", 5);
4196
(unsigned long)(object + 3));
4197
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4198
written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
4199
written += t2pWriteFile(output, (tdata_t) ">> \n", 4);
4201
written += t2pWriteFile(output, (tdata_t) "/ProcSet [ ", 11);
4202
if(t2p->pdf_colorspace == T2P_CS_BILEVEL
4203
|| t2p->pdf_colorspace == T2P_CS_GRAY
4205
written += t2pWriteFile(output, (tdata_t) "/ImageB ", 8);
4207
written += t2pWriteFile(output, (tdata_t) "/ImageC ", 8);
4208
if(t2p->pdf_colorspace & T2P_CS_PALETTE){
4209
written += t2pWriteFile(output, (tdata_t) "/ImageI ", 8);
4212
written += t2pWriteFile(output, (tdata_t) "]\n>>\n>>\n", 8);
4218
This function composes the page size and image and tile locations on a page.
4221
void t2p_compose_pdf_page(T2P* t2p){
4225
T2P_TILE* tiles=NULL;
4227
uint32 tilecountx=0;
4228
uint32 tilecounty=0;
4230
uint32 tilelength=0;
4233
float width_ratio=0;
4234
float length_ratio=0;
4236
t2p->pdf_xres = t2p->tiff_xres;
4237
t2p->pdf_yres = t2p->tiff_yres;
4238
if(t2p->pdf_overrideres) {
4239
t2p->pdf_xres = t2p->pdf_defaultxres;
4240
t2p->pdf_yres = t2p->pdf_defaultyres;
4242
if(t2p->pdf_xres == 0.0)
4243
t2p->pdf_xres = t2p->pdf_defaultxres;
4244
if(t2p->pdf_yres == 0.0)
4245
t2p->pdf_yres = t2p->pdf_defaultyres;
4246
if (t2p->pdf_image_fillpage) {
4247
width_ratio = t2p->pdf_defaultpagewidth/t2p->tiff_width;
4248
length_ratio = t2p->pdf_defaultpagelength/t2p->tiff_length;
4249
if (width_ratio < length_ratio ) {
4250
t2p->pdf_imagewidth = t2p->pdf_defaultpagewidth;
4251
t2p->pdf_imagelength = t2p->tiff_length * width_ratio;
4253
t2p->pdf_imagewidth = t2p->tiff_width * length_ratio;
4254
t2p->pdf_imagelength = t2p->pdf_defaultpagelength;
4256
} else if (t2p->tiff_resunit != RESUNIT_CENTIMETER /* RESUNIT_NONE and */
4257
&& t2p->tiff_resunit != RESUNIT_INCH) { /* other cases */
4258
t2p->pdf_imagewidth = ((float)(t2p->tiff_width))/t2p->pdf_xres;
4259
t2p->pdf_imagelength = ((float)(t2p->tiff_length))/t2p->pdf_yres;
4261
t2p->pdf_imagewidth =
4262
((float)(t2p->tiff_width))*PS_UNIT_SIZE/t2p->pdf_xres;
4263
t2p->pdf_imagelength =
4264
((float)(t2p->tiff_length))*PS_UNIT_SIZE/t2p->pdf_yres;
4266
if(t2p->pdf_overridepagesize != 0) {
4267
t2p->pdf_pagewidth = t2p->pdf_defaultpagewidth;
4268
t2p->pdf_pagelength = t2p->pdf_defaultpagelength;
4270
t2p->pdf_pagewidth = t2p->pdf_imagewidth;
4271
t2p->pdf_pagelength = t2p->pdf_imagelength;
4273
t2p->pdf_mediabox.x1=0.0;
4274
t2p->pdf_mediabox.y1=0.0;
4275
t2p->pdf_mediabox.x2=t2p->pdf_pagewidth;
4276
t2p->pdf_mediabox.y2=t2p->pdf_pagelength;
4277
t2p->pdf_imagebox.x1=0.0;
4278
t2p->pdf_imagebox.y1=0.0;
4279
t2p->pdf_imagebox.x2=t2p->pdf_imagewidth;
4280
t2p->pdf_imagebox.y2=t2p->pdf_imagelength;
4281
if(t2p->pdf_overridepagesize!=0){
4282
t2p->pdf_imagebox.x1+=((t2p->pdf_pagewidth-t2p->pdf_imagewidth)/2.0F);
4283
t2p->pdf_imagebox.y1+=((t2p->pdf_pagelength-t2p->pdf_imagelength)/2.0F);
4284
t2p->pdf_imagebox.x2+=((t2p->pdf_pagewidth-t2p->pdf_imagewidth)/2.0F);
4285
t2p->pdf_imagebox.y2+=((t2p->pdf_pagelength-t2p->pdf_imagelength)/2.0F);
4287
if(t2p->tiff_orientation > 4){
4288
f=t2p->pdf_mediabox.x2;
4289
t2p->pdf_mediabox.x2=t2p->pdf_mediabox.y2;
4290
t2p->pdf_mediabox.y2=f;
4292
istiled=((t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount==0) ? 0 : 1;
4294
t2p_compose_pdf_page_orient(&(t2p->pdf_imagebox), t2p->tiff_orientation);
4297
tilewidth=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilewidth;
4298
tilelength=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilelength;
4299
tilecountx=(t2p->tiff_width +
4302
(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecountx=tilecountx;
4303
tilecounty=(t2p->tiff_length +
4306
(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecounty=tilecounty;
4307
(t2p->tiff_tiles[t2p->pdf_page]).tiles_edgetilewidth=
4308
t2p->tiff_width % tilewidth;
4309
(t2p->tiff_tiles[t2p->pdf_page]).tiles_edgetilelength=
4310
t2p->tiff_length % tilelength;
4311
tiles=(t2p->tiff_tiles[t2p->pdf_page]).tiles_tiles;
4312
for(i2=0;i2<tilecounty-1;i2++){
4313
for(i=0;i<tilecountx-1;i++){
4314
boxp=&(tiles[i2*tilecountx+i].tile_box);
4316
t2p->pdf_imagebox.x1
4317
+ ((float)(t2p->pdf_imagewidth * i * tilewidth)
4318
/ (float)t2p->tiff_width);
4320
t2p->pdf_imagebox.x1
4321
+ ((float)(t2p->pdf_imagewidth * (i+1) * tilewidth)
4322
/ (float)t2p->tiff_width);
4324
t2p->pdf_imagebox.y2
4325
- ((float)(t2p->pdf_imagelength * (i2+1) * tilelength)
4326
/ (float)t2p->tiff_length);
4328
t2p->pdf_imagebox.y2
4329
- ((float)(t2p->pdf_imagelength * i2 * tilelength)
4330
/ (float)t2p->tiff_length);
4332
boxp=&(tiles[i2*tilecountx+i].tile_box);
4334
t2p->pdf_imagebox.x1
4335
+ ((float)(t2p->pdf_imagewidth * i * tilewidth)
4336
/ (float)t2p->tiff_width);
4337
boxp->x2 = t2p->pdf_imagebox.x2;
4339
t2p->pdf_imagebox.y2
4340
- ((float)(t2p->pdf_imagelength * (i2+1) * tilelength)
4341
/ (float)t2p->tiff_length);
4343
t2p->pdf_imagebox.y2
4344
- ((float)(t2p->pdf_imagelength * i2 * tilelength)
4345
/ (float)t2p->tiff_length);
4347
for(i=0;i<tilecountx-1;i++){
4348
boxp=&(tiles[i2*tilecountx+i].tile_box);
4350
t2p->pdf_imagebox.x1
4351
+ ((float)(t2p->pdf_imagewidth * i * tilewidth)
4352
/ (float)t2p->tiff_width);
4354
t2p->pdf_imagebox.x1
4355
+ ((float)(t2p->pdf_imagewidth * (i+1) * tilewidth)
4356
/ (float)t2p->tiff_width);
4357
boxp->y1 = t2p->pdf_imagebox.y1;
4359
t2p->pdf_imagebox.y2
4360
- ((float)(t2p->pdf_imagelength * i2 * tilelength)
4361
/ (float)t2p->tiff_length);
4363
boxp=&(tiles[i2*tilecountx+i].tile_box);
4365
t2p->pdf_imagebox.x1
4366
+ ((float)(t2p->pdf_imagewidth * i * tilewidth)
4367
/ (float)t2p->tiff_width);
4368
boxp->x2 = t2p->pdf_imagebox.x2;
4369
boxp->y1 = t2p->pdf_imagebox.y1;
4371
t2p->pdf_imagebox.y2
4372
- ((float)(t2p->pdf_imagelength * i2 * tilelength)
4373
/ (float)t2p->tiff_length);
4375
if(t2p->tiff_orientation==0 || t2p->tiff_orientation==1){
4376
for(i=0;i<(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount;i++){
4377
t2p_compose_pdf_page_orient( &(tiles[i].tile_box) , 0);
4381
for(i=0;i<(t2p->tiff_tiles[t2p->pdf_page]).tiles_tilecount;i++){
4382
boxp=&(tiles[i].tile_box);
4383
boxp->x1 -= t2p->pdf_imagebox.x1;
4384
boxp->x2 -= t2p->pdf_imagebox.x1;
4385
boxp->y1 -= t2p->pdf_imagebox.y1;
4386
boxp->y2 -= t2p->pdf_imagebox.y1;
4387
if(t2p->tiff_orientation==2 || t2p->tiff_orientation==3){
4388
boxp->x1 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x1;
4389
boxp->x2 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x2;
4391
if(t2p->tiff_orientation==3 || t2p->tiff_orientation==4){
4392
boxp->y1 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y1;
4393
boxp->y2 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y2;
4395
if(t2p->tiff_orientation==8 || t2p->tiff_orientation==5){
4396
boxp->y1 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y1;
4397
boxp->y2 = t2p->pdf_imagebox.y2 - t2p->pdf_imagebox.y1 - boxp->y2;
4399
if(t2p->tiff_orientation==5 || t2p->tiff_orientation==6){
4400
boxp->x1 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x1;
4401
boxp->x2 = t2p->pdf_imagebox.x2 - t2p->pdf_imagebox.x1 - boxp->x2;
4403
if(t2p->tiff_orientation > 4){
4405
boxp->x1 = boxp->y1;
4408
boxp->x2 = boxp->y2;
4410
t2p_compose_pdf_page_orient_flip(boxp, t2p->tiff_orientation);
4412
t2p_compose_pdf_page_orient(boxp, t2p->tiff_orientation);
4420
void t2p_compose_pdf_page_orient(T2P_BOX* boxp, uint16 orientation){
4425
if( boxp->x1 > boxp->x2){
4430
if( boxp->y1 > boxp->y2){
4435
boxp->mat[0]=m1[0]=boxp->x2-boxp->x1;
4436
boxp->mat[1]=m1[1]=0.0;
4437
boxp->mat[2]=m1[2]=0.0;
4438
boxp->mat[3]=m1[3]=0.0;
4439
boxp->mat[4]=m1[4]=boxp->y2-boxp->y1;
4440
boxp->mat[5]=m1[5]=0.0;
4441
boxp->mat[6]=m1[6]=boxp->x1;
4442
boxp->mat[7]=m1[7]=boxp->y1;
4443
boxp->mat[8]=m1[8]=1.0;
4444
switch(orientation){
4449
boxp->mat[0]=0.0F-m1[0];
4450
boxp->mat[6]+=m1[0];
4453
boxp->mat[0]=0.0F-m1[0];
4454
boxp->mat[4]=0.0F-m1[4];
4455
boxp->mat[6]+=m1[0];
4456
boxp->mat[7]+=m1[4];
4459
boxp->mat[4]=0.0F-m1[4];
4460
boxp->mat[7]+=m1[4];
4464
boxp->mat[1]=0.0F-m1[0];
4465
boxp->mat[3]=0.0F-m1[4];
4467
boxp->mat[6]+=m1[4];
4468
boxp->mat[7]+=m1[0];
4472
boxp->mat[1]=0.0F-m1[0];
4475
boxp->mat[7]+=m1[0];
4486
boxp->mat[3]=0.0F-m1[4];
4488
boxp->mat[6]+=m1[4];
4495
void t2p_compose_pdf_page_orient_flip(T2P_BOX* boxp, uint16 orientation){
4500
if( boxp->x1 > boxp->x2){
4505
if( boxp->y1 > boxp->y2){
4510
boxp->mat[0]=m1[0]=boxp->x2-boxp->x1;
4511
boxp->mat[1]=m1[1]=0.0F;
4512
boxp->mat[2]=m1[2]=0.0F;
4513
boxp->mat[3]=m1[3]=0.0F;
4514
boxp->mat[4]=m1[4]=boxp->y2-boxp->y1;
4515
boxp->mat[5]=m1[5]=0.0F;
4516
boxp->mat[6]=m1[6]=boxp->x1;
4517
boxp->mat[7]=m1[7]=boxp->y1;
4518
boxp->mat[8]=m1[8]=1.0F;
4519
switch(orientation){
4522
boxp->mat[1]=0.0F-m1[4];
4523
boxp->mat[3]=0.0F-m1[0];
4525
boxp->mat[6]+=m1[0];
4526
boxp->mat[7]+=m1[4];
4530
boxp->mat[1]=0.0F-m1[4];
4533
boxp->mat[7]+=m1[4];
4544
boxp->mat[3]=0.0F-m1[0];
4546
boxp->mat[6]+=m1[0];
4554
This function writes a PDF Contents stream to output.
4557
tsize_t t2p_write_pdf_page_content_stream(T2P* t2p, TIFF* output){
4565
if(t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount>0){
4566
for(i=0;i<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount; i++){
4567
box=t2p->tiff_tiles[t2p->pdf_page].tiles_tiles[i].tile_box;
4568
buflen=sprintf(buffer,
4569
"q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d_%ld Do Q\n",
4570
t2p->tiff_transferfunctioncount?"/GS1 gs ":"",
4579
written += t2p_write_pdf_stream(buffer, buflen, output);
4582
box=t2p->pdf_imagebox;
4583
buflen=sprintf(buffer,
4584
"q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n",
4585
t2p->tiff_transferfunctioncount?"/GS1 gs ":"",
4593
written += t2p_write_pdf_stream(buffer, buflen, output);
4600
This function writes a PDF Image XObject stream dictionary to output.
4603
tsize_t t2p_write_pdf_xobject_stream_dict(ttile_t tile,
4611
written += t2p_write_pdf_stream_dict(0, t2p->pdf_xrefcount+1, output);
4612
written += t2pWriteFile(output,
4613
(tdata_t) "/Type /XObject \n/Subtype /Image \n/Name /Im",
4615
buflen=sprintf(buffer, "%u", t2p->pdf_page+1);
4616
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4618
written += t2pWriteFile(output, (tdata_t) "_", 1);
4619
buflen=sprintf(buffer, "%lu", (unsigned long)tile);
4620
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4622
written += t2pWriteFile(output, (tdata_t) "\n/Width ", 8);
4623
_TIFFmemset((tdata_t)buffer, 0x00, 16);
4625
buflen=sprintf(buffer, "%lu", (unsigned long)t2p->tiff_width);
4627
if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)!=0){
4631
(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
4636
(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
4639
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4640
written += t2pWriteFile(output, (tdata_t) "\n/Height ", 9);
4641
_TIFFmemset((tdata_t)buffer, 0x00, 16);
4643
buflen=sprintf(buffer, "%lu", (unsigned long)t2p->tiff_length);
4645
if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)!=0){
4649
(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
4654
(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
4657
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4658
written += t2pWriteFile(output, (tdata_t) "\n/BitsPerComponent ", 19);
4659
_TIFFmemset((tdata_t)buffer, 0x00, 16);
4660
buflen=sprintf(buffer, "%u", t2p->tiff_bitspersample);
4661
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4662
written += t2pWriteFile(output, (tdata_t) "\n/ColorSpace ", 13);
4663
written += t2p_write_pdf_xobject_cs(t2p, output);
4664
if (t2p->pdf_image_interpolate)
4665
written += t2pWriteFile(output,
4666
(tdata_t) "\n/Interpolate true", 18);
4667
if( (t2p->pdf_switchdecode != 0)
4668
#ifdef CCITT_SUPPORT
4669
&& ! (t2p->pdf_colorspace == T2P_CS_BILEVEL
4670
&& t2p->pdf_compression == T2P_COMPRESS_G4)
4673
written += t2p_write_pdf_xobject_decode(t2p, output);
4675
written += t2p_write_pdf_xobject_stream_filter(tile, t2p, output);
4681
* This function writes a PDF Image XObject Colorspace name to output.
4685
tsize_t t2p_write_pdf_xobject_cs(T2P* t2p, TIFF* output){
4695
if( (t2p->pdf_colorspace & T2P_CS_ICCBASED) != 0){
4696
written += t2p_write_pdf_xobject_icccs(t2p, output);
4699
if( (t2p->pdf_colorspace & T2P_CS_PALETTE) != 0){
4700
written += t2pWriteFile(output, (tdata_t) "[ /Indexed ", 11);
4701
t2p->pdf_colorspace ^= T2P_CS_PALETTE;
4702
written += t2p_write_pdf_xobject_cs(t2p, output);
4703
t2p->pdf_colorspace |= T2P_CS_PALETTE;
4704
buflen=sprintf(buffer, "%u", (0x0001 << t2p->tiff_bitspersample)-1 );
4705
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4706
written += t2pWriteFile(output, (tdata_t) " ", 1);
4707
_TIFFmemset(buffer, 0x00, 16);
4708
buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_palettecs );
4709
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4710
written += t2pWriteFile(output, (tdata_t) " 0 R ]\n", 7);
4713
if(t2p->pdf_colorspace & T2P_CS_BILEVEL){
4714
written += t2pWriteFile(output, (tdata_t) "/DeviceGray \n", 13);
4716
if(t2p->pdf_colorspace & T2P_CS_GRAY){
4717
if(t2p->pdf_colorspace & T2P_CS_CALGRAY){
4718
written += t2p_write_pdf_xobject_calcs(t2p, output);
4720
written += t2pWriteFile(output, (tdata_t) "/DeviceGray \n", 13);
4723
if(t2p->pdf_colorspace & T2P_CS_RGB){
4724
if(t2p->pdf_colorspace & T2P_CS_CALRGB){
4725
written += t2p_write_pdf_xobject_calcs(t2p, output);
4727
written += t2pWriteFile(output, (tdata_t) "/DeviceRGB \n", 12);
4730
if(t2p->pdf_colorspace & T2P_CS_CMYK){
4731
written += t2pWriteFile(output, (tdata_t) "/DeviceCMYK \n", 13);
4733
if(t2p->pdf_colorspace & T2P_CS_LAB){
4734
written += t2pWriteFile(output, (tdata_t) "[/Lab << \n", 10);
4735
written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
4736
X_W = t2p->tiff_whitechromaticities[0];
4737
Y_W = t2p->tiff_whitechromaticities[1];
4738
Z_W = 1.0F - (X_W + Y_W);
4742
buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
4743
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4744
written += t2pWriteFile(output, (tdata_t) "/Range ", 7);
4745
buflen=sprintf(buffer, "[%d %d %d %d] \n",
4746
t2p->pdf_labrange[0],
4747
t2p->pdf_labrange[1],
4748
t2p->pdf_labrange[2],
4749
t2p->pdf_labrange[3]);
4750
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4751
written += t2pWriteFile(output, (tdata_t) ">>] \n", 5);
4758
tsize_t t2p_write_pdf_transfer(T2P* t2p, TIFF* output){
4764
written += t2pWriteFile(output, (tdata_t) "<< /Type /ExtGState \n/TR ", 25);
4765
if(t2p->tiff_transferfunctioncount == 1){
4766
buflen=sprintf(buffer, "%lu",
4767
(unsigned long)(t2p->pdf_xrefcount + 1));
4768
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4769
written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
4771
written += t2pWriteFile(output, (tdata_t) "[ ", 2);
4772
buflen=sprintf(buffer, "%lu",
4773
(unsigned long)(t2p->pdf_xrefcount + 1));
4774
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4775
written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
4776
buflen=sprintf(buffer, "%lu",
4777
(unsigned long)(t2p->pdf_xrefcount + 2));
4778
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4779
written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
4780
buflen=sprintf(buffer, "%lu",
4781
(unsigned long)(t2p->pdf_xrefcount + 3));
4782
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4783
written += t2pWriteFile(output, (tdata_t) " 0 R ", 5);
4784
written += t2pWriteFile(output, (tdata_t) "/Identity ] ", 12);
4787
written += t2pWriteFile(output, (tdata_t) " >> \n", 5);
4792
tsize_t t2p_write_pdf_transfer_dict(T2P* t2p, TIFF* output, uint16 i){
4799
written += t2pWriteFile(output, (tdata_t) "/FunctionType 0 \n", 17);
4800
written += t2pWriteFile(output, (tdata_t) "/Domain [0.0 1.0] \n", 19);
4801
written += t2pWriteFile(output, (tdata_t) "/Range [0.0 1.0] \n", 18);
4802
buflen=sprintf(buffer, "/Size [%u] \n", (1<<t2p->tiff_bitspersample));
4803
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4804
written += t2pWriteFile(output, (tdata_t) "/BitsPerSample 16 \n", 19);
4805
written += t2p_write_pdf_stream_dict(((tsize_t)1)<<(t2p->tiff_bitspersample+1), 0, output);
4810
tsize_t t2p_write_pdf_transfer_stream(T2P* t2p, TIFF* output, uint16 i){
4814
written += t2p_write_pdf_stream(
4815
t2p->tiff_transferfunction[i],
4816
(((tsize_t)1)<<(t2p->tiff_bitspersample+1)),
4823
This function writes a PDF Image XObject Colorspace array to output.
4826
tsize_t t2p_write_pdf_xobject_calcs(T2P* t2p, TIFF* output){
4857
written += t2pWriteFile(output, (tdata_t) "[", 1);
4858
if(t2p->pdf_colorspace & T2P_CS_CALGRAY){
4859
written += t2pWriteFile(output, (tdata_t) "/CalGray ", 9);
4860
X_W = t2p->tiff_whitechromaticities[0];
4861
Y_W = t2p->tiff_whitechromaticities[1];
4862
Z_W = 1.0F - (X_W + Y_W);
4867
if(t2p->pdf_colorspace & T2P_CS_CALRGB){
4868
written += t2pWriteFile(output, (tdata_t) "/CalRGB ", 8);
4869
x_w = t2p->tiff_whitechromaticities[0];
4870
y_w = t2p->tiff_whitechromaticities[1];
4871
x_r = t2p->tiff_primarychromaticities[0];
4872
y_r = t2p->tiff_primarychromaticities[1];
4873
x_g = t2p->tiff_primarychromaticities[2];
4874
y_g = t2p->tiff_primarychromaticities[3];
4875
x_b = t2p->tiff_primarychromaticities[4];
4876
y_b = t2p->tiff_primarychromaticities[5];
4877
z_w = y_w * ((x_g - x_b)*y_r - (x_r-x_b)*y_g + (x_r-x_g)*y_b);
4878
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;
4879
X_R = Y_R * x_r / y_r;
4880
Z_R = Y_R * (((1-x_r)/y_r)-1);
4881
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;
4882
X_G = Y_G * x_g / y_g;
4883
Z_G = Y_G * (((1-x_g)/y_g)-1);
4884
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;
4885
X_B = Y_B * x_b / y_b;
4886
Z_B = Y_B * (((1-x_b)/y_b)-1);
4887
X_W = (X_R * R) + (X_G * G) + (X_B * B);
4888
Y_W = (Y_R * R) + (Y_G * G) + (Y_B * B);
4889
Z_W = (Z_R * R) + (Z_G * G) + (Z_B * B);
4894
written += t2pWriteFile(output, (tdata_t) "<< \n", 4);
4895
if(t2p->pdf_colorspace & T2P_CS_CALGRAY){
4896
written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
4897
buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
4898
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4899
written += t2pWriteFile(output, (tdata_t) "/Gamma 2.2 \n", 12);
4901
if(t2p->pdf_colorspace & T2P_CS_CALRGB){
4902
written += t2pWriteFile(output, (tdata_t) "/WhitePoint ", 12);
4903
buflen=sprintf(buffer, "[%.4f %.4f %.4f] \n", X_W, Y_W, Z_W);
4904
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4905
written += t2pWriteFile(output, (tdata_t) "/Matrix ", 8);
4906
buflen=sprintf(buffer, "[%.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f] \n",
4910
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4911
written += t2pWriteFile(output, (tdata_t) "/Gamma [2.2 2.2 2.2] \n", 22);
4913
written += t2pWriteFile(output, (tdata_t) ">>] \n", 5);
4919
This function writes a PDF Image XObject Colorspace array to output.
4922
tsize_t t2p_write_pdf_xobject_icccs(T2P* t2p, TIFF* output){
4928
written += t2pWriteFile(output, (tdata_t) "[/ICCBased ", 11);
4929
buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_icccs);
4930
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4931
written += t2pWriteFile(output, (tdata_t) " 0 R] \n", 7);
4936
tsize_t t2p_write_pdf_xobject_icccs_dict(T2P* t2p, TIFF* output){
4942
written += t2pWriteFile(output, (tdata_t) "/N ", 3);
4943
buflen=sprintf(buffer, "%u \n", t2p->tiff_samplesperpixel);
4944
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
4945
written += t2pWriteFile(output, (tdata_t) "/Alternate ", 11);
4946
t2p->pdf_colorspace ^= T2P_CS_ICCBASED;
4947
written += t2p_write_pdf_xobject_cs(t2p, output);
4948
t2p->pdf_colorspace |= T2P_CS_ICCBASED;
4949
written += t2p_write_pdf_stream_dict(t2p->tiff_iccprofilelength, 0, output);
4954
tsize_t t2p_write_pdf_xobject_icccs_stream(T2P* t2p, TIFF* output){
4958
written += t2p_write_pdf_stream(
4959
(tdata_t) t2p->tiff_iccprofile,
4960
(tsize_t) t2p->tiff_iccprofilelength,
4967
This function writes a palette stream for an indexed color space to output.
4970
tsize_t t2p_write_pdf_xobject_palettecs_stream(T2P* t2p, TIFF* output){
4974
written += t2p_write_pdf_stream(
4975
(tdata_t) t2p->pdf_palette,
4976
(tsize_t) t2p->pdf_palettesize,
4983
This function writes a PDF Image XObject Decode array to output.
4986
tsize_t t2p_write_pdf_xobject_decode(T2P* t2p, TIFF* output){
4991
written += t2pWriteFile(output, (tdata_t) "/Decode [ ", 10);
4992
for (i=0;i<t2p->tiff_samplesperpixel;i++){
4993
written += t2pWriteFile(output, (tdata_t) "1 0 ", 4);
4995
written += t2pWriteFile(output, (tdata_t) "]\n", 2);
5001
This function writes a PDF Image XObject stream filter name and parameters to
5005
tsize_t t2p_write_pdf_xobject_stream_filter(ttile_t tile, T2P* t2p, TIFF* output){
5011
if(t2p->pdf_compression==T2P_COMPRESS_NONE){
5014
written += t2pWriteFile(output, (tdata_t) "/Filter ", 8);
5015
switch(t2p->pdf_compression){
5016
#ifdef CCITT_SUPPORT
5017
case T2P_COMPRESS_G4:
5018
written += t2pWriteFile(output, (tdata_t) "/CCITTFaxDecode ", 16);
5019
written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13);
5020
written += t2pWriteFile(output, (tdata_t) "<< /K -1 ", 9);
5022
written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
5023
buflen=sprintf(buffer, "%lu",
5024
(unsigned long)t2p->tiff_width);
5025
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5026
written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
5027
buflen=sprintf(buffer, "%lu",
5028
(unsigned long)t2p->tiff_length);
5029
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5031
if(t2p_tile_is_right_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)==0){
5032
written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
5036
(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilewidth);
5037
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5039
written += t2pWriteFile(output, (tdata_t) "/Columns ", 9);
5043
(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilewidth);
5044
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5046
if(t2p_tile_is_bottom_edge(t2p->tiff_tiles[t2p->pdf_page], tile-1)==0){
5047
written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
5051
(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_tilelength);
5052
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5054
written += t2pWriteFile(output, (tdata_t) " /Rows ", 7);
5058
(unsigned long)t2p->tiff_tiles[t2p->pdf_page].tiles_edgetilelength);
5059
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5062
if(t2p->pdf_switchdecode == 0){
5063
written += t2pWriteFile(output, (tdata_t) " /BlackIs1 true ", 16);
5065
written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
5069
case T2P_COMPRESS_JPEG:
5070
written += t2pWriteFile(output, (tdata_t) "/DCTDecode ", 11);
5072
if(t2p->tiff_photometric != PHOTOMETRIC_YCBCR) {
5073
written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13);
5074
written += t2pWriteFile(output, (tdata_t) "<< /ColorTransform 0 >>\n", 24);
5079
case T2P_COMPRESS_ZIP:
5080
written += t2pWriteFile(output, (tdata_t) "/FlateDecode ", 13);
5081
if(t2p->pdf_compressionquality%100){
5082
written += t2pWriteFile(output, (tdata_t) "/DecodeParms ", 13);
5083
written += t2pWriteFile(output, (tdata_t) "<< /Predictor ", 14);
5084
_TIFFmemset(buffer, 0x00, 16);
5085
buflen=sprintf(buffer, "%u", t2p->pdf_compressionquality%100);
5086
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5087
written += t2pWriteFile(output, (tdata_t) " /Columns ", 10);
5088
_TIFFmemset(buffer, 0x00, 16);
5089
buflen = sprintf(buffer, "%lu",
5090
(unsigned long)t2p->tiff_width);
5091
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5092
written += t2pWriteFile(output, (tdata_t) " /Colors ", 9);
5093
_TIFFmemset(buffer, 0x00, 16);
5094
buflen=sprintf(buffer, "%u", t2p->tiff_samplesperpixel);
5095
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5096
written += t2pWriteFile(output, (tdata_t) " /BitsPerComponent ", 19);
5097
_TIFFmemset(buffer, 0x00, 16);
5098
buflen=sprintf(buffer, "%u", t2p->tiff_bitspersample);
5099
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5100
written += t2pWriteFile(output, (tdata_t) ">>\n", 3);
5112
This function writes a PDF xref table to output.
5115
tsize_t t2p_write_pdf_xreftable(T2P* t2p, TIFF* output){
5122
written += t2pWriteFile(output, (tdata_t) "xref\n0 ", 7);
5123
buflen=sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount + 1));
5124
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5125
written += t2pWriteFile(output, (tdata_t) " \n0000000000 65535 f \n", 22);
5126
for (i=0;i<t2p->pdf_xrefcount;i++){
5127
sprintf(buffer, "%.10lu 00000 n \n",
5128
(unsigned long)t2p->pdf_xrefoffsets[i]);
5129
written += t2pWriteFile(output, (tdata_t) buffer, 20);
5136
* This function writes a PDF trailer to output.
5139
tsize_t t2p_write_pdf_trailer(T2P* t2p, TIFF* output)
5142
tsize_t written = 0;
5147
for (i = 0; i < sizeof(t2p->pdf_fileid) - 8; i += 8)
5148
snprintf(t2p->pdf_fileid + i, 9, "%.8X", rand());
5150
written += t2pWriteFile(output, (tdata_t) "trailer\n<<\n/Size ", 17);
5151
buflen = sprintf(buffer, "%lu", (unsigned long)(t2p->pdf_xrefcount+1));
5152
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5153
_TIFFmemset(buffer, 0x00, 32);
5154
written += t2pWriteFile(output, (tdata_t) "\n/Root ", 7);
5155
buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_catalog);
5156
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5157
_TIFFmemset(buffer, 0x00, 32);
5158
written += t2pWriteFile(output, (tdata_t) " 0 R \n/Info ", 12);
5159
buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_info);
5160
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5161
_TIFFmemset(buffer, 0x00, 32);
5162
written += t2pWriteFile(output, (tdata_t) " 0 R \n/ID[<", 11);
5163
written += t2pWriteFile(output, (tdata_t) t2p->pdf_fileid,
5164
sizeof(t2p->pdf_fileid) - 1);
5165
written += t2pWriteFile(output, (tdata_t) "><", 2);
5166
written += t2pWriteFile(output, (tdata_t) t2p->pdf_fileid,
5167
sizeof(t2p->pdf_fileid) - 1);
5168
written += t2pWriteFile(output, (tdata_t) ">]\n>>\nstartxref\n", 16);
5169
buflen=sprintf(buffer, "%lu", (unsigned long)t2p->pdf_startxref);
5170
written += t2pWriteFile(output, (tdata_t) buffer, buflen);
5171
_TIFFmemset(buffer, 0x00, 32);
5172
written += t2pWriteFile(output, (tdata_t) "\n%%EOF\n", 7);
5179
This function writes a PDF to a file given a pointer to a TIFF.
5181
The idea with using a TIFF* as output for a PDF file is that the file
5182
can be created with TIFFClientOpen for memory-mapped use within the TIFF
5183
library, and TIFFWriteEncodedStrip can be used to write compressed data to
5184
the output. The output is not actually a TIFF file, it is a PDF file.
5186
This function uses only t2pWriteFile and TIFFWriteEncodedStrip to write to
5187
the output TIFF file. When libtiff would otherwise be writing data to the
5188
output file, the write procedure of the TIFF structure is replaced with an
5189
empty implementation.
5191
The first argument to the function is an initialized and validated T2P
5192
context struct pointer.
5194
The second argument to the function is the TIFF* that is the input that has
5195
been opened for reading and no other functions have been called upon it.
5197
The third argument to the function is the TIFF* that is the output that has
5198
been opened for writing. It has to be opened so that it hasn't written any
5199
data to the output. If the output is seekable then it's OK to seek to the
5200
beginning of the file. The function only writes to the output PDF and does
5201
not seek. See the example usage in the main() function.
5203
TIFF* output = TIFFOpen("output.pdf", "w");
5204
assert(output != NULL);
5206
if(output->tif_seekproc != NULL){
5207
t2pSeekFile(output, (toff_t) 0, SEEK_SET);
5210
This function returns the file size of the output PDF file. On error it
5211
returns zero and the t2p->t2p_error variable is set to T2P_ERR_ERROR.
5213
After this function completes, call t2p_free on t2p, TIFFClose on input,
5214
and TIFFClose on output.
5217
tsize_t t2p_write_pdf(T2P* t2p, TIFF* input, TIFF* output){
5221
tsize_t streamlen=0;
5224
t2p_read_tiff_init(t2p, input);
5225
if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
5226
t2p->pdf_xrefoffsets= (uint32*) _TIFFmalloc(t2p->pdf_xrefcount * sizeof(uint32) );
5227
if(t2p->pdf_xrefoffsets==NULL){
5230
"Can't allocate %u bytes of memory for t2p_write_pdf",
5231
(unsigned int) (t2p->pdf_xrefcount * sizeof(uint32)) );
5234
t2p->pdf_xrefcount=0;
5238
written += t2p_write_pdf_header(t2p, output);
5239
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5240
t2p->pdf_catalog=t2p->pdf_xrefcount;
5241
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5242
written += t2p_write_pdf_catalog(t2p, output);
5243
written += t2p_write_pdf_obj_end(output);
5244
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5245
t2p->pdf_info=t2p->pdf_xrefcount;
5246
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5247
written += t2p_write_pdf_info(t2p, input, output);
5248
written += t2p_write_pdf_obj_end(output);
5249
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5250
t2p->pdf_pages=t2p->pdf_xrefcount;
5251
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5252
written += t2p_write_pdf_pages(t2p, output);
5253
written += t2p_write_pdf_obj_end(output);
5254
for(t2p->pdf_page=0;t2p->pdf_page<t2p->tiff_pagecount;t2p->pdf_page++){
5255
t2p_read_tiff_data(t2p, input);
5256
if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
5257
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5258
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5259
written += t2p_write_pdf_page(t2p->pdf_xrefcount, t2p, output);
5260
written += t2p_write_pdf_obj_end(output);
5261
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5262
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5263
written += t2p_write_pdf_stream_dict_start(output);
5264
written += t2p_write_pdf_stream_dict(0, t2p->pdf_xrefcount+1, output);
5265
written += t2p_write_pdf_stream_dict_end(output);
5266
written += t2p_write_pdf_stream_start(output);
5268
written += t2p_write_pdf_page_content_stream(t2p, output);
5269
streamlen=written-streamlen;
5270
written += t2p_write_pdf_stream_end(output);
5271
written += t2p_write_pdf_obj_end(output);
5272
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5273
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5274
written += t2p_write_pdf_stream_length(streamlen, output);
5275
written += t2p_write_pdf_obj_end(output);
5276
if(t2p->tiff_transferfunctioncount != 0){
5277
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5278
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5279
written += t2p_write_pdf_transfer(t2p, output);
5280
written += t2p_write_pdf_obj_end(output);
5281
for(i=0; i < t2p->tiff_transferfunctioncount; i++){
5282
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5283
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5284
written += t2p_write_pdf_stream_dict_start(output);
5285
written += t2p_write_pdf_transfer_dict(t2p, output, i);
5286
written += t2p_write_pdf_stream_dict_end(output);
5287
written += t2p_write_pdf_stream_start(output);
5289
written += t2p_write_pdf_transfer_stream(t2p, output, i);
5290
streamlen=written-streamlen;
5291
written += t2p_write_pdf_stream_end(output);
5292
written += t2p_write_pdf_obj_end(output);
5295
if( (t2p->pdf_colorspace & T2P_CS_PALETTE) != 0){
5296
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5297
t2p->pdf_palettecs=t2p->pdf_xrefcount;
5298
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5299
written += t2p_write_pdf_stream_dict_start(output);
5300
written += t2p_write_pdf_stream_dict(t2p->pdf_palettesize, 0, output);
5301
written += t2p_write_pdf_stream_dict_end(output);
5302
written += t2p_write_pdf_stream_start(output);
5304
written += t2p_write_pdf_xobject_palettecs_stream(t2p, output);
5305
streamlen=written-streamlen;
5306
written += t2p_write_pdf_stream_end(output);
5307
written += t2p_write_pdf_obj_end(output);
5309
if( (t2p->pdf_colorspace & T2P_CS_ICCBASED) != 0){
5310
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5311
t2p->pdf_icccs=t2p->pdf_xrefcount;
5312
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5313
written += t2p_write_pdf_stream_dict_start(output);
5314
written += t2p_write_pdf_xobject_icccs_dict(t2p, output);
5315
written += t2p_write_pdf_stream_dict_end(output);
5316
written += t2p_write_pdf_stream_start(output);
5318
written += t2p_write_pdf_xobject_icccs_stream(t2p, output);
5319
streamlen=written-streamlen;
5320
written += t2p_write_pdf_stream_end(output);
5321
written += t2p_write_pdf_obj_end(output);
5323
if(t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount !=0){
5324
for(i2=0;i2<t2p->tiff_tiles[t2p->pdf_page].tiles_tilecount;i2++){
5325
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5326
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5327
written += t2p_write_pdf_stream_dict_start(output);
5328
written += t2p_write_pdf_xobject_stream_dict(
5332
written += t2p_write_pdf_stream_dict_end(output);
5333
written += t2p_write_pdf_stream_start(output);
5335
t2p_read_tiff_size_tile(t2p, input, i2);
5336
written += t2p_readwrite_pdf_image_tile(t2p, input, output, i2);
5337
t2p_write_advance_directory(t2p, output);
5338
if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
5339
streamlen=written-streamlen;
5340
written += t2p_write_pdf_stream_end(output);
5341
written += t2p_write_pdf_obj_end(output);
5342
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5343
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5344
written += t2p_write_pdf_stream_length(streamlen, output);
5345
written += t2p_write_pdf_obj_end(output);
5348
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5349
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5350
written += t2p_write_pdf_stream_dict_start(output);
5351
written += t2p_write_pdf_xobject_stream_dict(
5355
written += t2p_write_pdf_stream_dict_end(output);
5356
written += t2p_write_pdf_stream_start(output);
5358
t2p_read_tiff_size(t2p, input);
5359
written += t2p_readwrite_pdf_image(t2p, input, output);
5360
t2p_write_advance_directory(t2p, output);
5361
if(t2p->t2p_error!=T2P_ERR_OK){return(0);}
5362
streamlen=written-streamlen;
5363
written += t2p_write_pdf_stream_end(output);
5364
written += t2p_write_pdf_obj_end(output);
5365
t2p->pdf_xrefoffsets[t2p->pdf_xrefcount++]=written;
5366
written += t2p_write_pdf_obj_start(t2p->pdf_xrefcount, output);
5367
written += t2p_write_pdf_stream_length(streamlen, output);
5368
written += t2p_write_pdf_obj_end(output);
5371
t2p->pdf_startxref = written;
5372
written += t2p_write_pdf_xreftable(t2p, output);
5373
written += t2p_write_pdf_trailer(t2p, output);
5374
t2p_disable(output);
5379
/* vim: set ts=8 sts=8 sw=8 noet: */