2 * tiff2pdf
- converts a TIFF image to a PDF document
4 * Copyright (c
) 2003 Ross Finlayson
6 * Permission to use
, copy
, modify
, distribute
, and sell
this software
and
7 * its documentation
for any purpose is hereby granted without fee
, provided
8 * that (i
) the above copyright notices
and this permission notice appear in
9 * all copies of the software
and related documentation
, and (ii
) the name of
10 * Ross Finlayson may
not be used in any advertising
or
11 * publicity relating to the software without the specific
, prior written
12 * permission of Ross Finlayson
.
14 * THE SOFTWARE IS PROVIDED
"AS-IS" AND WITHOUT WARRANTY OF ANY KIND
,
15 * EXPRESS
, IMPLIED OR OTHERWISE
, INCLUDING WITHOUT LIMITATION
, ANY
16 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
.
18 * IN NO EVENT SHALL ROSS FINLAYSON BE LIABLE FOR
19 * ANY SPECIAL
, INCIDENTAL
, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND
,
20 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE
, DATA OR PROFITS
,
21 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE
, AND ON ANY THEORY OF
22 * LIABILITY
, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
26 #include "tif_config.h"
55 extern int getopt(int, char**, char*);
59 # define EXIT_SUCCESS 0
62 # define EXIT_FAILURE 1
65 #define TIFF2PDF_MODULE "tiff2pdf"
67 #define PS_UNIT_SIZE 72.0F
69 /* This type is of PDF color spaces. */
71 T2P_CS_BILEVEL
= 0x01, /* Bilevel, black and white */
72 T2P_CS_GRAY
= 0x02, /* Single channel */
73 T2P_CS_RGB
= 0x04, /* Three channel tristimulus RGB */
74 T2P_CS_CMYK
= 0x08, /* Four channel CMYK print inkset */
75 T2P_CS_LAB
= 0x10, /* Three channel L*a*b* color space */
76 T2P_CS_PALETTE
= 0x1000,/* One of the above with a color map */
77 T2P_CS_CALGRAY
= 0x20, /* Calibrated single channel */
78 T2P_CS_CALRGB
= 0x40, /* Calibrated three channel tristimulus RGB */
79 T2P_CS_ICCBASED
= 0x80 /* ICC profile color specification */
82 /* This type is of PDF compression types. */
84 T2P_COMPRESS_NONE
=0x00
86 , T2P_COMPRESS_G4
=0x01
88 #if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
89 , T2P_COMPRESS_JPEG
=0x02
92 , T2P_COMPRESS_ZIP
=0x04
96 /* This type is whether TIFF image data can be used in PDF without transcoding. */
98 T2P_TRANSCODE_RAW
=0x01, /* The raw data from the input can be used without recompressing */
99 T2P_TRANSCODE_ENCODE
=0x02 /* The data from the input is perhaps unencoded and reencoded */
102 /* This type is of information about the data samples of the input image. */
104 T2P_SAMPLE_NOTHING
=0x0000, /* The unencoded samples are normal for the output colorspace */
105 T2P_SAMPLE_ABGR_TO_RGB
=0x0001, /* The unencoded samples are the result of ReadRGBAImage */
106 T2P_SAMPLE_RGBA_TO_RGB
=0x0002, /* The unencoded samples are contiguous RGBA */
107 T2P_SAMPLE_RGBAA_TO_RGB
=0x0004, /* The unencoded samples are RGBA with premultiplied alpha */
108 T2P_SAMPLE_YCBCR_TO_RGB
=0x0008,
109 T2P_SAMPLE_YCBCR_TO_LAB
=0x0010,
110 T2P_SAMPLE_REALIZE_PALETTE
=0x0020, /* The unencoded samples are indexes into the color map */
111 T2P_SAMPLE_SIGNED_TO_UNSIGNED
=0x0040, /* The unencoded samples are signed instead of unsignd */
112 T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED
=0x0040, /* The L*a*b* samples have a* and b* signed */
113 T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG
=0x0100 /* The unencoded samples are separate instead of contiguous */
116 /* This type is of error status of the T2P struct. */
118 T2P_ERR_OK
= 0, /* This is the value of t2p->t2p_error when there is no error */
119 T2P_ERR_ERROR
= 1 /* This is the value of t2p->t2p_error when there was an error */
122 /* This struct defines a logical page of a TIFF. */
124 tdir_t page_directory
;
126 ttile_t page_tilecount
;
130 /* This struct defines a PDF rectangle's coordinates. */
139 /* This struct defines a tile of a PDF. */
144 /* This struct defines information about the tiles on a PDF page. */
146 ttile_t tiles_tilecount
;
147 uint32 tiles_tilewidth
;
148 uint32 tiles_tilelength
;
149 uint32 tiles_tilecountx
;
150 uint32 tiles_tilecounty
;
151 uint32 tiles_edgetilewidth
;
152 uint32 tiles_edgetilelength
;
153 T2P_TILE
* tiles_tiles
;
156 /* This struct is the context of a function to generate PDF from a TIFF. */
159 T2P_PAGE
* tiff_pages
;
160 T2P_TILES
* tiff_tiles
;
161 tdir_t tiff_pagecount
;
162 uint16 tiff_compression
;
163 uint16 tiff_photometric
;
164 uint16 tiff_fillorder
;
165 uint16 tiff_bitspersample
;
166 uint16 tiff_samplesperpixel
;
172 uint16 tiff_orientation
;
173 toff_t tiff_dataoffset
;
174 tsize_t tiff_datasize
;
176 uint16 pdf_centimeters
;
177 uint16 pdf_overrideres
;
178 uint16 pdf_overridepagesize
;
179 float pdf_defaultxres
;
180 float pdf_defaultyres
;
183 float pdf_defaultpagewidth
;
184 float pdf_defaultpagelength
;
186 float pdf_pagelength
;
187 float pdf_imagewidth
;
188 float pdf_imagelength
;
189 int pdf_image_fillpage
; /* 0 (default: no scaling, 1:scale imagesize to pagesize */
190 T2P_BOX pdf_mediabox
;
191 T2P_BOX pdf_imagebox
;
192 uint16 pdf_majorversion
;
193 uint16 pdf_minorversion
;
197 uint32 pdf_palettecs
;
198 uint16 pdf_fitwindow
;
199 uint32 pdf_startxref
;
200 #define TIFF2PDF_FILEID_SIZE 33
201 char pdf_fileid
[TIFF2PDF_FILEID_SIZE
];
202 #define TIFF2PDF_DATETIME_SIZE 17
203 char pdf_datetime
[TIFF2PDF_DATETIME_SIZE
];
204 #define TIFF2PDF_CREATOR_SIZE 512
205 char pdf_creator
[TIFF2PDF_CREATOR_SIZE
];
206 #define TIFF2PDF_AUTHOR_SIZE 512
207 char pdf_author
[TIFF2PDF_AUTHOR_SIZE
];
208 #define TIFF2PDF_TITLE_SIZE 512
209 char pdf_title
[TIFF2PDF_TITLE_SIZE
];
210 #define TIFF2PDF_SUBJECT_SIZE 512
211 char pdf_subject
[TIFF2PDF_SUBJECT_SIZE
];
212 #define TIFF2PDF_KEYWORDS_SIZE 512
213 char pdf_keywords
[TIFF2PDF_KEYWORDS_SIZE
];
214 t2p_cs_t pdf_colorspace
;
215 uint16 pdf_colorspace_invert
;
216 uint16 pdf_switchdecode
;
217 uint16 pdf_palettesize
;
218 unsigned char* pdf_palette
;
220 t2p_compress_t pdf_defaultcompression
;
221 uint16 pdf_defaultcompressionquality
;
222 t2p_compress_t pdf_compression
;
223 uint16 pdf_compressionquality
;
224 uint16 pdf_nopassthrough
;
225 t2p_transcode_t pdf_transcode
;
226 t2p_sample_t pdf_sample
;
227 uint32
* pdf_xrefoffsets
;
228 uint32 pdf_xrefcount
;
231 tdata_t pdf_ojpegdata
;
232 uint32 pdf_ojpegdatalength
;
233 uint32 pdf_ojpegiflength
;
235 float tiff_whitechromaticities
[2];
236 float tiff_primarychromaticities
[6];
237 float tiff_referenceblackwhite
[2];
238 float* tiff_transferfunction
[3];
239 int pdf_image_interpolate
; /* 0 (default) : do not interpolate,
241 uint16 tiff_transferfunctioncount
;
243 uint32 tiff_iccprofilelength
;
244 tdata_t tiff_iccprofile
;
246 /* fields for custom read/write procedures */
249 tsize_t outputwritten
;
252 /* These functions are called by main. */
254 void tiff2pdf_usage(void);
255 int tiff2pdf_match_paper_size(float*, float*, char*);
257 /* These functions are used to generate a PDF from a TIFF. */
264 void t2p_validate(T2P
*);
265 tsize_t
t2p_write_pdf(T2P
*, TIFF
*, TIFF
*);
272 void t2p_read_tiff_init(T2P
*, TIFF
*);
273 int t2p_cmp_t2p_page(const void*, const void*);
274 void t2p_read_tiff_data(T2P
*, TIFF
*);
275 void t2p_read_tiff_size(T2P
*, TIFF
*);
276 void t2p_read_tiff_size_tile(T2P
*, TIFF
*, ttile_t
);
277 int t2p_tile_is_right_edge(T2P_TILES
, ttile_t
);
278 int t2p_tile_is_bottom_edge(T2P_TILES
, ttile_t
);
279 int t2p_tile_is_edge(T2P_TILES
, ttile_t
);
280 int t2p_tile_is_corner_edge(T2P_TILES
, ttile_t
);
281 tsize_t
t2p_readwrite_pdf_image(T2P
*, TIFF
*, TIFF
*);
282 tsize_t
t2p_readwrite_pdf_image_tile(T2P
*, TIFF
*, TIFF
*, ttile_t
);
284 int t2p_process_ojpeg_tables(T2P
*, TIFF
*);
287 int t2p_process_jpeg_strip(unsigned char*, tsize_t
*, unsigned char*, tsize_t
*, tstrip_t
, uint32
);
289 void t2p_tile_collapse_left(tdata_t
, tsize_t
, uint32
, uint32
, uint32
);
290 void t2p_write_advance_directory(T2P
*, TIFF
*);
291 tsize_t
t2p_sample_planar_separate_to_contig(T2P
*, unsigned char*, unsigned char*, tsize_t
);
292 tsize_t
t2p_sample_realize_palette(T2P
*, unsigned char*);
293 tsize_t
t2p_sample_abgr_to_rgb(tdata_t
, uint32
);
294 tsize_t
t2p_sample_rgba_to_rgb(tdata_t
, uint32
);
295 tsize_t
t2p_sample_rgbaa_to_rgb(tdata_t
, uint32
);
296 tsize_t
t2p_sample_lab_signed_to_unsigned(tdata_t
, uint32
);
297 tsize_t
t2p_write_pdf_header(T2P
*, TIFF
*);
298 tsize_t
t2p_write_pdf_obj_start(uint32
, TIFF
*);
299 tsize_t
t2p_write_pdf_obj_end(TIFF
*);
300 tsize_t
t2p_write_pdf_name(unsigned char*, TIFF
*);
301 tsize_t
t2p_write_pdf_string(char*, TIFF
*);
302 tsize_t
t2p_write_pdf_stream(tdata_t
, tsize_t
, TIFF
*);
303 tsize_t
t2p_write_pdf_stream_start(TIFF
*);
304 tsize_t
t2p_write_pdf_stream_end(TIFF
*);
305 tsize_t
t2p_write_pdf_stream_dict(tsize_t
, uint32
, TIFF
*);
306 tsize_t
t2p_write_pdf_stream_dict_start(TIFF
*);
307 tsize_t
t2p_write_pdf_stream_dict_end(TIFF
*);
308 tsize_t
t2p_write_pdf_stream_length(tsize_t
, TIFF
*);
309 tsize_t
t2p_write_pdf_catalog(T2P
*, TIFF
*);
310 tsize_t
t2p_write_pdf_info(T2P
*, TIFF
*, TIFF
*);
311 void t2p_pdf_currenttime(T2P
*);
312 void t2p_pdf_tifftime(T2P
*, TIFF
*);
313 tsize_t
t2p_write_pdf_pages(T2P
*, TIFF
*);
314 tsize_t
t2p_write_pdf_page(uint32
, T2P
*, TIFF
*);
315 void t2p_compose_pdf_page(T2P
*);
316 void t2p_compose_pdf_page_orient(T2P_BOX
*, uint16
);
317 void t2p_compose_pdf_page_orient_flip(T2P_BOX
*, uint16
);
318 tsize_t
t2p_write_pdf_page_content(T2P
*, TIFF
*);
319 tsize_t
t2p_write_pdf_xobject_stream_dict(ttile_t
, T2P
*, TIFF
*);
320 tsize_t
t2p_write_pdf_xobject_cs(T2P
*, TIFF
*);
321 tsize_t
t2p_write_pdf_transfer(T2P
*, TIFF
*);
322 tsize_t
t2p_write_pdf_transfer_dict(T2P
*, TIFF
*, uint16
);
323 tsize_t
t2p_write_pdf_transfer_stream(T2P
*, TIFF
*, uint16
);
324 tsize_t
t2p_write_pdf_xobject_calcs(T2P
*, TIFF
*);
325 tsize_t
t2p_write_pdf_xobject_icccs(T2P
*, TIFF
*);
326 tsize_t
t2p_write_pdf_xobject_icccs_dict(T2P
*, TIFF
*);
327 tsize_t
t2p_write_pdf_xobject_icccs_stream(T2P
*, TIFF
*);
328 tsize_t
t2p_write_pdf_xobject_cs_stream(T2P
*, TIFF
*);
329 tsize_t
t2p_write_pdf_xobject_decode(T2P
*, TIFF
*);
330 tsize_t
t2p_write_pdf_xobject_stream_filter(ttile_t
, T2P
*, TIFF
*);
331 tsize_t
t2p_write_pdf_xreftable(T2P
*, TIFF
*);
332 tsize_t
t2p_write_pdf_trailer(T2P
*, TIFF
*);
335 t2p_disable(TIFF
*tif
)
337 T2P
*t2p
= (T2P
*) TIFFClientdata(tif
);
338 t2p
->outputdisable
= 1;
342 t2p_enable(TIFF
*tif
)
344 T2P
*t2p
= (T2P
*) TIFFClientdata(tif
);
345 t2p
->outputdisable
= 0;
349 * Procs for TIFFClientOpen
353 t2pReadFile(TIFF
*tif
, tdata_t data
, tmsize_t size
)
355 thandle_t client
= TIFFClientdata(tif
);
356 TIFFReadWriteProc proc
= TIFFGetReadProc(tif
);
358 return proc(client
, data
, size
);
363 t2pWriteFile(TIFF
*tif
, tdata_t data
, tmsize_t size
)
365 thandle_t client
= TIFFClientdata(tif
);
366 TIFFReadWriteProc proc
= TIFFGetWriteProc(tif
);
368 return proc(client
, data
, size
);
373 t2pSeekFile(TIFF
*tif
, toff_t offset
, int whence
)
375 thandle_t client
= TIFFClientdata(tif
);
376 TIFFSeekProc proc
= TIFFGetSeekProc(tif
);
378 return proc(client
, offset
, whence
);
383 t2p_readproc(thandle_t handle
, tdata_t data
, tmsize_t size
)
385 (void) handle
, (void) data
, (void) size
;
390 t2p_writeproc(thandle_t handle
, tdata_t data
, tmsize_t size
)
392 T2P
*t2p
= (T2P
*) handle
;
393 if (t2p
->outputdisable
<= 0 && t2p
->outputfile
) {
394 tsize_t written
= fwrite(data
, 1, size
, t2p
->outputfile
);
395 t2p
->outputwritten
+= written
;
402 t2p_seekproc(thandle_t handle
, uint64 offset
, int whence
)
404 T2P
*t2p
= (T2P
*) handle
;
405 if (t2p
->outputdisable
<= 0 && t2p
->outputfile
)
406 return fseek(t2p
->outputfile
, (long) offset
, whence
);
411 t2p_closeproc(thandle_t handle
)
418 t2p_sizeproc(thandle_t handle
)
425 t2p_mapproc(thandle_t handle
, void **data
, toff_t
*offset
)
427 (void) handle
, (void) data
, (void) offset
;
432 t2p_unmapproc(thandle_t handle
, void *data
, toff_t offset
)
434 (void) handle
, (void) data
, (void) offset
;
438 checkAdd64(uint64 summand1
, uint64 summand2
, T2P
* t2p
)
440 uint64 bytes
= summand1
+ summand2
;
442 if (bytes
- summand1
!= summand2
) {
443 TIFFError(TIFF2PDF_MODULE
, "Integer overflow");
444 t2p
->t2p_error
= T2P_ERR_ERROR
;
452 checkMultiply64(uint64 first
, uint64 second
, T2P
* t2p
)
454 uint64 bytes
= first
* second
;
456 if (second
&& bytes
/ second
!= first
) {
457 TIFFError(TIFF2PDF_MODULE
, "Integer overflow");
458 t2p
->t2p_error
= T2P_ERR_ERROR
;
467 This is the main function.
469 The program converts one TIFF file to one PDF file, including multiple page
470 TIFF files, tiled TIFF files, black and white. grayscale, and color TIFF
471 files that contain data of TIFF photometric interpretations of bilevel,
472 grayscale, RGB, YCbCr, CMYK separation, and ICC L*a*b* as supported by
475 If you have multiple TIFF files to convert into one PDF file then use tiffcp
476 or other program to concatenate the files into a multiple page TIFF file.
477 If the input TIFF file is of huge dimensions (greater than 10000 pixels height
478 or width) convert the input image to a tiled TIFF if it is not already.
480 The standard output is standard output. Set the output file name with the
481 "-o output.pdf" option.
483 All black and white files are compressed into a single strip CCITT G4 Fax
484 compressed PDF, unless tiled, where tiled black and white images are
485 compressed into tiled CCITT G4 Fax compressed PDF, libtiff CCITT support
488 Color and grayscale data can be compressed using either JPEG compression,
489 ITU-T T.81, or Zip/Deflate LZ77 compression, per PNG 1.2 and RFC 1951. Set
490 the compression type using the -j or -z options. JPEG compression support
491 requires that libtiff be configured with JPEG support, and Zip/Deflate
492 compression support requires that libtiff is configured with Zip support,
493 in tiffconf.h. Use only one or the other of -j and -z. The -q option
494 sets the image compression quality, that is 1-100 with libjpeg JPEG
495 compression and one of 1, 10, 11, 12, 13, 14, or 15 for PNG group compression
496 predictor methods, add 100, 200, ..., 900 to set zlib compression quality 1-9.
497 PNG Group differencing predictor methods are not currently implemented.
499 If the input TIFF contains single strip CCITT G4 Fax compressed information,
500 then that is written to the PDF file without transcoding, unless the options
501 of no compression and no passthrough are set, -d and -n.
503 If the input TIFF contains JPEG or single strip Zip/Deflate compressed
504 information, and they are configured, then that is written to the PDF file
505 without transcoding, unless the options of no compression and no passthrough
508 The default page size upon which the TIFF image is placed is determined by
509 the resolution and extent of the image data. Default values for the TIFF
510 image resolution can be set using the -x and -y options. The page size can
511 be set using the -p option for paper size, or -w and -l for paper width and
512 length, then each page of the TIFF image is centered on its page. The
513 distance unit for default resolution and page width and length can be set
514 by the -u option, the default unit is inch.
516 Various items of the output document information can be set with the -e, -c,
517 -a, -t, -s, and -k tags. Setting the argument of the option to "" for these
518 tags causes the relevant document information field to be not written. Some
519 of the document information values otherwise get their information from the
520 input TIFF image, the software, author, document name, and image description.
522 The output PDF file conforms to the PDF 1.1 specification or PDF 1.2 if using
523 Zip/Deflate compression.
525 The Portable Document Format (PDF) specification is copyrighted by Adobe
526 Systems, Incorporated. Todos derechos reservados.
528 Here is a listing of the usage example and the options to the tiff2pdf
529 program that is part of the libtiff distribution. Options followed by
530 a colon have a required argument.
532 usage: tiff2pdf [options] input.tif
535 -o: output to file name
537 -j: compress with JPEG (requires libjpeg configured with libtiff)
538 -z: compress with Zip/Deflate (requires zlib configured with libtiff)
539 -q: compression quality
540 -n: no compressed data passthrough
541 -d: do not compress (decompress)
543 -u: set distance unit, 'i' for inch, 'm' for centimeter
544 -x: set x resolution default
545 -y: set y resolution default
548 -r: 'd' for resolution default, 'o' for resolution override
549 -p: paper size, eg "letter", "legal", "a4"
550 -F: make the tiff fill the PDF page
551 -f: set pdf "fit window" user preference
552 -b: set PDF "Interpolate" user preference
553 -e: date, overrides image or current date/time default, YYYYMMDDHHMMSS
554 -c: creator, overrides image software default
555 -a: author, overrides image artist default
556 -t: title, overrides image document name default
557 -s: subject, overrides image image description default
564 tiff2pdf -o output.pdf input.tiff
566 The above example would generate the file output.pdf from input.tiff.
570 The above example would generate PDF output from input.tiff and write it
573 tiff2pdf -j -p letter -o output.pdf input.tiff
575 The above example would generate the file output.pdf from input.tiff,
576 putting the image pages on a letter sized page, compressing the output
579 Please report bugs through:
581 http://bugzilla.remotesensing.org/buglist.cgi?product=libtiff
583 See also libtiff.3t, tiffcp.
586 int main(int argc
, char** argv
){
590 const char *outfilename
= NULL
;
592 TIFF
*input
= NULL
, *output
= NULL
;
593 int c
, ret
= EXIT_SUCCESS
;
598 TIFFError(TIFF2PDF_MODULE
, "Can't initialize context");
603 (c
= getopt(argc
, argv
,
604 "o:q:u:x:y:w:l:r:p:e:c:a:t:s:k:jzndifbhF")) != -1){
607 outfilename
= optarg
;
611 t2p
->pdf_defaultcompression
=T2P_COMPRESS_JPEG
;
618 "JPEG support in libtiff required for JPEG compression, ignoring option");
623 t2p
->pdf_defaultcompression
=T2P_COMPRESS_ZIP
;
630 "Zip support in libtiff required for Zip compression, ignoring option");
634 t2p
->pdf_defaultcompressionquality
=atoi(optarg
);
637 t2p
->pdf_nopassthrough
=1;
640 t2p
->pdf_defaultcompression
=T2P_COMPRESS_NONE
;
644 t2p
->pdf_centimeters
=1;
648 t2p
->pdf_defaultxres
=
649 (float)atof(optarg
) / (t2p
->pdf_centimeters
?2.54F
:1.0F
);
652 t2p
->pdf_defaultyres
=
653 (float)atof(optarg
) / (t2p
->pdf_centimeters
?2.54F
:1.0F
);
656 t2p
->pdf_overridepagesize
=1;
657 t2p
->pdf_defaultpagewidth
=
658 ((float)atof(optarg
) * PS_UNIT_SIZE
) / (t2p
->pdf_centimeters
?2.54F
:1.0F
);
661 t2p
->pdf_overridepagesize
=1;
662 t2p
->pdf_defaultpagelength
=
663 ((float)atof(optarg
) * PS_UNIT_SIZE
) / (t2p
->pdf_centimeters
?2.54F
:1.0F
);
667 t2p
->pdf_overrideres
=1;
671 if(tiff2pdf_match_paper_size(
672 &(t2p
->pdf_defaultpagewidth
),
673 &(t2p
->pdf_defaultpagelength
),
675 t2p
->pdf_overridepagesize
=1;
677 TIFFWarning(TIFF2PDF_MODULE
,
678 "Unknown paper size %s, ignoring option",
683 t2p
->pdf_colorspace_invert
=1;
686 t2p
->pdf_image_fillpage
= 1;
689 t2p
->pdf_fitwindow
=1;
692 if (strlen(optarg
) == 0) {
693 t2p
->pdf_datetime
[0] = '\0';
695 t2p
->pdf_datetime
[0] = 'D';
696 t2p
->pdf_datetime
[1] = ':';
697 strncpy(t2p
->pdf_datetime
+ 2, optarg
,
698 sizeof(t2p
->pdf_datetime
) - 3);
699 t2p
->pdf_datetime
[sizeof(t2p
->pdf_datetime
) - 1] = '\0';
703 strncpy(t2p
->pdf_creator
, optarg
, sizeof(t2p
->pdf_creator
) - 1);
704 t2p
->pdf_creator
[sizeof(t2p
->pdf_creator
) - 1] = '\0';
707 strncpy(t2p
->pdf_author
, optarg
, sizeof(t2p
->pdf_author
) - 1);
708 t2p
->pdf_author
[sizeof(t2p
->pdf_author
) - 1] = '\0';
711 strncpy(t2p
->pdf_title
, optarg
, sizeof(t2p
->pdf_title
) - 1);
712 t2p
->pdf_title
[sizeof(t2p
->pdf_title
) - 1] = '\0';
715 strncpy(t2p
->pdf_subject
, optarg
, sizeof(t2p
->pdf_subject
) - 1);
716 t2p
->pdf_subject
[sizeof(t2p
->pdf_subject
) - 1] = '\0';
719 strncpy(t2p
->pdf_keywords
, optarg
, sizeof(t2p
->pdf_keywords
) - 1);
720 t2p
->pdf_keywords
[sizeof(t2p
->pdf_keywords
) - 1] = '\0';
723 t2p
->pdf_image_interpolate
= 1;
737 input
= TIFFOpen(argv
[optind
++], "r");
739 TIFFError(TIFF2PDF_MODULE
,
740 "Can't open input file %s for reading",
745 TIFFError(TIFF2PDF_MODULE
, "No input file specified");
751 TIFFError(TIFF2PDF_MODULE
,
752 "No support for multiple input files");
760 t2p
->outputdisable
= 0;
762 t2p
->outputfile
= fopen(outfilename
, "wb");
763 if (t2p
->outputfile
== NULL
) {
764 TIFFError(TIFF2PDF_MODULE
,
765 "Can't open output file %s for writing",
771 t2p
->outputfile
= stdout
;
774 output
= TIFFClientOpen(outfilename
, "w", (thandle_t
) t2p
,
775 t2p_readproc
, t2p_writeproc
, t2p_seekproc
,
776 t2p_closeproc
, t2p_sizeproc
,
777 t2p_mapproc
, t2p_unmapproc
);
778 if (output
== NULL
) {
779 TIFFError(TIFF2PDF_MODULE
,
780 "Can't initialize output descriptor");
788 t2pSeekFile(output
, (toff_t
) 0, SEEK_SET
);
793 t2p_write_pdf(t2p
, input
, output
);
794 if (t2p
->t2p_error
!= 0) {
795 TIFFError(TIFF2PDF_MODULE
,
796 "An error occurred creating output PDF file");
814 void tiff2pdf_usage(){
816 "usage: tiff2pdf [options] input.tiff",
818 " -o: output to file name",
820 " -j: compress with JPEG",
823 " -z: compress with Zip/Deflate",
825 " -q: compression quality",
826 " -n: no compressed data passthrough",
827 " -d: do not compress (decompress)",
828 " -i: invert colors",
829 " -u: set distance unit, 'i' for inch, 'm' for centimeter",
830 " -x: set x resolution default in dots per unit",
831 " -y: set y resolution default in dots per unit",
832 " -w: width in units",
833 " -l: length in units",
834 " -r: 'd' for resolution default, 'o' for resolution override",
835 " -p: paper size, eg \"letter\", \"legal\", \"A4\"",
836 " -F: make the tiff fill the PDF page",
837 " -f: set PDF \"Fit Window\" user preference",
838 " -e: date, overrides image or current date/time default, YYYYMMDDHHMMSS",
839 " -c: sets document creator, overrides image software default",
840 " -a: sets document author, overrides image artist default",
841 " -t: sets document title, overrides image document name default",
842 " -s: sets document subject, overrides image image description default",
843 " -k: sets document keywords",
844 " -b: set PDF \"Interpolate\" user preference",
850 fprintf(stderr
, "%s\n\n", TIFFGetVersion());
851 for (i
=0;lines
[i
]!=NULL
;i
++){
852 fprintf(stderr
, "%s\n", lines
[i
]);
858 int tiff2pdf_match_paper_size(float* width
, float* length
, char* papersize
){
861 const char* sizes
[]={
862 "LETTER", "A4", "LEGAL",
863 "EXECUTIVE", "LETTER", "LEGAL", "LEDGER", "TABLOID",
864 "A", "B", "C", "D", "E", "F", "G", "H", "J", "K",
865 "A10", "A9", "A8", "A7", "A6", "A5", "A4", "A3", "A2", "A1", "A0",
866 "2A0", "4A0", "2A", "4A",
867 "B10", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "B2", "B1", "B0",
868 "JISB10", "JISB9", "JISB8", "JISB7", "JISB6", "JISB5", "JISB4",
869 "JISB3", "JISB2", "JISB1", "JISB0",
870 "C10", "C9", "C8", "C7", "C6", "C5", "C4", "C3", "C2", "C1", "C0",
871 "RA2", "RA1", "RA0", "SRA4", "SRA3", "SRA2", "SRA1", "SRA0",
872 "A3EXTRA", "A4EXTRA",
873 "STATEMENT", "FOLIO", "QUARTO",
878 522, 612,612,792,792,
879 612,792,1224,1584,2448,2016,792,2016,2448,2880,
880 74,105,147,210,298,420,595,842,1191,1684,2384,3370,4768,3370,4768,
881 88,125,176,249,354,499,709,1001,1417,2004,2835,
882 91,128,181,258,363,516,729,1032,1460,2064,2920,
883 79,113,162,230,323,459,649,918,1298,1298,2599,
884 1219,1729,2438,638,907,1276,1814,2551,
889 const int lengths
[]={
891 756,792,1008,1224,1224,
892 792,1224,1584,2448,3168,2880,6480,10296,12672,10296,
893 105,147,210,298,420,595,842,1191,1684,2384,3370,4768,6741,4768,6741,
894 125,176,249,354,499,709,1001,1417,2004,2835,4008,
895 128,181,258,363,516,729,1032,1460,2064,2920,4127,
896 113,162,230,323,459,649,918,1298,1837,1837,3677,
897 1729,2438,3458,907,1276,1814,2551,3628,
903 len
=strlen(papersize
);
905 papersize
[i
]=toupper(papersize
[i
]);
907 for(i
=0;sizes
[i
]!=NULL
; i
++){
908 if (strcmp( (const char*)papersize
, sizes
[i
])==0){
909 *width
=(float)widths
[i
];
910 *length
=(float)lengths
[i
];
919 * This function allocates and initializes a T2P context struct pointer.
924 T2P
* t2p
= (T2P
*) _TIFFmalloc(sizeof(T2P
));
928 "Can't allocate %lu bytes of memory for t2p_init",
929 (unsigned long) sizeof(T2P
));
930 return( (T2P
*) NULL
);
932 _TIFFmemset(t2p
, 0x00, sizeof(T2P
));
933 t2p
->pdf_majorversion
=1;
934 t2p
->pdf_minorversion
=1;
935 t2p
->pdf_defaultxres
=300.0;
936 t2p
->pdf_defaultyres
=300.0;
937 t2p
->pdf_defaultpagewidth
=612.0;
938 t2p
->pdf_defaultpagelength
=792.0;
939 t2p
->pdf_xrefcount
=3; /* Catalog, Info, Pages */
945 * This function frees a T2P context struct pointer and any allocated data fields of it.
948 void t2p_free(T2P
* t2p
)
953 if(t2p
->pdf_xrefoffsets
!= NULL
){
954 _TIFFfree( (tdata_t
) t2p
->pdf_xrefoffsets
);
956 if(t2p
->tiff_pages
!= NULL
){
957 _TIFFfree( (tdata_t
) t2p
->tiff_pages
);
959 for(i
=0;i
<t2p
->tiff_pagecount
;i
++){
960 if(t2p
->tiff_tiles
[i
].tiles_tiles
!= NULL
){
961 _TIFFfree( (tdata_t
) t2p
->tiff_tiles
[i
].tiles_tiles
);
964 if(t2p
->tiff_tiles
!= NULL
){
965 _TIFFfree( (tdata_t
) t2p
->tiff_tiles
);
967 if(t2p
->pdf_palette
!= NULL
){
968 _TIFFfree( (tdata_t
) t2p
->pdf_palette
);
971 if(t2p
->pdf_ojpegdata
!= NULL
){
972 _TIFFfree( (tdata_t
) t2p
->pdf_ojpegdata
);
975 _TIFFfree( (tdata_t
) t2p
);
982 This function validates the values of a T2P context struct pointer
983 before calling t2p_write_pdf with it.
986 void t2p_validate(T2P
* t2p
){
989 if(t2p
->pdf_defaultcompression
==T2P_COMPRESS_JPEG
){
990 if(t2p
->pdf_defaultcompressionquality
>100 ||
991 t2p
->pdf_defaultcompressionquality
<1){
992 t2p
->pdf_defaultcompressionquality
=0;
997 if(t2p
->pdf_defaultcompression
==T2P_COMPRESS_ZIP
){
998 uint16 m
=t2p
->pdf_defaultcompressionquality%100
;
999 if(t2p
->pdf_defaultcompressionquality
/100 > 9 ||
1000 (m
>1 && m
<10) || m
>15){
1001 t2p
->pdf_defaultcompressionquality
=0;
1003 if(t2p
->pdf_defaultcompressionquality%100
!=0){
1004 t2p
->pdf_defaultcompressionquality
/=100;
1005 t2p
->pdf_defaultcompressionquality
*=100;
1008 "PNG Group predictor differencing not implemented, assuming compression quality %u",
1009 t2p
->pdf_defaultcompressionquality
);
1011 t2p
->pdf_defaultcompressionquality
%=100;
1012 if(t2p
->pdf_minorversion
<2){t2p
->pdf_minorversion
=2;}
1022 This function scans the input TIFF file for pages. It attempts
1023 to determine which IFD's of the TIFF file contain image document
1024 pages. For each, it gathers some information that has to do
1025 with the output of the PDF document as a whole.
1028 void t2p_read_tiff_init(T2P
* t2p
, TIFF
* input
){
1030 tdir_t directorycount
=0;
1036 directorycount
=TIFFNumberOfDirectories(input
);
1037 t2p
->tiff_pages
= (T2P_PAGE
*) _TIFFmalloc(directorycount
* sizeof(T2P_PAGE
));
1038 if(t2p
->tiff_pages
==NULL
){
1041 "Can't allocate %lu bytes of memory for tiff_pages array, %s",
1042 (unsigned long) directorycount
* sizeof(T2P_PAGE
),
1043 TIFFFileName(input
));
1044 t2p
->t2p_error
= T2P_ERR_ERROR
;
1047 _TIFFmemset( t2p
->tiff_pages
, 0x00, directorycount
* sizeof(T2P_PAGE
));
1048 t2p
->tiff_tiles
= (T2P_TILES
*) _TIFFmalloc(directorycount
* sizeof(T2P_TILES
));
1049 if(t2p
->tiff_tiles
==NULL
){
1052 "Can't allocate %lu bytes of memory for tiff_tiles array, %s",
1053 (unsigned long) directorycount
* sizeof(T2P_TILES
),
1054 TIFFFileName(input
));
1055 t2p
->t2p_error
= T2P_ERR_ERROR
;
1058 _TIFFmemset( t2p
->tiff_tiles
, 0x00, directorycount
* sizeof(T2P_TILES
));
1059 for(i
=0;i
<directorycount
;i
++){
1060 uint32 subfiletype
= 0;
1062 if(!TIFFSetDirectory(input
, i
)){
1065 "Can't set directory %u of input file %s",
1067 TIFFFileName(input
));
1068 t2p
->t2p_error
= T2P_ERR_ERROR
;
1071 if(TIFFGetField(input
, TIFFTAG_PAGENUMBER
, &pagen
, &paged
)){
1072 if((pagen
>paged
) && (paged
!= 0)){
1073 t2p
->tiff_pages
[t2p
->tiff_pagecount
].page_number
=
1076 t2p
->tiff_pages
[t2p
->tiff_pagecount
].page_number
=
1081 if(TIFFGetField(input
, TIFFTAG_SUBFILETYPE
, &subfiletype
)){
1082 if ( ((subfiletype
& FILETYPE_PAGE
) != 0)
1083 || (subfiletype
== 0)){
1089 if(TIFFGetField(input
, TIFFTAG_OSUBFILETYPE
, &subfiletype
)){
1090 if ((subfiletype
== OFILETYPE_IMAGE
)
1091 || (subfiletype
== OFILETYPE_PAGE
)
1092 || (subfiletype
== 0) ){
1099 t2p
->tiff_pages
[t2p
->tiff_pagecount
].page_number
=t2p
->tiff_pagecount
;
1101 t2p
->tiff_pages
[t2p
->tiff_pagecount
].page_directory
=i
;
1102 if(TIFFIsTiled(input
)){
1103 t2p
->tiff_pages
[t2p
->tiff_pagecount
].page_tilecount
=
1104 TIFFNumberOfTiles(input
);
1106 t2p
->tiff_pagecount
++;
1111 qsort((void*) t2p
->tiff_pages
, t2p
->tiff_pagecount
,
1112 sizeof(T2P_PAGE
), t2p_cmp_t2p_page
);
1114 for(i
=0;i
<t2p
->tiff_pagecount
;i
++){
1115 t2p
->pdf_xrefcount
+= 5;
1116 TIFFSetDirectory(input
, t2p
->tiff_pages
[i
].page_directory
);
1117 if((TIFFGetField(input
, TIFFTAG_PHOTOMETRIC
, &xuint16
)
1118 && (xuint16
==PHOTOMETRIC_PALETTE
))
1119 || TIFFGetField(input
, TIFFTAG_INDEXED
, &xuint16
)) {
1120 t2p
->tiff_pages
[i
].page_extra
++;
1121 t2p
->pdf_xrefcount
++;
1124 if (TIFFGetField(input
, TIFFTAG_COMPRESSION
, &xuint16
)) {
1125 if( (xuint16
== COMPRESSION_DEFLATE
||
1126 xuint16
== COMPRESSION_ADOBE_DEFLATE
) &&
1127 ((t2p
->tiff_pages
[i
].page_tilecount
!= 0)
1128 || TIFFNumberOfStrips(input
)==1) &&
1129 (t2p
->pdf_nopassthrough
==0) ){
1130 if(t2p
->pdf_minorversion
<2){t2p
->pdf_minorversion
=2;}
1134 if (TIFFGetField(input
, TIFFTAG_TRANSFERFUNCTION
,
1135 &(t2p
->tiff_transferfunction
[0]),
1136 &(t2p
->tiff_transferfunction
[1]),
1137 &(t2p
->tiff_transferfunction
[2]))) {
1138 if(t2p
->tiff_transferfunction
[1] !=
1139 t2p
->tiff_transferfunction
[0]) {
1140 t2p
->tiff_transferfunctioncount
= 3;
1141 t2p
->tiff_pages
[i
].page_extra
+= 4;
1142 t2p
->pdf_xrefcount
+= 4;
1144 t2p
->tiff_transferfunctioncount
= 1;
1145 t2p
->tiff_pages
[i
].page_extra
+= 2;
1146 t2p
->pdf_xrefcount
+= 2;
1148 if(t2p
->pdf_minorversion
< 2)
1149 t2p
->pdf_minorversion
= 2;
1151 t2p
->tiff_transferfunctioncount
=0;
1156 &(t2p
->tiff_iccprofilelength
),
1157 &(t2p
->tiff_iccprofile
)) != 0){
1158 t2p
->tiff_pages
[i
].page_extra
++;
1159 t2p
->pdf_xrefcount
++;
1160 if(t2p
->pdf_minorversion
<3){t2p
->pdf_minorversion
=3;}
1162 t2p
->tiff_tiles
[i
].tiles_tilecount
=
1163 t2p
->tiff_pages
[i
].page_tilecount
;
1164 if( (TIFFGetField(input
, TIFFTAG_PLANARCONFIG
, &xuint16
) != 0)
1165 && (xuint16
== PLANARCONFIG_SEPARATE
) ){
1166 TIFFGetField(input
, TIFFTAG_SAMPLESPERPIXEL
, &xuint16
);
1167 t2p
->tiff_tiles
[i
].tiles_tilecount
/= xuint16
;
1169 if( t2p
->tiff_tiles
[i
].tiles_tilecount
> 0){
1170 t2p
->pdf_xrefcount
+=
1171 (t2p
->tiff_tiles
[i
].tiles_tilecount
-1)*2;
1174 &( t2p
->tiff_tiles
[i
].tiles_tilewidth
) );
1177 &( t2p
->tiff_tiles
[i
].tiles_tilelength
) );
1178 t2p
->tiff_tiles
[i
].tiles_tiles
=
1179 (T2P_TILE
*) _TIFFmalloc(
1180 t2p
->tiff_tiles
[i
].tiles_tilecount
1181 * sizeof(T2P_TILE
) );
1182 if( t2p
->tiff_tiles
[i
].tiles_tiles
== NULL
){
1185 "Can't allocate %lu bytes of memory for t2p_read_tiff_init, %s",
1186 (unsigned long) t2p
->tiff_tiles
[i
].tiles_tilecount
* sizeof(T2P_TILE
),
1187 TIFFFileName(input
));
1188 t2p
->t2p_error
= T2P_ERR_ERROR
;
1198 * This function is used by qsort to sort a T2P_PAGE* array of page structures
1202 int t2p_cmp_t2p_page(const void* e1
, const void* e2
){
1204 return( ((T2P_PAGE
*)e1
)->page_number
- ((T2P_PAGE
*)e2
)->page_number
);
1208 This function sets the input directory to the directory of a given
1209 page and determines information about the image. It checks
1210 the image characteristics to determine if it is possible to convert
1211 the image data into a page of PDF output, setting values of the T2P
1212 struct for this page. It determines what color space is used in
1213 the output PDF to represent the image.
1215 It determines if the image can be converted as raw data without
1216 requiring transcoding of the image data.
1219 void t2p_read_tiff_data(T2P
* t2p
, TIFF
* input
){
1230 t2p
->pdf_transcode
= T2P_TRANSCODE_ENCODE
;
1231 t2p
->pdf_sample
= T2P_SAMPLE_NOTHING
;
1232 t2p
->pdf_switchdecode
= t2p
->pdf_colorspace_invert
;
1235 TIFFSetDirectory(input
, t2p
->tiff_pages
[t2p
->pdf_page
].page_directory
);
1237 TIFFGetField(input
, TIFFTAG_IMAGEWIDTH
, &(t2p
->tiff_width
));
1238 if(t2p
->tiff_width
== 0){
1241 "No support for %s with zero width",
1242 TIFFFileName(input
) );
1243 t2p
->t2p_error
= T2P_ERR_ERROR
;
1247 TIFFGetField(input
, TIFFTAG_IMAGELENGTH
, &(t2p
->tiff_length
));
1248 if(t2p
->tiff_length
== 0){
1251 "No support for %s with zero length",
1252 TIFFFileName(input
) );
1253 t2p
->t2p_error
= T2P_ERR_ERROR
;
1257 if(TIFFGetField(input
, TIFFTAG_COMPRESSION
, &(t2p
->tiff_compression
)) == 0){
1260 "No support for %s with no compression tag",
1261 TIFFFileName(input
) );
1262 t2p
->t2p_error
= T2P_ERR_ERROR
;
1266 if( TIFFIsCODECConfigured(t2p
->tiff_compression
) == 0){
1269 "No support for %s with compression type %u: not configured",
1270 TIFFFileName(input
),
1271 t2p
->tiff_compression
1273 t2p
->t2p_error
= T2P_ERR_ERROR
;
1278 TIFFGetFieldDefaulted(input
, TIFFTAG_BITSPERSAMPLE
, &(t2p
->tiff_bitspersample
));
1279 switch(t2p
->tiff_bitspersample
){
1288 "Image %s has 0 bits per sample, assuming 1",
1289 TIFFFileName(input
));
1290 t2p
->tiff_bitspersample
=1;
1295 "No support for %s with %u bits per sample",
1296 TIFFFileName(input
),
1297 t2p
->tiff_bitspersample
);
1298 t2p
->t2p_error
= T2P_ERR_ERROR
;
1302 TIFFGetFieldDefaulted(input
, TIFFTAG_SAMPLESPERPIXEL
, &(t2p
->tiff_samplesperpixel
));
1303 if(t2p
->tiff_samplesperpixel
>4){
1306 "No support for %s with %u samples per pixel",
1307 TIFFFileName(input
),
1308 t2p
->tiff_samplesperpixel
);
1309 t2p
->t2p_error
= T2P_ERR_ERROR
;
1312 if(t2p
->tiff_samplesperpixel
==0){
1315 "Image %s has 0 samples per pixel, assuming 1",
1316 TIFFFileName(input
));
1317 t2p
->tiff_samplesperpixel
=1;
1320 if(TIFFGetField(input
, TIFFTAG_SAMPLEFORMAT
, &xuint16
) != 0 ){
1329 "No support for %s with sample format %u",
1330 TIFFFileName(input
),
1332 t2p
->t2p_error
= T2P_ERR_ERROR
;
1338 TIFFGetFieldDefaulted(input
, TIFFTAG_FILLORDER
, &(t2p
->tiff_fillorder
));
1340 if(TIFFGetField(input
, TIFFTAG_PHOTOMETRIC
, &(t2p
->tiff_photometric
)) == 0){
1343 "No support for %s with no photometric interpretation tag",
1344 TIFFFileName(input
) );
1345 t2p
->t2p_error
= T2P_ERR_ERROR
;
1350 switch(t2p
->tiff_photometric
){
1351 case PHOTOMETRIC_MINISWHITE
:
1352 case PHOTOMETRIC_MINISBLACK
:
1353 if (t2p
->tiff_bitspersample
==1){
1354 t2p
->pdf_colorspace
=T2P_CS_BILEVEL
;
1355 if(t2p
->tiff_photometric
==PHOTOMETRIC_MINISWHITE
){
1356 t2p
->pdf_switchdecode
^= 1;
1359 t2p
->pdf_colorspace
=T2P_CS_GRAY
;
1360 if(t2p
->tiff_photometric
==PHOTOMETRIC_MINISWHITE
){
1361 t2p
->pdf_switchdecode
^= 1;
1365 case PHOTOMETRIC_RGB
:
1366 t2p
->pdf_colorspace
=T2P_CS_RGB
;
1367 if(t2p
->tiff_samplesperpixel
== 3){
1370 if(TIFFGetField(input
, TIFFTAG_INDEXED
, &xuint16
)){
1372 goto photometric_palette
;
1374 if(t2p
->tiff_samplesperpixel
> 3) {
1375 if(t2p
->tiff_samplesperpixel
== 4) {
1376 t2p
->pdf_colorspace
= T2P_CS_RGB
;
1377 if(TIFFGetField(input
,
1378 TIFFTAG_EXTRASAMPLES
,
1379 &xuint16
, &xuint16p
)
1381 if(xuint16p
[0] == EXTRASAMPLE_ASSOCALPHA
){
1382 t2p
->pdf_sample
=T2P_SAMPLE_RGBAA_TO_RGB
;
1385 if(xuint16p
[0] == EXTRASAMPLE_UNASSALPHA
){
1386 t2p
->pdf_sample
=T2P_SAMPLE_RGBA_TO_RGB
;
1391 "RGB image %s has 4 samples per pixel, assuming RGBA",
1392 TIFFFileName(input
));
1395 t2p
->pdf_colorspace
=T2P_CS_CMYK
;
1396 t2p
->pdf_switchdecode
^= 1;
1399 "RGB image %s has 4 samples per pixel, assuming inverse CMYK",
1400 TIFFFileName(input
));
1405 "No support for RGB image %s with %u samples per pixel",
1406 TIFFFileName(input
),
1407 t2p
->tiff_samplesperpixel
);
1408 t2p
->t2p_error
= T2P_ERR_ERROR
;
1414 "No support for RGB image %s with %u samples per pixel",
1415 TIFFFileName(input
),
1416 t2p
->tiff_samplesperpixel
);
1417 t2p
->t2p_error
= T2P_ERR_ERROR
;
1420 case PHOTOMETRIC_PALETTE
:
1421 photometric_palette
:
1422 if(t2p
->tiff_samplesperpixel
!=1){
1425 "No support for palettized image %s with not one sample per pixel",
1426 TIFFFileName(input
));
1427 t2p
->t2p_error
= T2P_ERR_ERROR
;
1430 t2p
->pdf_colorspace
=T2P_CS_RGB
| T2P_CS_PALETTE
;
1431 t2p
->pdf_palettesize
=0x0001<<t2p
->tiff_bitspersample
;
1432 if(!TIFFGetField(input
, TIFFTAG_COLORMAP
, &r
, &g
, &b
)){
1435 "Palettized image %s has no color map",
1436 TIFFFileName(input
));
1437 t2p
->t2p_error
= T2P_ERR_ERROR
;
1440 if(t2p
->pdf_palette
!= NULL
){
1441 _TIFFfree(t2p
->pdf_palette
);
1442 t2p
->pdf_palette
=NULL
;
1444 t2p
->pdf_palette
= (unsigned char*)
1445 _TIFFmalloc(t2p
->pdf_palettesize
*3);
1446 if(t2p
->pdf_palette
==NULL
){
1449 "Can't allocate %u bytes of memory for t2p_read_tiff_image, %s",
1450 t2p
->pdf_palettesize
,
1451 TIFFFileName(input
));
1452 t2p
->t2p_error
= T2P_ERR_ERROR
;
1455 for(i
=0;i
<t2p
->pdf_palettesize
;i
++){
1456 t2p
->pdf_palette
[(i
*3)] = (unsigned char) (r
[i
]>>8);
1457 t2p
->pdf_palette
[(i
*3)+1]= (unsigned char) (g
[i
]>>8);
1458 t2p
->pdf_palette
[(i
*3)+2]= (unsigned char) (b
[i
]>>8);
1460 t2p
->pdf_palettesize
*= 3;
1462 case PHOTOMETRIC_SEPARATED
:
1463 if(TIFFGetField(input
, TIFFTAG_INDEXED
, &xuint16
)){
1465 goto photometric_palette_cmyk
;
1468 if( TIFFGetField(input
, TIFFTAG_INKSET
, &xuint16
) ){
1469 if(xuint16
!= INKSET_CMYK
){
1472 "No support for %s because its inkset is not CMYK",
1473 TIFFFileName(input
) );
1474 t2p
->t2p_error
= T2P_ERR_ERROR
;
1478 if(t2p
->tiff_samplesperpixel
==4){
1479 t2p
->pdf_colorspace
=T2P_CS_CMYK
;
1483 "No support for %s because it has %u samples per pixel",
1484 TIFFFileName(input
),
1485 t2p
->tiff_samplesperpixel
);
1486 t2p
->t2p_error
= T2P_ERR_ERROR
;
1490 photometric_palette_cmyk
:
1491 if(t2p
->tiff_samplesperpixel
!=1){
1494 "No support for palettized CMYK image %s with not one sample per pixel",
1495 TIFFFileName(input
));
1496 t2p
->t2p_error
= T2P_ERR_ERROR
;
1499 t2p
->pdf_colorspace
=T2P_CS_CMYK
| T2P_CS_PALETTE
;
1500 t2p
->pdf_palettesize
=0x0001<<t2p
->tiff_bitspersample
;
1501 if(!TIFFGetField(input
, TIFFTAG_COLORMAP
, &r
, &g
, &b
, &a
)){
1504 "Palettized image %s has no color map",
1505 TIFFFileName(input
));
1506 t2p
->t2p_error
= T2P_ERR_ERROR
;
1509 if(t2p
->pdf_palette
!= NULL
){
1510 _TIFFfree(t2p
->pdf_palette
);
1511 t2p
->pdf_palette
=NULL
;
1513 t2p
->pdf_palette
= (unsigned char*)
1514 _TIFFmalloc(t2p
->pdf_palettesize
*4);
1515 if(t2p
->pdf_palette
==NULL
){
1518 "Can't allocate %u bytes of memory for t2p_read_tiff_image, %s",
1519 t2p
->pdf_palettesize
,
1520 TIFFFileName(input
));
1521 t2p
->t2p_error
= T2P_ERR_ERROR
;
1524 for(i
=0;i
<t2p
->pdf_palettesize
;i
++){
1525 t2p
->pdf_palette
[(i
*4)] = (unsigned char) (r
[i
]>>8);
1526 t2p
->pdf_palette
[(i
*4)+1]= (unsigned char) (g
[i
]>>8);
1527 t2p
->pdf_palette
[(i
*4)+2]= (unsigned char) (b
[i
]>>8);
1528 t2p
->pdf_palette
[(i
*4)+3]= (unsigned char) (a
[i
]>>8);
1530 t2p
->pdf_palettesize
*= 4;
1532 case PHOTOMETRIC_YCBCR
:
1533 t2p
->pdf_colorspace
=T2P_CS_RGB
;
1534 if(t2p
->tiff_samplesperpixel
==1){
1535 t2p
->pdf_colorspace
=T2P_CS_GRAY
;
1536 t2p
->tiff_photometric
=PHOTOMETRIC_MINISBLACK
;
1539 t2p
->pdf_sample
=T2P_SAMPLE_YCBCR_TO_RGB
;
1541 if(t2p
->pdf_defaultcompression
==T2P_COMPRESS_JPEG
){
1542 t2p
->pdf_sample
=T2P_SAMPLE_NOTHING
;
1546 case PHOTOMETRIC_CIELAB
:
1547 t2p
->pdf_labrange
[0]= -127;
1548 t2p
->pdf_labrange
[1]= 127;
1549 t2p
->pdf_labrange
[2]= -127;
1550 t2p
->pdf_labrange
[3]= 127;
1551 t2p
->pdf_sample
=T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED
;
1552 t2p
->pdf_colorspace
=T2P_CS_LAB
;
1554 case PHOTOMETRIC_ICCLAB
:
1555 t2p
->pdf_labrange
[0]= 0;
1556 t2p
->pdf_labrange
[1]= 255;
1557 t2p
->pdf_labrange
[2]= 0;
1558 t2p
->pdf_labrange
[3]= 255;
1559 t2p
->pdf_colorspace
=T2P_CS_LAB
;
1561 case PHOTOMETRIC_ITULAB
:
1562 t2p
->pdf_labrange
[0]=-85;
1563 t2p
->pdf_labrange
[1]=85;
1564 t2p
->pdf_labrange
[2]=-75;
1565 t2p
->pdf_labrange
[3]=124;
1566 t2p
->pdf_sample
=T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED
;
1567 t2p
->pdf_colorspace
=T2P_CS_LAB
;
1569 case PHOTOMETRIC_LOGL
:
1570 case PHOTOMETRIC_LOGLUV
:
1573 "No support for %s with photometric interpretation LogL/LogLuv",
1574 TIFFFileName(input
));
1575 t2p
->t2p_error
= T2P_ERR_ERROR
;
1580 "No support for %s with photometric interpretation %u",
1581 TIFFFileName(input
),
1582 t2p
->tiff_photometric
);
1583 t2p
->t2p_error
= T2P_ERR_ERROR
;
1587 if(TIFFGetField(input
, TIFFTAG_PLANARCONFIG
, &(t2p
->tiff_planar
))){
1588 switch(t2p
->tiff_planar
){
1592 "Image %s has planar configuration 0, assuming 1",
1593 TIFFFileName(input
));
1594 t2p
->tiff_planar
=PLANARCONFIG_CONTIG
;
1595 case PLANARCONFIG_CONTIG
:
1597 case PLANARCONFIG_SEPARATE
:
1598 t2p
->pdf_sample
=T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG
;
1599 if(t2p
->tiff_bitspersample
!=8){
1602 "No support for %s with separated planar configuration and %u bits per sample",
1603 TIFFFileName(input
),
1604 t2p
->tiff_bitspersample
);
1605 t2p
->t2p_error
= T2P_ERR_ERROR
;
1612 "No support for %s with planar configuration %u",
1613 TIFFFileName(input
),
1615 t2p
->t2p_error
= T2P_ERR_ERROR
;
1620 TIFFGetFieldDefaulted(input
, TIFFTAG_ORIENTATION
,
1621 &(t2p
->tiff_orientation
));
1622 if(t2p
->tiff_orientation
>8){
1623 TIFFWarning(TIFF2PDF_MODULE
,
1624 "Image %s has orientation %u, assuming 0",
1625 TIFFFileName(input
), t2p
->tiff_orientation
);
1626 t2p
->tiff_orientation
=0;
1629 if(TIFFGetField(input
, TIFFTAG_XRESOLUTION
, &(t2p
->tiff_xres
) ) == 0){
1632 if(TIFFGetField(input
, TIFFTAG_YRESOLUTION
, &(t2p
->tiff_yres
) ) == 0){
1635 TIFFGetFieldDefaulted(input
, TIFFTAG_RESOLUTIONUNIT
,
1636 &(t2p
->tiff_resunit
));
1637 if(t2p
->tiff_resunit
== RESUNIT_CENTIMETER
) {
1638 t2p
->tiff_xres
*= 2.54F
;
1639 t2p
->tiff_yres
*= 2.54F
;
1640 } else if (t2p
->tiff_resunit
!= RESUNIT_INCH
1641 && t2p
->pdf_centimeters
!= 0) {
1642 t2p
->tiff_xres
*= 2.54F
;
1643 t2p
->tiff_yres
*= 2.54F
;
1646 t2p_compose_pdf_page(t2p
);
1648 t2p
->pdf_transcode
= T2P_TRANSCODE_ENCODE
;
1649 if(t2p
->pdf_nopassthrough
==0){
1650 #ifdef CCITT_SUPPORT
1651 if(t2p
->tiff_compression
==COMPRESSION_CCITTFAX4
1653 if(TIFFIsTiled(input
) || (TIFFNumberOfStrips(input
)==1) ){
1654 t2p
->pdf_transcode
= T2P_TRANSCODE_RAW
;
1655 t2p
->pdf_compression
=T2P_COMPRESS_G4
;
1660 if(t2p
->tiff_compression
== COMPRESSION_ADOBE_DEFLATE
1661 || t2p
->tiff_compression
==COMPRESSION_DEFLATE
){
1662 if(TIFFIsTiled(input
) || (TIFFNumberOfStrips(input
)==1) ){
1663 t2p
->pdf_transcode
= T2P_TRANSCODE_RAW
;
1664 t2p
->pdf_compression
=T2P_COMPRESS_ZIP
;
1668 #ifdef OJPEG_SUPPORT
1669 if(t2p
->tiff_compression
==COMPRESSION_OJPEG
){
1670 t2p
->pdf_transcode
= T2P_TRANSCODE_RAW
;
1671 t2p
->pdf_compression
=T2P_COMPRESS_JPEG
;
1672 t2p_process_ojpeg_tables(t2p
, input
);
1676 if(t2p
->tiff_compression
==COMPRESSION_JPEG
){
1677 t2p
->pdf_transcode
= T2P_TRANSCODE_RAW
;
1678 t2p
->pdf_compression
=T2P_COMPRESS_JPEG
;
1684 if(t2p
->pdf_transcode
!=T2P_TRANSCODE_RAW
){
1685 t2p
->pdf_compression
= t2p
->pdf_defaultcompression
;
1689 if(t2p
->pdf_defaultcompression
==T2P_COMPRESS_JPEG
){
1690 if(t2p
->pdf_colorspace
& T2P_CS_PALETTE
){
1691 t2p
->pdf_sample
|=T2P_SAMPLE_REALIZE_PALETTE
;
1692 t2p
->pdf_colorspace
^= T2P_CS_PALETTE
;
1693 t2p
->tiff_pages
[t2p
->pdf_page
].page_extra
--;
1696 if(t2p
->tiff_compression
==COMPRESSION_JPEG
){
1697 if(t2p
->tiff_planar
==PLANARCONFIG_SEPARATE
){
1700 "No support for %s with JPEG compression and separated planar configuration",
1701 TIFFFileName(input
));
1702 t2p
->t2p_error
=T2P_ERR_ERROR
;
1707 #ifdef OJPEG_SUPPORT
1708 if(t2p
->tiff_compression
==COMPRESSION_OJPEG
){
1709 if(t2p
->tiff_planar
==PLANARCONFIG_SEPARATE
){
1712 "No support for %s with OJPEG compression and separated planar configuration",
1713 TIFFFileName(input
));
1714 t2p
->t2p_error
=T2P_ERR_ERROR
;
1720 if(t2p
->pdf_sample
& T2P_SAMPLE_REALIZE_PALETTE
){
1721 if(t2p
->pdf_colorspace
& T2P_CS_CMYK
){
1722 t2p
->tiff_samplesperpixel
=4;
1723 t2p
->tiff_photometric
=PHOTOMETRIC_SEPARATED
;
1725 t2p
->tiff_samplesperpixel
=3;
1726 t2p
->tiff_photometric
=PHOTOMETRIC_RGB
;
1730 if (TIFFGetField(input
, TIFFTAG_TRANSFERFUNCTION
,
1731 &(t2p
->tiff_transferfunction
[0]),
1732 &(t2p
->tiff_transferfunction
[1]),
1733 &(t2p
->tiff_transferfunction
[2]))) {
1734 if(t2p
->tiff_transferfunction
[1] !=
1735 t2p
->tiff_transferfunction
[0]) {
1736 t2p
->tiff_transferfunctioncount
=3;
1738 t2p
->tiff_transferfunctioncount
=1;
1741 t2p
->tiff_transferfunctioncount
=0;
1743 if(TIFFGetField(input
, TIFFTAG_WHITEPOINT
, &xfloatp
)!=0){
1744 t2p
->tiff_whitechromaticities
[0]=xfloatp
[0];
1745 t2p
->tiff_whitechromaticities
[1]=xfloatp
[1];
1746 if(t2p
->pdf_colorspace
& T2P_CS_GRAY
){
1747 t2p
->pdf_colorspace
|= T2P_CS_CALGRAY
;
1749 if(t2p
->pdf_colorspace
& T2P_CS_RGB
){
1750 t2p
->pdf_colorspace
|= T2P_CS_CALRGB
;
1753 if(TIFFGetField(input
, TIFFTAG_PRIMARYCHROMATICITIES
, &xfloatp
)!=0){
1754 t2p
->tiff_primarychromaticities
[0]=xfloatp
[0];
1755 t2p
->tiff_primarychromaticities
[1]=xfloatp
[1];
1756 t2p
->tiff_primarychromaticities
[2]=xfloatp
[2];
1757 t2p
->tiff_primarychromaticities
[3]=xfloatp
[3];
1758 t2p
->tiff_primarychromaticities
[4]=xfloatp
[4];
1759 t2p
->tiff_primarychromaticities
[5]=xfloatp
[5];
1760 if(t2p
->pdf_colorspace
& T2P_CS_RGB
){
1761 t2p
->pdf_colorspace
|= T2P_CS_CALRGB
;
1764 if(t2p
->pdf_colorspace
& T2P_CS_LAB
){
1765 if(TIFFGetField(input
, TIFFTAG_WHITEPOINT
, &xfloatp
) != 0){
1766 t2p
->tiff_whitechromaticities
[0]=xfloatp
[0];
1767 t2p
->tiff_whitechromaticities
[1]=xfloatp
[1];
1769 t2p
->tiff_whitechromaticities
[0]=0.3457F
; /* 0.3127F; */
1770 t2p
->tiff_whitechromaticities
[1]=0.3585F
; /* 0.3290F; */
1773 if(TIFFGetField(input
,
1775 &(t2p
->tiff_iccprofilelength
),
1776 &(t2p
->tiff_iccprofile
))!=0){
1777 t2p
->pdf_colorspace
|= T2P_CS_ICCBASED
;
1779 t2p
->tiff_iccprofilelength
=0;
1780 t2p
->tiff_iccprofile
=NULL
;
1783 #ifdef CCITT_SUPPORT
1784 if( t2p
->tiff_bitspersample
==1 &&
1785 t2p
->tiff_samplesperpixel
==1){
1786 t2p
->pdf_compression
= T2P_COMPRESS_G4
;
1795 This function returns the necessary size of a data buffer to contain the raw or
1796 uncompressed image data from the input TIFF for a page.
1799 void t2p_read_tiff_size(T2P
* t2p
, TIFF
* input
){
1802 #if defined(JPEG_SUPPORT) || defined (OJPEG_SUPPORT)
1803 unsigned char* jpt
=NULL
;
1805 tstrip_t stripcount
=0;
1809 if(t2p
->pdf_transcode
== T2P_TRANSCODE_RAW
){
1810 #ifdef CCITT_SUPPORT
1811 if(t2p
->pdf_compression
== T2P_COMPRESS_G4
){
1812 TIFFGetField(input
, TIFFTAG_STRIPBYTECOUNTS
, &sbc
);
1813 t2p
->tiff_datasize
=(tmsize_t
)sbc
[0];
1818 if(t2p
->pdf_compression
== T2P_COMPRESS_ZIP
){
1819 TIFFGetField(input
, TIFFTAG_STRIPBYTECOUNTS
, &sbc
);
1820 t2p
->tiff_datasize
=(tmsize_t
)sbc
[0];
1824 #ifdef OJPEG_SUPPORT
1825 if(t2p
->tiff_compression
== COMPRESSION_OJPEG
){
1826 if(!TIFFGetField(input
, TIFFTAG_STRIPBYTECOUNTS
, &sbc
)){
1827 TIFFError(TIFF2PDF_MODULE
,
1828 "Input file %s missing field: TIFFTAG_STRIPBYTECOUNTS",
1829 TIFFFileName(input
));
1830 t2p
->t2p_error
= T2P_ERR_ERROR
;
1833 stripcount
=TIFFNumberOfStrips(input
);
1834 for(i
=0;i
<stripcount
;i
++){
1835 k
= checkAdd64(k
, sbc
[i
], t2p
);
1837 if(TIFFGetField(input
, TIFFTAG_JPEGIFOFFSET
, &(t2p
->tiff_dataoffset
))){
1838 if(t2p
->tiff_dataoffset
!= 0){
1839 if(TIFFGetField(input
, TIFFTAG_JPEGIFBYTECOUNT
, &(t2p
->tiff_datasize
))!=0){
1840 if((uint64
)t2p
->tiff_datasize
< k
) {
1841 TIFFWarning(TIFF2PDF_MODULE
,
1842 "Input file %s has short JPEG interchange file byte count",
1843 TIFFFileName(input
));
1844 t2p
->pdf_ojpegiflength
=t2p
->tiff_datasize
;
1845 k
= checkAdd64(k
, t2p
->tiff_datasize
, t2p
);
1846 k
= checkAdd64(k
, 6, t2p
);
1847 k
= checkAdd64(k
, stripcount
, t2p
);
1848 k
= checkAdd64(k
, stripcount
, t2p
);
1849 t2p
->tiff_datasize
= (tsize_t
) k
;
1850 if ((uint64
) t2p
->tiff_datasize
!= k
) {
1851 TIFFError(TIFF2PDF_MODULE
, "Integer overflow");
1852 t2p
->t2p_error
= T2P_ERR_ERROR
;
1858 TIFFError(TIFF2PDF_MODULE
,
1859 "Input file %s missing field: TIFFTAG_JPEGIFBYTECOUNT",
1860 TIFFFileName(input
));
1861 t2p
->t2p_error
= T2P_ERR_ERROR
;
1866 k
= checkAdd64(k
, stripcount
, t2p
);
1867 k
= checkAdd64(k
, stripcount
, t2p
);
1868 k
= checkAdd64(k
, 2048, t2p
);
1869 t2p
->tiff_datasize
= (tsize_t
) k
;
1870 if ((uint64
) t2p
->tiff_datasize
!= k
) {
1871 TIFFError(TIFF2PDF_MODULE
, "Integer overflow");
1872 t2p
->t2p_error
= T2P_ERR_ERROR
;
1878 if(t2p
->tiff_compression
== COMPRESSION_JPEG
) {
1880 if(TIFFGetField(input
, TIFFTAG_JPEGTABLES
, &count
, &jpt
) != 0 ){
1883 k
-= 2; /* don't use EOI of header */
1886 k
= 2; /* SOI for first strip */
1888 stripcount
=TIFFNumberOfStrips(input
);
1889 if(!TIFFGetField(input
, TIFFTAG_STRIPBYTECOUNTS
, &sbc
)){
1890 TIFFError(TIFF2PDF_MODULE
,
1891 "Input file %s missing field: TIFFTAG_STRIPBYTECOUNTS",
1892 TIFFFileName(input
));
1893 t2p
->t2p_error
= T2P_ERR_ERROR
;
1896 for(i
=0;i
<stripcount
;i
++){
1897 k
= checkAdd64(k
, sbc
[i
], t2p
);
1898 k
-=4; /* don't use SOI or EOI of strip */
1900 k
= checkAdd64(k
, 2, t2p
); /* use EOI of last strip */
1901 t2p
->tiff_datasize
= (tsize_t
) k
;
1902 if ((uint64
) t2p
->tiff_datasize
!= k
) {
1903 TIFFError(TIFF2PDF_MODULE
, "Integer overflow");
1904 t2p
->t2p_error
= T2P_ERR_ERROR
;
1911 k
= checkMultiply64(TIFFScanlineSize(input
), t2p
->tiff_length
, t2p
);
1912 if(t2p
->tiff_planar
==PLANARCONFIG_SEPARATE
){
1913 k
= checkMultiply64(k
, t2p
->tiff_samplesperpixel
, t2p
);
1916 /* Assume we had overflow inside TIFFScanlineSize */
1917 t2p
->t2p_error
= T2P_ERR_ERROR
;
1920 t2p
->tiff_datasize
= (tsize_t
) k
;
1921 if ((uint64
) t2p
->tiff_datasize
!= k
) {
1922 TIFFError(TIFF2PDF_MODULE
, "Integer overflow");
1923 t2p
->t2p_error
= T2P_ERR_ERROR
;
1930 This function returns the necessary size of a data buffer to contain the raw or
1931 uncompressed image data from the input TIFF for a tile of a page.
1934 void t2p_read_tiff_size_tile(T2P
* t2p
, TIFF
* input
, ttile_t tile
){
1943 edge
|= t2p_tile_is_right_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
);
1944 edge
|= t2p_tile_is_bottom_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
);
1946 if(t2p
->pdf_transcode
==T2P_TRANSCODE_RAW
){
1948 #if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
1949 && !(t2p
->pdf_compression
==T2P_COMPRESS_JPEG
)
1952 t2p
->tiff_datasize
=TIFFTileSize(input
);
1953 if (t2p
->tiff_datasize
== 0) {
1954 /* Assume we had overflow inside TIFFTileSize */
1955 t2p
->t2p_error
= T2P_ERR_ERROR
;
1959 TIFFGetField(input
, TIFFTAG_TILEBYTECOUNTS
, &tbc
);
1961 #ifdef OJPEG_SUPPORT
1962 if(t2p
->tiff_compression
==COMPRESSION_OJPEG
){
1963 k
= checkAdd64(k
, 2048, t2p
);
1967 if(t2p
->tiff_compression
==COMPRESSION_JPEG
) {
1969 if(TIFFGetField(input
, TIFFTAG_JPEGTABLES
, &count
, &jpt
)!=0){
1971 k
= checkAdd64(k
, count
, t2p
);
1972 k
-= 2; /* don't use EOI of header or SOI of tile */
1977 t2p
->tiff_datasize
= (tsize_t
) k
;
1978 if ((uint64
) t2p
->tiff_datasize
!= k
) {
1979 TIFFError(TIFF2PDF_MODULE
, "Integer overflow");
1980 t2p
->t2p_error
= T2P_ERR_ERROR
;
1985 k
= TIFFTileSize(input
);
1986 if(t2p
->tiff_planar
==PLANARCONFIG_SEPARATE
){
1987 k
= checkMultiply64(k
, t2p
->tiff_samplesperpixel
, t2p
);
1990 /* Assume we had overflow inside TIFFTileSize */
1991 t2p
->t2p_error
= T2P_ERR_ERROR
;
1994 t2p
->tiff_datasize
= (tsize_t
) k
;
1995 if ((uint64
) t2p
->tiff_datasize
!= k
) {
1996 TIFFError(TIFF2PDF_MODULE
, "Integer overflow");
1997 t2p
->t2p_error
= T2P_ERR_ERROR
;
2004 * This functions returns a non-zero value when the tile is on the right edge
2005 * and does not have full imaged tile width.
2008 int t2p_tile_is_right_edge(T2P_TILES tiles
, ttile_t tile
){
2010 if( ((tile
+1) % tiles
.tiles_tilecountx
== 0)
2011 && (tiles
.tiles_edgetilewidth
!= 0) ){
2019 * This functions returns a non-zero value when the tile is on the bottom edge
2020 * and does not have full imaged tile length.
2023 int t2p_tile_is_bottom_edge(T2P_TILES tiles
, ttile_t tile
){
2025 if( ((tile
+1) > (tiles
.tiles_tilecount
-tiles
.tiles_tilecountx
) )
2026 && (tiles
.tiles_edgetilelength
!= 0) ){
2034 * This function returns a non-zero value when the tile is a right edge tile
2035 * or a bottom edge tile.
2038 int t2p_tile_is_edge(T2P_TILES tiles
, ttile_t tile
){
2040 return(t2p_tile_is_right_edge(tiles
, tile
) | t2p_tile_is_bottom_edge(tiles
, tile
) );
2044 This function returns a non-zero value when the tile is a right edge tile and a bottom
2048 int t2p_tile_is_corner_edge(T2P_TILES tiles
, ttile_t tile
){
2050 return(t2p_tile_is_right_edge(tiles
, tile
) & t2p_tile_is_bottom_edge(tiles
, tile
) );
2055 This function reads the raster image data from the input TIFF for an image and writes
2056 the data to the output PDF XObject image dictionary stream. It returns the amount written
2060 tsize_t
t2p_readwrite_pdf_image(T2P
* t2p
, TIFF
* input
, TIFF
* output
){
2063 unsigned char* buffer
=NULL
;
2064 unsigned char* samplebuffer
=NULL
;
2065 tsize_t bufferoffset
=0;
2066 tsize_t samplebufferoffset
=0;
2070 tstrip_t stripcount
=0;
2071 tsize_t stripsize
=0;
2072 tsize_t sepstripcount
=0;
2073 tsize_t sepstripsize
=0;
2074 #ifdef OJPEG_SUPPORT
2075 toff_t inputoffset
=0;
2085 unsigned char* stripbuffer
;
2086 tsize_t striplength
=0;
2087 uint32 max_striplength
=0;
2090 /* Fail if prior error (in particular, can't trust tiff_datasize) */
2091 if (t2p
->t2p_error
!= T2P_ERR_OK
)
2094 if(t2p
->pdf_transcode
== T2P_TRANSCODE_RAW
){
2095 #ifdef CCITT_SUPPORT
2096 if(t2p
->pdf_compression
== T2P_COMPRESS_G4
){
2097 buffer
= (unsigned char*)
2098 _TIFFmalloc(t2p
->tiff_datasize
);
2099 if (buffer
== NULL
) {
2100 TIFFError(TIFF2PDF_MODULE
,
2101 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2102 (unsigned long) t2p
->tiff_datasize
,
2103 TIFFFileName(input
));
2104 t2p
->t2p_error
= T2P_ERR_ERROR
;
2107 TIFFReadRawStrip(input
, 0, (tdata_t
) buffer
,
2108 t2p
->tiff_datasize
);
2109 if (t2p
->tiff_fillorder
==FILLORDER_LSB2MSB
){
2111 * make sure is lsb-to-msb
2112 * bit-endianness fill order
2114 TIFFReverseBits(buffer
,
2115 t2p
->tiff_datasize
);
2117 t2pWriteFile(output
, (tdata_t
) buffer
,
2118 t2p
->tiff_datasize
);
2120 return(t2p
->tiff_datasize
);
2124 if (t2p
->pdf_compression
== T2P_COMPRESS_ZIP
) {
2125 buffer
= (unsigned char*)
2126 _TIFFmalloc(t2p
->tiff_datasize
);
2128 TIFFError(TIFF2PDF_MODULE
,
2129 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2130 (unsigned long) t2p
->tiff_datasize
,
2131 TIFFFileName(input
));
2132 t2p
->t2p_error
= T2P_ERR_ERROR
;
2135 memset(buffer
, 0, t2p
->tiff_datasize
);
2136 TIFFReadRawStrip(input
, 0, (tdata_t
) buffer
,
2137 t2p
->tiff_datasize
);
2138 if (t2p
->tiff_fillorder
==FILLORDER_LSB2MSB
) {
2139 TIFFReverseBits(buffer
,
2140 t2p
->tiff_datasize
);
2142 t2pWriteFile(output
, (tdata_t
) buffer
,
2143 t2p
->tiff_datasize
);
2145 return(t2p
->tiff_datasize
);
2148 #ifdef OJPEG_SUPPORT
2149 if(t2p
->tiff_compression
== COMPRESSION_OJPEG
) {
2151 if(t2p
->tiff_dataoffset
!= 0) {
2152 buffer
= (unsigned char*)
2153 _TIFFmalloc(t2p
->tiff_datasize
);
2154 if(buffer
== NULL
) {
2155 TIFFError(TIFF2PDF_MODULE
,
2156 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2157 (unsigned long) t2p
->tiff_datasize
,
2158 TIFFFileName(input
));
2159 t2p
->t2p_error
= T2P_ERR_ERROR
;
2162 memset(buffer
, 0, t2p
->tiff_datasize
);
2163 if(t2p
->pdf_ojpegiflength
==0){
2164 inputoffset
=t2pSeekFile(input
, 0,
2167 t2p
->tiff_dataoffset
,
2169 t2pReadFile(input
, (tdata_t
) buffer
,
2170 t2p
->tiff_datasize
);
2171 t2pSeekFile(input
, inputoffset
,
2173 t2pWriteFile(output
, (tdata_t
) buffer
,
2174 t2p
->tiff_datasize
);
2176 return(t2p
->tiff_datasize
);
2178 inputoffset
=t2pSeekFile(input
, 0,
2181 t2p
->tiff_dataoffset
,
2183 bufferoffset
= t2pReadFile(input
,
2185 t2p
->pdf_ojpegiflength
);
2186 t2p
->pdf_ojpegiflength
= 0;
2187 t2pSeekFile(input
, inputoffset
,
2190 TIFFTAG_YCBCRSUBSAMPLING
,
2192 buffer
[bufferoffset
++]= 0xff;
2193 buffer
[bufferoffset
++]= 0xdd;
2194 buffer
[bufferoffset
++]= 0x00;
2195 buffer
[bufferoffset
++]= 0x04;
2198 ri
=(t2p
->tiff_width
+h_samp
-1) / h_samp
;
2200 TIFFTAG_ROWSPERSTRIP
,
2202 ri
*=(rows
+v_samp
-1)/v_samp
;
2203 buffer
[bufferoffset
++]= (ri
>>8) & 0xff;
2204 buffer
[bufferoffset
++]= ri
& 0xff;
2205 stripcount
=TIFFNumberOfStrips(input
);
2206 for(i
=0;i
<stripcount
;i
++){
2208 buffer
[bufferoffset
++]=0xff;
2209 buffer
[bufferoffset
++]=(0xd0 | ((i
-1)%8
));
2211 bufferoffset
+=TIFFReadRawStrip(input
,
2213 (tdata_t
) &(((unsigned char*)buffer
)[bufferoffset
]),
2216 t2pWriteFile(output
, (tdata_t
) buffer
, bufferoffset
);
2218 return(bufferoffset
);
2221 if(! t2p
->pdf_ojpegdata
){
2222 TIFFError(TIFF2PDF_MODULE
,
2223 "No support for OJPEG image %s with bad tables",
2224 TIFFFileName(input
));
2225 t2p
->t2p_error
= T2P_ERR_ERROR
;
2228 buffer
= (unsigned char*)
2229 _TIFFmalloc(t2p
->tiff_datasize
);
2231 TIFFError(TIFF2PDF_MODULE
,
2232 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2233 (unsigned long) t2p
->tiff_datasize
,
2234 TIFFFileName(input
));
2235 t2p
->t2p_error
= T2P_ERR_ERROR
;
2238 memset(buffer
, 0, t2p
->tiff_datasize
);
2239 _TIFFmemcpy(buffer
, t2p
->pdf_ojpegdata
, t2p
->pdf_ojpegdatalength
);
2240 bufferoffset
=t2p
->pdf_ojpegdatalength
;
2241 stripcount
=TIFFNumberOfStrips(input
);
2242 for(i
=0;i
<stripcount
;i
++){
2244 buffer
[bufferoffset
++]=0xff;
2245 buffer
[bufferoffset
++]=(0xd0 | ((i
-1)%8
));
2247 bufferoffset
+=TIFFReadRawStrip(input
,
2249 (tdata_t
) &(((unsigned char*)buffer
)[bufferoffset
]),
2252 if( ! ( (buffer
[bufferoffset
-1]==0xd9) && (buffer
[bufferoffset
-2]==0xff) ) ){
2253 buffer
[bufferoffset
++]=0xff;
2254 buffer
[bufferoffset
++]=0xd9;
2256 t2pWriteFile(output
, (tdata_t
) buffer
, bufferoffset
);
2258 return(bufferoffset
);
2259 TIFFError(TIFF2PDF_MODULE
,
2260 "No support for OJPEG image %s with no JPEG File Interchange offset",
2261 TIFFFileName(input
));
2262 t2p
->t2p_error
= T2P_ERR_ERROR
;
2265 return(t2p
->tiff_datasize
);
2269 if(t2p
->tiff_compression
== COMPRESSION_JPEG
) {
2271 buffer
= (unsigned char*)
2272 _TIFFmalloc(t2p
->tiff_datasize
);
2274 TIFFError(TIFF2PDF_MODULE
,
2275 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2276 (unsigned long) t2p
->tiff_datasize
,
2277 TIFFFileName(input
));
2278 t2p
->t2p_error
= T2P_ERR_ERROR
;
2281 memset(buffer
, 0, t2p
->tiff_datasize
);
2282 if (TIFFGetField(input
, TIFFTAG_JPEGTABLES
, &count
, &jpt
) != 0) {
2284 _TIFFmemcpy(buffer
, jpt
, count
);
2285 bufferoffset
+= count
- 2;
2288 stripcount
=TIFFNumberOfStrips(input
);
2289 TIFFGetField(input
, TIFFTAG_STRIPBYTECOUNTS
, &sbc
);
2290 for(i
=0;i
<stripcount
;i
++){
2291 if(sbc
[i
]>max_striplength
) max_striplength
=sbc
[i
];
2293 stripbuffer
= (unsigned char*)
2294 _TIFFmalloc(max_striplength
);
2295 if(stripbuffer
==NULL
){
2296 TIFFError(TIFF2PDF_MODULE
,
2297 "Can't allocate %u bytes of memory for t2p_readwrite_pdf_image, %s",
2299 TIFFFileName(input
));
2301 t2p
->t2p_error
= T2P_ERR_ERROR
;
2304 for(i
=0;i
<stripcount
;i
++){
2305 striplength
=TIFFReadRawStrip(input
, i
, (tdata_t
) stripbuffer
, -1);
2306 if(!t2p_process_jpeg_strip(
2313 TIFFError(TIFF2PDF_MODULE
,
2314 "Can't process JPEG data in input file %s",
2315 TIFFFileName(input
));
2316 _TIFFfree(samplebuffer
);
2318 t2p
->t2p_error
= T2P_ERR_ERROR
;
2322 buffer
[bufferoffset
++]=0xff;
2323 buffer
[bufferoffset
++]=0xd9;
2324 t2pWriteFile(output
, (tdata_t
) buffer
, bufferoffset
);
2325 _TIFFfree(stripbuffer
);
2327 return(bufferoffset
);
2333 if(t2p
->pdf_sample
==T2P_SAMPLE_NOTHING
){
2334 buffer
= (unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2336 TIFFError(TIFF2PDF_MODULE
,
2337 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2338 (unsigned long) t2p
->tiff_datasize
,
2339 TIFFFileName(input
));
2340 t2p
->t2p_error
= T2P_ERR_ERROR
;
2343 memset(buffer
, 0, t2p
->tiff_datasize
);
2344 stripsize
=TIFFStripSize(input
);
2345 stripcount
=TIFFNumberOfStrips(input
);
2346 for(i
=0;i
<stripcount
;i
++){
2348 TIFFReadEncodedStrip(input
,
2350 (tdata_t
) &buffer
[bufferoffset
],
2353 TIFFError(TIFF2PDF_MODULE
,
2354 "Error on decoding strip %u of %s",
2356 TIFFFileName(input
));
2358 t2p
->t2p_error
=T2P_ERR_ERROR
;
2364 if(t2p
->pdf_sample
& T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG
){
2366 sepstripsize
=TIFFStripSize(input
);
2367 sepstripcount
=TIFFNumberOfStrips(input
);
2369 stripsize
=sepstripsize
*t2p
->tiff_samplesperpixel
;
2370 stripcount
=sepstripcount
/t2p
->tiff_samplesperpixel
;
2372 buffer
= (unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2374 TIFFError(TIFF2PDF_MODULE
,
2375 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2376 (unsigned long) t2p
->tiff_datasize
,
2377 TIFFFileName(input
));
2378 t2p
->t2p_error
= T2P_ERR_ERROR
;
2381 memset(buffer
, 0, t2p
->tiff_datasize
);
2382 samplebuffer
= (unsigned char*) _TIFFmalloc(stripsize
);
2383 if(samplebuffer
==NULL
){
2384 TIFFError(TIFF2PDF_MODULE
,
2385 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2386 (unsigned long) t2p
->tiff_datasize
,
2387 TIFFFileName(input
));
2388 t2p
->t2p_error
= T2P_ERR_ERROR
;
2391 for(i
=0;i
<stripcount
;i
++){
2392 samplebufferoffset
=0;
2393 for(j
=0;j
<t2p
->tiff_samplesperpixel
;j
++){
2395 TIFFReadEncodedStrip(input
,
2397 (tdata_t
) &(samplebuffer
[samplebufferoffset
]),
2400 TIFFError(TIFF2PDF_MODULE
,
2401 "Error on decoding strip %u of %s",
2403 TIFFFileName(input
));
2405 t2p
->t2p_error
=T2P_ERR_ERROR
;
2408 samplebufferoffset
+=read
;
2410 t2p_sample_planar_separate_to_contig(
2412 &(buffer
[bufferoffset
]),
2414 samplebufferoffset
);
2415 bufferoffset
+=samplebufferoffset
;
2417 _TIFFfree(samplebuffer
);
2421 buffer
= (unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2423 TIFFError(TIFF2PDF_MODULE
,
2424 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2425 (unsigned long) t2p
->tiff_datasize
,
2426 TIFFFileName(input
));
2427 t2p
->t2p_error
= T2P_ERR_ERROR
;
2430 memset(buffer
, 0, t2p
->tiff_datasize
);
2431 stripsize
=TIFFStripSize(input
);
2432 stripcount
=TIFFNumberOfStrips(input
);
2433 for(i
=0;i
<stripcount
;i
++){
2435 TIFFReadEncodedStrip(input
,
2437 (tdata_t
) &buffer
[bufferoffset
],
2440 TIFFError(TIFF2PDF_MODULE
,
2441 "Error on decoding strip %u of %s",
2443 TIFFFileName(input
));
2444 _TIFFfree(samplebuffer
);
2446 t2p
->t2p_error
=T2P_ERR_ERROR
;
2452 if(t2p
->pdf_sample
& T2P_SAMPLE_REALIZE_PALETTE
){
2454 samplebuffer
=(unsigned char*)_TIFFrealloc(
2456 t2p
->tiff_datasize
* t2p
->tiff_samplesperpixel
);
2457 if(samplebuffer
==NULL
){
2458 TIFFError(TIFF2PDF_MODULE
,
2459 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2460 (unsigned long) t2p
->tiff_datasize
,
2461 TIFFFileName(input
));
2462 t2p
->t2p_error
= T2P_ERR_ERROR
;
2465 buffer
=samplebuffer
;
2466 t2p
->tiff_datasize
*= t2p
->tiff_samplesperpixel
;
2468 t2p_sample_realize_palette(t2p
, buffer
);
2471 if(t2p
->pdf_sample
& T2P_SAMPLE_RGBA_TO_RGB
){
2472 t2p
->tiff_datasize
=t2p_sample_rgba_to_rgb(
2474 t2p
->tiff_width
*t2p
->tiff_length
);
2477 if(t2p
->pdf_sample
& T2P_SAMPLE_RGBAA_TO_RGB
){
2478 t2p
->tiff_datasize
=t2p_sample_rgbaa_to_rgb(
2480 t2p
->tiff_width
*t2p
->tiff_length
);
2483 if(t2p
->pdf_sample
& T2P_SAMPLE_YCBCR_TO_RGB
){
2484 samplebuffer
=(unsigned char*)_TIFFrealloc(
2486 t2p
->tiff_width
*t2p
->tiff_length
*4);
2487 if(samplebuffer
==NULL
){
2488 TIFFError(TIFF2PDF_MODULE
,
2489 "Can't allocate %lu bytes of memory for t2p_readwrite_pdf_image, %s",
2490 (unsigned long) t2p
->tiff_datasize
,
2491 TIFFFileName(input
));
2492 t2p
->t2p_error
= T2P_ERR_ERROR
;
2496 buffer
=samplebuffer
;
2498 if(!TIFFReadRGBAImageOriented(
2503 ORIENTATION_TOPLEFT
,
2505 TIFFError(TIFF2PDF_MODULE
,
2506 "Can't use TIFFReadRGBAImageOriented to extract RGB image from %s",
2507 TIFFFileName(input
));
2508 t2p
->t2p_error
= T2P_ERR_ERROR
;
2511 t2p
->tiff_datasize
=t2p_sample_abgr_to_rgb(
2513 t2p
->tiff_width
*t2p
->tiff_length
);
2517 if(t2p
->pdf_sample
& T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED
){
2518 t2p
->tiff_datasize
=t2p_sample_lab_signed_to_unsigned(
2520 t2p
->tiff_width
*t2p
->tiff_length
);
2526 t2p_disable(output
);
2527 TIFFSetField(output
, TIFFTAG_PHOTOMETRIC
, t2p
->tiff_photometric
);
2528 TIFFSetField(output
, TIFFTAG_BITSPERSAMPLE
, t2p
->tiff_bitspersample
);
2529 TIFFSetField(output
, TIFFTAG_SAMPLESPERPIXEL
, t2p
->tiff_samplesperpixel
);
2530 TIFFSetField(output
, TIFFTAG_IMAGEWIDTH
, t2p
->tiff_width
);
2531 TIFFSetField(output
, TIFFTAG_IMAGELENGTH
, t2p
->tiff_length
);
2532 TIFFSetField(output
, TIFFTAG_ROWSPERSTRIP
, t2p
->tiff_length
);
2533 TIFFSetField(output
, TIFFTAG_PLANARCONFIG
, PLANARCONFIG_CONTIG
);
2534 TIFFSetField(output
, TIFFTAG_FILLORDER
, FILLORDER_MSB2LSB
);
2536 switch(t2p
->pdf_compression
){
2537 case T2P_COMPRESS_NONE
:
2538 TIFFSetField(output
, TIFFTAG_COMPRESSION
, COMPRESSION_NONE
);
2540 #ifdef CCITT_SUPPORT
2541 case T2P_COMPRESS_G4
:
2542 TIFFSetField(output
, TIFFTAG_COMPRESSION
, COMPRESSION_CCITTFAX4
);
2546 case T2P_COMPRESS_JPEG
:
2547 if(t2p
->tiff_photometric
==PHOTOMETRIC_YCBCR
) {
2548 uint16 hor
= 0, ver
= 0;
2549 if (TIFFGetField(input
, TIFFTAG_YCBCRSUBSAMPLING
, &hor
, &ver
) !=0 ) {
2550 if(hor
!= 0 && ver
!= 0){
2551 TIFFSetField(output
, TIFFTAG_YCBCRSUBSAMPLING
, hor
, ver
);
2554 if(TIFFGetField(input
, TIFFTAG_REFERENCEBLACKWHITE
, &xfloatp
)!=0){
2555 TIFFSetField(output
, TIFFTAG_REFERENCEBLACKWHITE
, xfloatp
);
2558 if(TIFFSetField(output
, TIFFTAG_COMPRESSION
, COMPRESSION_JPEG
)==0){
2559 TIFFError(TIFF2PDF_MODULE
,
2560 "Unable to use JPEG compression for input %s and output %s",
2561 TIFFFileName(input
),
2562 TIFFFileName(output
));
2564 t2p
->t2p_error
= T2P_ERR_ERROR
;
2567 TIFFSetField(output
, TIFFTAG_JPEGTABLESMODE
, 0);
2569 if(t2p
->pdf_colorspace
& (T2P_CS_RGB
| T2P_CS_LAB
)){
2570 TIFFSetField(output
, TIFFTAG_PHOTOMETRIC
, PHOTOMETRIC_YCBCR
);
2571 if(t2p
->tiff_photometric
!= PHOTOMETRIC_YCBCR
){
2572 TIFFSetField(output
, TIFFTAG_JPEGCOLORMODE
, JPEGCOLORMODE_RGB
);
2574 TIFFSetField(output
, TIFFTAG_JPEGCOLORMODE
, JPEGCOLORMODE_RAW
);
2577 if(t2p
->pdf_colorspace
& T2P_CS_GRAY
){
2580 if(t2p
->pdf_colorspace
& T2P_CS_CMYK
){
2583 if(t2p
->pdf_defaultcompressionquality
!= 0){
2584 TIFFSetField(output
,
2585 TIFFTAG_JPEGQUALITY
,
2586 t2p
->pdf_defaultcompressionquality
);
2592 case T2P_COMPRESS_ZIP
:
2593 TIFFSetField(output
, TIFFTAG_COMPRESSION
, COMPRESSION_DEFLATE
);
2594 if(t2p
->pdf_defaultcompressionquality%100
!= 0){
2595 TIFFSetField(output
,
2597 t2p
->pdf_defaultcompressionquality
% 100);
2599 if(t2p
->pdf_defaultcompressionquality
/100 != 0){
2600 TIFFSetField(output
,
2602 (t2p
->pdf_defaultcompressionquality
/ 100));
2611 t2p
->outputwritten
= 0;
2613 if(t2p
->pdf_compression
== T2P_COMPRESS_JPEG
2614 && t2p
->tiff_photometric
== PHOTOMETRIC_YCBCR
){
2615 bufferoffset
= TIFFWriteEncodedStrip(output
, (tstrip_t
)0,
2617 stripsize
* stripcount
);
2621 bufferoffset
= TIFFWriteEncodedStrip(output
, (tstrip_t
)0,
2623 t2p
->tiff_datasize
);
2625 if (buffer
!= NULL
) {
2630 if (bufferoffset
== (tsize_t
)-1) {
2631 TIFFError(TIFF2PDF_MODULE
,
2632 "Error writing encoded strip to output PDF %s",
2633 TIFFFileName(output
));
2634 t2p
->t2p_error
= T2P_ERR_ERROR
;
2638 written
= t2p
->outputwritten
;
2643 * This function reads the raster image data from the input TIFF for an image
2644 * tile and writes the data to the output PDF XObject image dictionary stream
2645 * for the tile. It returns the amount written or zero on error.
2648 tsize_t
t2p_readwrite_pdf_image_tile(T2P
* t2p
, TIFF
* input
, TIFF
* output
, ttile_t tile
){
2652 unsigned char* buffer
=NULL
;
2653 tsize_t bufferoffset
=0;
2654 unsigned char* samplebuffer
=NULL
;
2655 tsize_t samplebufferoffset
=0;
2658 ttile_t tilecount
=0;
2660 ttile_t septilecount
=0;
2661 tsize_t septilesize
=0;
2668 /* Fail if prior error (in particular, can't trust tiff_datasize) */
2669 if (t2p
->t2p_error
!= T2P_ERR_OK
)
2672 edge
|= t2p_tile_is_right_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
);
2673 edge
|= t2p_tile_is_bottom_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
);
2675 if( (t2p
->pdf_transcode
== T2P_TRANSCODE_RAW
) && ((edge
== 0)
2676 #if defined(JPEG_SUPPORT) || defined(OJPEG_SUPPORT)
2677 || (t2p
->pdf_compression
== T2P_COMPRESS_JPEG
)
2681 #ifdef CCITT_SUPPORT
2682 if(t2p
->pdf_compression
== T2P_COMPRESS_G4
){
2683 buffer
= (unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2685 TIFFError(TIFF2PDF_MODULE
,
2686 "Can't allocate %lu bytes of memory "
2687 "for t2p_readwrite_pdf_image_tile, %s",
2688 (unsigned long) t2p
->tiff_datasize
,
2689 TIFFFileName(input
));
2690 t2p
->t2p_error
= T2P_ERR_ERROR
;
2693 TIFFReadRawTile(input
, tile
, (tdata_t
) buffer
, t2p
->tiff_datasize
);
2694 if (t2p
->tiff_fillorder
==FILLORDER_LSB2MSB
){
2695 TIFFReverseBits(buffer
, t2p
->tiff_datasize
);
2697 t2pWriteFile(output
, (tdata_t
) buffer
, t2p
->tiff_datasize
);
2699 return(t2p
->tiff_datasize
);
2703 if(t2p
->pdf_compression
== T2P_COMPRESS_ZIP
){
2704 buffer
= (unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2706 TIFFError(TIFF2PDF_MODULE
,
2707 "Can't allocate %lu bytes of memory "
2708 "for t2p_readwrite_pdf_image_tile, %s",
2709 (unsigned long) t2p
->tiff_datasize
,
2710 TIFFFileName(input
));
2711 t2p
->t2p_error
= T2P_ERR_ERROR
;
2714 TIFFReadRawTile(input
, tile
, (tdata_t
) buffer
, t2p
->tiff_datasize
);
2715 if (t2p
->tiff_fillorder
==FILLORDER_LSB2MSB
){
2716 TIFFReverseBits(buffer
, t2p
->tiff_datasize
);
2718 t2pWriteFile(output
, (tdata_t
) buffer
, t2p
->tiff_datasize
);
2720 return(t2p
->tiff_datasize
);
2723 #ifdef OJPEG_SUPPORT
2724 if(t2p
->tiff_compression
== COMPRESSION_OJPEG
){
2725 if(! t2p
->pdf_ojpegdata
){
2726 TIFFError(TIFF2PDF_MODULE
,
2727 "No support for OJPEG image %s with "
2729 TIFFFileName(input
));
2730 t2p
->t2p_error
= T2P_ERR_ERROR
;
2733 buffer
=(unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2735 TIFFError(TIFF2PDF_MODULE
,
2736 "Can't allocate %lu bytes of memory "
2737 "for t2p_readwrite_pdf_image, %s",
2738 (unsigned long) t2p
->tiff_datasize
,
2739 TIFFFileName(input
));
2740 t2p
->t2p_error
= T2P_ERR_ERROR
;
2743 _TIFFmemcpy(buffer
, t2p
->pdf_ojpegdata
, t2p
->pdf_ojpegdatalength
);
2745 if(t2p_tile_is_bottom_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
)){
2747 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilelength
>> 8) & 0xff;
2749 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilelength
) & 0xff;
2751 if(t2p_tile_is_right_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
)){
2753 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilewidth
>> 8) & 0xff;
2755 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilewidth
) & 0xff;
2758 bufferoffset
=t2p
->pdf_ojpegdatalength
;
2759 bufferoffset
+=TIFFReadRawTile(input
,
2761 (tdata_t
) &(((unsigned char*)buffer
)[bufferoffset
]),
2763 ((unsigned char*)buffer
)[bufferoffset
++]=0xff;
2764 ((unsigned char*)buffer
)[bufferoffset
++]=0xd9;
2765 t2pWriteFile(output
, (tdata_t
) buffer
, bufferoffset
);
2767 return(bufferoffset
);
2771 if(t2p
->tiff_compression
== COMPRESSION_JPEG
){
2772 unsigned char table_end
[2];
2774 buffer
= (unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2776 TIFFError(TIFF2PDF_MODULE
,
2777 "Can't allocate %lu bytes of memory "
2778 "for t2p_readwrite_pdf_image_tile, %s",
2780 TIFFFileName(input
));
2781 t2p
->t2p_error
= T2P_ERR_ERROR
;
2784 if(TIFFGetField(input
, TIFFTAG_JPEGTABLES
, &count
, &jpt
) != 0) {
2786 _TIFFmemcpy(buffer
, jpt
, count
);
2787 bufferoffset
+= count
- 2;
2788 table_end
[0] = buffer
[bufferoffset
-2];
2789 table_end
[1] = buffer
[bufferoffset
-1];
2792 xuint32
= bufferoffset
;
2793 bufferoffset
+= TIFFReadRawTile(
2796 (tdata_t
) &(((unsigned char*)buffer
)[bufferoffset
-2]),
2798 buffer
[xuint32
-2]=table_end
[0];
2799 buffer
[xuint32
-1]=table_end
[1];
2801 bufferoffset
+= TIFFReadRawTile(
2804 (tdata_t
) &(((unsigned char*)buffer
)[bufferoffset
]),
2808 t2pWriteFile(output
, (tdata_t
) buffer
, bufferoffset
);
2810 return(bufferoffset
);
2816 if(t2p
->pdf_sample
==T2P_SAMPLE_NOTHING
){
2817 buffer
= (unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2819 TIFFError(TIFF2PDF_MODULE
,
2820 "Can't allocate %lu bytes of memory for "
2821 "t2p_readwrite_pdf_image_tile, %s",
2822 (unsigned long) t2p
->tiff_datasize
,
2823 TIFFFileName(input
));
2824 t2p
->t2p_error
= T2P_ERR_ERROR
;
2828 read
= TIFFReadEncodedTile(
2831 (tdata_t
) &buffer
[bufferoffset
],
2832 t2p
->tiff_datasize
);
2834 TIFFError(TIFF2PDF_MODULE
,
2835 "Error on decoding tile %u of %s",
2837 TIFFFileName(input
));
2839 t2p
->t2p_error
=T2P_ERR_ERROR
;
2845 if(t2p
->pdf_sample
== T2P_SAMPLE_PLANAR_SEPARATE_TO_CONTIG
){
2846 septilesize
=TIFFTileSize(input
);
2847 septilecount
=TIFFNumberOfTiles(input
);
2848 tilesize
=septilesize
*t2p
->tiff_samplesperpixel
;
2849 tilecount
=septilecount
/t2p
->tiff_samplesperpixel
;
2850 buffer
= (unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2852 TIFFError(TIFF2PDF_MODULE
,
2853 "Can't allocate %lu bytes of memory "
2854 "for t2p_readwrite_pdf_image_tile, %s",
2855 (unsigned long) t2p
->tiff_datasize
,
2856 TIFFFileName(input
));
2857 t2p
->t2p_error
= T2P_ERR_ERROR
;
2860 samplebuffer
= (unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2861 if(samplebuffer
==NULL
){
2862 TIFFError(TIFF2PDF_MODULE
,
2863 "Can't allocate %lu bytes of memory "
2864 "for t2p_readwrite_pdf_image_tile, %s",
2865 (unsigned long) t2p
->tiff_datasize
,
2866 TIFFFileName(input
));
2867 t2p
->t2p_error
= T2P_ERR_ERROR
;
2870 samplebufferoffset
=0;
2871 for(i
=0;i
<t2p
->tiff_samplesperpixel
;i
++){
2873 TIFFReadEncodedTile(input
,
2875 (tdata_t
) &(samplebuffer
[samplebufferoffset
]),
2878 TIFFError(TIFF2PDF_MODULE
,
2879 "Error on decoding tile %u of %s",
2881 TIFFFileName(input
));
2882 _TIFFfree(samplebuffer
);
2884 t2p
->t2p_error
=T2P_ERR_ERROR
;
2887 samplebufferoffset
+=read
;
2889 t2p_sample_planar_separate_to_contig(
2891 &(buffer
[bufferoffset
]),
2893 samplebufferoffset
);
2894 bufferoffset
+=samplebufferoffset
;
2895 _TIFFfree(samplebuffer
);
2899 buffer
= (unsigned char*) _TIFFmalloc(t2p
->tiff_datasize
);
2901 TIFFError(TIFF2PDF_MODULE
,
2902 "Can't allocate %lu bytes of memory "
2903 "for t2p_readwrite_pdf_image_tile, %s",
2904 (unsigned long) t2p
->tiff_datasize
,
2905 TIFFFileName(input
));
2906 t2p
->t2p_error
= T2P_ERR_ERROR
;
2909 read
= TIFFReadEncodedTile(
2912 (tdata_t
) &buffer
[bufferoffset
],
2913 t2p
->tiff_datasize
);
2915 TIFFError(TIFF2PDF_MODULE
,
2916 "Error on decoding tile %u of %s",
2918 TIFFFileName(input
));
2920 t2p
->t2p_error
=T2P_ERR_ERROR
;
2925 if(t2p
->pdf_sample
& T2P_SAMPLE_RGBA_TO_RGB
){
2926 t2p
->tiff_datasize
=t2p_sample_rgba_to_rgb(
2928 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
2929 *t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
);
2932 if(t2p
->pdf_sample
& T2P_SAMPLE_RGBAA_TO_RGB
){
2933 t2p
->tiff_datasize
=t2p_sample_rgbaa_to_rgb(
2935 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
2936 *t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
);
2939 if(t2p
->pdf_sample
& T2P_SAMPLE_YCBCR_TO_RGB
){
2940 TIFFError(TIFF2PDF_MODULE
,
2941 "No support for YCbCr to RGB in tile for %s",
2942 TIFFFileName(input
));
2944 t2p
->t2p_error
= T2P_ERR_ERROR
;
2948 if(t2p
->pdf_sample
& T2P_SAMPLE_LAB_SIGNED_TO_UNSIGNED
){
2949 t2p
->tiff_datasize
=t2p_sample_lab_signed_to_unsigned(
2951 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
2952 *t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
);
2956 if(t2p_tile_is_right_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
) != 0){
2957 t2p_tile_collapse_left(
2959 TIFFTileRowSize(input
),
2960 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
,
2961 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilewidth
,
2962 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
);
2966 t2p_disable(output
);
2967 TIFFSetField(output
, TIFFTAG_PHOTOMETRIC
, t2p
->tiff_photometric
);
2968 TIFFSetField(output
, TIFFTAG_BITSPERSAMPLE
, t2p
->tiff_bitspersample
);
2969 TIFFSetField(output
, TIFFTAG_SAMPLESPERPIXEL
, t2p
->tiff_samplesperpixel
);
2970 if(t2p_tile_is_right_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
) == 0){
2974 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
);
2979 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilewidth
);
2981 if(t2p_tile_is_bottom_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
) == 0){
2984 TIFFTAG_IMAGELENGTH
,
2985 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
);
2988 TIFFTAG_ROWSPERSTRIP
,
2989 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
);
2993 TIFFTAG_IMAGELENGTH
,
2994 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilelength
);
2997 TIFFTAG_ROWSPERSTRIP
,
2998 t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilelength
);
3000 TIFFSetField(output
, TIFFTAG_PLANARCONFIG
, PLANARCONFIG_CONTIG
);
3001 TIFFSetField(output
, TIFFTAG_FILLORDER
, FILLORDER_MSB2LSB
);
3003 switch(t2p
->pdf_compression
){
3004 case T2P_COMPRESS_NONE
:
3005 TIFFSetField(output
, TIFFTAG_COMPRESSION
, COMPRESSION_NONE
);
3007 #ifdef CCITT_SUPPORT
3008 case T2P_COMPRESS_G4
:
3009 TIFFSetField(output
, TIFFTAG_COMPRESSION
, COMPRESSION_CCITTFAX4
);
3013 case T2P_COMPRESS_JPEG
:
3014 if (t2p
->tiff_photometric
==PHOTOMETRIC_YCBCR
) {
3015 uint16 hor
= 0, ver
= 0;
3016 if (TIFFGetField(input
, TIFFTAG_YCBCRSUBSAMPLING
, &hor
, &ver
)!=0) {
3017 if (hor
!= 0 && ver
!= 0) {
3018 TIFFSetField(output
, TIFFTAG_YCBCRSUBSAMPLING
, hor
, ver
);
3021 if(TIFFGetField(input
, TIFFTAG_REFERENCEBLACKWHITE
, &xfloatp
)!=0){
3022 TIFFSetField(output
, TIFFTAG_REFERENCEBLACKWHITE
, xfloatp
);
3025 TIFFSetField(output
, TIFFTAG_COMPRESSION
, COMPRESSION_JPEG
);
3026 TIFFSetField(output
, TIFFTAG_JPEGTABLESMODE
, 0); /* JPEGTABLESMODE_NONE */
3027 if(t2p
->pdf_colorspace
& (T2P_CS_RGB
| T2P_CS_LAB
)){
3028 TIFFSetField(output
, TIFFTAG_PHOTOMETRIC
, PHOTOMETRIC_YCBCR
);
3029 if(t2p
->tiff_photometric
!= PHOTOMETRIC_YCBCR
){
3030 TIFFSetField(output
, TIFFTAG_JPEGCOLORMODE
, JPEGCOLORMODE_RGB
);
3032 TIFFSetField(output
, TIFFTAG_JPEGCOLORMODE
, JPEGCOLORMODE_RAW
);
3035 if(t2p
->pdf_colorspace
& T2P_CS_GRAY
){
3038 if(t2p
->pdf_colorspace
& T2P_CS_CMYK
){
3041 if(t2p
->pdf_defaultcompressionquality
!= 0){
3042 TIFFSetField(output
,
3043 TIFFTAG_JPEGQUALITY
,
3044 t2p
->pdf_defaultcompressionquality
);
3049 case T2P_COMPRESS_ZIP
:
3050 TIFFSetField(output
, TIFFTAG_COMPRESSION
, COMPRESSION_DEFLATE
);
3051 if(t2p
->pdf_defaultcompressionquality%100
!= 0){
3052 TIFFSetField(output
,
3054 t2p
->pdf_defaultcompressionquality
% 100);
3056 if(t2p
->pdf_defaultcompressionquality
/100 != 0){
3057 TIFFSetField(output
,
3059 (t2p
->pdf_defaultcompressionquality
/ 100));
3068 t2p
->outputwritten
= 0;
3069 bufferoffset
= TIFFWriteEncodedStrip(output
, (tstrip_t
) 0, buffer
,
3070 TIFFStripSize(output
));
3071 if (buffer
!= NULL
) {
3075 if (bufferoffset
== -1) {
3076 TIFFError(TIFF2PDF_MODULE
,
3077 "Error writing encoded tile to output PDF %s",
3078 TIFFFileName(output
));
3079 t2p
->t2p_error
= T2P_ERR_ERROR
;
3083 written
= t2p
->outputwritten
;
3088 #ifdef OJPEG_SUPPORT
3089 int t2p_process_ojpeg_tables(T2P
* t2p
, TIFF
* input
){
3101 unsigned char* ojpegdata
;
3103 uint32 offset_table
;
3111 if(!TIFFGetField(input
, TIFFTAG_JPEGPROC
, &proc
)){
3112 TIFFError(TIFF2PDF_MODULE
,
3113 "Missing JPEGProc field in OJPEG image %s",
3114 TIFFFileName(input
));
3115 t2p
->t2p_error
= T2P_ERR_ERROR
;
3118 if(proc
!=JPEGPROC_BASELINE
&& proc
!=JPEGPROC_LOSSLESS
){
3119 TIFFError(TIFF2PDF_MODULE
,
3120 "Bad JPEGProc field in OJPEG image %s",
3121 TIFFFileName(input
));
3122 t2p
->t2p_error
= T2P_ERR_ERROR
;
3125 if(!TIFFGetField(input
, TIFFTAG_JPEGQTABLES
, &q_length
, &q
)){
3126 TIFFError(TIFF2PDF_MODULE
,
3127 "Missing JPEGQTables field in OJPEG image %s",
3128 TIFFFileName(input
));
3129 t2p
->t2p_error
= T2P_ERR_ERROR
;
3132 if(q_length
< (64U * t2p
->tiff_samplesperpixel
)){
3133 TIFFError(TIFF2PDF_MODULE
,
3134 "Bad JPEGQTables field in OJPEG image %s",
3135 TIFFFileName(input
));
3136 t2p
->t2p_error
= T2P_ERR_ERROR
;
3139 if(!TIFFGetField(input
, TIFFTAG_JPEGDCTABLES
, &dc_length
, &dc
)){
3140 TIFFError(TIFF2PDF_MODULE
,
3141 "Missing JPEGDCTables field in OJPEG image %s",
3142 TIFFFileName(input
));
3143 t2p
->t2p_error
= T2P_ERR_ERROR
;
3146 if(proc
==JPEGPROC_BASELINE
){
3147 if(!TIFFGetField(input
, TIFFTAG_JPEGACTABLES
, &ac_length
, &ac
)){
3148 TIFFError(TIFF2PDF_MODULE
,
3149 "Missing JPEGACTables field in OJPEG image %s",
3150 TIFFFileName(input
));
3151 t2p
->t2p_error
= T2P_ERR_ERROR
;
3155 if(!TIFFGetField(input
, TIFFTAG_JPEGLOSSLESSPREDICTORS
, &lp
)){
3156 TIFFError(TIFF2PDF_MODULE
,
3157 "Missing JPEGLosslessPredictors field in OJPEG image %s",
3158 TIFFFileName(input
));
3159 t2p
->t2p_error
= T2P_ERR_ERROR
;
3162 if(!TIFFGetField(input
, TIFFTAG_JPEGPOINTTRANSFORM
, &pt
)){
3163 TIFFError(TIFF2PDF_MODULE
,
3164 "Missing JPEGPointTransform field in OJPEG image %s",
3165 TIFFFileName(input
));
3166 t2p
->t2p_error
= T2P_ERR_ERROR
;
3170 if(!TIFFGetField(input
, TIFFTAG_YCBCRSUBSAMPLING
, &h_samp
, &v_samp
)){
3174 if(t2p
->pdf_ojpegdata
!= NULL
){
3175 _TIFFfree(t2p
->pdf_ojpegdata
);
3176 t2p
->pdf_ojpegdata
=NULL
;
3178 t2p
->pdf_ojpegdata
= _TIFFmalloc(2048);
3179 if(t2p
->pdf_ojpegdata
== NULL
){
3180 TIFFError(TIFF2PDF_MODULE
,
3181 "Can't allocate %u bytes of memory for t2p_process_ojpeg_tables, %s",
3183 TIFFFileName(input
));
3184 t2p
->t2p_error
= T2P_ERR_ERROR
;
3187 _TIFFmemset(t2p
->pdf_ojpegdata
, 0x00, 2048);
3188 t2p
->pdf_ojpegdatalength
= 0;
3189 table_count
=t2p
->tiff_samplesperpixel
;
3190 if(proc
==JPEGPROC_BASELINE
){
3191 if(table_count
>2) table_count
=2;
3193 ojpegdata
=(unsigned char*)t2p
->pdf_ojpegdata
;
3194 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3195 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xd8;
3196 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3197 if(proc
==JPEGPROC_BASELINE
){
3198 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xc0;
3200 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xc3;
3202 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x00;
3203 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=(8 + 3*t2p
->tiff_samplesperpixel
);
3204 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=(t2p
->tiff_bitspersample
& 0xff);
3205 if(TIFFIsTiled(input
)){
3206 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3207 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
>> 8) & 0xff;
3208 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3209 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
) & 0xff;
3210 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3211 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
>> 8) & 0xff;
3212 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3213 (t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
) & 0xff;
3215 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3216 (t2p
->tiff_length
>> 8) & 0xff;
3217 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3218 (t2p
->tiff_length
) & 0xff;
3219 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3220 (t2p
->tiff_width
>> 8) & 0xff;
3221 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=
3222 (t2p
->tiff_width
) & 0xff;
3224 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=(t2p
->tiff_samplesperpixel
& 0xff);
3225 for(i
=0;i
<t2p
->tiff_samplesperpixel
;i
++){
3226 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=i
;
3228 ojpegdata
[t2p
->pdf_ojpegdatalength
] |= h_samp
<<4 & 0xf0;;
3229 ojpegdata
[t2p
->pdf_ojpegdatalength
++] |= v_samp
& 0x0f;
3231 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= 0x11;
3233 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=i
;
3235 for(dest
=0;dest
<t2p
->tiff_samplesperpixel
;dest
++){
3236 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3237 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xdb;
3238 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x00;
3239 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x43;
3240 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=dest
;
3241 _TIFFmemcpy( &(ojpegdata
[t2p
->pdf_ojpegdatalength
++]),
3242 &(((unsigned char*)q
)[64*dest
]), 64);
3243 t2p
->pdf_ojpegdatalength
+=64;
3246 for(dest
=0;dest
<table_count
;dest
++){
3247 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3248 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xc4;
3249 offset_ms_l
=t2p
->pdf_ojpegdatalength
;
3250 t2p
->pdf_ojpegdatalength
+=2;
3251 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=dest
& 0x0f;
3252 _TIFFmemcpy( &(ojpegdata
[t2p
->pdf_ojpegdatalength
]),
3253 &(((unsigned char*)dc
)[offset_table
]), 16);
3257 code_count
+=ojpegdata
[t2p
->pdf_ojpegdatalength
++];
3259 ojpegdata
[offset_ms_l
]=((19+code_count
)>>8) & 0xff;
3260 ojpegdata
[offset_ms_l
+1]=(19+code_count
) & 0xff;
3261 _TIFFmemcpy( &(ojpegdata
[t2p
->pdf_ojpegdatalength
]),
3262 &(((unsigned char*)dc
)[offset_table
]), code_count
);
3263 offset_table
+=code_count
;
3264 t2p
->pdf_ojpegdatalength
+=code_count
;
3266 if(proc
==JPEGPROC_BASELINE
){
3268 for(dest
=0;dest
<table_count
;dest
++){
3269 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3270 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xc4;
3271 offset_ms_l
=t2p
->pdf_ojpegdatalength
;
3272 t2p
->pdf_ojpegdatalength
+=2;
3273 ojpegdata
[t2p
->pdf_ojpegdatalength
] |= 0x10;
3274 ojpegdata
[t2p
->pdf_ojpegdatalength
++] |=dest
& 0x0f;
3275 _TIFFmemcpy( &(ojpegdata
[t2p
->pdf_ojpegdatalength
]),
3276 &(((unsigned char*)ac
)[offset_table
]), 16);
3280 code_count
+=ojpegdata
[t2p
->pdf_ojpegdatalength
++];
3282 ojpegdata
[offset_ms_l
]=((19+code_count
)>>8) & 0xff;
3283 ojpegdata
[offset_ms_l
+1]=(19+code_count
) & 0xff;
3284 _TIFFmemcpy( &(ojpegdata
[t2p
->pdf_ojpegdatalength
]),
3285 &(((unsigned char*)ac
)[offset_table
]), code_count
);
3286 offset_table
+=code_count
;
3287 t2p
->pdf_ojpegdatalength
+=code_count
;
3290 if(TIFFNumberOfStrips(input
)>1){
3291 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3292 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xdd;
3293 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x00;
3294 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x04;
3297 ri
=(t2p
->tiff_width
+h_samp
-1) / h_samp
;
3298 TIFFGetField(input
, TIFFTAG_ROWSPERSTRIP
, &rows
);
3299 ri
*=(rows
+v_samp
-1)/v_samp
;
3300 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= (ri
>>8) & 0xff;
3301 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= ri
& 0xff;
3303 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xff;
3304 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0xda;
3305 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x00;
3306 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=(6 + 2*t2p
->tiff_samplesperpixel
);
3307 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=t2p
->tiff_samplesperpixel
& 0xff;
3308 for(i
=0;i
<t2p
->tiff_samplesperpixel
;i
++){
3309 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= i
& 0xff;
3310 if(proc
==JPEGPROC_BASELINE
){
3311 ojpegdata
[t2p
->pdf_ojpegdatalength
] |=
3312 ( ( (i
>(table_count
-1U)) ? (table_count
-1U) : i
) << 4U) & 0xf0;
3313 ojpegdata
[t2p
->pdf_ojpegdatalength
++] |=
3314 ( (i
>(table_count
-1U)) ? (table_count
-1U) : i
) & 0x0f;
3316 ojpegdata
[t2p
->pdf_ojpegdatalength
++] = (i
<< 4) & 0xf0;
3319 if(proc
==JPEGPROC_BASELINE
){
3320 t2p
->pdf_ojpegdatalength
++;
3321 ojpegdata
[t2p
->pdf_ojpegdatalength
++]=0x3f;
3322 t2p
->pdf_ojpegdatalength
++;
3324 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= (lp
[0] & 0xff);
3325 t2p
->pdf_ojpegdatalength
++;
3326 ojpegdata
[t2p
->pdf_ojpegdatalength
++]= (pt
[0] & 0x0f);
3334 int t2p_process_jpeg_strip(
3335 unsigned char* strip
,
3336 tsize_t
* striplength
,
3337 unsigned char* buffer
,
3338 tsize_t
* bufferoffset
,
3350 while(i
<(*striplength
)){
3353 /* SOI - start of image */
3354 _TIFFmemcpy(&(buffer
[*bufferoffset
]), &(strip
[i
-1]), 2);
3364 _TIFFmemcpy(&(buffer
[*bufferoffset
]), &(strip
[i
-1]), strip
[i
+2]+2);
3365 for(j
=0;j
<buffer
[*bufferoffset
+9];j
++){
3366 if( (buffer
[*bufferoffset
+11+(2*j
)]>>4) > h_samp
)
3367 h_samp
= (buffer
[*bufferoffset
+11+(2*j
)]>>4);
3368 if( (buffer
[*bufferoffset
+11+(2*j
)] & 0x0f) > v_samp
)
3369 v_samp
= (buffer
[*bufferoffset
+11+(2*j
)] & 0x0f);
3373 ri
=((( ((uint16
)(buffer
[*bufferoffset
+5])<<8) |
3374 (uint16
)(buffer
[*bufferoffset
+6]) )+v_samp
-1)/
3376 ri
*=((( ((uint16
)(buffer
[*bufferoffset
+7])<<8) |
3377 (uint16
)(buffer
[*bufferoffset
+8]) )+h_samp
-1)/
3379 buffer
[*bufferoffset
+5]=
3380 (unsigned char) ((height
>>8) & 0xff);
3381 buffer
[*bufferoffset
+6]=
3382 (unsigned char) (height
& 0xff);
3383 *bufferoffset
+=strip
[i
+2]+2;
3386 buffer
[(*bufferoffset
)++]=0xff;
3387 buffer
[(*bufferoffset
)++]=0xdd;
3388 buffer
[(*bufferoffset
)++]=0x00;
3389 buffer
[(*bufferoffset
)++]=0x04;
3390 buffer
[(*bufferoffset
)++]=(ri
>> 8) & 0xff;
3391 buffer
[(*bufferoffset
)++]= ri
& 0xff;
3398 _TIFFmemcpy(&(buffer
[*bufferoffset
]), &(strip
[i
-1]), strip
[i
+2]+2);
3399 *bufferoffset
+=strip
[i
+2]+2;
3404 _TIFFmemcpy(&(buffer
[*bufferoffset
]), &(strip
[i
-1]), strip
[i
+2]+2);
3405 *bufferoffset
+=strip
[i
+2]+2;
3408 buffer
[(*bufferoffset
)++]=0xff;
3409 buffer
[(*bufferoffset
)++]=
3410 (unsigned char)(0xd0 | ((no
-1)%8
));
3413 _TIFFmemcpy(&(buffer
[*bufferoffset
]), &(strip
[i
-1]), (*striplength
)-i
-1);
3414 *bufferoffset
+=(*striplength
)-i
-1;
3427 This functions converts a tilewidth x tilelength buffer of samples into an edgetilewidth x
3428 tilelength buffer of samples.
3430 void t2p_tile_collapse_left(
3434 uint32 edgetilewidth
,
3438 tsize_t edgescanwidth
=0;
3440 edgescanwidth
= (scanwidth
* edgetilewidth
+ (tilewidth
- 1))/ tilewidth
;
3441 for(i
=0;i
<tilelength
;i
++){
3443 &(((char*)buffer
)[edgescanwidth
*i
]),
3444 &(((char*)buffer
)[scanwidth
*i
]),
3453 * This function calls TIFFWriteDirectory on the output after blanking its
3454 * output by replacing the read, write, and seek procedures with empty
3455 * implementations, then it replaces the original implementations.
3459 t2p_write_advance_directory(T2P
* t2p
, TIFF
* output
)
3461 t2p_disable(output
);
3462 if(!TIFFWriteDirectory(output
)){
3463 TIFFError(TIFF2PDF_MODULE
,
3464 "Error writing virtual directory to output PDF %s",
3465 TIFFFileName(output
));
3466 t2p
->t2p_error
= T2P_ERR_ERROR
;
3473 tsize_t
t2p_sample_planar_separate_to_contig(
3475 unsigned char* buffer
,
3476 unsigned char* samplebuffer
,
3477 tsize_t samplebuffersize
){
3483 stride
=samplebuffersize
/t2p
->tiff_samplesperpixel
;
3484 for(i
=0;i
<stride
;i
++){
3485 for(j
=0;j
<t2p
->tiff_samplesperpixel
;j
++){
3486 buffer
[i
*t2p
->tiff_samplesperpixel
+ j
] = samplebuffer
[i
+ j
*stride
];
3490 return(samplebuffersize
);
3493 tsize_t
t2p_sample_realize_palette(T2P
* t2p
, unsigned char* buffer
){
3495 uint32 sample_count
=0;
3496 uint16 component_count
=0;
3497 uint32 palette_offset
=0;
3498 uint32 sample_offset
=0;
3501 sample_count
=t2p
->tiff_width
*t2p
->tiff_length
;
3502 component_count
=t2p
->tiff_samplesperpixel
;
3504 for(i
=sample_count
;i
>0;i
--){
3505 palette_offset
=buffer
[i
-1] * component_count
;
3506 sample_offset
= (i
-1) * component_count
;
3507 for(j
=0;j
<component_count
;j
++){
3508 buffer
[sample_offset
+j
]=t2p
->pdf_palette
[palette_offset
+j
];
3516 This functions converts in place a buffer of ABGR interleaved data
3517 into RGB interleaved data, discarding A.
3520 tsize_t
t2p_sample_abgr_to_rgb(tdata_t data
, uint32 samplecount
)
3525 for(i
=0;i
<samplecount
;i
++){
3526 sample
=((uint32
*)data
)[i
];
3527 ((char*)data
)[i
*3]= (char) (sample
& 0xff);
3528 ((char*)data
)[i
*3+1]= (char) ((sample
>>8) & 0xff);
3529 ((char*)data
)[i
*3+2]= (char) ((sample
>>16) & 0xff);
3536 * This functions converts in place a buffer of RGBA interleaved data
3537 * into RGB interleaved data, discarding A.
3541 t2p_sample_rgbaa_to_rgb(tdata_t data
, uint32 samplecount
)
3545 for(i
= 0; i
< samplecount
; i
++)
3546 memcpy((uint8
*)data
+ i
* 3, (uint8
*)data
+ i
* 4, 3);
3552 * This functions converts in place a buffer of RGBA interleaved data
3553 * into RGB interleaved data, adding 255-A to each component sample.
3557 t2p_sample_rgba_to_rgb(tdata_t data
, uint32 samplecount
)
3563 for (i
= 0; i
< samplecount
; i
++) {
3564 sample
=((uint32
*)data
)[i
];
3565 alpha
=(uint8
)((255 - ((sample
>> 24) & 0xff)));
3566 ((uint8
*)data
)[i
* 3] = (uint8
) ((sample
>> 16) & 0xff) + alpha
;
3567 ((uint8
*)data
)[i
* 3 + 1] = (uint8
) ((sample
>> 8) & 0xff) + alpha
;
3568 ((uint8
*)data
)[i
* 3 + 2] = (uint8
) (sample
& 0xff) + alpha
;
3575 This function converts the a and b samples of Lab data from signed
3579 tsize_t
t2p_sample_lab_signed_to_unsigned(tdata_t buffer
, uint32 samplecount
){
3583 for(i
=0;i
<samplecount
;i
++){
3584 if( (((unsigned char*)buffer
)[(i
*3)+1] & 0x80) !=0){
3585 ((unsigned char*)buffer
)[(i
*3)+1] =
3586 (unsigned char)(0x80 + ((char*)buffer
)[(i
*3)+1]);
3588 ((unsigned char*)buffer
)[(i
*3)+1] |= 0x80;
3590 if( (((unsigned char*)buffer
)[(i
*3)+2] & 0x80) !=0){
3591 ((unsigned char*)buffer
)[(i
*3)+2] =
3592 (unsigned char)(0x80 + ((char*)buffer
)[(i
*3)+2]);
3594 ((unsigned char*)buffer
)[(i
*3)+2] |= 0x80;
3598 return(samplecount
*3);
3602 This function writes the PDF header to output.
3605 tsize_t
t2p_write_pdf_header(T2P
* t2p
, TIFF
* output
){
3611 buflen
=sprintf(buffer
, "%%PDF-%u.%u ", t2p
->pdf_majorversion
&0xff, t2p
->pdf_minorversion
&0xff);
3612 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
3613 written
+= t2pWriteFile(output
, (tdata_t
)"\n%\342\343\317\323\n", 7);
3619 This function writes the beginning of a PDF object to output.
3622 tsize_t
t2p_write_pdf_obj_start(uint32 number
, TIFF
* output
){
3628 buflen
=sprintf(buffer
, "%lu", (unsigned long)number
);
3629 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
3630 written
+= t2pWriteFile(output
, (tdata_t
) " 0 obj\n", 7);
3636 This function writes the end of a PDF object to output.
3639 tsize_t
t2p_write_pdf_obj_end(TIFF
* output
){
3643 written
+= t2pWriteFile(output
, (tdata_t
) "endobj\n", 7);
3649 This function writes a PDF name object to output.
3652 tsize_t
t2p_write_pdf_name(unsigned char* name
, TIFF
* output
){
3660 namelen
= strlen((char *)name
);
3664 written
+= t2pWriteFile(output
, (tdata_t
) "/", 1);
3665 for (i
=0;i
<namelen
;i
++){
3666 if ( ((unsigned char)name
[i
]) < 0x21){
3667 sprintf(buffer
, "#%.2X", name
[i
]);
3668 buffer
[sizeof(buffer
) - 1] = '\0';
3669 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3672 if ( ((unsigned char)name
[i
]) > 0x7E){
3673 sprintf(buffer
, "#%.2X", name
[i
]);
3674 buffer
[sizeof(buffer
) - 1] = '\0';
3675 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3681 sprintf(buffer
, "#%.2X", name
[i
]);
3682 buffer
[sizeof(buffer
) - 1] = '\0';
3683 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3686 sprintf(buffer
, "#%.2X", name
[i
]);
3687 buffer
[sizeof(buffer
) - 1] = '\0';
3688 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3691 sprintf(buffer
, "#%.2X", name
[i
]);
3692 buffer
[sizeof(buffer
) - 1] = '\0';
3693 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3696 sprintf(buffer
, "#%.2X", name
[i
]);
3697 buffer
[sizeof(buffer
) - 1] = '\0';
3698 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3701 sprintf(buffer
, "#%.2X", name
[i
]);
3702 buffer
[sizeof(buffer
) - 1] = '\0';
3703 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3706 sprintf(buffer
, "#%.2X", name
[i
]);
3707 buffer
[sizeof(buffer
) - 1] = '\0';
3708 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3711 sprintf(buffer
, "#%.2X", name
[i
]);
3712 buffer
[sizeof(buffer
) - 1] = '\0';
3713 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3716 sprintf(buffer
, "#%.2X", name
[i
]);
3717 buffer
[sizeof(buffer
) - 1] = '\0';
3718 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3721 sprintf(buffer
, "#%.2X", name
[i
]);
3722 buffer
[sizeof(buffer
) - 1] = '\0';
3723 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3726 sprintf(buffer
, "#%.2X", name
[i
]);
3727 buffer
[sizeof(buffer
) - 1] = '\0';
3728 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3731 sprintf(buffer
, "#%.2X", name
[i
]);
3732 buffer
[sizeof(buffer
) - 1] = '\0';
3733 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 3);
3736 written
+= t2pWriteFile(output
, (tdata_t
) &name
[i
], 1);
3741 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
3747 * This function writes a PDF string object to output.
3750 tsize_t
t2p_write_pdf_string(char* pdfstr
, TIFF
* output
)
3752 tsize_t written
= 0;
3757 len
= strlen(pdfstr
);
3758 written
+= t2pWriteFile(output
, (tdata_t
) "(", 1);
3759 for (i
=0; i
<len
; i
++) {
3760 if((pdfstr
[i
]&0x80) || (pdfstr
[i
]==127) || (pdfstr
[i
]<32)){
3761 snprintf(buffer
, sizeof(buffer
), "\\%.3o", ((unsigned char)pdfstr
[i
]));
3762 written
+= t2pWriteFile(output
, (tdata_t
)buffer
, 4);
3766 written
+= t2pWriteFile(output
, (tdata_t
) "\\b", 2);
3769 written
+= t2pWriteFile(output
, (tdata_t
) "\\t", 2);
3772 written
+= t2pWriteFile(output
, (tdata_t
) "\\n", 2);
3775 written
+= t2pWriteFile(output
, (tdata_t
) "\\f", 2);
3778 written
+= t2pWriteFile(output
, (tdata_t
) "\\r", 2);
3781 written
+= t2pWriteFile(output
, (tdata_t
) "\\(", 2);
3784 written
+= t2pWriteFile(output
, (tdata_t
) "\\)", 2);
3787 written
+= t2pWriteFile(output
, (tdata_t
) "\\\\", 2);
3790 written
+= t2pWriteFile(output
, (tdata_t
) &pdfstr
[i
], 1);
3794 written
+= t2pWriteFile(output
, (tdata_t
) ") ", 1);
3801 This function writes a buffer of data to output.
3804 tsize_t
t2p_write_pdf_stream(tdata_t buffer
, tsize_t len
, TIFF
* output
){
3808 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, len
);
3814 This functions writes the beginning of a PDF stream to output.
3817 tsize_t
t2p_write_pdf_stream_start(TIFF
* output
){
3821 written
+= t2pWriteFile(output
, (tdata_t
) "stream\n", 7);
3827 This function writes the end of a PDF stream to output.
3830 tsize_t
t2p_write_pdf_stream_end(TIFF
* output
){
3834 written
+= t2pWriteFile(output
, (tdata_t
) "\nendstream\n", 11);
3840 This function writes a stream dictionary for a PDF stream to output.
3843 tsize_t
t2p_write_pdf_stream_dict(tsize_t len
, uint32 number
, TIFF
* output
){
3849 written
+= t2pWriteFile(output
, (tdata_t
) "/Length ", 8);
3851 written
+= t2p_write_pdf_stream_length(len
, output
);
3853 buflen
=sprintf(buffer
, "%lu", (unsigned long)number
);
3854 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
3855 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n", 6);
3862 This functions writes the beginning of a PDF stream dictionary to output.
3865 tsize_t
t2p_write_pdf_stream_dict_start(TIFF
* output
){
3869 written
+= t2pWriteFile(output
, (tdata_t
) "<< \n", 4);
3875 This function writes the end of a PDF stream dictionary to output.
3878 tsize_t
t2p_write_pdf_stream_dict_end(TIFF
* output
){
3882 written
+= t2pWriteFile(output
, (tdata_t
) " >>\n", 4);
3888 This function writes a number to output.
3891 tsize_t
t2p_write_pdf_stream_length(tsize_t len
, TIFF
* output
){
3897 buflen
=sprintf(buffer
, "%lu", (unsigned long)len
);
3898 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
3899 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3905 * This function writes the PDF Catalog structure to output.
3908 tsize_t
t2p_write_pdf_catalog(T2P
* t2p
, TIFF
* output
)
3910 tsize_t written
= 0;
3914 written
+= t2pWriteFile(output
,
3915 (tdata_t
)"<< \n/Type /Catalog \n/Pages ",
3917 buflen
= snprintf(buffer
, sizeof(buffer
), "%lu", (unsigned long)t2p
->pdf_pages
);
3918 written
+= t2pWriteFile(output
, (tdata_t
) buffer
,
3919 TIFFmin((size_t)buflen
, sizeof(buffer
) - 1));
3920 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n", 6);
3921 if(t2p
->pdf_fitwindow
){
3922 written
+= t2pWriteFile(output
,
3923 (tdata_t
) "/ViewerPreferences <</FitWindow true>>\n",
3926 written
+= t2pWriteFile(output
, (tdata_t
)">>\n", 3);
3932 This function writes the PDF Info structure to output.
3935 tsize_t
t2p_write_pdf_info(T2P
* t2p
, TIFF
* input
, TIFF
* output
)
3937 tsize_t written
= 0;
3941 if(t2p
->pdf_datetime
[0] == '\0')
3942 t2p_pdf_tifftime(t2p
, input
);
3943 if (strlen(t2p
->pdf_datetime
) > 0) {
3944 written
+= t2pWriteFile(output
, (tdata_t
) "<< \n/CreationDate ", 18);
3945 written
+= t2p_write_pdf_string(t2p
->pdf_datetime
, output
);
3946 written
+= t2pWriteFile(output
, (tdata_t
) "\n/ModDate ", 10);
3947 written
+= t2p_write_pdf_string(t2p
->pdf_datetime
, output
);
3949 written
+= t2pWriteFile(output
, (tdata_t
) "\n/Producer ", 11);
3950 _TIFFmemset((tdata_t
)buffer
, 0x00, sizeof(buffer
));
3951 snprintf(buffer
, sizeof(buffer
), "libtiff / tiff2pdf - %d", TIFFLIB_VERSION
);
3952 written
+= t2p_write_pdf_string(buffer
, output
);
3953 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3954 if (t2p
->pdf_creator
[0] != '\0') {
3955 written
+= t2pWriteFile(output
, (tdata_t
) "/Creator ", 9);
3956 written
+= t2p_write_pdf_string(t2p
->pdf_creator
, output
);
3957 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3959 if (TIFFGetField(input
, TIFFTAG_SOFTWARE
, &info
) != 0 && info
) {
3960 if(strlen(info
) >= sizeof(t2p
->pdf_creator
))
3961 info
[sizeof(t2p
->pdf_creator
) - 1] = '\0';
3962 written
+= t2pWriteFile(output
, (tdata_t
) "/Creator ", 9);
3963 written
+= t2p_write_pdf_string(info
, output
);
3964 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3967 if (t2p
->pdf_author
[0] != '\0') {
3968 written
+= t2pWriteFile(output
, (tdata_t
) "/Author ", 8);
3969 written
+= t2p_write_pdf_string(t2p
->pdf_author
, output
);
3970 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3972 if ((TIFFGetField(input
, TIFFTAG_ARTIST
, &info
) != 0
3973 || TIFFGetField(input
, TIFFTAG_COPYRIGHT
, &info
) != 0)
3975 if (strlen(info
) >= sizeof(t2p
->pdf_author
))
3976 info
[sizeof(t2p
->pdf_author
) - 1] = '\0';
3977 written
+= t2pWriteFile(output
, (tdata_t
) "/Author ", 8);
3978 written
+= t2p_write_pdf_string(info
, output
);
3979 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3982 if (t2p
->pdf_title
[0] != '\0') {
3983 written
+= t2pWriteFile(output
, (tdata_t
) "/Title ", 7);
3984 written
+= t2p_write_pdf_string(t2p
->pdf_title
, output
);
3985 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3987 if (TIFFGetField(input
, TIFFTAG_DOCUMENTNAME
, &info
) != 0){
3988 if(strlen(info
) > 511) {
3991 written
+= t2pWriteFile(output
, (tdata_t
) "/Title ", 7);
3992 written
+= t2p_write_pdf_string(info
, output
);
3993 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
3996 if (t2p
->pdf_subject
[0] != '\0') {
3997 written
+= t2pWriteFile(output
, (tdata_t
) "/Subject ", 9);
3998 written
+= t2p_write_pdf_string(t2p
->pdf_subject
, output
);
3999 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
4001 if (TIFFGetField(input
, TIFFTAG_IMAGEDESCRIPTION
, &info
) != 0 && info
) {
4002 if (strlen(info
) >= sizeof(t2p
->pdf_subject
))
4003 info
[sizeof(t2p
->pdf_subject
) - 1] = '\0';
4004 written
+= t2pWriteFile(output
, (tdata_t
) "/Subject ", 9);
4005 written
+= t2p_write_pdf_string(info
, output
);
4006 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
4009 if (t2p
->pdf_keywords
[0] != '\0') {
4010 written
+= t2pWriteFile(output
, (tdata_t
) "/Keywords ", 10);
4011 written
+= t2p_write_pdf_string(t2p
->pdf_keywords
, output
);
4012 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
4014 written
+= t2pWriteFile(output
, (tdata_t
) ">> \n", 4);
4020 * This function fills a string of a T2P struct with the current time as a PDF
4021 * date string, it is called by t2p_pdf_tifftime.
4024 void t2p_pdf_currenttime(T2P
* t2p
)
4026 struct tm
* currenttime
;
4029 if (time(&timenow
) == (time_t) -1) {
4030 TIFFError(TIFF2PDF_MODULE
,
4031 "Can't get the current time: %s", strerror(errno
));
4032 timenow
= (time_t) 0;
4035 currenttime
= localtime(&timenow
);
4036 snprintf(t2p
->pdf_datetime
, sizeof(t2p
->pdf_datetime
),
4037 "D:%.4d%.2d%.2d%.2d%.2d%.2d",
4038 (currenttime
->tm_year
+ 1900) % 65536,
4039 (currenttime
->tm_mon
+ 1) % 256,
4040 (currenttime
->tm_mday
) % 256,
4041 (currenttime
->tm_hour
) % 256,
4042 (currenttime
->tm_min
) % 256,
4043 (currenttime
->tm_sec
) % 256);
4049 * This function fills a string of a T2P struct with the date and time of a
4050 * TIFF file if it exists or the current time as a PDF date string.
4053 void t2p_pdf_tifftime(T2P
* t2p
, TIFF
* input
)
4057 if (TIFFGetField(input
, TIFFTAG_DATETIME
, &datetime
) != 0
4058 && (strlen(datetime
) >= 19) ){
4059 t2p
->pdf_datetime
[0]='D';
4060 t2p
->pdf_datetime
[1]=':';
4061 t2p
->pdf_datetime
[2]=datetime
[0];
4062 t2p
->pdf_datetime
[3]=datetime
[1];
4063 t2p
->pdf_datetime
[4]=datetime
[2];
4064 t2p
->pdf_datetime
[5]=datetime
[3];
4065 t2p
->pdf_datetime
[6]=datetime
[5];
4066 t2p
->pdf_datetime
[7]=datetime
[6];
4067 t2p
->pdf_datetime
[8]=datetime
[8];
4068 t2p
->pdf_datetime
[9]=datetime
[9];
4069 t2p
->pdf_datetime
[10]=datetime
[11];
4070 t2p
->pdf_datetime
[11]=datetime
[12];
4071 t2p
->pdf_datetime
[12]=datetime
[14];
4072 t2p
->pdf_datetime
[13]=datetime
[15];
4073 t2p
->pdf_datetime
[14]=datetime
[17];
4074 t2p
->pdf_datetime
[15]=datetime
[18];
4075 t2p
->pdf_datetime
[16] = '\0';
4077 t2p_pdf_currenttime(t2p
);
4084 * This function writes a PDF Pages Tree structure to output.
4087 tsize_t
t2p_write_pdf_pages(T2P
* t2p
, TIFF
* output
)
4095 written
+= t2pWriteFile(output
,
4096 (tdata_t
) "<< \n/Type /Pages \n/Kids [ ", 26);
4097 page
= t2p
->pdf_pages
+1;
4098 for (i
=0;i
<t2p
->tiff_pagecount
;i
++){
4099 buflen
=sprintf(buffer
, "%d", page
);
4100 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4101 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4102 if ( ((i
+1)%8
)==0 ) {
4103 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
4106 page
+= t2p
->tiff_pages
[i
].page_extra
;
4107 if(t2p
->tiff_pages
[i
].page_tilecount
>0){
4108 page
+= (2 * t2p
->tiff_pages
[i
].page_tilecount
);
4113 written
+= t2pWriteFile(output
, (tdata_t
) "] \n/Count ", 10);
4114 _TIFFmemset(buffer
, 0x00, 16);
4115 buflen
=sprintf(buffer
, "%d", t2p
->tiff_pagecount
);
4116 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4117 written
+= t2pWriteFile(output
, (tdata_t
) " \n>> \n", 6);
4123 This function writes a PDF Page structure to output.
4126 tsize_t
t2p_write_pdf_page(uint32 object
, T2P
* t2p
, TIFF
* output
){
4133 written
+= t2pWriteFile(output
, (tdata_t
) "<<\n/Type /Page \n/Parent ", 24);
4134 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_pages
);
4135 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4136 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n", 6);
4137 written
+= t2pWriteFile(output
, (tdata_t
) "/MediaBox [", 11);
4138 buflen
=sprintf(buffer
, "%.4f",t2p
->pdf_mediabox
.x1
);
4139 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4140 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4141 buflen
=sprintf(buffer
, "%.4f",t2p
->pdf_mediabox
.y1
);
4142 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4143 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4144 buflen
=sprintf(buffer
, "%.4f",t2p
->pdf_mediabox
.x2
);
4145 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4146 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4147 buflen
=sprintf(buffer
, "%.4f",t2p
->pdf_mediabox
.y2
);
4148 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4149 written
+= t2pWriteFile(output
, (tdata_t
) "] \n", 3);
4150 written
+= t2pWriteFile(output
, (tdata_t
) "/Contents ", 10);
4151 buflen
=sprintf(buffer
, "%lu", (unsigned long)(object
+ 1));
4152 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4153 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n", 6);
4154 written
+= t2pWriteFile(output
, (tdata_t
) "/Resources << \n", 15);
4155 if( t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
!= 0 ){
4156 written
+= t2pWriteFile(output
, (tdata_t
) "/XObject <<\n", 12);
4157 for(i
=0;i
<t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
;i
++){
4158 written
+= t2pWriteFile(output
, (tdata_t
) "/Im", 3);
4159 buflen
= sprintf(buffer
, "%u", t2p
->pdf_page
+1);
4160 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4161 written
+= t2pWriteFile(output
, (tdata_t
) "_", 1);
4162 buflen
= sprintf(buffer
, "%u", i
+1);
4163 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4164 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4168 (unsigned long)(object
+3+(2*i
)+t2p
->tiff_pages
[t2p
->pdf_page
].page_extra
));
4169 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4170 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4172 written
+= t2pWriteFile(output
, (tdata_t
) "\n", 1);
4175 written
+= t2pWriteFile(output
, (tdata_t
) ">>\n", 3);
4177 written
+= t2pWriteFile(output
, (tdata_t
) "/XObject <<\n", 12);
4178 written
+= t2pWriteFile(output
, (tdata_t
) "/Im", 3);
4179 buflen
= sprintf(buffer
, "%u", t2p
->pdf_page
+1);
4180 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4181 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4185 (unsigned long)(object
+3+(2*i
)+t2p
->tiff_pages
[t2p
->pdf_page
].page_extra
));
4186 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4187 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4188 written
+= t2pWriteFile(output
, (tdata_t
) ">>\n", 3);
4190 if(t2p
->tiff_transferfunctioncount
!= 0) {
4191 written
+= t2pWriteFile(output
, (tdata_t
) "/ExtGState <<", 13);
4192 t2pWriteFile(output
, (tdata_t
) "/GS1 ", 5);
4196 (unsigned long)(object
+ 3));
4197 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4198 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4199 written
+= t2pWriteFile(output
, (tdata_t
) ">> \n", 4);
4201 written
+= t2pWriteFile(output
, (tdata_t
) "/ProcSet [ ", 11);
4202 if(t2p
->pdf_colorspace
== T2P_CS_BILEVEL
4203 || t2p
->pdf_colorspace
== T2P_CS_GRAY
4205 written
+= t2pWriteFile(output
, (tdata_t
) "/ImageB ", 8);
4207 written
+= t2pWriteFile(output
, (tdata_t
) "/ImageC ", 8);
4208 if(t2p
->pdf_colorspace
& T2P_CS_PALETTE
){
4209 written
+= t2pWriteFile(output
, (tdata_t
) "/ImageI ", 8);
4212 written
+= t2pWriteFile(output
, (tdata_t
) "]\n>>\n>>\n", 8);
4218 This function composes the page size and image and tile locations on a page.
4221 void t2p_compose_pdf_page(T2P
* t2p
){
4225 T2P_TILE
* tiles
=NULL
;
4227 uint32 tilecountx
=0;
4228 uint32 tilecounty
=0;
4230 uint32 tilelength
=0;
4233 float width_ratio
=0;
4234 float length_ratio
=0;
4236 t2p
->pdf_xres
= t2p
->tiff_xres
;
4237 t2p
->pdf_yres
= t2p
->tiff_yres
;
4238 if(t2p
->pdf_overrideres
) {
4239 t2p
->pdf_xres
= t2p
->pdf_defaultxres
;
4240 t2p
->pdf_yres
= t2p
->pdf_defaultyres
;
4242 if(t2p
->pdf_xres
== 0.0)
4243 t2p
->pdf_xres
= t2p
->pdf_defaultxres
;
4244 if(t2p
->pdf_yres
== 0.0)
4245 t2p
->pdf_yres
= t2p
->pdf_defaultyres
;
4246 if (t2p
->pdf_image_fillpage
) {
4247 width_ratio
= t2p
->pdf_defaultpagewidth
/t2p
->tiff_width
;
4248 length_ratio
= t2p
->pdf_defaultpagelength
/t2p
->tiff_length
;
4249 if (width_ratio
< length_ratio
) {
4250 t2p
->pdf_imagewidth
= t2p
->pdf_defaultpagewidth
;
4251 t2p
->pdf_imagelength
= t2p
->tiff_length
* width_ratio
;
4253 t2p
->pdf_imagewidth
= t2p
->tiff_width
* length_ratio
;
4254 t2p
->pdf_imagelength
= t2p
->pdf_defaultpagelength
;
4256 } else if (t2p
->tiff_resunit
!= RESUNIT_CENTIMETER
/* RESUNIT_NONE and */
4257 && t2p
->tiff_resunit
!= RESUNIT_INCH
) { /* other cases */
4258 t2p
->pdf_imagewidth
= ((float)(t2p
->tiff_width
))/t2p
->pdf_xres
;
4259 t2p
->pdf_imagelength
= ((float)(t2p
->tiff_length
))/t2p
->pdf_yres
;
4261 t2p
->pdf_imagewidth
=
4262 ((float)(t2p
->tiff_width
))*PS_UNIT_SIZE
/t2p
->pdf_xres
;
4263 t2p
->pdf_imagelength
=
4264 ((float)(t2p
->tiff_length
))*PS_UNIT_SIZE
/t2p
->pdf_yres
;
4266 if(t2p
->pdf_overridepagesize
!= 0) {
4267 t2p
->pdf_pagewidth
= t2p
->pdf_defaultpagewidth
;
4268 t2p
->pdf_pagelength
= t2p
->pdf_defaultpagelength
;
4270 t2p
->pdf_pagewidth
= t2p
->pdf_imagewidth
;
4271 t2p
->pdf_pagelength
= t2p
->pdf_imagelength
;
4273 t2p
->pdf_mediabox
.x1
=0.0;
4274 t2p
->pdf_mediabox
.y1
=0.0;
4275 t2p
->pdf_mediabox
.x2
=t2p
->pdf_pagewidth
;
4276 t2p
->pdf_mediabox
.y2
=t2p
->pdf_pagelength
;
4277 t2p
->pdf_imagebox
.x1
=0.0;
4278 t2p
->pdf_imagebox
.y1
=0.0;
4279 t2p
->pdf_imagebox
.x2
=t2p
->pdf_imagewidth
;
4280 t2p
->pdf_imagebox
.y2
=t2p
->pdf_imagelength
;
4281 if(t2p
->pdf_overridepagesize
!=0){
4282 t2p
->pdf_imagebox
.x1
+=((t2p
->pdf_pagewidth
-t2p
->pdf_imagewidth
)/2.0F
);
4283 t2p
->pdf_imagebox
.y1
+=((t2p
->pdf_pagelength
-t2p
->pdf_imagelength
)/2.0F
);
4284 t2p
->pdf_imagebox
.x2
+=((t2p
->pdf_pagewidth
-t2p
->pdf_imagewidth
)/2.0F
);
4285 t2p
->pdf_imagebox
.y2
+=((t2p
->pdf_pagelength
-t2p
->pdf_imagelength
)/2.0F
);
4287 if(t2p
->tiff_orientation
> 4){
4288 f
=t2p
->pdf_mediabox
.x2
;
4289 t2p
->pdf_mediabox
.x2
=t2p
->pdf_mediabox
.y2
;
4290 t2p
->pdf_mediabox
.y2
=f
;
4292 istiled
=((t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilecount
==0) ? 0 : 1;
4294 t2p_compose_pdf_page_orient(&(t2p
->pdf_imagebox
), t2p
->tiff_orientation
);
4297 tilewidth
=(t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilewidth
;
4298 tilelength
=(t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilelength
;
4299 tilecountx
=(t2p
->tiff_width
+
4302 (t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilecountx
=tilecountx
;
4303 tilecounty
=(t2p
->tiff_length
+
4306 (t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilecounty
=tilecounty
;
4307 (t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_edgetilewidth
=
4308 t2p
->tiff_width
% tilewidth
;
4309 (t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_edgetilelength
=
4310 t2p
->tiff_length
% tilelength
;
4311 tiles
=(t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tiles
;
4312 for(i2
=0;i2
<tilecounty
-1;i2
++){
4313 for(i
=0;i
<tilecountx
-1;i
++){
4314 boxp
=&(tiles
[i2
*tilecountx
+i
].tile_box
);
4316 t2p
->pdf_imagebox
.x1
4317 + ((float)(t2p
->pdf_imagewidth
* i
* tilewidth
)
4318 / (float)t2p
->tiff_width
);
4320 t2p
->pdf_imagebox
.x1
4321 + ((float)(t2p
->pdf_imagewidth
* (i
+1) * tilewidth
)
4322 / (float)t2p
->tiff_width
);
4324 t2p
->pdf_imagebox
.y2
4325 - ((float)(t2p
->pdf_imagelength
* (i2
+1) * tilelength
)
4326 / (float)t2p
->tiff_length
);
4328 t2p
->pdf_imagebox
.y2
4329 - ((float)(t2p
->pdf_imagelength
* i2
* tilelength
)
4330 / (float)t2p
->tiff_length
);
4332 boxp
=&(tiles
[i2
*tilecountx
+i
].tile_box
);
4334 t2p
->pdf_imagebox
.x1
4335 + ((float)(t2p
->pdf_imagewidth
* i
* tilewidth
)
4336 / (float)t2p
->tiff_width
);
4337 boxp
->x2
= t2p
->pdf_imagebox
.x2
;
4339 t2p
->pdf_imagebox
.y2
4340 - ((float)(t2p
->pdf_imagelength
* (i2
+1) * tilelength
)
4341 / (float)t2p
->tiff_length
);
4343 t2p
->pdf_imagebox
.y2
4344 - ((float)(t2p
->pdf_imagelength
* i2
* tilelength
)
4345 / (float)t2p
->tiff_length
);
4347 for(i
=0;i
<tilecountx
-1;i
++){
4348 boxp
=&(tiles
[i2
*tilecountx
+i
].tile_box
);
4350 t2p
->pdf_imagebox
.x1
4351 + ((float)(t2p
->pdf_imagewidth
* i
* tilewidth
)
4352 / (float)t2p
->tiff_width
);
4354 t2p
->pdf_imagebox
.x1
4355 + ((float)(t2p
->pdf_imagewidth
* (i
+1) * tilewidth
)
4356 / (float)t2p
->tiff_width
);
4357 boxp
->y1
= t2p
->pdf_imagebox
.y1
;
4359 t2p
->pdf_imagebox
.y2
4360 - ((float)(t2p
->pdf_imagelength
* i2
* tilelength
)
4361 / (float)t2p
->tiff_length
);
4363 boxp
=&(tiles
[i2
*tilecountx
+i
].tile_box
);
4365 t2p
->pdf_imagebox
.x1
4366 + ((float)(t2p
->pdf_imagewidth
* i
* tilewidth
)
4367 / (float)t2p
->tiff_width
);
4368 boxp
->x2
= t2p
->pdf_imagebox
.x2
;
4369 boxp
->y1
= t2p
->pdf_imagebox
.y1
;
4371 t2p
->pdf_imagebox
.y2
4372 - ((float)(t2p
->pdf_imagelength
* i2
* tilelength
)
4373 / (float)t2p
->tiff_length
);
4375 if(t2p
->tiff_orientation
==0 || t2p
->tiff_orientation
==1){
4376 for(i
=0;i
<(t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilecount
;i
++){
4377 t2p_compose_pdf_page_orient( &(tiles
[i
].tile_box
) , 0);
4381 for(i
=0;i
<(t2p
->tiff_tiles
[t2p
->pdf_page
]).tiles_tilecount
;i
++){
4382 boxp
=&(tiles
[i
].tile_box
);
4383 boxp
->x1
-= t2p
->pdf_imagebox
.x1
;
4384 boxp
->x2
-= t2p
->pdf_imagebox
.x1
;
4385 boxp
->y1
-= t2p
->pdf_imagebox
.y1
;
4386 boxp
->y2
-= t2p
->pdf_imagebox
.y1
;
4387 if(t2p
->tiff_orientation
==2 || t2p
->tiff_orientation
==3){
4388 boxp
->x1
= t2p
->pdf_imagebox
.x2
- t2p
->pdf_imagebox
.x1
- boxp
->x1
;
4389 boxp
->x2
= t2p
->pdf_imagebox
.x2
- t2p
->pdf_imagebox
.x1
- boxp
->x2
;
4391 if(t2p
->tiff_orientation
==3 || t2p
->tiff_orientation
==4){
4392 boxp
->y1
= t2p
->pdf_imagebox
.y2
- t2p
->pdf_imagebox
.y1
- boxp
->y1
;
4393 boxp
->y2
= t2p
->pdf_imagebox
.y2
- t2p
->pdf_imagebox
.y1
- boxp
->y2
;
4395 if(t2p
->tiff_orientation
==8 || t2p
->tiff_orientation
==5){
4396 boxp
->y1
= t2p
->pdf_imagebox
.y2
- t2p
->pdf_imagebox
.y1
- boxp
->y1
;
4397 boxp
->y2
= t2p
->pdf_imagebox
.y2
- t2p
->pdf_imagebox
.y1
- boxp
->y2
;
4399 if(t2p
->tiff_orientation
==5 || t2p
->tiff_orientation
==6){
4400 boxp
->x1
= t2p
->pdf_imagebox
.x2
- t2p
->pdf_imagebox
.x1
- boxp
->x1
;
4401 boxp
->x2
= t2p
->pdf_imagebox
.x2
- t2p
->pdf_imagebox
.x1
- boxp
->x2
;
4403 if(t2p
->tiff_orientation
> 4){
4405 boxp
->x1
= boxp
->y1
;
4408 boxp
->x2
= boxp
->y2
;
4410 t2p_compose_pdf_page_orient_flip(boxp
, t2p
->tiff_orientation
);
4412 t2p_compose_pdf_page_orient(boxp
, t2p
->tiff_orientation
);
4420 void t2p_compose_pdf_page_orient(T2P_BOX
* boxp
, uint16 orientation
){
4425 if( boxp
->x1
> boxp
->x2
){
4430 if( boxp
->y1
> boxp
->y2
){
4435 boxp
->mat
[0]=m1
[0]=boxp
->x2
-boxp
->x1
;
4436 boxp
->mat
[1]=m1
[1]=0.0;
4437 boxp
->mat
[2]=m1
[2]=0.0;
4438 boxp
->mat
[3]=m1
[3]=0.0;
4439 boxp
->mat
[4]=m1
[4]=boxp
->y2
-boxp
->y1
;
4440 boxp
->mat
[5]=m1
[5]=0.0;
4441 boxp
->mat
[6]=m1
[6]=boxp
->x1
;
4442 boxp
->mat
[7]=m1
[7]=boxp
->y1
;
4443 boxp
->mat
[8]=m1
[8]=1.0;
4444 switch(orientation
){
4449 boxp
->mat
[0]=0.0F
-m1
[0];
4450 boxp
->mat
[6]+=m1
[0];
4453 boxp
->mat
[0]=0.0F
-m1
[0];
4454 boxp
->mat
[4]=0.0F
-m1
[4];
4455 boxp
->mat
[6]+=m1
[0];
4456 boxp
->mat
[7]+=m1
[4];
4459 boxp
->mat
[4]=0.0F
-m1
[4];
4460 boxp
->mat
[7]+=m1
[4];
4464 boxp
->mat
[1]=0.0F
-m1
[0];
4465 boxp
->mat
[3]=0.0F
-m1
[4];
4467 boxp
->mat
[6]+=m1
[4];
4468 boxp
->mat
[7]+=m1
[0];
4472 boxp
->mat
[1]=0.0F
-m1
[0];
4475 boxp
->mat
[7]+=m1
[0];
4486 boxp
->mat
[3]=0.0F
-m1
[4];
4488 boxp
->mat
[6]+=m1
[4];
4495 void t2p_compose_pdf_page_orient_flip(T2P_BOX
* boxp
, uint16 orientation
){
4500 if( boxp
->x1
> boxp
->x2
){
4505 if( boxp
->y1
> boxp
->y2
){
4510 boxp
->mat
[0]=m1
[0]=boxp
->x2
-boxp
->x1
;
4511 boxp
->mat
[1]=m1
[1]=0.0F
;
4512 boxp
->mat
[2]=m1
[2]=0.0F
;
4513 boxp
->mat
[3]=m1
[3]=0.0F
;
4514 boxp
->mat
[4]=m1
[4]=boxp
->y2
-boxp
->y1
;
4515 boxp
->mat
[5]=m1
[5]=0.0F
;
4516 boxp
->mat
[6]=m1
[6]=boxp
->x1
;
4517 boxp
->mat
[7]=m1
[7]=boxp
->y1
;
4518 boxp
->mat
[8]=m1
[8]=1.0F
;
4519 switch(orientation
){
4522 boxp
->mat
[1]=0.0F
-m1
[4];
4523 boxp
->mat
[3]=0.0F
-m1
[0];
4525 boxp
->mat
[6]+=m1
[0];
4526 boxp
->mat
[7]+=m1
[4];
4530 boxp
->mat
[1]=0.0F
-m1
[4];
4533 boxp
->mat
[7]+=m1
[4];
4544 boxp
->mat
[3]=0.0F
-m1
[0];
4546 boxp
->mat
[6]+=m1
[0];
4554 This function writes a PDF Contents stream to output.
4557 tsize_t
t2p_write_pdf_page_content_stream(T2P
* t2p
, TIFF
* output
){
4565 if(t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
>0){
4566 for(i
=0;i
<t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
; i
++){
4567 box
=t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tiles
[i
].tile_box
;
4568 buflen
=sprintf(buffer
,
4569 "q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d_%ld Do Q\n",
4570 t2p
->tiff_transferfunctioncount
?"/GS1 gs ":"",
4579 written
+= t2p_write_pdf_stream(buffer
, buflen
, output
);
4582 box
=t2p
->pdf_imagebox
;
4583 buflen
=sprintf(buffer
,
4584 "q %s %.4f %.4f %.4f %.4f %.4f %.4f cm /Im%d Do Q\n",
4585 t2p
->tiff_transferfunctioncount
?"/GS1 gs ":"",
4593 written
+= t2p_write_pdf_stream(buffer
, buflen
, output
);
4600 This function writes a PDF Image XObject stream dictionary to output.
4603 tsize_t
t2p_write_pdf_xobject_stream_dict(ttile_t tile
,
4611 written
+= t2p_write_pdf_stream_dict(0, t2p
->pdf_xrefcount
+1, output
);
4612 written
+= t2pWriteFile(output
,
4613 (tdata_t
) "/Type /XObject \n/Subtype /Image \n/Name /Im",
4615 buflen
=sprintf(buffer
, "%u", t2p
->pdf_page
+1);
4616 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4618 written
+= t2pWriteFile(output
, (tdata_t
) "_", 1);
4619 buflen
=sprintf(buffer
, "%lu", (unsigned long)tile
);
4620 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4622 written
+= t2pWriteFile(output
, (tdata_t
) "\n/Width ", 8);
4623 _TIFFmemset((tdata_t
)buffer
, 0x00, 16);
4625 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->tiff_width
);
4627 if(t2p_tile_is_right_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
-1)!=0){
4631 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilewidth
);
4636 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
);
4639 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4640 written
+= t2pWriteFile(output
, (tdata_t
) "\n/Height ", 9);
4641 _TIFFmemset((tdata_t
)buffer
, 0x00, 16);
4643 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->tiff_length
);
4645 if(t2p_tile_is_bottom_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
-1)!=0){
4649 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilelength
);
4654 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
);
4657 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4658 written
+= t2pWriteFile(output
, (tdata_t
) "\n/BitsPerComponent ", 19);
4659 _TIFFmemset((tdata_t
)buffer
, 0x00, 16);
4660 buflen
=sprintf(buffer
, "%u", t2p
->tiff_bitspersample
);
4661 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4662 written
+= t2pWriteFile(output
, (tdata_t
) "\n/ColorSpace ", 13);
4663 written
+= t2p_write_pdf_xobject_cs(t2p
, output
);
4664 if (t2p
->pdf_image_interpolate
)
4665 written
+= t2pWriteFile(output
,
4666 (tdata_t
) "\n/Interpolate true", 18);
4667 if( (t2p
->pdf_switchdecode
!= 0)
4668 #ifdef CCITT_SUPPORT
4669 && ! (t2p
->pdf_colorspace
== T2P_CS_BILEVEL
4670 && t2p
->pdf_compression
== T2P_COMPRESS_G4
)
4673 written
+= t2p_write_pdf_xobject_decode(t2p
, output
);
4675 written
+= t2p_write_pdf_xobject_stream_filter(tile
, t2p
, output
);
4681 * This function writes a PDF Image XObject Colorspace name to output.
4685 tsize_t
t2p_write_pdf_xobject_cs(T2P
* t2p
, TIFF
* output
){
4695 if( (t2p
->pdf_colorspace
& T2P_CS_ICCBASED
) != 0){
4696 written
+= t2p_write_pdf_xobject_icccs(t2p
, output
);
4699 if( (t2p
->pdf_colorspace
& T2P_CS_PALETTE
) != 0){
4700 written
+= t2pWriteFile(output
, (tdata_t
) "[ /Indexed ", 11);
4701 t2p
->pdf_colorspace
^= T2P_CS_PALETTE
;
4702 written
+= t2p_write_pdf_xobject_cs(t2p
, output
);
4703 t2p
->pdf_colorspace
|= T2P_CS_PALETTE
;
4704 buflen
=sprintf(buffer
, "%u", (0x0001 << t2p
->tiff_bitspersample
)-1 );
4705 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4706 written
+= t2pWriteFile(output
, (tdata_t
) " ", 1);
4707 _TIFFmemset(buffer
, 0x00, 16);
4708 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_palettecs
);
4709 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4710 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ]\n", 7);
4713 if(t2p
->pdf_colorspace
& T2P_CS_BILEVEL
){
4714 written
+= t2pWriteFile(output
, (tdata_t
) "/DeviceGray \n", 13);
4716 if(t2p
->pdf_colorspace
& T2P_CS_GRAY
){
4717 if(t2p
->pdf_colorspace
& T2P_CS_CALGRAY
){
4718 written
+= t2p_write_pdf_xobject_calcs(t2p
, output
);
4720 written
+= t2pWriteFile(output
, (tdata_t
) "/DeviceGray \n", 13);
4723 if(t2p
->pdf_colorspace
& T2P_CS_RGB
){
4724 if(t2p
->pdf_colorspace
& T2P_CS_CALRGB
){
4725 written
+= t2p_write_pdf_xobject_calcs(t2p
, output
);
4727 written
+= t2pWriteFile(output
, (tdata_t
) "/DeviceRGB \n", 12);
4730 if(t2p
->pdf_colorspace
& T2P_CS_CMYK
){
4731 written
+= t2pWriteFile(output
, (tdata_t
) "/DeviceCMYK \n", 13);
4733 if(t2p
->pdf_colorspace
& T2P_CS_LAB
){
4734 written
+= t2pWriteFile(output
, (tdata_t
) "[/Lab << \n", 10);
4735 written
+= t2pWriteFile(output
, (tdata_t
) "/WhitePoint ", 12);
4736 X_W
= t2p
->tiff_whitechromaticities
[0];
4737 Y_W
= t2p
->tiff_whitechromaticities
[1];
4738 Z_W
= 1.0F
- (X_W
+ Y_W
);
4742 buflen
=sprintf(buffer
, "[%.4f %.4f %.4f] \n", X_W
, Y_W
, Z_W
);
4743 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4744 written
+= t2pWriteFile(output
, (tdata_t
) "/Range ", 7);
4745 buflen
=sprintf(buffer
, "[%d %d %d %d] \n",
4746 t2p
->pdf_labrange
[0],
4747 t2p
->pdf_labrange
[1],
4748 t2p
->pdf_labrange
[2],
4749 t2p
->pdf_labrange
[3]);
4750 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4751 written
+= t2pWriteFile(output
, (tdata_t
) ">>] \n", 5);
4758 tsize_t
t2p_write_pdf_transfer(T2P
* t2p
, TIFF
* output
){
4764 written
+= t2pWriteFile(output
, (tdata_t
) "<< /Type /ExtGState \n/TR ", 25);
4765 if(t2p
->tiff_transferfunctioncount
== 1){
4766 buflen
=sprintf(buffer
, "%lu",
4767 (unsigned long)(t2p
->pdf_xrefcount
+ 1));
4768 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4769 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4771 written
+= t2pWriteFile(output
, (tdata_t
) "[ ", 2);
4772 buflen
=sprintf(buffer
, "%lu",
4773 (unsigned long)(t2p
->pdf_xrefcount
+ 1));
4774 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4775 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4776 buflen
=sprintf(buffer
, "%lu",
4777 (unsigned long)(t2p
->pdf_xrefcount
+ 2));
4778 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4779 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4780 buflen
=sprintf(buffer
, "%lu",
4781 (unsigned long)(t2p
->pdf_xrefcount
+ 3));
4782 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4783 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R ", 5);
4784 written
+= t2pWriteFile(output
, (tdata_t
) "/Identity ] ", 12);
4787 written
+= t2pWriteFile(output
, (tdata_t
) " >> \n", 5);
4792 tsize_t
t2p_write_pdf_transfer_dict(T2P
* t2p
, TIFF
* output
, uint16 i
){
4799 written
+= t2pWriteFile(output
, (tdata_t
) "/FunctionType 0 \n", 17);
4800 written
+= t2pWriteFile(output
, (tdata_t
) "/Domain [0.0 1.0] \n", 19);
4801 written
+= t2pWriteFile(output
, (tdata_t
) "/Range [0.0 1.0] \n", 18);
4802 buflen
=sprintf(buffer
, "/Size [%u] \n", (1<<t2p
->tiff_bitspersample
));
4803 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4804 written
+= t2pWriteFile(output
, (tdata_t
) "/BitsPerSample 16 \n", 19);
4805 written
+= t2p_write_pdf_stream_dict(((tsize_t
)1)<<(t2p
->tiff_bitspersample
+1), 0, output
);
4810 tsize_t
t2p_write_pdf_transfer_stream(T2P
* t2p
, TIFF
* output
, uint16 i
){
4814 written
+= t2p_write_pdf_stream(
4815 t2p
->tiff_transferfunction
[i
],
4816 (((tsize_t
)1)<<(t2p
->tiff_bitspersample
+1)),
4823 This function writes a PDF Image XObject Colorspace array to output.
4826 tsize_t
t2p_write_pdf_xobject_calcs(T2P
* t2p
, TIFF
* output
){
4857 written
+= t2pWriteFile(output
, (tdata_t
) "[", 1);
4858 if(t2p
->pdf_colorspace
& T2P_CS_CALGRAY
){
4859 written
+= t2pWriteFile(output
, (tdata_t
) "/CalGray ", 9);
4860 X_W
= t2p
->tiff_whitechromaticities
[0];
4861 Y_W
= t2p
->tiff_whitechromaticities
[1];
4862 Z_W
= 1.0F
- (X_W
+ Y_W
);
4867 if(t2p
->pdf_colorspace
& T2P_CS_CALRGB
){
4868 written
+= t2pWriteFile(output
, (tdata_t
) "/CalRGB ", 8);
4869 x_w
= t2p
->tiff_whitechromaticities
[0];
4870 y_w
= t2p
->tiff_whitechromaticities
[1];
4871 x_r
= t2p
->tiff_primarychromaticities
[0];
4872 y_r
= t2p
->tiff_primarychromaticities
[1];
4873 x_g
= t2p
->tiff_primarychromaticities
[2];
4874 y_g
= t2p
->tiff_primarychromaticities
[3];
4875 x_b
= t2p
->tiff_primarychromaticities
[4];
4876 y_b
= t2p
->tiff_primarychromaticities
[5];
4877 z_w
= y_w
* ((x_g
- x_b
)*y_r
- (x_r
-x_b
)*y_g
+ (x_r
-x_g
)*y_b
);
4878 Y_R
= (y_r
/R
) * ((x_g
-x_b
)*y_w
- (x_w
-x_b
)*y_g
+ (x_w
-x_g
)*y_b
) / z_w
;
4879 X_R
= Y_R
* x_r
/ y_r
;
4880 Z_R
= Y_R
* (((1-x_r
)/y_r
)-1);
4881 Y_G
= ((0.0F
-(y_g
))/G
) * ((x_r
-x_b
)*y_w
- (x_w
-x_b
)*y_r
+ (x_w
-x_r
)*y_b
) / z_w
;
4882 X_G
= Y_G
* x_g
/ y_g
;
4883 Z_G
= Y_G
* (((1-x_g
)/y_g
)-1);
4884 Y_B
= (y_b
/B
) * ((x_r
-x_g
)*y_w
- (x_w
-x_g
)*y_r
+ (x_w
-x_r
)*y_g
) / z_w
;
4885 X_B
= Y_B
* x_b
/ y_b
;
4886 Z_B
= Y_B
* (((1-x_b
)/y_b
)-1);
4887 X_W
= (X_R
* R
) + (X_G
* G
) + (X_B
* B
);
4888 Y_W
= (Y_R
* R
) + (Y_G
* G
) + (Y_B
* B
);
4889 Z_W
= (Z_R
* R
) + (Z_G
* G
) + (Z_B
* B
);
4894 written
+= t2pWriteFile(output
, (tdata_t
) "<< \n", 4);
4895 if(t2p
->pdf_colorspace
& T2P_CS_CALGRAY
){
4896 written
+= t2pWriteFile(output
, (tdata_t
) "/WhitePoint ", 12);
4897 buflen
=sprintf(buffer
, "[%.4f %.4f %.4f] \n", X_W
, Y_W
, Z_W
);
4898 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4899 written
+= t2pWriteFile(output
, (tdata_t
) "/Gamma 2.2 \n", 12);
4901 if(t2p
->pdf_colorspace
& T2P_CS_CALRGB
){
4902 written
+= t2pWriteFile(output
, (tdata_t
) "/WhitePoint ", 12);
4903 buflen
=sprintf(buffer
, "[%.4f %.4f %.4f] \n", X_W
, Y_W
, Z_W
);
4904 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4905 written
+= t2pWriteFile(output
, (tdata_t
) "/Matrix ", 8);
4906 buflen
=sprintf(buffer
, "[%.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f] \n",
4910 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4911 written
+= t2pWriteFile(output
, (tdata_t
) "/Gamma [2.2 2.2 2.2] \n", 22);
4913 written
+= t2pWriteFile(output
, (tdata_t
) ">>] \n", 5);
4919 This function writes a PDF Image XObject Colorspace array to output.
4922 tsize_t
t2p_write_pdf_xobject_icccs(T2P
* t2p
, TIFF
* output
){
4928 written
+= t2pWriteFile(output
, (tdata_t
) "[/ICCBased ", 11);
4929 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_icccs
);
4930 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4931 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R] \n", 7);
4936 tsize_t
t2p_write_pdf_xobject_icccs_dict(T2P
* t2p
, TIFF
* output
){
4942 written
+= t2pWriteFile(output
, (tdata_t
) "/N ", 3);
4943 buflen
=sprintf(buffer
, "%u \n", t2p
->tiff_samplesperpixel
);
4944 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
4945 written
+= t2pWriteFile(output
, (tdata_t
) "/Alternate ", 11);
4946 t2p
->pdf_colorspace
^= T2P_CS_ICCBASED
;
4947 written
+= t2p_write_pdf_xobject_cs(t2p
, output
);
4948 t2p
->pdf_colorspace
|= T2P_CS_ICCBASED
;
4949 written
+= t2p_write_pdf_stream_dict(t2p
->tiff_iccprofilelength
, 0, output
);
4954 tsize_t
t2p_write_pdf_xobject_icccs_stream(T2P
* t2p
, TIFF
* output
){
4958 written
+= t2p_write_pdf_stream(
4959 (tdata_t
) t2p
->tiff_iccprofile
,
4960 (tsize_t
) t2p
->tiff_iccprofilelength
,
4967 This function writes a palette stream for an indexed color space to output.
4970 tsize_t
t2p_write_pdf_xobject_palettecs_stream(T2P
* t2p
, TIFF
* output
){
4974 written
+= t2p_write_pdf_stream(
4975 (tdata_t
) t2p
->pdf_palette
,
4976 (tsize_t
) t2p
->pdf_palettesize
,
4983 This function writes a PDF Image XObject Decode array to output.
4986 tsize_t
t2p_write_pdf_xobject_decode(T2P
* t2p
, TIFF
* output
){
4991 written
+= t2pWriteFile(output
, (tdata_t
) "/Decode [ ", 10);
4992 for (i
=0;i
<t2p
->tiff_samplesperpixel
;i
++){
4993 written
+= t2pWriteFile(output
, (tdata_t
) "1 0 ", 4);
4995 written
+= t2pWriteFile(output
, (tdata_t
) "]\n", 2);
5001 This function writes a PDF Image XObject stream filter name and parameters to
5005 tsize_t
t2p_write_pdf_xobject_stream_filter(ttile_t tile
, T2P
* t2p
, TIFF
* output
){
5011 if(t2p
->pdf_compression
==T2P_COMPRESS_NONE
){
5014 written
+= t2pWriteFile(output
, (tdata_t
) "/Filter ", 8);
5015 switch(t2p
->pdf_compression
){
5016 #ifdef CCITT_SUPPORT
5017 case T2P_COMPRESS_G4
:
5018 written
+= t2pWriteFile(output
, (tdata_t
) "/CCITTFaxDecode ", 16);
5019 written
+= t2pWriteFile(output
, (tdata_t
) "/DecodeParms ", 13);
5020 written
+= t2pWriteFile(output
, (tdata_t
) "<< /K -1 ", 9);
5022 written
+= t2pWriteFile(output
, (tdata_t
) "/Columns ", 9);
5023 buflen
=sprintf(buffer
, "%lu",
5024 (unsigned long)t2p
->tiff_width
);
5025 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5026 written
+= t2pWriteFile(output
, (tdata_t
) " /Rows ", 7);
5027 buflen
=sprintf(buffer
, "%lu",
5028 (unsigned long)t2p
->tiff_length
);
5029 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5031 if(t2p_tile_is_right_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
-1)==0){
5032 written
+= t2pWriteFile(output
, (tdata_t
) "/Columns ", 9);
5036 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilewidth
);
5037 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5039 written
+= t2pWriteFile(output
, (tdata_t
) "/Columns ", 9);
5043 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilewidth
);
5044 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5046 if(t2p_tile_is_bottom_edge(t2p
->tiff_tiles
[t2p
->pdf_page
], tile
-1)==0){
5047 written
+= t2pWriteFile(output
, (tdata_t
) " /Rows ", 7);
5051 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilelength
);
5052 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5054 written
+= t2pWriteFile(output
, (tdata_t
) " /Rows ", 7);
5058 (unsigned long)t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_edgetilelength
);
5059 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5062 if(t2p
->pdf_switchdecode
== 0){
5063 written
+= t2pWriteFile(output
, (tdata_t
) " /BlackIs1 true ", 16);
5065 written
+= t2pWriteFile(output
, (tdata_t
) ">>\n", 3);
5069 case T2P_COMPRESS_JPEG
:
5070 written
+= t2pWriteFile(output
, (tdata_t
) "/DCTDecode ", 11);
5072 if(t2p
->tiff_photometric
!= PHOTOMETRIC_YCBCR
) {
5073 written
+= t2pWriteFile(output
, (tdata_t
) "/DecodeParms ", 13);
5074 written
+= t2pWriteFile(output
, (tdata_t
) "<< /ColorTransform 0 >>\n", 24);
5079 case T2P_COMPRESS_ZIP
:
5080 written
+= t2pWriteFile(output
, (tdata_t
) "/FlateDecode ", 13);
5081 if(t2p
->pdf_compressionquality%100
){
5082 written
+= t2pWriteFile(output
, (tdata_t
) "/DecodeParms ", 13);
5083 written
+= t2pWriteFile(output
, (tdata_t
) "<< /Predictor ", 14);
5084 _TIFFmemset(buffer
, 0x00, 16);
5085 buflen
=sprintf(buffer
, "%u", t2p
->pdf_compressionquality%100
);
5086 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5087 written
+= t2pWriteFile(output
, (tdata_t
) " /Columns ", 10);
5088 _TIFFmemset(buffer
, 0x00, 16);
5089 buflen
= sprintf(buffer
, "%lu",
5090 (unsigned long)t2p
->tiff_width
);
5091 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5092 written
+= t2pWriteFile(output
, (tdata_t
) " /Colors ", 9);
5093 _TIFFmemset(buffer
, 0x00, 16);
5094 buflen
=sprintf(buffer
, "%u", t2p
->tiff_samplesperpixel
);
5095 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5096 written
+= t2pWriteFile(output
, (tdata_t
) " /BitsPerComponent ", 19);
5097 _TIFFmemset(buffer
, 0x00, 16);
5098 buflen
=sprintf(buffer
, "%u", t2p
->tiff_bitspersample
);
5099 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5100 written
+= t2pWriteFile(output
, (tdata_t
) ">>\n", 3);
5112 This function writes a PDF xref table to output.
5115 tsize_t
t2p_write_pdf_xreftable(T2P
* t2p
, TIFF
* output
){
5122 written
+= t2pWriteFile(output
, (tdata_t
) "xref\n0 ", 7);
5123 buflen
=sprintf(buffer
, "%lu", (unsigned long)(t2p
->pdf_xrefcount
+ 1));
5124 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5125 written
+= t2pWriteFile(output
, (tdata_t
) " \n0000000000 65535 f \n", 22);
5126 for (i
=0;i
<t2p
->pdf_xrefcount
;i
++){
5127 sprintf(buffer
, "%.10lu 00000 n \n",
5128 (unsigned long)t2p
->pdf_xrefoffsets
[i
]);
5129 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, 20);
5136 * This function writes a PDF trailer to output.
5139 tsize_t
t2p_write_pdf_trailer(T2P
* t2p
, TIFF
* output
)
5142 tsize_t written
= 0;
5147 for (i
= 0; i
< sizeof(t2p
->pdf_fileid
) - 8; i
+= 8)
5148 snprintf(t2p
->pdf_fileid
+ i
, 9, "%.8X", rand());
5150 written
+= t2pWriteFile(output
, (tdata_t
) "trailer\n<<\n/Size ", 17);
5151 buflen
= sprintf(buffer
, "%lu", (unsigned long)(t2p
->pdf_xrefcount
+1));
5152 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5153 _TIFFmemset(buffer
, 0x00, 32);
5154 written
+= t2pWriteFile(output
, (tdata_t
) "\n/Root ", 7);
5155 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_catalog
);
5156 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5157 _TIFFmemset(buffer
, 0x00, 32);
5158 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n/Info ", 12);
5159 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_info
);
5160 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5161 _TIFFmemset(buffer
, 0x00, 32);
5162 written
+= t2pWriteFile(output
, (tdata_t
) " 0 R \n/ID[<", 11);
5163 written
+= t2pWriteFile(output
, (tdata_t
) t2p
->pdf_fileid
,
5164 sizeof(t2p
->pdf_fileid
) - 1);
5165 written
+= t2pWriteFile(output
, (tdata_t
) "><", 2);
5166 written
+= t2pWriteFile(output
, (tdata_t
) t2p
->pdf_fileid
,
5167 sizeof(t2p
->pdf_fileid
) - 1);
5168 written
+= t2pWriteFile(output
, (tdata_t
) ">]\n>>\nstartxref\n", 16);
5169 buflen
=sprintf(buffer
, "%lu", (unsigned long)t2p
->pdf_startxref
);
5170 written
+= t2pWriteFile(output
, (tdata_t
) buffer
, buflen
);
5171 _TIFFmemset(buffer
, 0x00, 32);
5172 written
+= t2pWriteFile(output
, (tdata_t
) "\n%%EOF\n", 7);
5179 This function writes a PDF to a file given a pointer to a TIFF.
5181 The idea with using a TIFF* as output for a PDF file is that the file
5182 can be created with TIFFClientOpen for memory-mapped use within the TIFF
5183 library, and TIFFWriteEncodedStrip can be used to write compressed data to
5184 the output. The output is not actually a TIFF file, it is a PDF file.
5186 This function uses only t2pWriteFile and TIFFWriteEncodedStrip to write to
5187 the output TIFF file. When libtiff would otherwise be writing data to the
5188 output file, the write procedure of the TIFF structure is replaced with an
5189 empty implementation.
5191 The first argument to the function is an initialized and validated T2P
5192 context struct pointer.
5194 The second argument to the function is the TIFF* that is the input that has
5195 been opened for reading and no other functions have been called upon it.
5197 The third argument to the function is the TIFF* that is the output that has
5198 been opened for writing. It has to be opened so that it hasn't written any
5199 data to the output. If the output is seekable then it's OK to seek to the
5200 beginning of the file. The function only writes to the output PDF and does
5201 not seek. See the example usage in the main() function.
5203 TIFF* output = TIFFOpen("output.pdf", "w");
5204 assert(output != NULL);
5206 if(output->tif_seekproc != NULL){
5207 t2pSeekFile(output, (toff_t) 0, SEEK_SET);
5210 This function returns the file size of the output PDF file. On error it
5211 returns zero and the t2p->t2p_error variable is set to T2P_ERR_ERROR.
5213 After this function completes, call t2p_free on t2p, TIFFClose on input,
5214 and TIFFClose on output.
5217 tsize_t
t2p_write_pdf(T2P
* t2p
, TIFF
* input
, TIFF
* output
){
5221 tsize_t streamlen
=0;
5224 t2p_read_tiff_init(t2p
, input
);
5225 if(t2p
->t2p_error
!=T2P_ERR_OK
){return(0);}
5226 t2p
->pdf_xrefoffsets
= (uint32
*) _TIFFmalloc(t2p
->pdf_xrefcount
* sizeof(uint32
) );
5227 if(t2p
->pdf_xrefoffsets
==NULL
){
5230 "Can't allocate %u bytes of memory for t2p_write_pdf",
5231 (unsigned int) (t2p
->pdf_xrefcount
* sizeof(uint32
)) );
5232 t2p
->t2p_error
= T2P_ERR_ERROR
;
5235 t2p
->pdf_xrefcount
=0;
5239 written
+= t2p_write_pdf_header(t2p
, output
);
5240 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5241 t2p
->pdf_catalog
=t2p
->pdf_xrefcount
;
5242 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5243 written
+= t2p_write_pdf_catalog(t2p
, output
);
5244 written
+= t2p_write_pdf_obj_end(output
);
5245 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5246 t2p
->pdf_info
=t2p
->pdf_xrefcount
;
5247 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5248 written
+= t2p_write_pdf_info(t2p
, input
, output
);
5249 written
+= t2p_write_pdf_obj_end(output
);
5250 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5251 t2p
->pdf_pages
=t2p
->pdf_xrefcount
;
5252 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5253 written
+= t2p_write_pdf_pages(t2p
, output
);
5254 written
+= t2p_write_pdf_obj_end(output
);
5255 for(t2p
->pdf_page
=0;t2p
->pdf_page
<t2p
->tiff_pagecount
;t2p
->pdf_page
++){
5256 t2p_read_tiff_data(t2p
, input
);
5257 if(t2p
->t2p_error
!=T2P_ERR_OK
){return(0);}
5258 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5259 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5260 written
+= t2p_write_pdf_page(t2p
->pdf_xrefcount
, t2p
, output
);
5261 written
+= t2p_write_pdf_obj_end(output
);
5262 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5263 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5264 written
+= t2p_write_pdf_stream_dict_start(output
);
5265 written
+= t2p_write_pdf_stream_dict(0, t2p
->pdf_xrefcount
+1, output
);
5266 written
+= t2p_write_pdf_stream_dict_end(output
);
5267 written
+= t2p_write_pdf_stream_start(output
);
5269 written
+= t2p_write_pdf_page_content_stream(t2p
, output
);
5270 streamlen
=written
-streamlen
;
5271 written
+= t2p_write_pdf_stream_end(output
);
5272 written
+= t2p_write_pdf_obj_end(output
);
5273 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5274 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5275 written
+= t2p_write_pdf_stream_length(streamlen
, output
);
5276 written
+= t2p_write_pdf_obj_end(output
);
5277 if(t2p
->tiff_transferfunctioncount
!= 0){
5278 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5279 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5280 written
+= t2p_write_pdf_transfer(t2p
, output
);
5281 written
+= t2p_write_pdf_obj_end(output
);
5282 for(i
=0; i
< t2p
->tiff_transferfunctioncount
; i
++){
5283 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5284 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5285 written
+= t2p_write_pdf_stream_dict_start(output
);
5286 written
+= t2p_write_pdf_transfer_dict(t2p
, output
, i
);
5287 written
+= t2p_write_pdf_stream_dict_end(output
);
5288 written
+= t2p_write_pdf_stream_start(output
);
5290 written
+= t2p_write_pdf_transfer_stream(t2p
, output
, i
);
5291 streamlen
=written
-streamlen
;
5292 written
+= t2p_write_pdf_stream_end(output
);
5293 written
+= t2p_write_pdf_obj_end(output
);
5296 if( (t2p
->pdf_colorspace
& T2P_CS_PALETTE
) != 0){
5297 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5298 t2p
->pdf_palettecs
=t2p
->pdf_xrefcount
;
5299 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5300 written
+= t2p_write_pdf_stream_dict_start(output
);
5301 written
+= t2p_write_pdf_stream_dict(t2p
->pdf_palettesize
, 0, output
);
5302 written
+= t2p_write_pdf_stream_dict_end(output
);
5303 written
+= t2p_write_pdf_stream_start(output
);
5305 written
+= t2p_write_pdf_xobject_palettecs_stream(t2p
, output
);
5306 streamlen
=written
-streamlen
;
5307 written
+= t2p_write_pdf_stream_end(output
);
5308 written
+= t2p_write_pdf_obj_end(output
);
5310 if( (t2p
->pdf_colorspace
& T2P_CS_ICCBASED
) != 0){
5311 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5312 t2p
->pdf_icccs
=t2p
->pdf_xrefcount
;
5313 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5314 written
+= t2p_write_pdf_stream_dict_start(output
);
5315 written
+= t2p_write_pdf_xobject_icccs_dict(t2p
, output
);
5316 written
+= t2p_write_pdf_stream_dict_end(output
);
5317 written
+= t2p_write_pdf_stream_start(output
);
5319 written
+= t2p_write_pdf_xobject_icccs_stream(t2p
, output
);
5320 streamlen
=written
-streamlen
;
5321 written
+= t2p_write_pdf_stream_end(output
);
5322 written
+= t2p_write_pdf_obj_end(output
);
5324 if(t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
!=0){
5325 for(i2
=0;i2
<t2p
->tiff_tiles
[t2p
->pdf_page
].tiles_tilecount
;i2
++){
5326 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5327 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5328 written
+= t2p_write_pdf_stream_dict_start(output
);
5329 written
+= t2p_write_pdf_xobject_stream_dict(
5333 written
+= t2p_write_pdf_stream_dict_end(output
);
5334 written
+= t2p_write_pdf_stream_start(output
);
5336 t2p_read_tiff_size_tile(t2p
, input
, i2
);
5337 written
+= t2p_readwrite_pdf_image_tile(t2p
, input
, output
, i2
);
5338 t2p_write_advance_directory(t2p
, output
);
5339 if(t2p
->t2p_error
!=T2P_ERR_OK
){return(0);}
5340 streamlen
=written
-streamlen
;
5341 written
+= t2p_write_pdf_stream_end(output
);
5342 written
+= t2p_write_pdf_obj_end(output
);
5343 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5344 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5345 written
+= t2p_write_pdf_stream_length(streamlen
, output
);
5346 written
+= t2p_write_pdf_obj_end(output
);
5349 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5350 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5351 written
+= t2p_write_pdf_stream_dict_start(output
);
5352 written
+= t2p_write_pdf_xobject_stream_dict(
5356 written
+= t2p_write_pdf_stream_dict_end(output
);
5357 written
+= t2p_write_pdf_stream_start(output
);
5359 t2p_read_tiff_size(t2p
, input
);
5360 written
+= t2p_readwrite_pdf_image(t2p
, input
, output
);
5361 t2p_write_advance_directory(t2p
, output
);
5362 if(t2p
->t2p_error
!=T2P_ERR_OK
){return(0);}
5363 streamlen
=written
-streamlen
;
5364 written
+= t2p_write_pdf_stream_end(output
);
5365 written
+= t2p_write_pdf_obj_end(output
);
5366 t2p
->pdf_xrefoffsets
[t2p
->pdf_xrefcount
++]=written
;
5367 written
+= t2p_write_pdf_obj_start(t2p
->pdf_xrefcount
, output
);
5368 written
+= t2p_write_pdf_stream_length(streamlen
, output
);
5369 written
+= t2p_write_pdf_obj_end(output
);
5372 t2p
->pdf_startxref
= written
;
5373 written
+= t2p_write_pdf_xreftable(t2p
, output
);
5374 written
+= t2p_write_pdf_trailer(t2p
, output
);
5375 t2p_disable(output
);
5380 /* vim: set ts=8 sts=8 sw=8 noet: */