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
));
3185 t2p
->t2p_error
= T2P_ERR_ERROR
;
3188 _TIFFmemset(t2p
->pdf_ojpegdata
, 0x00, 2048);
3189 t2p
->pdf_ojpegdatalength
= 0;
3190 table_count
=t2p
->tiff_samplesperpixel
;
3191 if(proc
==JPEGPROC_BASELINE
){
3192 if(table_count
>2) table_count
=2;
3194 ojpegdata
=(unsigned char*)t2p
->pdf_ojpegdata
;
3195 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3196 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xd8;
3197 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3198 if(proc
==JPEGPROC_BASELINE
){
3199 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xc0;
3201 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xc3;
3203 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x00;
3204 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=(8 + 3*t2p
->tiff_samplesperpixel
);
3205 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=(t2p
->tiff_bitspersample
& 0xff);
3206 if(TIFFIsTiled(input
)){
3207 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3208 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
>> 8) & 0xff;
3209 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3210 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
) & 0xff;
3211 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3212 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
>> 8) & 0xff;
3213 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3214 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
) & 0xff;
3216 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3217 (t2p
->tiff_length
>> 8) & 0xff;
3218 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3219 (t2p
->tiff_length
) & 0xff;
3220 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3221 (t2p
->tiff_width
>> 8) & 0xff;
3222 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3223 (t2p
->tiff_width
) & 0xff;
3225 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=(t2p
->tiff_samplesperpixel
& 0xff);
3226 for(i
=0;i
<t2p
->tiff_samplesperpixel
;i
++){
3227 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=i
;
3229 ojpegdata
[t2p
->pdf_ojpegdatalength
] |= h_samp
<<4 & 0xf0;;
3230 ojpegdata
[t2p
->pdf_ojpegdatalength
++] |= v_samp
& 0x0f;
3232 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= 0x11;
3234 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=i
;
3236 for(dest
=0;dest
<t2p
->tiff_samplesperpixel
;dest
++){
3237 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3238 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xdb;
3239 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x00;
3240 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x43;
3241 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=dest
;
3242 _TIFFmemcpy( &(ojpegdata
[t2p
->pdf_ojpegdatalength
++]),
3243 &(((unsigned char*)q
)[64*dest
]), 64);
3244 t2p
->pdf_ojpegdatalength
+=64;
3247 for(dest
=0;dest
<table_count
;dest
++){
3248 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3249 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xc4;
3250 offset_ms_l
=t2p
->pdf_ojpegdatalength
;
3251 t2p
->pdf_ojpegdatalength
+=2;
3252 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=dest
& 0x0f;
3253 _TIFFmemcpy( &(ojpegdata
[t2p
->pdf_ojpegdatalength
]),
3254 &(((unsigned char*)dc
)[offset_table
]), 16);
3258 code_count
+=ojpegdata
[t2p
->pdf_ojpegdatalength
++];
3260 ojpegdata
[offset_ms_l
]=((19+code_count
)>>8) & 0xff;
3261 ojpegdata
[offset_ms_l
+1]=(19+code_count
) & 0xff;
3262 _TIFFmemcpy( &(ojpegdata
[t2p
->pdf_ojpegdatalength
]),
3263 &(((unsigned char*)dc
)[offset_table
]), code_count
);
3264 offset_table
+=code_count
;
3265 t2p
->pdf_ojpegdatalength
+=code_count
;
3267 if(proc
==JPEGPROC_BASELINE
){
3269 for(dest
=0;dest
<table_count
;dest
++){
3270 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3271 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xc4;
3272 offset_ms_l
=t2p
->pdf_ojpegdatalength
;
3273 t2p
->pdf_ojpegdatalength
+=2;
3274 ojpegdata
[t2p
->pdf_ojpegdatalength
] |= 0x10;
3275 ojpegdata
[t2p
->pdf_ojpegdatalength
++] |=dest
& 0x0f;
3276 _TIFFmemcpy( &(ojpegdata
[t2p
->pdf_ojpegdatalength
]),
3277 &(((unsigned char*)ac
)[offset_table
]), 16);
3281 code_count
+=ojpegdata
[t2p
->pdf_ojpegdatalength
++];
3283 ojpegdata
[offset_ms_l
]=((19+code_count
)>>8) & 0xff;
3284 ojpegdata
[offset_ms_l
+1]=(19+code_count
) & 0xff;
3285 _TIFFmemcpy( &(ojpegdata
[t2p
->pdf_ojpegdatalength
]),
3286 &(((unsigned char*)ac
)[offset_table
]), code_count
);
3287 offset_table
+=code_count
;
3288 t2p
->pdf_ojpegdatalength
+=code_count
;
3291 if(TIFFNumberOfStrips(input
)>1){
3292 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3293 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xdd;
3294 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x00;
3295 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x04;
3298 ri
=(t2p
->tiff_width
+h_samp
-1) / h_samp
;
3299 TIFFGetField(input
, TIFFTAG_ROWSPERSTRIP
, &rows
);
3300 ri
*=(rows
+v_samp
-1)/v_samp
;
3301 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= (ri
>>8) & 0xff;
3302 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= ri
& 0xff;
3304 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3305 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xda;
3306 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x00;
3307 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=(6 + 2*t2p
->tiff_samplesperpixel
);
3308 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=t2p
->tiff_samplesperpixel
& 0xff;
3309 for(i
=0;i
<t2p
->tiff_samplesperpixel
;i
++){
3310 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= i
& 0xff;
3311 if(proc
==JPEGPROC_BASELINE
){
3312 ojpegdata
[t2p
->pdf_ojpegdatalength
] |=
3313 ( ( (i
>(table_count
-1U)) ? (table_count
-1U) : i
) << 4U) & 0xf0;
3314 ojpegdata
[t2p
->pdf_ojpegdatalength
++] |=
3315 ( (i
>(table_count
-1U)) ? (table_count
-1U) : i
) & 0x0f;
3317 ojpegdata
[t2p
->pdf_ojpegdatalength
++] = (i
<< 4) & 0xf0;
3320 if(proc
==JPEGPROC_BASELINE
){
3321 t2p
->pdf_ojpegdatalength
++;
3322 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x3f;
3323 t2p
->pdf_ojpegdatalength
++;
3325 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= (lp
[0] & 0xff);
3326 t2p
->pdf_ojpegdatalength
++;
3327 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= (pt
[0] & 0x0f);
3335 int t2p_process_jpeg_strip(
3336 unsigned char* strip
,
3337 tsize_t
* striplength
,
3338 unsigned char* buffer
,
3339 tsize_t
* bufferoffset
,
3351 while(i
<(*striplength
)){
3354 /* SOI - start of image */
3355 _TIFFmemcpy(&(buffer
[*bufferoffset
]), &(strip
[i
-1]), 2);
3365 _TIFFmemcpy(&(buffer
[*bufferoffset
]), &(strip
[i
-1]), strip
[i
+2]+2);
3366 for(j
=0;j
<buffer
[*bufferoffset
+9];j
++){
3367 if( (buffer
[*bufferoffset
+11+(2*j
)]>>4) > h_samp
)
3368 h_samp
= (buffer
[*bufferoffset
+11+(2*j
)]>>4);
3369 if( (buffer
[*bufferoffset
+11+(2*j
)] & 0x0f) > v_samp
)
3370 v_samp
= (buffer
[*bufferoffset
+11+(2*j
)] & 0x0f);
3374 ri
=((( ((uint16
)(buffer
[*bufferoffset
+5])<<8) |
3375 (uint16
)(buffer
[*bufferoffset
+6]) )+v_samp
-1)/
3377 ri
*=((( ((uint16
)(buffer
[*bufferoffset
+7])<<8) |
3378 (uint16
)(buffer
[*bufferoffset
+8]) )+h_samp
-1)/
3380 buffer
[*bufferoffset
+5]=
3381 (unsigned char) ((height
>>8) & 0xff);
3382 buffer
[*bufferoffset
+6]=
3383 (unsigned char) (height
& 0xff);
3384 *bufferoffset
+=strip
[i
+2]+2;
3387 buffer
[(*bufferoffset
)++]=0xff;
3388 buffer
[(*bufferoffset
)++]=0xdd;
3389 buffer
[(*bufferoffset
)++]=0x00;
3390 buffer
[(*bufferoffset
)++]=0x04;
3391 buffer
[(*bufferoffset
)++]=(ri
>> 8) & 0xff;
3392 buffer
[(*bufferoffset
)++]= ri
& 0xff;
3399 _TIFFmemcpy(&(buffer
[*bufferoffset
]), &(strip
[i
-1]), strip
[i
+2]+2);
3400 *bufferoffset
+=strip
[i
+2]+2;
3405 _TIFFmemcpy(&(buffer
[*bufferoffset
]), &(strip
[i
-1]), strip
[i
+2]+2);
3406 *bufferoffset
+=strip
[i
+2]+2;
3409 buffer
[(*bufferoffset
)++]=0xff;
3410 buffer
[(*bufferoffset
)++]=
3411 (unsigned char)(0xd0 | ((no
-1)%8
));
3414 _TIFFmemcpy(&(buffer
[*bufferoffset
]), &(strip
[i
-1]), (*striplength
)-i
-1);
3415 *bufferoffset
+=(*striplength
)-i
-1;
3428 This functions converts a tilewidth x tilelength buffer of samples into an edgetilewidth x
3429 tilelength buffer of samples.
3431 void t2p_tile_collapse_left(
3435 uint32 edgetilewidth
,
3439 tsize_t edgescanwidth
=0;
3441 edgescanwidth
= (scanwidth
* edgetilewidth
+ (tilewidth
- 1))/ tilewidth
;
3442 for(i
=0;i
<tilelength
;i
++){
3444 &(((char*)buffer
)[edgescanwidth
*i
]),
3445 &(((char*)buffer
)[scanwidth
*i
]),
3454 * This function calls TIFFWriteDirectory on the output after blanking its
3455 * output by replacing the read, write, and seek procedures with empty
3456 * implementations, then it replaces the original implementations.
3460 t2p_write_advance_directory(T2P
* t2p
, TIFF
* output
)
3462 t2p_disable(output
);
3463 if(!TIFFWriteDirectory(output
)){
3464 TIFFError(TIFF2PDF_MODULE
,
3465 "Error writing virtual directory to output PDF %s",
3466 TIFFFileName(output
));
3467 t2p
->t2p_error
= T2P_ERR_ERROR
;
3474 tsize_t
t2p_sample_planar_separate_to_contig(
3476 unsigned char* buffer
,
3477 unsigned char* samplebuffer
,
3478 tsize_t samplebuffersize
){
3484 stride
=samplebuffersize
/t2p
->tiff_samplesperpixel
;
3485 for(i
=0;i
<stride
;i
++){
3486 for(j
=0;j
<t2p
->tiff_samplesperpixel
;j
++){
3487 buffer
[i
*t2p
->tiff_samplesperpixel
+ j
] = samplebuffer
[i
+ j
*stride
];
3491 return(samplebuffersize
);
3494 tsize_t
t2p_sample_realize_palette(T2P
* t2p
, unsigned char* buffer
){
3496 uint32 sample_count
=0;
3497 uint16 component_count
=0;
3498 uint32 palette_offset
=0;
3499 uint32 sample_offset
=0;
3502 sample_count
=t2p
->tiff_width
*t2p
->tiff_length
;
3503 component_count
=t2p
->tiff_samplesperpixel
;
3505 for(i
=sample_count
;i
>0;i
--){
3506 palette_offset
=buffer
[i
-1] * component_count
;
3507 sample_offset
= (i
-1) * component_count
;
3508 for(j
=0;j
<component_count
;j
++){
3509 buffer
[sample_offset
+j
]=t2p
->pdf_palette
[palette_offset
+j
];
3517 This functions converts in place a buffer of ABGR interleaved data
3518 into RGB interleaved data, discarding A.
3521 tsize_t
t2p_sample_abgr_to_rgb(tdata_t data
, uint32 samplecount
)
3526 for(i
=0;i
<samplecount
;i
++){
3527 sample
=((uint32
*)data
)[i
];
3528 ((char*)data
)[i
*3]= (char) (sample
& 0xff);
3529 ((char*)data
)[i
*3+1]= (char) ((sample
>>8) & 0xff);
3530 ((char*)data
)[i
*3+2]= (char) ((sample
>>16) & 0xff);
3537 * This functions converts in place a buffer of RGBA interleaved data
3538 * into RGB interleaved data, discarding A.
3542 t2p_sample_rgbaa_to_rgb(tdata_t data
, uint32 samplecount
)
3546 for(i
= 0; i
< samplecount
; i
++)
3547 memcpy((uint8
*)data
+ i
* 3, (uint8
*)data
+ i
* 4, 3);
3553 * This functions converts in place a buffer of RGBA interleaved data
3554 * into RGB interleaved data, adding 255-A to each component sample.
3558 t2p_sample_rgba_to_rgb(tdata_t data
, uint32 samplecount
)
3564 for (i
= 0; i
< samplecount
; i
++) {
3565 sample
=((uint32
*)data
)[i
];
3566 alpha
=(uint8
)((255 - ((sample
>> 24) & 0xff)));
3567 ((uint8
*)data
)[i
* 3] = (uint8
) ((sample
>> 16) & 0xff) + alpha
;
3568 ((uint8
*)data
)[i
* 3 + 1] = (uint8
) ((sample
>> 8) & 0xff) + alpha
;
3569 ((uint8
*)data
)[i
* 3 + 2] = (uint8
) (sample
& 0xff) + alpha
;
3576 This function converts the a and b samples of Lab data from signed
3580 tsize_t
t2p_sample_lab_signed_to_unsigned(tdata_t buffer
, uint32 samplecount
){
3584 for(i
=0;i
<samplecount
;i
++){
3585 if( (((unsigned char*)buffer
)[(i
*3)+1] & 0x80) !=0){
3586 ((unsigned char*)buffer
)[(i
*3)+1] =
3587 (unsigned char)(0x80 + ((char*)buffer
)[(i
*3)+1]);
3589 ((unsigned char*)buffer
)[(i
*3)+1] |= 0x80;
3591 if( (((unsigned char*)buffer
)[(i
*3)+2] & 0x80) !=0){
3592 ((unsigned char*)buffer
)[(i
*3)+2] =
3593 (unsigned char)(0x80 + ((char*)buffer
)[(i
*3)+2]);
3595 ((unsigned char*)buffer
)[(i
*3)+2] |= 0x80;
3599 return(samplecount
*3);
3603 This function writes the PDF header to output.
3606 tsize_t
t2p_write_pdf_header(T2P
* t2p
, TIFF
* output
){
3612 buflen
=sprintf(buffer
, "%%PDF-%u.%u ", t2p
->pdf_majorversion
&0xff, t2p
->pdf_minorversion
&0xff);
3613 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
3614 written
+= t2pWriteFile(output
, (tdata_t
)"\n%\342\343\317\323\n", 7);
3620 This function writes the beginning of a PDF object to output.
3623 tsize_t
t2p_write_pdf_obj_start(uint32 number
, TIFF
* output
){
3629 buflen
=sprintf(buffer
, "%lu", (unsigned long)number
);
3630 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
3631 written
+= t2pWriteFile(output
, (tdata_t
) " 0 obj\n", 7);
3637 This function writes the end of a PDF object to output.
3640 tsize_t
t2p_write_pdf_obj_end(TIFF
* output
){
3644 written
+= t2pWriteFile(output
, (tdata_t
) "endobj\n", 7);
3650 This function writes a PDF name object to output.
3653 tsize_t
t2p_write_pdf_name(unsigned char* name
, TIFF
* output
){
3661 namelen
= strlen((char *)name
);
3665 written
+= t2pWriteFile(output
, (tdata_t
) "/", 1);
3666 for (i
=0;i
<namelen
;i
++){
3667 if ( ((unsigned char)name
[i
]) < 0x21){
3668 sprintf(buffer
, "#%.2X", name
[i
]);
3669 buffer
[sizeof(buffer
) - 1] = '\0';
3670 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3673 if ( ((unsigned char)name
[i
]) > 0x7E){
3674 sprintf(buffer
, "#%.2X", name
[i
]);
3675 buffer
[sizeof(buffer
) - 1] = '\0';
3676 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3682 sprintf(buffer
, "#%.2X", name
[i
]);
3683 buffer
[sizeof(buffer
) - 1] = '\0';
3684 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3687 sprintf(buffer
, "#%.2X", name
[i
]);
3688 buffer
[sizeof(buffer
) - 1] = '\0';
3689 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3692 sprintf(buffer
, "#%.2X", name
[i
]);
3693 buffer
[sizeof(buffer
) - 1] = '\0';
3694 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3697 sprintf(buffer
, "#%.2X", name
[i
]);
3698 buffer
[sizeof(buffer
) - 1] = '\0';
3699 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3702 sprintf(buffer
, "#%.2X", name
[i
]);
3703 buffer
[sizeof(buffer
) - 1] = '\0';
3704 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3707 sprintf(buffer
, "#%.2X", name
[i
]);
3708 buffer
[sizeof(buffer
) - 1] = '\0';
3709 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3712 sprintf(buffer
, "#%.2X", name
[i
]);
3713 buffer
[sizeof(buffer
) - 1] = '\0';
3714 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3717 sprintf(buffer
, "#%.2X", name
[i
]);
3718 buffer
[sizeof(buffer
) - 1] = '\0';
3719 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3722 sprintf(buffer
, "#%.2X", name
[i
]);
3723 buffer
[sizeof(buffer
) - 1] = '\0';
3724 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3727 sprintf(buffer
, "#%.2X", name
[i
]);
3728 buffer
[sizeof(buffer
) - 1] = '\0';
3729 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3732 sprintf(buffer
, "#%.2X", name
[i
]);
3733 buffer
[sizeof(buffer
) - 1] = '\0';
3734 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3737 written
+= t2pWriteFile(output
, (tdata_t
) &name
[i
], 1);
3742 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
3748 * This function writes a PDF string object to output.
3751 tsize_t
t2p_write_pdf_string(char* pdfstr
, TIFF
* output
)
3753 tsize_t written
= 0;
3758 len
= strlen(pdfstr
);
3759 written
+= t2pWriteFile(output
, (tdata_t
) "(", 1);
3760 for (i
=0; i
<len
; i
++) {
3761 if((pdfstr
[i
]&0x80) || (pdfstr
[i
]==127) || (pdfstr
[i
]<32)){
3762 snprintf(buffer
, sizeof(buffer
), "\\%.3o", ((unsigned char)pdfstr
[i
]));
3763 written
+= t2pWriteFile(output
, (tdata_t
)buffer
, 4);
3767 written
+= t2pWriteFile(output
, (tdata_t
) "\\b", 2);
3770 written
+= t2pWriteFile(output
, (tdata_t
) "\\t", 2);
3773 written
+= t2pWriteFile(output
, (tdata_t
) "\\n", 2);
3776 written
+= t2pWriteFile(output
, (tdata_t
) "\\f", 2);
3779 written
+= t2pWriteFile(output
, (tdata_t
) "\\r", 2);
3782 written
+= t2pWriteFile(output
, (tdata_t
) "\\(", 2);
3785 written
+= t2pWriteFile(output
, (tdata_t
) "\\)", 2);
3788 written
+= t2pWriteFile(output
, (tdata_t
) "\\\\", 2);
3791 written
+= t2pWriteFile(output
, (tdata_t
) &pdfstr
[i
], 1);
3795 written
+= t2pWriteFile(output
, (tdata_t
) ") ", 1);
3802 This function writes a buffer of data to output.
3805 tsize_t
t2p_write_pdf_stream(tdata_t buffer
, tsize_t len
, TIFF
* output
){
3809 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, len
);
3815 This functions writes the beginning of a PDF stream to output.
3818 tsize_t
t2p_write_pdf_stream_start(TIFF
* output
){
3822 written
+= t2pWriteFile(output
, (tdata_t
) "stream\n", 7);
3828 This function writes the end of a PDF stream to output.
3831 tsize_t
t2p_write_pdf_stream_end(TIFF
* output
){
3835 written
+= t2pWriteFile(output
, (tdata_t
) "\nendstream\n", 11);
3841 This function writes a stream dictionary for a PDF stream to output.
3844 tsize_t
t2p_write_pdf_stream_dict(tsize_t len
, uint32 number
, TIFF
* output
){
3850 written
+= t2pWriteFile(output
, (tdata_t
) "/Length ", 8);
3852 written
+= t2p_write_pdf_stream_length(len
, output
);
3854 buflen
=sprintf(buffer
, "%lu", (unsigned long)number
);
3855 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
3856 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n", 6);
3863 This functions writes the beginning of a PDF stream dictionary to output.
3866 tsize_t
t2p_write_pdf_stream_dict_start(TIFF
* output
){
3870 written
+= t2pWriteFile(output
, (tdata_t
) "<< \n", 4);
3876 This function writes the end of a PDF stream dictionary to output.
3879 tsize_t
t2p_write_pdf_stream_dict_end(TIFF
* output
){
3883 written
+= t2pWriteFile(output
, (tdata_t
) " >>\n", 4);
3889 This function writes a number to output.
3892 tsize_t
t2p_write_pdf_stream_length(tsize_t len
, TIFF
* output
){
3898 buflen
=sprintf(buffer
, "%lu", (unsigned long)len
);
3899 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
3900 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3906 * This function writes the PDF Catalog structure to output.
3909 tsize_t
t2p_write_pdf_catalog(T2P
* t2p
, TIFF
* output
)
3911 tsize_t written
= 0;
3915 written
+= t2pWriteFile(output
,
3916 (tdata_t
)"<< \n/Type /Catalog \n/Pages ",
3918 buflen
= snprintf(buffer
, sizeof(buffer
), "%lu", (unsigned long)t2p
->pdf_pages
);
3919 written
+= t2pWriteFile(output
, (tdata_t
) buffer
,
3920 TIFFmin((size_t)buflen
, sizeof(buffer
) - 1));
3921 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n", 6);
3922 if(t2p
->pdf_fitwindow
){
3923 written
+= t2pWriteFile(output
,
3924 (tdata_t
) "/ViewerPreferences <</FitWindow true>>\n",
3927 written
+= t2pWriteFile(output
, (tdata_t
)">>\n", 3);
3933 This function writes the PDF Info structure to output.
3936 tsize_t
t2p_write_pdf_info(T2P
* t2p
, TIFF
* input
, TIFF
* output
)
3938 tsize_t written
= 0;
3942 if(t2p
->pdf_datetime
[0] == '\0')
3943 t2p_pdf_tifftime(t2p
, input
);
3944 if (strlen(t2p
->pdf_datetime
) > 0) {
3945 written
+= t2pWriteFile(output
, (tdata_t
) "<< \n/CreationDate ", 18);
3946 written
+= t2p_write_pdf_string(t2p
->pdf_datetime
, output
);
3947 written
+= t2pWriteFile(output
, (tdata_t
) "\n/ModDate ", 10);
3948 written
+= t2p_write_pdf_string(t2p
->pdf_datetime
, output
);
3950 written
+= t2pWriteFile(output
, (tdata_t
) "\n/Producer ", 11);
3951 _TIFFmemset((tdata_t
)buffer
, 0x00, sizeof(buffer
));
3952 snprintf(buffer
, sizeof(buffer
), "libtiff / tiff2pdf - %d", TIFFLIB_VERSION
);
3953 written
+= t2p_write_pdf_string(buffer
, output
);
3954 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3955 if (t2p
->pdf_creator
[0] != '\0') {
3956 written
+= t2pWriteFile(output
, (tdata_t
) "/Creator ", 9);
3957 written
+= t2p_write_pdf_string(t2p
->pdf_creator
, output
);
3958 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3960 if (TIFFGetField(input
, TIFFTAG_SOFTWARE
, &info
) != 0 && info
) {
3961 if(strlen(info
) >= sizeof(t2p
->pdf_creator
))
3962 info
[sizeof(t2p
->pdf_creator
) - 1] = '\0';
3963 written
+= t2pWriteFile(output
, (tdata_t
) "/Creator ", 9);
3964 written
+= t2p_write_pdf_string(info
, output
);
3965 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3968 if (t2p
->pdf_author
[0] != '\0') {
3969 written
+= t2pWriteFile(output
, (tdata_t
) "/Author ", 8);
3970 written
+= t2p_write_pdf_string(t2p
->pdf_author
, output
);
3971 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3973 if ((TIFFGetField(input
, TIFFTAG_ARTIST
, &info
) != 0
3974 || TIFFGetField(input
, TIFFTAG_COPYRIGHT
, &info
) != 0)
3976 if (strlen(info
) >= sizeof(t2p
->pdf_author
))
3977 info
[sizeof(t2p
->pdf_author
) - 1] = '\0';
3978 written
+= t2pWriteFile(output
, (tdata_t
) "/Author ", 8);
3979 written
+= t2p_write_pdf_string(info
, output
);
3980 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3983 if (t2p
->pdf_title
[0] != '\0') {
3984 written
+= t2pWriteFile(output
, (tdata_t
) "/Title ", 7);
3985 written
+= t2p_write_pdf_string(t2p
->pdf_title
, output
);
3986 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3988 if (TIFFGetField(input
, TIFFTAG_DOCUMENTNAME
, &info
) != 0){
3989 if(strlen(info
) > 511) {
3992 written
+= t2pWriteFile(output
, (tdata_t
) "/Title ", 7);
3993 written
+= t2p_write_pdf_string(info
, output
);
3994 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3997 if (t2p
->pdf_subject
[0] != '\0') {
3998 written
+= t2pWriteFile(output
, (tdata_t
) "/Subject ", 9);
3999 written
+= t2p_write_pdf_string(t2p
->pdf_subject
, output
);
4000 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
4002 if (TIFFGetField(input
, TIFFTAG_IMAGEDESCRIPTION
, &info
) != 0 && info
) {
4003 if (strlen(info
) >= sizeof(t2p
->pdf_subject
))
4004 info
[sizeof(t2p
->pdf_subject
) - 1] = '\0';
4005 written
+= t2pWriteFile(output
, (tdata_t
) "/Subject ", 9);
4006 written
+= t2p_write_pdf_string(info
, output
);
4007 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
4010 if (t2p
->pdf_keywords
[0] != '\0') {
4011 written
+= t2pWriteFile(output
, (tdata_t
) "/Keywords ", 10);
4012 written
+= t2p_write_pdf_string(t2p
->pdf_keywords
, output
);
4013 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
4015 written
+= t2pWriteFile(output
, (tdata_t
) ">> \n", 4);
4021 * This function fills a string of a T2P struct with the current time as a PDF
4022 * date string, it is called by t2p_pdf_tifftime.
4025 void t2p_pdf_currenttime(T2P
* t2p
)
4027 struct tm
* currenttime
;
4030 if (time(&timenow
) == (time_t) -1) {
4031 TIFFError(TIFF2PDF_MODULE
,
4032 "Can't get the current time: %s", strerror(errno
));
4033 timenow
= (time_t) 0;
4036 currenttime
= localtime(&timenow
);
4037 snprintf(t2p
->pdf_datetime
, sizeof(t2p
->pdf_datetime
),
4038 "D:%.4d%.2d%.2d%.2d%.2d%.2d",
4039 (currenttime
->tm_year
+ 1900) % 65536,
4040 (currenttime
->tm_mon
+ 1) % 256,
4041 (currenttime
->tm_mday
) % 256,
4042 (currenttime
->tm_hour
) % 256,
4043 (currenttime
->tm_min
) % 256,
4044 (currenttime
->tm_sec
) % 256);
4050 * This function fills a string of a T2P struct with the date and time of a
4051 * TIFF file if it exists or the current time as a PDF date string.
4054 void t2p_pdf_tifftime(T2P
* t2p
, TIFF
* input
)
4058 if (TIFFGetField(input
, TIFFTAG_DATETIME
, &datetime
) != 0
4059 && (strlen(datetime
) >= 19) ){
4060 t2p
->pdf_datetime
[0]='D';
4061 t2p
->pdf_datetime
[1]=':';
4062 t2p
->pdf_datetime
[2]=datetime
[0];
4063 t2p
->pdf_datetime
[3]=datetime
[1];
4064 t2p
->pdf_datetime
[4]=datetime
[2];
4065 t2p
->pdf_datetime
[5]=datetime
[3];
4066 t2p
->pdf_datetime
[6]=datetime
[5];
4067 t2p
->pdf_datetime
[7]=datetime
[6];
4068 t2p
->pdf_datetime
[8]=datetime
[8];
4069 t2p
->pdf_datetime
[9]=datetime
[9];
4070 t2p
->pdf_datetime
[10]=datetime
[11];
4071 t2p
->pdf_datetime
[11]=datetime
[12];
4072 t2p
->pdf_datetime
[12]=datetime
[14];
4073 t2p
->pdf_datetime
[13]=datetime
[15];
4074 t2p
->pdf_datetime
[14]=datetime
[17];
4075 t2p
->pdf_datetime
[15]=datetime
[18];
4076 t2p
->pdf_datetime
[16] = '\0';
4078 t2p_pdf_currenttime(t2p
);
4085 * This function writes a PDF Pages Tree structure to output.
4088 tsize_t
t2p_write_pdf_pages(T2P
* t2p
, TIFF
* output
)
4096 written
+= t2pWriteFile(output
,
4097 (tdata_t
) "<< \n/Type /Pages \n/Kids [ ", 26);
4098 page
= t2p
->pdf_pages
+1;
4099 for (i
=0;i
<t2p
->tiff_pagecount
;i
++){
4100 buflen
=sprintf(buffer
, "%d", page
);
4101 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4102 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4103 if ( ((i
+1)%8
)==0 ) {
4104 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
4107 page
+= t2p
->tiff_pages
[i
].page_extra
;
4108 if(t2p
->tiff_pages
[i
].page_tilecount
>0){
4109 page
+= (2 * t2p
->tiff_pages
[i
].page_tilecount
);
4114 written
+= t2pWriteFile(output
, (tdata_t
) "] \n/Count ", 10);
4115 _TIFFmemset(buffer
, 0x00, 16);
4116 buflen
=sprintf(buffer
, "%d", t2p
->tiff_pagecount
);
4117 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4118 written
+= t2pWriteFile(output
, (tdata_t
) " \n>> \n", 6);
4124 This function writes a PDF Page structure to output.
4127 tsize_t
t2p_write_pdf_page(uint32 object
, T2P
* t2p
, TIFF
* output
){
4134 written
+= t2pWriteFile(output
, (tdata_t
) "<<\n/Type /Page \n/Parent ", 24);
4135 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_pages
);
4136 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4137 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n", 6);
4138 written
+= t2pWriteFile(output
, (tdata_t
) "/MediaBox [", 11);
4139 buflen
=sprintf(buffer
, "%.4f",t2p
->pdf_mediabox
.x1
);
4140 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4141 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4142 buflen
=sprintf(buffer
, "%.4f",t2p
->pdf_mediabox
.y1
);
4143 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4144 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4145 buflen
=sprintf(buffer
, "%.4f",t2p
->pdf_mediabox
.x2
);
4146 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4147 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4148 buflen
=sprintf(buffer
, "%.4f",t2p
->pdf_mediabox
.y2
);
4149 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4150 written
+= t2pWriteFile(output
, (tdata_t
) "] \n", 3);
4151 written
+= t2pWriteFile(output
, (tdata_t
) "/Contents ", 10);
4152 buflen
=sprintf(buffer
, "%lu", (unsigned long)(object
+ 1));
4153 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4154 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n", 6);
4155 written
+= t2pWriteFile(output
, (tdata_t
) "/Resources << \n", 15);
4156 if( t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
!= 0 ){
4157 written
+= t2pWriteFile(output
, (tdata_t
) "/XObject <<\n", 12);
4158 for(i
=0;i
<t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
;i
++){
4159 written
+= t2pWriteFile(output
, (tdata_t
) "/Im", 3);
4160 buflen
= sprintf(buffer
, "%u", t2p
->pdf_page
+1);
4161 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4162 written
+= t2pWriteFile(output
, (tdata_t
) "_", 1);
4163 buflen
= sprintf(buffer
, "%u", i
+1);
4164 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4165 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4169 (unsigned long)(object
+3+(2*i
)+t2p
->tiff_pages
[t2p
->pdf_page
].page_extra
));
4170 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4171 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4173 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
4176 written
+= t2pWriteFile(output
, (tdata_t
) ">>\n", 3);
4178 written
+= t2pWriteFile(output
, (tdata_t
) "/XObject <<\n", 12);
4179 written
+= t2pWriteFile(output
, (tdata_t
) "/Im", 3);
4180 buflen
= sprintf(buffer
, "%u", t2p
->pdf_page
+1);
4181 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4182 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4186 (unsigned long)(object
+3+(2*i
)+t2p
->tiff_pages
[t2p
->pdf_page
].page_extra
));
4187 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4188 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4189 written
+= t2pWriteFile(output
, (tdata_t
) ">>\n", 3);
4191 if(t2p
->tiff_transferfunctioncount
!= 0) {
4192 written
+= t2pWriteFile(output
, (tdata_t
) "/ExtGState <<", 13);
4193 t2pWriteFile(output
, (tdata_t
) "/GS1 ", 5);
4197 (unsigned long)(object
+ 3));
4198 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4199 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4200 written
+= t2pWriteFile(output
, (tdata_t
) ">> \n", 4);
4202 written
+= t2pWriteFile(output
, (tdata_t
) "/ProcSet [ ", 11);
4203 if(t2p
->pdf_colorspace
== T2P_CS_BILEVEL
4204 || t2p
->pdf_colorspace
== T2P_CS_GRAY
4206 written
+= t2pWriteFile(output
, (tdata_t
) "/ImageB ", 8);
4208 written
+= t2pWriteFile(output
, (tdata_t
) "/ImageC ", 8);
4209 if(t2p
->pdf_colorspace
& T2P_CS_PALETTE
){
4210 written
+= t2pWriteFile(output
, (tdata_t
) "/ImageI ", 8);
4213 written
+= t2pWriteFile(output
, (tdata_t
) "]\n>>\n>>\n", 8);
4219 This function composes the page size and image and tile locations on a page.
4222 void t2p_compose_pdf_page(T2P
* t2p
){
4226 T2P_TILE
* tiles
=NULL
;
4228 uint32 tilecountx
=0;
4229 uint32 tilecounty
=0;
4231 uint32 tilelength
=0;
4234 float width_ratio
=0;
4235 float length_ratio
=0;
4237 t2p
->pdf_xres
= t2p
->tiff_xres
;
4238 t2p
->pdf_yres
= t2p
->tiff_yres
;
4239 if(t2p
->pdf_overrideres
) {
4240 t2p
->pdf_xres
= t2p
->pdf_defaultxres
;
4241 t2p
->pdf_yres
= t2p
->pdf_defaultyres
;
4243 if(t2p
->pdf_xres
== 0.0)
4244 t2p
->pdf_xres
= t2p
->pdf_defaultxres
;
4245 if(t2p
->pdf_yres
== 0.0)
4246 t2p
->pdf_yres
= t2p
->pdf_defaultyres
;
4247 if (t2p
->pdf_image_fillpage
) {
4248 width_ratio
= t2p
->pdf_defaultpagewidth
/t2p
->tiff_width
;
4249 length_ratio
= t2p
->pdf_defaultpagelength
/t2p
->tiff_length
;
4250 if (width_ratio
< length_ratio
) {
4251 t2p
->pdf_imagewidth
= t2p
->pdf_defaultpagewidth
;
4252 t2p
->pdf_imagelength
= t2p
->tiff_length
* width_ratio
;
4254 t2p
->pdf_imagewidth
= t2p
->tiff_width
* length_ratio
;
4255 t2p
->pdf_imagelength
= t2p
->pdf_defaultpagelength
;
4257 } else if (t2p
->tiff_resunit
!= RESUNIT_CENTIMETER
/* RESUNIT_NONE and */
4258 && t2p
->tiff_resunit
!= RESUNIT_INCH
) { /* other cases */
4259 t2p
->pdf_imagewidth
= ((float)(t2p
->tiff_width
))/t2p
->pdf_xres
;
4260 t2p
->pdf_imagelength
= ((float)(t2p
->tiff_length
))/t2p
->pdf_yres
;
4262 t2p
->pdf_imagewidth
=
4263 ((float)(t2p
->tiff_width
))*PS_UNIT_SIZE
/t2p
->pdf_xres
;
4264 t2p
->pdf_imagelength
=
4265 ((float)(t2p
->tiff_length
))*PS_UNIT_SIZE
/t2p
->pdf_yres
;
4267 if(t2p
->pdf_overridepagesize
!= 0) {
4268 t2p
->pdf_pagewidth
= t2p
->pdf_defaultpagewidth
;
4269 t2p
->pdf_pagelength
= t2p
->pdf_defaultpagelength
;
4271 t2p
->pdf_pagewidth
= t2p
->pdf_imagewidth
;
4272 t2p
->pdf_pagelength
= t2p
->pdf_imagelength
;
4274 t2p
->pdf_mediabox
.x1
=0.0;
4275 t2p
->pdf_mediabox
.y1
=0.0;
4276 t2p
->pdf_mediabox
.x2
=t2p
->pdf_pagewidth
;
4277 t2p
->pdf_mediabox
.y2
=t2p
->pdf_pagelength
;
4278 t2p
->pdf_imagebox
.x1
=0.0;
4279 t2p
->pdf_imagebox
.y1
=0.0;
4280 t2p
->pdf_imagebox
.x2
=t2p
->pdf_imagewidth
;
4281 t2p
->pdf_imagebox
.y2
=t2p
->pdf_imagelength
;
4282 if(t2p
->pdf_overridepagesize
!=0){
4283 t2p
->pdf_imagebox
.x1
+=((t2p
->pdf_pagewidth
-t2p
->pdf_imagewidth
)/2.0F
);
4284 t2p
->pdf_imagebox
.y1
+=((t2p
->pdf_pagelength
-t2p
->pdf_imagelength
)/2.0F
);
4285 t2p
->pdf_imagebox
.x2
+=((t2p
->pdf_pagewidth
-t2p
->pdf_imagewidth
)/2.0F
);
4286 t2p
->pdf_imagebox
.y2
+=((t2p
->pdf_pagelength
-t2p
->pdf_imagelength
)/2.0F
);
4288 if(t2p
->tiff_orientation
> 4){
4289 f
=t2p
->pdf_mediabox
.x2
;
4290 t2p
->pdf_mediabox
.x2
=t2p
->pdf_mediabox
.y2
;
4291 t2p
->pdf_mediabox
.y2
=f
;
4293 istiled
=((t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilecount
==0) ? 0 : 1;
4295 t2p_compose_pdf_page_orient(&(t2p
->pdf_imagebox
), t2p
->tiff_orientation
);
4298 tilewidth
=(t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilewidth
;
4299 tilelength
=(t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilelength
;
4300 tilecountx
=(t2p
->tiff_width
+
4303 (t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilecountx
=tilecountx
;
4304 tilecounty
=(t2p
->tiff_length
+
4307 (t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilecounty
=tilecounty
;
4308 (t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_edgetilewidth
=
4309 t2p
->tiff_width
% tilewidth
;
4310 (t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_edgetilelength
=
4311 t2p
->tiff_length
% tilelength
;
4312 tiles
=(t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tiles
;
4313 for(i2
=0;i2
<tilecounty
-1;i2
++){
4314 for(i
=0;i
<tilecountx
-1;i
++){
4315 boxp
=&(tiles
[i2
*tilecountx
+i
].tile_box
);
4317 t2p
->pdf_imagebox
.x1
4318 + ((float)(t2p
->pdf_imagewidth
* i
* tilewidth
)
4319 / (float)t2p
->tiff_width
);
4321 t2p
->pdf_imagebox
.x1
4322 + ((float)(t2p
->pdf_imagewidth
* (i
+1) * tilewidth
)
4323 / (float)t2p
->tiff_width
);
4325 t2p
->pdf_imagebox
.y2
4326 - ((float)(t2p
->pdf_imagelength
* (i2
+1) * tilelength
)
4327 / (float)t2p
->tiff_length
);
4329 t2p
->pdf_imagebox
.y2
4330 - ((float)(t2p
->pdf_imagelength
* i2
* tilelength
)
4331 / (float)t2p
->tiff_length
);
4333 boxp
=&(tiles
[i2
*tilecountx
+i
].tile_box
);
4335 t2p
->pdf_imagebox
.x1
4336 + ((float)(t2p
->pdf_imagewidth
* i
* tilewidth
)
4337 / (float)t2p
->tiff_width
);
4338 boxp
->x2
= t2p
->pdf_imagebox
.x2
;
4340 t2p
->pdf_imagebox
.y2
4341 - ((float)(t2p
->pdf_imagelength
* (i2
+1) * tilelength
)
4342 / (float)t2p
->tiff_length
);
4344 t2p
->pdf_imagebox
.y2
4345 - ((float)(t2p
->pdf_imagelength
* i2
* tilelength
)
4346 / (float)t2p
->tiff_length
);
4348 for(i
=0;i
<tilecountx
-1;i
++){
4349 boxp
=&(tiles
[i2
*tilecountx
+i
].tile_box
);
4351 t2p
->pdf_imagebox
.x1
4352 + ((float)(t2p
->pdf_imagewidth
* i
* tilewidth
)
4353 / (float)t2p
->tiff_width
);
4355 t2p
->pdf_imagebox
.x1
4356 + ((float)(t2p
->pdf_imagewidth
* (i
+1) * tilewidth
)
4357 / (float)t2p
->tiff_width
);
4358 boxp
->y1
= t2p
->pdf_imagebox
.y1
;
4360 t2p
->pdf_imagebox
.y2
4361 - ((float)(t2p
->pdf_imagelength
* i2
* tilelength
)
4362 / (float)t2p
->tiff_length
);
4364 boxp
=&(tiles
[i2
*tilecountx
+i
].tile_box
);
4366 t2p
->pdf_imagebox
.x1
4367 + ((float)(t2p
->pdf_imagewidth
* i
* tilewidth
)
4368 / (float)t2p
->tiff_width
);
4369 boxp
->x2
= t2p
->pdf_imagebox
.x2
;
4370 boxp
->y1
= t2p
->pdf_imagebox
.y1
;
4372 t2p
->pdf_imagebox
.y2
4373 - ((float)(t2p
->pdf_imagelength
* i2
* tilelength
)
4374 / (float)t2p
->tiff_length
);
4376 if(t2p
->tiff_orientation
==0 || t2p
->tiff_orientation
==1){
4377 for(i
=0;i
<(t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilecount
;i
++){
4378 t2p_compose_pdf_page_orient( &(tiles
[i
].tile_box
) , 0);
4382 for(i
=0;i
<(t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilecount
;i
++){
4383 boxp
=&(tiles
[i
].tile_box
);
4384 boxp
->x1
-= t2p
->pdf_imagebox
.x1
;
4385 boxp
->x2
-= t2p
->pdf_imagebox
.x1
;
4386 boxp
->y1
-= t2p
->pdf_imagebox
.y1
;
4387 boxp
->y2
-= t2p
->pdf_imagebox
.y1
;
4388 if(t2p
->tiff_orientation
==2 || t2p
->tiff_orientation
==3){
4389 boxp
->x1
= t2p
->pdf_imagebox
.x2
- t2p
->pdf_imagebox
.x1
- boxp
->x1
;
4390 boxp
->x2
= t2p
->pdf_imagebox
.x2
- t2p
->pdf_imagebox
.x1
- boxp
->x2
;
4392 if(t2p
->tiff_orientation
==3 || t2p
->tiff_orientation
==4){
4393 boxp
->y1
= t2p
->pdf_imagebox
.y2
- t2p
->pdf_imagebox
.y1
- boxp
->y1
;
4394 boxp
->y2
= t2p
->pdf_imagebox
.y2
- t2p
->pdf_imagebox
.y1
- boxp
->y2
;
4396 if(t2p
->tiff_orientation
==8 || t2p
->tiff_orientation
==5){
4397 boxp
->y1
= t2p
->pdf_imagebox
.y2
- t2p
->pdf_imagebox
.y1
- boxp
->y1
;
4398 boxp
->y2
= t2p
->pdf_imagebox
.y2
- t2p
->pdf_imagebox
.y1
- boxp
->y2
;
4400 if(t2p
->tiff_orientation
==5 || t2p
->tiff_orientation
==6){
4401 boxp
->x1
= t2p
->pdf_imagebox
.x2
- t2p
->pdf_imagebox
.x1
- boxp
->x1
;
4402 boxp
->x2
= t2p
->pdf_imagebox
.x2
- t2p
->pdf_imagebox
.x1
- boxp
->x2
;
4404 if(t2p
->tiff_orientation
> 4){
4406 boxp
->x1
= boxp
->y1
;
4409 boxp
->x2
= boxp
->y2
;
4411 t2p_compose_pdf_page_orient_flip(boxp
, t2p
->tiff_orientation
);
4413 t2p_compose_pdf_page_orient(boxp
, t2p
->tiff_orientation
);
4421 void t2p_compose_pdf_page_orient(T2P_BOX
* boxp
, uint16 orientation
){
4426 if( boxp
->x1
> boxp
->x2
){
4431 if( boxp
->y1
> boxp
->y2
){
4436 boxp
->mat
[0]=m1
[0]=boxp
->x2
-boxp
->x1
;
4437 boxp
->mat
[1]=m1
[1]=0.0;
4438 boxp
->mat
[2]=m1
[2]=0.0;
4439 boxp
->mat
[3]=m1
[3]=0.0;
4440 boxp
->mat
[4]=m1
[4]=boxp
->y2
-boxp
->y1
;
4441 boxp
->mat
[5]=m1
[5]=0.0;
4442 boxp
->mat
[6]=m1
[6]=boxp
->x1
;
4443 boxp
->mat
[7]=m1
[7]=boxp
->y1
;
4444 boxp
->mat
[8]=m1
[8]=1.0;
4445 switch(orientation
){
4450 boxp
->mat
[0]=0.0F
-m1
[0];
4451 boxp
->mat
[6]+=m1
[0];
4454 boxp
->mat
[0]=0.0F
-m1
[0];
4455 boxp
->mat
[4]=0.0F
-m1
[4];
4456 boxp
->mat
[6]+=m1
[0];
4457 boxp
->mat
[7]+=m1
[4];
4460 boxp
->mat
[4]=0.0F
-m1
[4];
4461 boxp
->mat
[7]+=m1
[4];
4465 boxp
->mat
[1]=0.0F
-m1
[0];
4466 boxp
->mat
[3]=0.0F
-m1
[4];
4468 boxp
->mat
[6]+=m1
[4];
4469 boxp
->mat
[7]+=m1
[0];
4473 boxp
->mat
[1]=0.0F
-m1
[0];
4476 boxp
->mat
[7]+=m1
[0];
4487 boxp
->mat
[3]=0.0F
-m1
[4];
4489 boxp
->mat
[6]+=m1
[4];
4496 void t2p_compose_pdf_page_orient_flip(T2P_BOX
* boxp
, uint16 orientation
){
4501 if( boxp
->x1
> boxp
->x2
){
4506 if( boxp
->y1
> boxp
->y2
){
4511 boxp
->mat
[0]=m1
[0]=boxp
->x2
-boxp
->x1
;
4512 boxp
->mat
[1]=m1
[1]=0.0F
;
4513 boxp
->mat
[2]=m1
[2]=0.0F
;
4514 boxp
->mat
[3]=m1
[3]=0.0F
;
4515 boxp
->mat
[4]=m1
[4]=boxp
->y2
-boxp
->y1
;
4516 boxp
->mat
[5]=m1
[5]=0.0F
;
4517 boxp
->mat
[6]=m1
[6]=boxp
->x1
;
4518 boxp
->mat
[7]=m1
[7]=boxp
->y1
;
4519 boxp
->mat
[8]=m1
[8]=1.0F
;
4520 switch(orientation
){
4523 boxp
->mat
[1]=0.0F
-m1
[4];
4524 boxp
->mat
[3]=0.0F
-m1
[0];
4526 boxp
->mat
[6]+=m1
[0];
4527 boxp
->mat
[7]+=m1
[4];
4531 boxp
->mat
[1]=0.0F
-m1
[4];
4534 boxp
->mat
[7]+=m1
[4];
4545 boxp
->mat
[3]=0.0F
-m1
[0];
4547 boxp
->mat
[6]+=m1
[0];
4555 This function writes a PDF Contents stream to output.
4558 tsize_t
t2p_write_pdf_page_content_stream(T2P
* t2p
, TIFF
* output
){
4566 if(t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
>0){
4567 for(i
=0;i
<t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
; i
++){
4568 box
=t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tiles
[i
].tile_box
;
4569 buflen
=sprintf(buffer
,
4570 "q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d_%ld Do Q\n",
4571 t2p
->tiff_transferfunctioncount
?"/GS1 gs ":"",
4580 written
+= t2p_write_pdf_stream(buffer
, buflen
, output
);
4583 box
=t2p
->pdf_imagebox
;
4584 buflen
=sprintf(buffer
,
4585 "q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n",
4586 t2p
->tiff_transferfunctioncount
?"/GS1 gs ":"",
4594 written
+= t2p_write_pdf_stream(buffer
, buflen
, output
);
4601 This function writes a PDF Image XObject stream dictionary to output.
4604 tsize_t
t2p_write_pdf_xobject_stream_dict(ttile_t tile
,
4612 written
+= t2p_write_pdf_stream_dict(0, t2p
->pdf_xrefcount
+1, output
);
4613 written
+= t2pWriteFile(output
,
4614 (tdata_t
) "/Type /XObject \n/Subtype /Image \n/Name /Im",
4616 buflen
=sprintf(buffer
, "%u", t2p
->pdf_page
+1);
4617 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4619 written
+= t2pWriteFile(output
, (tdata_t
) "_", 1);
4620 buflen
=sprintf(buffer
, "%lu", (unsigned long)tile
);
4621 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4623 written
+= t2pWriteFile(output
, (tdata_t
) "\n/Width ", 8);
4624 _TIFFmemset((tdata_t
)buffer
, 0x00, 16);
4626 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->tiff_width
);
4628 if(t2p_tile_is_right_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
-1)!=0){
4632 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilewidth
);
4637 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
);
4640 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4641 written
+= t2pWriteFile(output
, (tdata_t
) "\n/Height ", 9);
4642 _TIFFmemset((tdata_t
)buffer
, 0x00, 16);
4644 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->tiff_length
);
4646 if(t2p_tile_is_bottom_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
-1)!=0){
4650 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilelength
);
4655 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
);
4658 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4659 written
+= t2pWriteFile(output
, (tdata_t
) "\n/BitsPerComponent ", 19);
4660 _TIFFmemset((tdata_t
)buffer
, 0x00, 16);
4661 buflen
=sprintf(buffer
, "%u", t2p
->tiff_bitspersample
);
4662 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4663 written
+= t2pWriteFile(output
, (tdata_t
) "\n/ColorSpace ", 13);
4664 written
+= t2p_write_pdf_xobject_cs(t2p
, output
);
4665 if (t2p
->pdf_image_interpolate
)
4666 written
+= t2pWriteFile(output
,
4667 (tdata_t
) "\n/Interpolate true", 18);
4668 if( (t2p
->pdf_switchdecode
!= 0)
4669 #ifdef CCITT_SUPPORT
4670 && ! (t2p
->pdf_colorspace
== T2P_CS_BILEVEL
4671 && t2p
->pdf_compression
== T2P_COMPRESS_G4
)
4674 written
+= t2p_write_pdf_xobject_decode(t2p
, output
);
4676 written
+= t2p_write_pdf_xobject_stream_filter(tile
, t2p
, output
);
4682 * This function writes a PDF Image XObject Colorspace name to output.
4686 tsize_t
t2p_write_pdf_xobject_cs(T2P
* t2p
, TIFF
* output
){
4696 if( (t2p
->pdf_colorspace
& T2P_CS_ICCBASED
) != 0){
4697 written
+= t2p_write_pdf_xobject_icccs(t2p
, output
);
4700 if( (t2p
->pdf_colorspace
& T2P_CS_PALETTE
) != 0){
4701 written
+= t2pWriteFile(output
, (tdata_t
) "[ /Indexed ", 11);
4702 t2p
->pdf_colorspace
^= T2P_CS_PALETTE
;
4703 written
+= t2p_write_pdf_xobject_cs(t2p
, output
);
4704 t2p
->pdf_colorspace
|= T2P_CS_PALETTE
;
4705 buflen
=sprintf(buffer
, "%u", (0x0001 << t2p
->tiff_bitspersample
)-1 );
4706 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4707 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4708 _TIFFmemset(buffer
, 0x00, 16);
4709 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_palettecs
);
4710 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4711 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ]\n", 7);
4714 if(t2p
->pdf_colorspace
& T2P_CS_BILEVEL
){
4715 written
+= t2pWriteFile(output
, (tdata_t
) "/DeviceGray \n", 13);
4717 if(t2p
->pdf_colorspace
& T2P_CS_GRAY
){
4718 if(t2p
->pdf_colorspace
& T2P_CS_CALGRAY
){
4719 written
+= t2p_write_pdf_xobject_calcs(t2p
, output
);
4721 written
+= t2pWriteFile(output
, (tdata_t
) "/DeviceGray \n", 13);
4724 if(t2p
->pdf_colorspace
& T2P_CS_RGB
){
4725 if(t2p
->pdf_colorspace
& T2P_CS_CALRGB
){
4726 written
+= t2p_write_pdf_xobject_calcs(t2p
, output
);
4728 written
+= t2pWriteFile(output
, (tdata_t
) "/DeviceRGB \n", 12);
4731 if(t2p
->pdf_colorspace
& T2P_CS_CMYK
){
4732 written
+= t2pWriteFile(output
, (tdata_t
) "/DeviceCMYK \n", 13);
4734 if(t2p
->pdf_colorspace
& T2P_CS_LAB
){
4735 written
+= t2pWriteFile(output
, (tdata_t
) "[/Lab << \n", 10);
4736 written
+= t2pWriteFile(output
, (tdata_t
) "/WhitePoint ", 12);
4737 X_W
= t2p
->tiff_whitechromaticities
[0];
4738 Y_W
= t2p
->tiff_whitechromaticities
[1];
4739 Z_W
= 1.0F
- (X_W
+ Y_W
);
4743 buflen
=sprintf(buffer
, "[%.4f %.4f %.4f] \n", X_W
, Y_W
, Z_W
);
4744 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4745 written
+= t2pWriteFile(output
, (tdata_t
) "/Range ", 7);
4746 buflen
=sprintf(buffer
, "[%d %d %d %d] \n",
4747 t2p
->pdf_labrange
[0],
4748 t2p
->pdf_labrange
[1],
4749 t2p
->pdf_labrange
[2],
4750 t2p
->pdf_labrange
[3]);
4751 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4752 written
+= t2pWriteFile(output
, (tdata_t
) ">>] \n", 5);
4759 tsize_t
t2p_write_pdf_transfer(T2P
* t2p
, TIFF
* output
){
4765 written
+= t2pWriteFile(output
, (tdata_t
) "<< /Type /ExtGState \n/TR ", 25);
4766 if(t2p
->tiff_transferfunctioncount
== 1){
4767 buflen
=sprintf(buffer
, "%lu",
4768 (unsigned long)(t2p
->pdf_xrefcount
+ 1));
4769 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4770 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4772 written
+= t2pWriteFile(output
, (tdata_t
) "[ ", 2);
4773 buflen
=sprintf(buffer
, "%lu",
4774 (unsigned long)(t2p
->pdf_xrefcount
+ 1));
4775 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4776 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4777 buflen
=sprintf(buffer
, "%lu",
4778 (unsigned long)(t2p
->pdf_xrefcount
+ 2));
4779 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4780 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4781 buflen
=sprintf(buffer
, "%lu",
4782 (unsigned long)(t2p
->pdf_xrefcount
+ 3));
4783 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4784 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4785 written
+= t2pWriteFile(output
, (tdata_t
) "/Identity ] ", 12);
4788 written
+= t2pWriteFile(output
, (tdata_t
) " >> \n", 5);
4793 tsize_t
t2p_write_pdf_transfer_dict(T2P
* t2p
, TIFF
* output
, uint16 i
){
4800 written
+= t2pWriteFile(output
, (tdata_t
) "/FunctionType 0 \n", 17);
4801 written
+= t2pWriteFile(output
, (tdata_t
) "/Domain [0.0 1.0] \n", 19);
4802 written
+= t2pWriteFile(output
, (tdata_t
) "/Range [0.0 1.0] \n", 18);
4803 buflen
=sprintf(buffer
, "/Size [%u] \n", (1<<t2p
->tiff_bitspersample
));
4804 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4805 written
+= t2pWriteFile(output
, (tdata_t
) "/BitsPerSample 16 \n", 19);
4806 written
+= t2p_write_pdf_stream_dict(((tsize_t
)1)<<(t2p
->tiff_bitspersample
+1), 0, output
);
4811 tsize_t
t2p_write_pdf_transfer_stream(T2P
* t2p
, TIFF
* output
, uint16 i
){
4815 written
+= t2p_write_pdf_stream(
4816 t2p
->tiff_transferfunction
[i
],
4817 (((tsize_t
)1)<<(t2p
->tiff_bitspersample
+1)),
4824 This function writes a PDF Image XObject Colorspace array to output.
4827 tsize_t
t2p_write_pdf_xobject_calcs(T2P
* t2p
, TIFF
* output
){
4858 written
+= t2pWriteFile(output
, (tdata_t
) "[", 1);
4859 if(t2p
->pdf_colorspace
& T2P_CS_CALGRAY
){
4860 written
+= t2pWriteFile(output
, (tdata_t
) "/CalGray ", 9);
4861 X_W
= t2p
->tiff_whitechromaticities
[0];
4862 Y_W
= t2p
->tiff_whitechromaticities
[1];
4863 Z_W
= 1.0F
- (X_W
+ Y_W
);
4868 if(t2p
->pdf_colorspace
& T2P_CS_CALRGB
){
4869 written
+= t2pWriteFile(output
, (tdata_t
) "/CalRGB ", 8);
4870 x_w
= t2p
->tiff_whitechromaticities
[0];
4871 y_w
= t2p
->tiff_whitechromaticities
[1];
4872 x_r
= t2p
->tiff_primarychromaticities
[0];
4873 y_r
= t2p
->tiff_primarychromaticities
[1];
4874 x_g
= t2p
->tiff_primarychromaticities
[2];
4875 y_g
= t2p
->tiff_primarychromaticities
[3];
4876 x_b
= t2p
->tiff_primarychromaticities
[4];
4877 y_b
= t2p
->tiff_primarychromaticities
[5];
4878 z_w
= y_w
* ((x_g
- x_b
)*y_r
- (x_r
-x_b
)*y_g
+ (x_r
-x_g
)*y_b
);
4879 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
;
4880 X_R
= Y_R
* x_r
/ y_r
;
4881 Z_R
= Y_R
* (((1-x_r
)/y_r
)-1);
4882 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
;
4883 X_G
= Y_G
* x_g
/ y_g
;
4884 Z_G
= Y_G
* (((1-x_g
)/y_g
)-1);
4885 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
;
4886 X_B
= Y_B
* x_b
/ y_b
;
4887 Z_B
= Y_B
* (((1-x_b
)/y_b
)-1);
4888 X_W
= (X_R
* R
) + (X_G
* G
) + (X_B
* B
);
4889 Y_W
= (Y_R
* R
) + (Y_G
* G
) + (Y_B
* B
);
4890 Z_W
= (Z_R
* R
) + (Z_G
* G
) + (Z_B
* B
);
4895 written
+= t2pWriteFile(output
, (tdata_t
) "<< \n", 4);
4896 if(t2p
->pdf_colorspace
& T2P_CS_CALGRAY
){
4897 written
+= t2pWriteFile(output
, (tdata_t
) "/WhitePoint ", 12);
4898 buflen
=sprintf(buffer
, "[%.4f %.4f %.4f] \n", X_W
, Y_W
, Z_W
);
4899 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4900 written
+= t2pWriteFile(output
, (tdata_t
) "/Gamma 2.2 \n", 12);
4902 if(t2p
->pdf_colorspace
& T2P_CS_CALRGB
){
4903 written
+= t2pWriteFile(output
, (tdata_t
) "/WhitePoint ", 12);
4904 buflen
=sprintf(buffer
, "[%.4f %.4f %.4f] \n", X_W
, Y_W
, Z_W
);
4905 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4906 written
+= t2pWriteFile(output
, (tdata_t
) "/Matrix ", 8);
4907 buflen
=sprintf(buffer
, "[%.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f] \n",
4911 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4912 written
+= t2pWriteFile(output
, (tdata_t
) "/Gamma [2.2 2.2 2.2] \n", 22);
4914 written
+= t2pWriteFile(output
, (tdata_t
) ">>] \n", 5);
4920 This function writes a PDF Image XObject Colorspace array to output.
4923 tsize_t
t2p_write_pdf_xobject_icccs(T2P
* t2p
, TIFF
* output
){
4929 written
+= t2pWriteFile(output
, (tdata_t
) "[/ICCBased ", 11);
4930 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_icccs
);
4931 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4932 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R] \n", 7);
4937 tsize_t
t2p_write_pdf_xobject_icccs_dict(T2P
* t2p
, TIFF
* output
){
4943 written
+= t2pWriteFile(output
, (tdata_t
) "/N ", 3);
4944 buflen
=sprintf(buffer
, "%u \n", t2p
->tiff_samplesperpixel
);
4945 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4946 written
+= t2pWriteFile(output
, (tdata_t
) "/Alternate ", 11);
4947 t2p
->pdf_colorspace
^= T2P_CS_ICCBASED
;
4948 written
+= t2p_write_pdf_xobject_cs(t2p
, output
);
4949 t2p
->pdf_colorspace
|= T2P_CS_ICCBASED
;
4950 written
+= t2p_write_pdf_stream_dict(t2p
->tiff_iccprofilelength
, 0, output
);
4955 tsize_t
t2p_write_pdf_xobject_icccs_stream(T2P
* t2p
, TIFF
* output
){
4959 written
+= t2p_write_pdf_stream(
4960 (tdata_t
) t2p
->tiff_iccprofile
,
4961 (tsize_t
) t2p
->tiff_iccprofilelength
,
4968 This function writes a palette stream for an indexed color space to output.
4971 tsize_t
t2p_write_pdf_xobject_palettecs_stream(T2P
* t2p
, TIFF
* output
){
4975 written
+= t2p_write_pdf_stream(
4976 (tdata_t
) t2p
->pdf_palette
,
4977 (tsize_t
) t2p
->pdf_palettesize
,
4984 This function writes a PDF Image XObject Decode array to output.
4987 tsize_t
t2p_write_pdf_xobject_decode(T2P
* t2p
, TIFF
* output
){
4992 written
+= t2pWriteFile(output
, (tdata_t
) "/Decode [ ", 10);
4993 for (i
=0;i
<t2p
->tiff_samplesperpixel
;i
++){
4994 written
+= t2pWriteFile(output
, (tdata_t
) "1 0 ", 4);
4996 written
+= t2pWriteFile(output
, (tdata_t
) "]\n", 2);
5002 This function writes a PDF Image XObject stream filter name and parameters to
5006 tsize_t
t2p_write_pdf_xobject_stream_filter(ttile_t tile
, T2P
* t2p
, TIFF
* output
){
5012 if(t2p
->pdf_compression
==T2P_COMPRESS_NONE
){
5015 written
+= t2pWriteFile(output
, (tdata_t
) "/Filter ", 8);
5016 switch(t2p
->pdf_compression
){
5017 #ifdef CCITT_SUPPORT
5018 case T2P_COMPRESS_G4
:
5019 written
+= t2pWriteFile(output
, (tdata_t
) "/CCITTFaxDecode ", 16);
5020 written
+= t2pWriteFile(output
, (tdata_t
) "/DecodeParms ", 13);
5021 written
+= t2pWriteFile(output
, (tdata_t
) "<< /K -1 ", 9);
5023 written
+= t2pWriteFile(output
, (tdata_t
) "/Columns ", 9);
5024 buflen
=sprintf(buffer
, "%lu",
5025 (unsigned long)t2p
->tiff_width
);
5026 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5027 written
+= t2pWriteFile(output
, (tdata_t
) " /Rows ", 7);
5028 buflen
=sprintf(buffer
, "%lu",
5029 (unsigned long)t2p
->tiff_length
);
5030 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5032 if(t2p_tile_is_right_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
-1)==0){
5033 written
+= t2pWriteFile(output
, (tdata_t
) "/Columns ", 9);
5037 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
);
5038 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5040 written
+= t2pWriteFile(output
, (tdata_t
) "/Columns ", 9);
5044 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilewidth
);
5045 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5047 if(t2p_tile_is_bottom_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
-1)==0){
5048 written
+= t2pWriteFile(output
, (tdata_t
) " /Rows ", 7);
5052 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
);
5053 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5055 written
+= t2pWriteFile(output
, (tdata_t
) " /Rows ", 7);
5059 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilelength
);
5060 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5063 if(t2p
->pdf_switchdecode
== 0){
5064 written
+= t2pWriteFile(output
, (tdata_t
) " /BlackIs1 true ", 16);
5066 written
+= t2pWriteFile(output
, (tdata_t
) ">>\n", 3);
5070 case T2P_COMPRESS_JPEG
:
5071 written
+= t2pWriteFile(output
, (tdata_t
) "/DCTDecode ", 11);
5073 if(t2p
->tiff_photometric
!= PHOTOMETRIC_YCBCR
) {
5074 written
+= t2pWriteFile(output
, (tdata_t
) "/DecodeParms ", 13);
5075 written
+= t2pWriteFile(output
, (tdata_t
) "<< /ColorTransform 0 >>\n", 24);
5080 case T2P_COMPRESS_ZIP
:
5081 written
+= t2pWriteFile(output
, (tdata_t
) "/FlateDecode ", 13);
5082 if(t2p
->pdf_compressionquality%100
){
5083 written
+= t2pWriteFile(output
, (tdata_t
) "/DecodeParms ", 13);
5084 written
+= t2pWriteFile(output
, (tdata_t
) "<< /Predictor ", 14);
5085 _TIFFmemset(buffer
, 0x00, 16);
5086 buflen
=sprintf(buffer
, "%u", t2p
->pdf_compressionquality%100
);
5087 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5088 written
+= t2pWriteFile(output
, (tdata_t
) " /Columns ", 10);
5089 _TIFFmemset(buffer
, 0x00, 16);
5090 buflen
= sprintf(buffer
, "%lu",
5091 (unsigned long)t2p
->tiff_width
);
5092 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5093 written
+= t2pWriteFile(output
, (tdata_t
) " /Colors ", 9);
5094 _TIFFmemset(buffer
, 0x00, 16);
5095 buflen
=sprintf(buffer
, "%u", t2p
->tiff_samplesperpixel
);
5096 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5097 written
+= t2pWriteFile(output
, (tdata_t
) " /BitsPerComponent ", 19);
5098 _TIFFmemset(buffer
, 0x00, 16);
5099 buflen
=sprintf(buffer
, "%u", t2p
->tiff_bitspersample
);
5100 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5101 written
+= t2pWriteFile(output
, (tdata_t
) ">>\n", 3);
5113 This function writes a PDF xref table to output.
5116 tsize_t
t2p_write_pdf_xreftable(T2P
* t2p
, TIFF
* output
){
5123 written
+= t2pWriteFile(output
, (tdata_t
) "xref\n0 ", 7);
5124 buflen
=sprintf(buffer
, "%lu", (unsigned long)(t2p
->pdf_xrefcount
+ 1));
5125 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5126 written
+= t2pWriteFile(output
, (tdata_t
) " \n0000000000 65535 f \n", 22);
5127 for (i
=0;i
<t2p
->pdf_xrefcount
;i
++){
5128 sprintf(buffer
, "%.10lu 00000 n \n",
5129 (unsigned long)t2p
->pdf_xrefoffsets
[i
]);
5130 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 20);
5137 * This function writes a PDF trailer to output.
5140 tsize_t
t2p_write_pdf_trailer(T2P
* t2p
, TIFF
* output
)
5143 tsize_t written
= 0;
5148 for (i
= 0; i
< sizeof(t2p
->pdf_fileid
) - 8; i
+= 8)
5149 snprintf(t2p
->pdf_fileid
+ i
, 9, "%.8X", rand());
5151 written
+= t2pWriteFile(output
, (tdata_t
) "trailer\n<<\n/Size ", 17);
5152 buflen
= sprintf(buffer
, "%lu", (unsigned long)(t2p
->pdf_xrefcount
+1));
5153 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5154 _TIFFmemset(buffer
, 0x00, 32);
5155 written
+= t2pWriteFile(output
, (tdata_t
) "\n/Root ", 7);
5156 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_catalog
);
5157 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5158 _TIFFmemset(buffer
, 0x00, 32);
5159 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n/Info ", 12);
5160 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_info
);
5161 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5162 _TIFFmemset(buffer
, 0x00, 32);
5163 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n/ID[<", 11);
5164 written
+= t2pWriteFile(output
, (tdata_t
) t2p
->pdf_fileid
,
5165 sizeof(t2p
->pdf_fileid
) - 1);
5166 written
+= t2pWriteFile(output
, (tdata_t
) "><", 2);
5167 written
+= t2pWriteFile(output
, (tdata_t
) t2p
->pdf_fileid
,
5168 sizeof(t2p
->pdf_fileid
) - 1);
5169 written
+= t2pWriteFile(output
, (tdata_t
) ">]\n>>\nstartxref\n", 16);
5170 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_startxref
);
5171 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5172 _TIFFmemset(buffer
, 0x00, 32);
5173 written
+= t2pWriteFile(output
, (tdata_t
) "\n%%EOF\n", 7);
5180 This function writes a PDF to a file given a pointer to a TIFF.
5182 The idea with using a TIFF* as output for a PDF file is that the file
5183 can be created with TIFFClientOpen for memory-mapped use within the TIFF
5184 library, and TIFFWriteEncodedStrip can be used to write compressed data to
5185 the output. The output is not actually a TIFF file, it is a PDF file.
5187 This function uses only t2pWriteFile and TIFFWriteEncodedStrip to write to
5188 the output TIFF file. When libtiff would otherwise be writing data to the
5189 output file, the write procedure of the TIFF structure is replaced with an
5190 empty implementation.
5192 The first argument to the function is an initialized and validated T2P
5193 context struct pointer.
5195 The second argument to the function is the TIFF* that is the input that has
5196 been opened for reading and no other functions have been called upon it.
5198 The third argument to the function is the TIFF* that is the output that has
5199 been opened for writing. It has to be opened so that it hasn't written any
5200 data to the output. If the output is seekable then it's OK to seek to the
5201 beginning of the file. The function only writes to the output PDF and does
5202 not seek. See the example usage in the main() function.
5204 TIFF* output = TIFFOpen("output.pdf", "w");
5205 assert(output != NULL);
5207 if(output->tif_seekproc != NULL){
5208 t2pSeekFile(output, (toff_t) 0, SEEK_SET);
5211 This function returns the file size of the output PDF file. On error it
5212 returns zero and the t2p->t2p_error variable is set to T2P_ERR_ERROR.
5214 After this function completes, call t2p_free on t2p, TIFFClose on input,
5215 and TIFFClose on output.
5218 tsize_t
t2p_write_pdf(T2P
* t2p
, TIFF
* input
, TIFF
* output
){
5222 tsize_t streamlen
=0;
5225 t2p_read_tiff_init(t2p
, input
);
5226 if(t2p
->t2p_error
!=T2P_ERR_OK
){return(0);}
5227 t2p
->pdf_xrefoffsets
= (uint32
*) _TIFFmalloc(t2p
->pdf_xrefcount
* sizeof(uint32
) );
5228 if(t2p
->pdf_xrefoffsets
==NULL
){
5231 "Can't allocate %u bytes of memory for t2p_write_pdf",
5232 (unsigned int) (t2p
->pdf_xrefcount
* sizeof(uint32
)) );
5233 t2p
->t2p_error
= T2P_ERR_ERROR
;
5236 t2p
->pdf_xrefcount
=0;
5240 written
+= t2p_write_pdf_header(t2p
, output
);
5241 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5242 t2p
->pdf_catalog
=t2p
->pdf_xrefcount
;
5243 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5244 written
+= t2p_write_pdf_catalog(t2p
, output
);
5245 written
+= t2p_write_pdf_obj_end(output
);
5246 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5247 t2p
->pdf_info
=t2p
->pdf_xrefcount
;
5248 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5249 written
+= t2p_write_pdf_info(t2p
, input
, output
);
5250 written
+= t2p_write_pdf_obj_end(output
);
5251 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5252 t2p
->pdf_pages
=t2p
->pdf_xrefcount
;
5253 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5254 written
+= t2p_write_pdf_pages(t2p
, output
);
5255 written
+= t2p_write_pdf_obj_end(output
);
5256 for(t2p
->pdf_page
=0;t2p
->pdf_page
<t2p
->tiff_pagecount
;t2p
->pdf_page
++){
5257 t2p_read_tiff_data(t2p
, input
);
5258 if(t2p
->t2p_error
!=T2P_ERR_OK
){return(0);}
5259 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5260 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5261 written
+= t2p_write_pdf_page(t2p
->pdf_xrefcount
, t2p
, output
);
5262 written
+= t2p_write_pdf_obj_end(output
);
5263 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5264 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5265 written
+= t2p_write_pdf_stream_dict_start(output
);
5266 written
+= t2p_write_pdf_stream_dict(0, t2p
->pdf_xrefcount
+1, output
);
5267 written
+= t2p_write_pdf_stream_dict_end(output
);
5268 written
+= t2p_write_pdf_stream_start(output
);
5270 written
+= t2p_write_pdf_page_content_stream(t2p
, output
);
5271 streamlen
=written
-streamlen
;
5272 written
+= t2p_write_pdf_stream_end(output
);
5273 written
+= t2p_write_pdf_obj_end(output
);
5274 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5275 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5276 written
+= t2p_write_pdf_stream_length(streamlen
, output
);
5277 written
+= t2p_write_pdf_obj_end(output
);
5278 if(t2p
->tiff_transferfunctioncount
!= 0){
5279 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5280 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5281 written
+= t2p_write_pdf_transfer(t2p
, output
);
5282 written
+= t2p_write_pdf_obj_end(output
);
5283 for(i
=0; i
< t2p
->tiff_transferfunctioncount
; i
++){
5284 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5285 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5286 written
+= t2p_write_pdf_stream_dict_start(output
);
5287 written
+= t2p_write_pdf_transfer_dict(t2p
, output
, i
);
5288 written
+= t2p_write_pdf_stream_dict_end(output
);
5289 written
+= t2p_write_pdf_stream_start(output
);
5291 written
+= t2p_write_pdf_transfer_stream(t2p
, output
, i
);
5292 streamlen
=written
-streamlen
;
5293 written
+= t2p_write_pdf_stream_end(output
);
5294 written
+= t2p_write_pdf_obj_end(output
);
5297 if( (t2p
->pdf_colorspace
& T2P_CS_PALETTE
) != 0){
5298 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5299 t2p
->pdf_palettecs
=t2p
->pdf_xrefcount
;
5300 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5301 written
+= t2p_write_pdf_stream_dict_start(output
);
5302 written
+= t2p_write_pdf_stream_dict(t2p
->pdf_palettesize
, 0, output
);
5303 written
+= t2p_write_pdf_stream_dict_end(output
);
5304 written
+= t2p_write_pdf_stream_start(output
);
5306 written
+= t2p_write_pdf_xobject_palettecs_stream(t2p
, output
);
5307 streamlen
=written
-streamlen
;
5308 written
+= t2p_write_pdf_stream_end(output
);
5309 written
+= t2p_write_pdf_obj_end(output
);
5311 if( (t2p
->pdf_colorspace
& T2P_CS_ICCBASED
) != 0){
5312 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5313 t2p
->pdf_icccs
=t2p
->pdf_xrefcount
;
5314 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5315 written
+= t2p_write_pdf_stream_dict_start(output
);
5316 written
+= t2p_write_pdf_xobject_icccs_dict(t2p
, output
);
5317 written
+= t2p_write_pdf_stream_dict_end(output
);
5318 written
+= t2p_write_pdf_stream_start(output
);
5320 written
+= t2p_write_pdf_xobject_icccs_stream(t2p
, output
);
5321 streamlen
=written
-streamlen
;
5322 written
+= t2p_write_pdf_stream_end(output
);
5323 written
+= t2p_write_pdf_obj_end(output
);
5325 if(t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
!=0){
5326 for(i2
=0;i2
<t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
;i2
++){
5327 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5328 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5329 written
+= t2p_write_pdf_stream_dict_start(output
);
5330 written
+= t2p_write_pdf_xobject_stream_dict(
5334 written
+= t2p_write_pdf_stream_dict_end(output
);
5335 written
+= t2p_write_pdf_stream_start(output
);
5337 t2p_read_tiff_size_tile(t2p
, input
, i2
);
5338 written
+= t2p_readwrite_pdf_image_tile(t2p
, input
, output
, i2
);
5339 t2p_write_advance_directory(t2p
, output
);
5340 if(t2p
->t2p_error
!=T2P_ERR_OK
){return(0);}
5341 streamlen
=written
-streamlen
;
5342 written
+= t2p_write_pdf_stream_end(output
);
5343 written
+= t2p_write_pdf_obj_end(output
);
5344 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5345 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5346 written
+= t2p_write_pdf_stream_length(streamlen
, output
);
5347 written
+= t2p_write_pdf_obj_end(output
);
5350 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5351 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5352 written
+= t2p_write_pdf_stream_dict_start(output
);
5353 written
+= t2p_write_pdf_xobject_stream_dict(
5357 written
+= t2p_write_pdf_stream_dict_end(output
);
5358 written
+= t2p_write_pdf_stream_start(output
);
5360 t2p_read_tiff_size(t2p
, input
);
5361 written
+= t2p_readwrite_pdf_image(t2p
, input
, output
);
5362 t2p_write_advance_directory(t2p
, output
);
5363 if(t2p
->t2p_error
!=T2P_ERR_OK
){return(0);}
5364 streamlen
=written
-streamlen
;
5365 written
+= t2p_write_pdf_stream_end(output
);
5366 written
+= t2p_write_pdf_obj_end(output
);
5367 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5368 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5369 written
+= t2p_write_pdf_stream_length(streamlen
, output
);
5370 written
+= t2p_write_pdf_obj_end(output
);
5373 t2p
->pdf_startxref
= written
;
5374 written
+= t2p_write_pdf_xreftable(t2p
, output
);
5375 written
+= t2p_write_pdf_trailer(t2p
, output
);
5376 t2p_disable(output
);
5381 /* vim: set ts=8 sts=8 sw=8 noet: */