| Bsoft 1.9 Bernard's software package

- Main Page
- Namespaces
- Classes
- Files

- File List
- File Members

tif_jpeg.c
Go to the documentation of this file.
1 /* $Id: tif_jpeg.c,v 1.50.2.9 2010-06-14 02:47:16 fwarmerdam Exp $ */
2
3 /*
4 * Copyright (c) 1994-1997 Sam Leffler
5 * Copyright (c) 1994-1997 Silicon Graphics, Inc.
6 *
7 * Permission to use, copy, modify, distribute, and sell this software and
8 * its documentation for any purpose is hereby granted without fee, provided
9 * that (i) the above copyright notices and this permission notice appear in
10 * all copies of the software and related documentation, and (ii) the names of
11 * Sam Leffler and Silicon Graphics may not be used in any advertising or
12 * publicity relating to the software without the specific, prior written
13 * permission of Sam Leffler and Silicon Graphics.
14 *
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18 *
19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 * OF THIS SOFTWARE.
25 */
26
27 #define WIN32_LEAN_AND_MEAN
28 #define VC_EXTRALEAN
29
30 #include "tiffiop.h"
31 #ifdef JPEG_SUPPORT
32
33 /*
34 * TIFF Library
35 *
36 * JPEG Compression support per TIFF Technical Note #2
37 * (*not* per the original TIFF 6.0 spec).
38 *
39 * This file is simply an interface to the libjpeg library written by
40 * the Independent JPEG Group. You need release 5 or later of the IJG
41 * code, which you can find on the Internet at ftp.uu.net:/graphics/jpeg/.
42 *
43 * Contributed by Tom Lane <tgl@sss.pgh.pa.us>.
44 */
45 #include <setjmp.h>
46
47 int TIFFFillStrip(TIFF*, tstrip_t);
48 int TIFFFillTile(TIFF*, ttile_t);
49
50 /* We undefine FAR to avoid conflict with JPEG definition */
51
52 #ifdef FAR
53 #undef FAR
54 #endif
55
56 /*
57 Libjpeg's jmorecfg.h defines INT16 and INT32, but only if XMD_H is
58 not defined. Unfortunately, the MinGW and Borland compilers include
59 a typedef for INT32, which causes a conflict. MSVC does not include
60 a conficting typedef given the headers which are included.
61 */
62 #if defined(__BORLANDC__) || defined(__MINGW32__)
63 # define XMD_H 1
64 #endif
65
66 /*
67 The windows RPCNDR.H file defines boolean, but defines it with the
68 unsigned char size. You should compile JPEG library using appropriate
69 definitions in jconfig.h header, but many users compile library in wrong
70 way. That causes errors of the following type:
71
72 "JPEGLib: JPEG parameter struct mismatch: library thinks size is 432,
73 caller expects 464"
74
75 For such users we wil fix the problem here. See install.doc file from
76 the JPEG library distribution for details.
77 */
78
79 /* Define "boolean" as unsigned char, not int, per Windows custom. */
80 #if defined(WIN32) && !defined(__MINGW32__)
81 # ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
82 typedef unsigned char boolean;
83 # endif
84 # define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
85 #endif
86
87 #include "jpeglib.h"
88 #include "jerror.h"
89
90 /*
91 * We are using width_in_blocks which is supposed to be private to
92 * libjpeg. Unfortunately, the libjpeg delivered with Cygwin has
93 * renamed this member to width_in_data_units. Since the header has
94 * also renamed a define, use that unique define name in order to
95 * detect the problem header and adjust to suit.
96 */
97 #if defined(D_MAX_DATA_UNITS_IN_MCU)
98 #define width_in_blocks width_in_data_units
99 #endif
100
101 /*
102 * On some machines it may be worthwhile to use _setjmp or sigsetjmp
103 * in place of plain setjmp. These macros will make it easier.
104 */
105 #define SETJMP(jbuf) setjmp(jbuf)
106 #define LONGJMP(jbuf,code) longjmp(jbuf,code)
107 #define JMP_BUF jmp_buf
108
109 typedef struct jpeg_destination_mgr jpeg_destination_mgr;
110 typedef struct jpeg_source_mgr jpeg_source_mgr;
111 typedef struct jpeg_error_mgr jpeg_error_mgr;
112
113 /*
114 * State block for each open TIFF file using
115 * libjpeg to do JPEG compression/decompression.
116 *
117 * libjpeg's visible state is either a jpeg_compress_struct
118 * or jpeg_decompress_struct depending on which way we
119 * are going. comm can be used to refer to the fields
120 * which are common to both.
121 *
122 * NB: cinfo is required to be the first member of JPEGState,
123 * so we can safely cast JPEGState* -> jpeg_xxx_struct*
124 * and vice versa!
125 */
126 typedef struct {
127 union {
128 struct jpeg_compress_struct c;
129 struct jpeg_decompress_struct d;
130 struct jpeg_common_struct comm;
131 } cinfo; /* NB: must be first */
132 int cinfo_initialized;
133
134 jpeg_error_mgr err; /* libjpeg error manager */
135 JMP_BUF exit_jmpbuf; /* for catching libjpeg failures */
136 /*
137 * The following two members could be a union, but
138 * they're small enough that it's not worth the effort.
139 */
140 jpeg_destination_mgr dest; /* data dest for compression */
141 jpeg_source_mgr src; /* data source for decompression */
142 /* private state */
143 TIFF* tif; /* back link needed by some code */
144 uint16 photometric; /* copy of PhotometricInterpretation */
145 uint16 h_sampling; /* luminance sampling factors */
146 uint16 v_sampling;
147 tsize_t bytesperline; /* decompressed bytes per scanline */
148 /* pointers to intermediate buffers when processing downsampled data */
149 JSAMPARRAY ds_buffer[MAX_COMPONENTS];
150 int scancount; /* number of "scanlines" accumulated */
151 int samplesperclump;
152
153 TIFFVGetMethod vgetparent; /* super-class method */
154 TIFFVSetMethod vsetparent; /* super-class method */
155 TIFFPrintMethod printdir; /* super-class method */
156 TIFFStripMethod defsparent; /* super-class method */
157 TIFFTileMethod deftparent; /* super-class method */
158 /* pseudo-tag fields */
159 void* jpegtables; /* JPEGTables tag value, or NULL */
160 uint32 jpegtables_length; /* number of bytes in same */
161 int jpegquality; /* Compression quality level */
162 int jpegcolormode; /* Auto RGB<=>YCbCr convert? */
163 int jpegtablesmode; /* What to put in JPEGTables */
164
165 int ycbcrsampling_fetched;
166 uint32 recvparams; /* encoded Class 2 session params */
167 char* subaddress; /* subaddress string */
168 uint32 recvtime; /* time spent receiving (secs) */
169 char* faxdcs; /* encoded fax parameters (DCS, Table 2/T.30) */
170 } JPEGState;
171
172 #define JState(tif) ((JPEGState*)(tif)->tif_data)
173
174 static int JPEGDecode(TIFF*, tidata_t, tsize_t, tsample_t);
175 static int JPEGDecodeRaw(TIFF*, tidata_t, tsize_t, tsample_t);
176 static int JPEGEncode(TIFF*, tidata_t, tsize_t, tsample_t);
177 static int JPEGEncodeRaw(TIFF*, tidata_t, tsize_t, tsample_t);
178 static int JPEGInitializeLibJPEG( TIFF * tif,
179 int force_encode, int force_decode );
180
181 #define FIELD_JPEGTABLES (FIELD_CODEC+0)
182 #define FIELD_RECVPARAMS (FIELD_CODEC+1)
183 #define FIELD_SUBADDRESS (FIELD_CODEC+2)
184 #define FIELD_RECVTIME (FIELD_CODEC+3)
185 #define FIELD_FAXDCS (FIELD_CODEC+4)
186
187 static const TIFFFieldInfo jpegFieldInfo[] = {
188 { TIFFTAG_JPEGTABLES, -3,-3, TIFF_UNDEFINED, FIELD_JPEGTABLES,
189 FALSE, TRUE, "JPEGTables" },
190 { TIFFTAG_JPEGQUALITY, 0, 0, TIFF_ANY, FIELD_PSEUDO,
191 TRUE, FALSE, "" },
192 { TIFFTAG_JPEGCOLORMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO,
193 FALSE, FALSE, "" },
194 { TIFFTAG_JPEGTABLESMODE, 0, 0, TIFF_ANY, FIELD_PSEUDO,
195 FALSE, FALSE, "" },
196 /* Specific for JPEG in faxes */
197 { TIFFTAG_FAXRECVPARAMS, 1, 1, TIFF_LONG, FIELD_RECVPARAMS,
198 TRUE, FALSE, "FaxRecvParams" },
199 { TIFFTAG_FAXSUBADDRESS, -1,-1, TIFF_ASCII, FIELD_SUBADDRESS,
200 TRUE, FALSE, "FaxSubAddress" },
201 { TIFFTAG_FAXRECVTIME, 1, 1, TIFF_LONG, FIELD_RECVTIME,
202 TRUE, FALSE, "FaxRecvTime" },
203 { TIFFTAG_FAXDCS, -1, -1, TIFF_ASCII, FIELD_FAXDCS,
204 TRUE, FALSE, "FaxDcs" },
205 };
206 #define N(a) (sizeof (a) / sizeof (a[0]))
207
208 /*
209 * libjpeg interface layer.
210 *
211 * We use setjmp/longjmp to return control to libtiff
212 * when a fatal error is encountered within the JPEG
213 * library. We also direct libjpeg error and warning
214 * messages through the appropriate libtiff handlers.
215 */
216
217 /*
218 * Error handling routines (these replace corresponding
219 * IJG routines from jerror.c). These are used for both
220 * compression and decompression.
221 */
222 static void
223 TIFFjpeg_error_exit(j_common_ptr cinfo)
224 {
225 JPEGState *sp = (JPEGState *) cinfo; /* NB: cinfo assumed first */
226 char buffer[JMSG_LENGTH_MAX];
227
228 (*cinfo->err->format_message) (cinfo, buffer);
229 TIFFErrorExt(sp->tif->tif_clientdata, "JPEGLib", "%s", buffer); /* display the error message */
230 jpeg_abort(cinfo); /* clean up libjpeg state */
231 LONGJMP(sp->exit_jmpbuf, 1); /* return to libtiff caller */
232 }
233
234 /*
235 * This routine is invoked only for warning messages,
236 * since error_exit does its own thing and trace_level
237 * is never set > 0.
238 */
239 static void
240 TIFFjpeg_output_message(j_common_ptr cinfo)
241 {
242 char buffer[JMSG_LENGTH_MAX];
243
244 (*cinfo->err->format_message) (cinfo, buffer);
245 TIFFWarningExt(((JPEGState *) cinfo)->tif->tif_clientdata, "JPEGLib", "%s", buffer);
246 }
247
248 /*
249 * Interface routines. This layer of routines exists
250 * primarily to limit side-effects from using setjmp.
251 * Also, normal/error returns are converted into return
252 * values per libtiff practice.
253 */
254 #define CALLJPEG(sp, fail, op) (SETJMP((sp)->exit_jmpbuf) ? (fail) : (op))
255 #define CALLVJPEG(sp, op) CALLJPEG(sp, 0, ((op),1))
256
257 static int
258 TIFFjpeg_create_compress(JPEGState* sp)
259 {
260 /* initialize JPEG error handling */
261 sp->cinfo.c.err = jpeg_std_error(&sp->err);
262 sp->err.error_exit = TIFFjpeg_error_exit;
263 sp->err.output_message = TIFFjpeg_output_message;
264
265 return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c));
266 }
267
268 static int
269 TIFFjpeg_create_decompress(JPEGState* sp)
270 {
271 /* initialize JPEG error handling */
272 sp->cinfo.d.err = jpeg_std_error(&sp->err);
273 sp->err.error_exit = TIFFjpeg_error_exit;
274 sp->err.output_message = TIFFjpeg_output_message;
275
276 return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d));
277 }
278
279 static int
280 TIFFjpeg_set_defaults(JPEGState* sp)
281 {
282 return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c));
283 }
284
285 static int
286 TIFFjpeg_set_colorspace(JPEGState* sp, J_COLOR_SPACE colorspace)
287 {
288 return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace));
289 }
290
291 static int
292 TIFFjpeg_set_quality(JPEGState* sp, int quality, boolean force_baseline)
293 {
294 return CALLVJPEG(sp,
295 jpeg_set_quality(&sp->cinfo.c, quality, force_baseline));
296 }
297
298 static int
299 TIFFjpeg_suppress_tables(JPEGState* sp, boolean suppress)
300 {
301 return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress));
302 }
303
304 static int
305 TIFFjpeg_start_compress(JPEGState* sp, boolean write_all_tables)
306 {
307 return CALLVJPEG(sp,
308 jpeg_start_compress(&sp->cinfo.c, write_all_tables));
309 }
310
311 static int
312 TIFFjpeg_write_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int num_lines)
313 {
314 return CALLJPEG(sp, -1, (int) jpeg_write_scanlines(&sp->cinfo.c,
315 scanlines, (JDIMENSION) num_lines));
316 }
317
318 static int
319 TIFFjpeg_write_raw_data(JPEGState* sp, JSAMPIMAGE data, int num_lines)
320 {
321 return CALLJPEG(sp, -1, (int) jpeg_write_raw_data(&sp->cinfo.c,
322 data, (JDIMENSION) num_lines));
323 }
324
325 static int
326 TIFFjpeg_finish_compress(JPEGState* sp)
327 {
328 return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c));
329 }
330
331 static int
332 TIFFjpeg_write_tables(JPEGState* sp)
333 {
334 return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c));
335 }
336
337 static int
338 TIFFjpeg_read_header(JPEGState* sp, boolean require_image)
339 {
340 return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image));
341 }
342
343 static int
344 TIFFjpeg_start_decompress(JPEGState* sp)
345 {
346 return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d));
347 }
348
349 static int
350 TIFFjpeg_read_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int max_lines)
351 {
352 return CALLJPEG(sp, -1, (int) jpeg_read_scanlines(&sp->cinfo.d,
353 scanlines, (JDIMENSION) max_lines));
354 }
355
356 static int
357 TIFFjpeg_read_raw_data(JPEGState* sp, JSAMPIMAGE data, int max_lines)
358 {
359 return CALLJPEG(sp, -1, (int) jpeg_read_raw_data(&sp->cinfo.d,
360 data, (JDIMENSION) max_lines));
361 }
362
363 static int
364 TIFFjpeg_finish_decompress(JPEGState* sp)
365 {
366 return CALLJPEG(sp, -1, (int) jpeg_finish_decompress(&sp->cinfo.d));
367 }
368
369 static int
370 TIFFjpeg_abort(JPEGState* sp)
371 {
372 return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm));
373 }
374
375 static int
376 TIFFjpeg_destroy(JPEGState* sp)
377 {
378 return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm));
379 }
380
381 static JSAMPARRAY
382 TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id,
383 JDIMENSION samplesperrow, JDIMENSION numrows)
384 {
385 return CALLJPEG(sp, (JSAMPARRAY) NULL,
386 (*sp->cinfo.comm.mem->alloc_sarray)
387 (&sp->cinfo.comm, pool_id, samplesperrow, numrows));
388 }
389
390 /*
391 * JPEG library destination data manager.
392 * These routines direct compressed data from libjpeg into the
393 * libtiff output buffer.
394 */
395
396 static void
397 std_init_destination(j_compress_ptr cinfo)
398 {
399 JPEGState* sp = (JPEGState*) cinfo;
400 TIFF* tif = sp->tif;
401
402 sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
403 sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
404 }
405
406 static boolean
407 std_empty_output_buffer(j_compress_ptr cinfo)
408 {
409 JPEGState* sp = (JPEGState*) cinfo;
410 TIFF* tif = sp->tif;
411
412 /* the entire buffer has been filled */
413 tif->tif_rawcc = tif->tif_rawdatasize;
414 TIFFFlushData1(tif);
415 sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
416 sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
417
418 return (TRUE);
419 }
420
421 static void
422 std_term_destination(j_compress_ptr cinfo)
423 {
424 JPEGState* sp = (JPEGState*) cinfo;
425 TIFF* tif = sp->tif;
426
427 tif->tif_rawcp = (tidata_t) sp->dest.next_output_byte;
428 tif->tif_rawcc =
429 tif->tif_rawdatasize - (tsize_t) sp->dest.free_in_buffer;
430 /* NB: libtiff does the final buffer flush */
431 }
432
433 static void
434 TIFFjpeg_data_dest(JPEGState* sp, TIFF* tif)
435 {
436 (void) tif;
437 sp->cinfo.c.dest = &sp->dest;
438 sp->dest.init_destination = std_init_destination;
439 sp->dest.empty_output_buffer = std_empty_output_buffer;
440 sp->dest.term_destination = std_term_destination;
441 }
442
443 /*
444 * Alternate destination manager for outputting to JPEGTables field.
445 */
446
447 static void
448 tables_init_destination(j_compress_ptr cinfo)
449 {
450 JPEGState* sp = (JPEGState*) cinfo;
451
452 /* while building, jpegtables_length is allocated buffer size */
453 sp->dest.next_output_byte = (JOCTET*) sp->jpegtables;
454 sp->dest.free_in_buffer = (size_t) sp->jpegtables_length;
455 }
456
457 static boolean
458 tables_empty_output_buffer(j_compress_ptr cinfo)
459 {
460 JPEGState* sp = (JPEGState*) cinfo;
461 void* newbuf;
462
463 /* the entire buffer has been filled; enlarge it by 1000 bytes */
464 newbuf = _TIFFrealloc((tdata_t) sp->jpegtables,
465 (tsize_t) (sp->jpegtables_length + 1000));
466 if (newbuf == NULL)
467 ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100);
468 sp->dest.next_output_byte = (JOCTET*) newbuf + sp->jpegtables_length;
469 sp->dest.free_in_buffer = (size_t) 1000;
470 sp->jpegtables = newbuf;
471 sp->jpegtables_length += 1000;
472 return (TRUE);
473 }
474
475 static void
476 tables_term_destination(j_compress_ptr cinfo)
477 {
478 JPEGState* sp = (JPEGState*) cinfo;
479
480 /* set tables length to number of bytes actually emitted */
481 sp->jpegtables_length -= sp->dest.free_in_buffer;
482 }
483
484 static int
485 TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif)
486 {
487 (void) tif;
488 /*
489 * Allocate a working buffer for building tables.
490 * Initial size is 1000 bytes, which is usually adequate.
491 */
492 if (sp->jpegtables)
493 _TIFFfree(sp->jpegtables);
494 sp->jpegtables_length = 1000;
495 sp->jpegtables = (void*) _TIFFmalloc((tsize_t) sp->jpegtables_length);
496 if (sp->jpegtables == NULL) {
497 sp->jpegtables_length = 0;
498 TIFFErrorExt(sp->tif->tif_clientdata, "TIFFjpeg_tables_dest", "No space for JPEGTables");
499 return (0);
500 }
501 sp->cinfo.c.dest = &sp->dest;
502 sp->dest.init_destination = tables_init_destination;
503 sp->dest.empty_output_buffer = tables_empty_output_buffer;
504 sp->dest.term_destination = tables_term_destination;
505 return (1);
506 }
507
508 /*
509 * JPEG library source data manager.
510 * These routines supply compressed data to libjpeg.
511 */
512
513 static void
514 std_init_source(j_decompress_ptr cinfo)
515 {
516 JPEGState* sp = (JPEGState*) cinfo;
517 TIFF* tif = sp->tif;
518
519 sp->src.next_input_byte = (const JOCTET*) tif->tif_rawdata;
520 sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
521 }
522
523 static boolean
524 std_fill_input_buffer(j_decompress_ptr cinfo)
525 {
526 JPEGState* sp = (JPEGState* ) cinfo;
527 static const JOCTET dummy_EOI[2] = { 0xFF, JPEG_EOI };
528
529 /*
530 * Should never get here since entire strip/tile is
531 * read into memory before the decompressor is called,
532 * and thus was supplied by init_source.
533 */
534 WARNMS(cinfo, JWRN_JPEG_EOF);
535 /* insert a fake EOI marker */
536 sp->src.next_input_byte = dummy_EOI;
537 sp->src.bytes_in_buffer = 2;
538 return (TRUE);
539 }
540
541 static void
542 std_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
543 {
544 JPEGState* sp = (JPEGState*) cinfo;
545
546 if (num_bytes > 0) {
547 if (num_bytes > (long) sp->src.bytes_in_buffer) {
548 /* oops, buffer overrun */
549 (void) std_fill_input_buffer(cinfo);
550 } else {
551 sp->src.next_input_byte += (size_t) num_bytes;
552 sp->src.bytes_in_buffer -= (size_t) num_bytes;
553 }
554 }
555 }
556
557 static void
558 std_term_source(j_decompress_ptr cinfo)
559 {
560 /* No work necessary here */
561 /* Or must we update tif->tif_rawcp, tif->tif_rawcc ??? */
562 /* (if so, need empty tables_term_source!) */
563 (void) cinfo;
564 }
565
566 static void
567 TIFFjpeg_data_src(JPEGState* sp, TIFF* tif)
568 {
569 (void) tif;
570 sp->cinfo.d.src = &sp->src;
571 sp->src.init_source = std_init_source;
572 sp->src.fill_input_buffer = std_fill_input_buffer;
573 sp->src.skip_input_data = std_skip_input_data;
574 sp->src.resync_to_restart = jpeg_resync_to_restart;
575 sp->src.term_source = std_term_source;
576 sp->src.bytes_in_buffer = 0; /* for safety */
577 sp->src.next_input_byte = NULL;
578 }
579
580 /*
581 * Alternate source manager for reading from JPEGTables.
582 * We can share all the code except for the init routine.
583 */
584
585 static void
586 tables_init_source(j_decompress_ptr cinfo)
587 {
588 JPEGState* sp = (JPEGState*) cinfo;
589
590 sp->src.next_input_byte = (const JOCTET*) sp->jpegtables;
591 sp->src.bytes_in_buffer = (size_t) sp->jpegtables_length;
592 }
593
594 static void
595 TIFFjpeg_tables_src(JPEGState* sp, TIFF* tif)
596 {
597 TIFFjpeg_data_src(sp, tif);
598 sp->src.init_source = tables_init_source;
599 }
600
601 /*
602 * Allocate downsampled-data buffers needed for downsampled I/O.
603 * We use values computed in jpeg_start_compress or jpeg_start_decompress.
604 * We use libjpeg's allocator so that buffers will be released automatically
605 * when done with strip/tile.
606 * This is also a handy place to compute samplesperclump, bytesperline.
607 */
608 static int
609 alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info,
610 int num_components)
611 {
612 JPEGState* sp = JState(tif);
613 int ci;
614 jpeg_component_info* compptr;
615 JSAMPARRAY buf;
616 int samples_per_clump = 0;
617
618 for (ci = 0, compptr = comp_info; ci < num_components;
619 ci++, compptr++) {
620 samples_per_clump += compptr->h_samp_factor *
621 compptr->v_samp_factor;
622 buf = TIFFjpeg_alloc_sarray(sp, JPOOL_IMAGE,
623 compptr->width_in_blocks * DCTSIZE,
624 (JDIMENSION) (compptr->v_samp_factor*DCTSIZE));
625 if (buf == NULL)
626 return (0);
627 sp->ds_buffer[ci] = buf;
628 }
629 sp->samplesperclump = samples_per_clump;
630 return (1);
631 }
632
633
634 /*
635 * JPEG Decoding.
636 */
637
638 static int
639 JPEGSetupDecode(TIFF* tif)
640 {
641 JPEGState* sp = JState(tif);
642 TIFFDirectory *td = &tif->tif_dir;
643
644 JPEGInitializeLibJPEG( tif, 0, 1 );
645
646 assert(sp != NULL);
647 assert(sp->cinfo.comm.is_decompressor);
648
649 /* Read JPEGTables if it is present */
650 if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) {
651 TIFFjpeg_tables_src(sp, tif);
652 if(TIFFjpeg_read_header(sp,FALSE) != JPEG_HEADER_TABLES_ONLY) {
653 TIFFErrorExt(tif->tif_clientdata, "JPEGSetupDecode", "Bogus JPEGTables field");
654 return (0);
655 }
656 }
657
658 /* Grab parameters that are same for all strips/tiles */
659 sp->photometric = td->td_photometric;
660 switch (sp->photometric) {
661 case PHOTOMETRIC_YCBCR:
662 sp->h_sampling = td->td_ycbcrsubsampling[0];
663 sp->v_sampling = td->td_ycbcrsubsampling[1];
664 break;
665 default:
666 /* TIFF 6.0 forbids subsampling of all other color spaces */
667 sp->h_sampling = 1;
668 sp->v_sampling = 1;
669 break;
670 }
671
672 /* Set up for reading normal data */
673 TIFFjpeg_data_src(sp, tif);
674 tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */
675 return (1);
676 }
677
678 /*
679 * Set up for decoding a strip or tile.
680 */
681 static int
682 JPEGPreDecode(TIFF* tif, tsample_t s)
683 {
684 JPEGState *sp = JState(tif);
685 TIFFDirectory *td = &tif->tif_dir;
686 static const char module[] = "JPEGPreDecode";
687 uint32 segment_width, segment_height;
688 int downsampled_output;
689 int ci;
690
691 assert(sp != NULL);
692 assert(sp->cinfo.comm.is_decompressor);
693 /*
694 * Reset decoder state from any previous strip/tile,
695 * in case application didn't read the whole strip.
696 */
697 if (!TIFFjpeg_abort(sp))
698 return (0);
699 /*
700 * Read the header for this strip/tile.
701 */
702 if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK)
703 return (0);
704 /*
705 * Check image parameters and set decompression parameters.
706 */
707 segment_width = td->td_imagewidth;
708 segment_height = td->td_imagelength - tif->tif_row;
709 if (isTiled(tif)) {
710 segment_width = td->td_tilewidth;
711 segment_height = td->td_tilelength;
712 sp->bytesperline = TIFFTileRowSize(tif);
713 } else {
714 if (segment_height > td->td_rowsperstrip)
715 segment_height = td->td_rowsperstrip;
716 sp->bytesperline = TIFFOldScanlineSize(tif);
717 }
718 if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
719 /*
720 * For PC 2, scale down the expected strip/tile size
721 * to match a downsampled component
722 */
723 segment_width = TIFFhowmany(segment_width, sp->h_sampling);
724 segment_height = TIFFhowmany(segment_height, sp->v_sampling);
725 }
726 if (sp->cinfo.d.image_width < segment_width ||
727 sp->cinfo.d.image_height < segment_height) {
728 TIFFWarningExt(tif->tif_clientdata, module,
729 "Improper JPEG strip/tile size, "
730 "expected %dx%d, got %dx%d",
731 segment_width, segment_height,
732 sp->cinfo.d.image_width,
733 sp->cinfo.d.image_height);
734 }
735 if (sp->cinfo.d.image_width > segment_width ||
736 sp->cinfo.d.image_height > segment_height) {
737 /*
738 * This case could be dangerous, if the strip or tile size has
739 * been reported as less than the amount of data jpeg will
740 * return, some potential security issues arise. Catch this
741 * case and error out.
742 */
743 TIFFErrorExt(tif->tif_clientdata, module,
744 "JPEG strip/tile size exceeds expected dimensions,"
745 " expected %dx%d, got %dx%d",
746 segment_width, segment_height,
747 sp->cinfo.d.image_width, sp->cinfo.d.image_height);
748 return (0);
749 }
750 if (sp->cinfo.d.num_components !=
751 (td->td_planarconfig == PLANARCONFIG_CONTIG ?
752 td->td_samplesperpixel : 1)) {
753 TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG component count");
754 return (0);
755 }
756 #ifdef JPEG_LIB_MK1
757 if (12 != td->td_bitspersample && 8 != td->td_bitspersample) {
758 TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision");
759 return (0);
760 }
761 sp->cinfo.d.data_precision = td->td_bitspersample;
762 sp->cinfo.d.bits_in_jsample = td->td_bitspersample;
763 #else
764 if (sp->cinfo.d.data_precision != td->td_bitspersample) {
765 TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG data precision");
766 return (0);
767 }
768 #endif
769 if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
770 /* Component 0 should have expected sampling factors */
771 if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling ||
772 sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) {
773 TIFFWarningExt(tif->tif_clientdata, module,
774 "Improper JPEG sampling factors %d,%d\n"
775 "Apparently should be %d,%d.",
776 sp->cinfo.d.comp_info[0].h_samp_factor,
777 sp->cinfo.d.comp_info[0].v_samp_factor,
778 sp->h_sampling, sp->v_sampling);
779
780 /*
781 * There are potential security issues here
782 * for decoders that have already allocated
783 * buffers based on the expected sampling
784 * factors. Lets check the sampling factors
785 * dont exceed what we were expecting.
786 */
787 if (sp->cinfo.d.comp_info[0].h_samp_factor
788 > sp->h_sampling
789 || sp->cinfo.d.comp_info[0].v_samp_factor
790 > sp->v_sampling) {
791 TIFFErrorExt(tif->tif_clientdata,
792 module,
793 "Cannot honour JPEG sampling factors"
794 " that exceed those specified.");
795 return (0);
796 }
797
798 /*
799 * XXX: Files written by the Intergraph software
800 * has different sampling factors stored in the
801 * TIFF tags and in the JPEG structures. We will
802 * try to deduce Intergraph files by the presense
803 * of the tag 33918.
804 */
805 if (!_TIFFFindFieldInfo(tif, 33918, TIFF_ANY)) {
806 TIFFWarningExt(tif->tif_clientdata, module,
807 "Decompressor will try reading with "
808 "sampling %d,%d.",
809 sp->cinfo.d.comp_info[0].h_samp_factor,
810 sp->cinfo.d.comp_info[0].v_samp_factor);
811
812 sp->h_sampling = (uint16)
813 sp->cinfo.d.comp_info[0].h_samp_factor;
814 sp->v_sampling = (uint16)
815 sp->cinfo.d.comp_info[0].v_samp_factor;
816 }
817 }
818 /* Rest should have sampling factors 1,1 */
819 for (ci = 1; ci < sp->cinfo.d.num_components; ci++) {
820 if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 ||
821 sp->cinfo.d.comp_info[ci].v_samp_factor != 1) {
822 TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors");
823 return (0);
824 }
825 }
826 } else {
827 /* PC 2's single component should have sampling factors 1,1 */
828 if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 ||
829 sp->cinfo.d.comp_info[0].v_samp_factor != 1) {
830 TIFFErrorExt(tif->tif_clientdata, module, "Improper JPEG sampling factors");
831 return (0);
832 }
833 }
834 downsampled_output = FALSE;
835 if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
836 sp->photometric == PHOTOMETRIC_YCBCR &&
837 sp->jpegcolormode == JPEGCOLORMODE_RGB) {
838 /* Convert YCbCr to RGB */
839 sp->cinfo.d.jpeg_color_space = JCS_YCbCr;
840 sp->cinfo.d.out_color_space = JCS_RGB;
841 } else {
842 /* Suppress colorspace handling */
843 sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN;
844 sp->cinfo.d.out_color_space = JCS_UNKNOWN;
845 if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
846 (sp->h_sampling != 1 || sp->v_sampling != 1))
847 downsampled_output = TRUE;
848 /* XXX what about up-sampling? */
849 }
850 if (downsampled_output) {
851 /* Need to use raw-data interface to libjpeg */
852 sp->cinfo.d.raw_data_out = TRUE;
853 tif->tif_decoderow = JPEGDecodeRaw;
854 tif->tif_decodestrip = JPEGDecodeRaw;
855 tif->tif_decodetile = JPEGDecodeRaw;
856 } else {
857 /* Use normal interface to libjpeg */
858 sp->cinfo.d.raw_data_out = FALSE;
859 tif->tif_decoderow = JPEGDecode;
860 tif->tif_decodestrip = JPEGDecode;
861 tif->tif_decodetile = JPEGDecode;
862 }
863 /* Start JPEG decompressor */
864 if (!TIFFjpeg_start_decompress(sp))
865 return (0);
866 /* Allocate downsampled-data buffers if needed */
867 if (downsampled_output) {
868 if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info,
869 sp->cinfo.d.num_components))
870 return (0);
871 sp->scancount = DCTSIZE; /* mark buffer empty */
872 }
873 return (1);
874 }
875
876 /*
877 * Decode a chunk of pixels.
878 * "Standard" case: returned data is not downsampled.
879 */
880 /*ARGSUSED*/ static int
881 JPEGDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
882 {
883 JPEGState *sp = JState(tif);
884 tsize_t nrows;
885 (void) s;
886
887 nrows = cc / sp->bytesperline;
888 if (cc % sp->bytesperline)
889 TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline not read");
890
891 if( nrows > (int) sp->cinfo.d.image_height )
892 nrows = sp->cinfo.d.image_height;
893
894 /* data is expected to be read in multiples of a scanline */
895 if (nrows)
896 {
897 JSAMPROW line_work_buf = NULL;
898
899 /*
900 ** For 6B, only use temporary buffer for 12 bit imagery.
901 ** For Mk1 always use it.
902 */
903 #if !defined(JPEG_LIB_MK1)
904 if( sp->cinfo.d.data_precision == 12 )
905 #endif
906 {
907 line_work_buf = (JSAMPROW)
908 _TIFFmalloc(sizeof(short) * sp->cinfo.d.output_width
909 * sp->cinfo.d.num_components );
910 }
911
912 do {
913 if( line_work_buf != NULL )
914 {
915 /*
916 ** In the MK1 case, we aways read into a 16bit buffer, and then
917 ** pack down to 12bit or 8bit. In 6B case we only read into 16
918 ** bit buffer for 12bit data, which we need to repack.
919 */
920 if (TIFFjpeg_read_scanlines(sp, &line_work_buf, 1) != 1)
921 return (0);
922
923 if( sp->cinfo.d.data_precision == 12 )
924 {
925 int value_pairs = (sp->cinfo.d.output_width
926 * sp->cinfo.d.num_components) / 2;
927 int iPair;
928
929 for( iPair = 0; iPair < value_pairs; iPair++ )
930 {
931 unsigned char *out_ptr =
932 ((unsigned char *) buf) + iPair * 3;
933 JSAMPLE *in_ptr = line_work_buf + iPair * 2;
934
935 out_ptr[0] = (in_ptr[0] & 0xff0) >> 4;
936 out_ptr[1] = ((in_ptr[0] & 0xf) << 4)
937 | ((in_ptr[1] & 0xf00) >> 8);
938 out_ptr[2] = ((in_ptr[1] & 0xff) >> 0);
939 }
940 }
941 else if( sp->cinfo.d.data_precision == 8 )
942 {
943 int value_count = (sp->cinfo.d.output_width
944 * sp->cinfo.d.num_components);
945 int iValue;
946
947 for( iValue = 0; iValue < value_count; iValue++ )
948 {
949 ((unsigned char *) buf)[iValue] =
950 line_work_buf[iValue] & 0xff;
951 }
952 }
953 }
954 else
955 {
956 /*
957 ** In the libjpeg6b 8bit case. We read directly into the
958 ** TIFF buffer.
959 */
960 JSAMPROW bufptr = (JSAMPROW)buf;
961
962 if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1)
963 return (0);
964 }
965
966 ++tif->tif_row;
967 buf += sp->bytesperline;
968 cc -= sp->bytesperline;
969 } while (--nrows > 0);
970
971 if( line_work_buf != NULL )
972 _TIFFfree( line_work_buf );
973 }
974
975 /* Close down the decompressor if we've finished the strip or tile. */
976 return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
977 || TIFFjpeg_finish_decompress(sp);
978 }
979
980 /*
981 * Decode a chunk of pixels.
982 * Returned data is downsampled per sampling factors.
983 */
984 /*ARGSUSED*/ static int
985 JPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
986 {
987 JPEGState *sp = JState(tif);
988 tsize_t nrows;
989 (void) s;
990
991 /* data is expected to be read in multiples of a scanline */
992 if ( (nrows = sp->cinfo.d.image_height) ) {
993 /* Cb,Cr both have sampling factors 1, so this is correct */
994 JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width;
995 int samples_per_clump = sp->samplesperclump;
996
997 #ifdef JPEG_LIB_MK1
998 unsigned short* tmpbuf = _TIFFmalloc(sizeof(unsigned short) *
999 sp->cinfo.d.output_width *
1000 sp->cinfo.d.num_components);
1001 #endif
1002
1003 do {
1004 jpeg_component_info *compptr;
1005 int ci, clumpoffset;
1006
1007 /* Reload downsampled-data buffer if needed */
1008 if (sp->scancount >= DCTSIZE) {
1009 int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE;
1010 if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n) != n)
1011 return (0);
1012 sp->scancount = 0;
1013 }
1014 /*
1015 * Fastest way to unseparate data is to make one pass
1016 * over the scanline for each row of each component.
1017 */
1018 clumpoffset = 0; /* first sample in clump */
1019 for (ci = 0, compptr = sp->cinfo.d.comp_info;
1020 ci < sp->cinfo.d.num_components;
1021 ci++, compptr++) {
1022 int hsamp = compptr->h_samp_factor;
1023 int vsamp = compptr->v_samp_factor;
1024 int ypos;
1025
1026 for (ypos = 0; ypos < vsamp; ypos++) {
1027 JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
1028 #ifdef JPEG_LIB_MK1
1029 JSAMPLE *outptr = (JSAMPLE*)tmpbuf + clumpoffset;
1030 #else
1031 JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset;
1032 #endif
1033 JDIMENSION nclump;
1034
1035 if (hsamp == 1) {
1036 /* fast path for at least Cb and Cr */
1037 for (nclump = clumps_per_line; nclump-- > 0; ) {
1038 outptr[0] = *inptr++;
1039 outptr += samples_per_clump;
1040 }
1041 } else {
1042 int xpos;
1043
1044 /* general case */
1045 for (nclump = clumps_per_line; nclump-- > 0; ) {
1046 for (xpos = 0; xpos < hsamp; xpos++)
1047 outptr[xpos] = *inptr++;
1048 outptr += samples_per_clump;
1049 }
1050 }
1051 clumpoffset += hsamp;
1052 }
1053 }
1054
1055 #ifdef JPEG_LIB_MK1
1056 {
1057 if (sp->cinfo.d.data_precision == 8)
1058 {
1059 int i=0;
1060 int len = sp->cinfo.d.output_width * sp->cinfo.d.num_components;
1061 for (i=0; i<len; i++)
1062 {
1063 ((unsigned char*)buf)[i] = tmpbuf[i] & 0xff;
1064 }
1065 }
1066 else
1067 { // 12-bit
1068 int value_pairs = (sp->cinfo.d.output_width
1069 * sp->cinfo.d.num_components) / 2;
1070 int iPair;
1071 for( iPair = 0; iPair < value_pairs; iPair++ )
1072 {
1073 unsigned char *out_ptr = ((unsigned char *) buf) + iPair * 3;
1074 JSAMPLE *in_ptr = tmpbuf + iPair * 2;
1075 out_ptr[0] = (in_ptr[0] & 0xff0) >> 4;
1076 out_ptr[1] = ((in_ptr[0] & 0xf) << 4)
1077 | ((in_ptr[1] & 0xf00) >> 8);
1078 out_ptr[2] = ((in_ptr[1] & 0xff) >> 0);
1079 }
1080 }
1081 }
1082 #endif
1083
1084 sp->scancount ++;
1085 tif->tif_row += sp->v_sampling;
1086 /* increment/decrement of buf and cc is still incorrect, but should not matter
1087 * TODO: resolve this */
1088 buf += sp->bytesperline;
1089 cc -= sp->bytesperline;
1090 nrows -= sp->v_sampling;
1091 } while (nrows > 0);
1092
1093 #ifdef JPEG_LIB_MK1
1094 _TIFFfree(tmpbuf);
1095 #endif
1096
1097 }
1098
1099 /* Close down the decompressor if done. */
1100 return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
1101 || TIFFjpeg_finish_decompress(sp);
1102 }
1103
1104
1105 /*
1106 * JPEG Encoding.
1107 */
1108
1109 static void
1110 unsuppress_quant_table (JPEGState* sp, int tblno)
1111 {
1112 JQUANT_TBL* qtbl;
1113
1114 if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
1115 qtbl->sent_table = FALSE;
1116 }
1117
1118 static void
1119 unsuppress_huff_table (JPEGState* sp, int tblno)
1120 {
1121 JHUFF_TBL* htbl;
1122
1123 if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
1124 htbl->sent_table = FALSE;
1125 if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
1126 htbl->sent_table = FALSE;
1127 }
1128
1129 static int
1130 prepare_JPEGTables(TIFF* tif)
1131 {
1132 JPEGState* sp = JState(tif);
1133
1134 JPEGInitializeLibJPEG( tif, 0, 0 );
1135
1136 /* Initialize quant tables for current quality setting */
1137 if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
1138 return (0);
1139 /* Mark only the tables we want for output */
1140 /* NB: chrominance tables are currently used only with YCbCr */
1141 if (!TIFFjpeg_suppress_tables(sp, TRUE))
1142 return (0);
1143 if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
1144 unsuppress_quant_table(sp, 0);
1145 if (sp->photometric == PHOTOMETRIC_YCBCR)
1146 unsuppress_quant_table(sp, 1);
1147 }
1148 if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) {
1149 unsuppress_huff_table(sp, 0);
1150 if (sp->photometric == PHOTOMETRIC_YCBCR)
1151 unsuppress_huff_table(sp, 1);
1152 }
1153 /* Direct libjpeg output into jpegtables */
1154 if (!TIFFjpeg_tables_dest(sp, tif))
1155 return (0);
1156 /* Emit tables-only datastream */
1157 if (!TIFFjpeg_write_tables(sp))
1158 return (0);
1159
1160 return (1);
1161 }
1162
1163 static int
1164 JPEGSetupEncode(TIFF* tif)
1165 {
1166 JPEGState* sp = JState(tif);
1167 TIFFDirectory *td = &tif->tif_dir;
1168 static const char module[] = "JPEGSetupEncode";
1169
1170 JPEGInitializeLibJPEG( tif, 1, 0 );
1171
1172 assert(sp != NULL);
1173 assert(!sp->cinfo.comm.is_decompressor);
1174
1175 /*
1176 * Initialize all JPEG parameters to default values.
1177 * Note that jpeg_set_defaults needs legal values for
1178 * in_color_space and input_components.
1179 */
1180 sp->cinfo.c.in_color_space = JCS_UNKNOWN;
1181 sp->cinfo.c.input_components = 1;
1182 if (!TIFFjpeg_set_defaults(sp))
1183 return (0);
1184 /* Set per-file parameters */
1185 sp->photometric = td->td_photometric;
1186 switch (sp->photometric) {
1187 case PHOTOMETRIC_YCBCR:
1188 sp->h_sampling = td->td_ycbcrsubsampling[0];
1189 sp->v_sampling = td->td_ycbcrsubsampling[1];
1190 /*
1191 * A ReferenceBlackWhite field *must* be present since the
1192 * default value is inappropriate for YCbCr. Fill in the
1193 * proper value if application didn't set it.
1194 */
1195 {
1196 float *ref;
1197 if (!TIFFGetField(tif, TIFFTAG_REFERENCEBLACKWHITE,
1198 &ref)) {
1199 float refbw[6];
1200 long top = 1L << td->td_bitspersample;
1201 refbw[0] = 0;
1202 refbw[1] = (float)(top-1L);
1203 refbw[2] = (float)(top>>1);
1204 refbw[3] = refbw[1];
1205 refbw[4] = refbw[2];
1206 refbw[5] = refbw[1];
1207 TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE,
1208 refbw);
1209 }
1210 }
1211 break;
1212 case PHOTOMETRIC_PALETTE: /* disallowed by Tech Note */
1213 case PHOTOMETRIC_MASK:
1214 TIFFErrorExt(tif->tif_clientdata, module,
1215 "PhotometricInterpretation %d not allowed for JPEG",
1216 (int) sp->photometric);
1217 return (0);
1218 default:
1219 /* TIFF 6.0 forbids subsampling of all other color spaces */
1220 sp->h_sampling = 1;
1221 sp->v_sampling = 1;
1222 break;
1223 }
1224
1225 /* Verify miscellaneous parameters */
1226
1227 /*
1228 * This would need work if libtiff ever supports different
1229 * depths for different components, or if libjpeg ever supports
1230 * run-time selection of depth. Neither is imminent.
1231 */
1232 #ifdef JPEG_LIB_MK1
1233 /* BITS_IN_JSAMPLE now permits 8 and 12 --- dgilbert */
1234 if (td->td_bitspersample != 8 && td->td_bitspersample != 12)
1235 #else
1236 if (td->td_bitspersample != BITS_IN_JSAMPLE )
1237 #endif
1238 {
1239 TIFFErrorExt(tif->tif_clientdata, module, "BitsPerSample %d not allowed for JPEG",
1240 (int) td->td_bitspersample);
1241 return (0);
1242 }
1243 sp->cinfo.c.data_precision = td->td_bitspersample;
1244 #ifdef JPEG_LIB_MK1
1245 sp->cinfo.c.bits_in_jsample = td->td_bitspersample;
1246 #endif
1247 if (isTiled(tif)) {
1248 if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0) {
1249 TIFFErrorExt(tif->tif_clientdata, module,
1250 "JPEG tile height must be multiple of %d",
1251 sp->v_sampling * DCTSIZE);
1252 return (0);
1253 }
1254 if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0) {
1255 TIFFErrorExt(tif->tif_clientdata, module,
1256 "JPEG tile width must be multiple of %d",
1257 sp->h_sampling * DCTSIZE);
1258 return (0);
1259 }
1260 } else {
1261 if (td->td_rowsperstrip < td->td_imagelength &&
1262 (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0) {
1263 TIFFErrorExt(tif->tif_clientdata, module,
1264 "RowsPerStrip must be multiple of %d for JPEG",
1265 sp->v_sampling * DCTSIZE);
1266 return (0);
1267 }
1268 }
1269
1270 /* Create a JPEGTables field if appropriate */
1271 if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) {
1272 if( sp->jpegtables == NULL
1273 || memcmp(sp->jpegtables,"\0\0\0\0\0\0\0\0\0",8) == 0 )
1274 {
1275 if (!prepare_JPEGTables(tif))
1276 return (0);
1277 /* Mark the field present */
1278 /* Can't use TIFFSetField since BEENWRITING is already set! */
1279 tif->tif_flags |= TIFF_DIRTYDIRECT;
1280 TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
1281 }
1282 } else {
1283 /* We do not support application-supplied JPEGTables, */
1284 /* so mark the field not present */
1285 TIFFClrFieldBit(tif, FIELD_JPEGTABLES);
1286 }
1287
1288 /* Direct libjpeg output to libtiff's output buffer */
1289 TIFFjpeg_data_dest(sp, tif);
1290
1291 return (1);
1292 }
1293
1294 /*
1295 * Set encoding state at the start of a strip or tile.
1296 */
1297 static int
1298 JPEGPreEncode(TIFF* tif, tsample_t s)
1299 {
1300 JPEGState *sp = JState(tif);
1301 TIFFDirectory *td = &tif->tif_dir;
1302 static const char module[] = "JPEGPreEncode";
1303 uint32 segment_width, segment_height;
1304 int downsampled_input;
1305
1306 assert(sp != NULL);
1307 assert(!sp->cinfo.comm.is_decompressor);
1308 /*
1309 * Set encoding parameters for this strip/tile.
1310 */
1311 if (isTiled(tif)) {
1312 segment_width = td->td_tilewidth;
1313 segment_height = td->td_tilelength;
1314 sp->bytesperline = TIFFTileRowSize(tif);
1315 } else {
1316 segment_width = td->td_imagewidth;
1317 segment_height = td->td_imagelength - tif->tif_row;
1318 if (segment_height > td->td_rowsperstrip)
1319 segment_height = td->td_rowsperstrip;
1320 sp->bytesperline = TIFFOldScanlineSize(tif);
1321 }
1322 if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
1323 /* for PC 2, scale down the strip/tile size
1324 * to match a downsampled component
1325 */
1326 segment_width = TIFFhowmany(segment_width, sp->h_sampling);
1327 segment_height = TIFFhowmany(segment_height, sp->v_sampling);
1328 }
1329 if (segment_width > 65535 || segment_height > 65535) {
1330 TIFFErrorExt(tif->tif_clientdata, module, "Strip/tile too large for JPEG");
1331 return (0);
1332 }
1333 sp->cinfo.c.image_width = segment_width;
1334 sp->cinfo.c.image_height = segment_height;
1335 downsampled_input = FALSE;
1336 if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
1337 sp->cinfo.c.input_components = td->td_samplesperpixel;
1338 if (sp->photometric == PHOTOMETRIC_YCBCR) {
1339 if (sp->jpegcolormode == JPEGCOLORMODE_RGB) {
1340 sp->cinfo.c.in_color_space = JCS_RGB;
1341 } else {
1342 sp->cinfo.c.in_color_space = JCS_YCbCr;
1343 if (sp->h_sampling != 1 || sp->v_sampling != 1)
1344 downsampled_input = TRUE;
1345 }
1346 if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr))
1347 return (0);
1348 /*
1349 * Set Y sampling factors;
1350 * we assume jpeg_set_colorspace() set the rest to 1
1351 */
1352 sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling;
1353 sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling;
1354 } else {
1355 sp->cinfo.c.in_color_space = JCS_UNKNOWN;
1356 if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
1357 return (0);
1358 /* jpeg_set_colorspace set all sampling factors to 1 */
1359 }
1360 } else {
1361 sp->cinfo.c.input_components = 1;
1362 sp->cinfo.c.in_color_space = JCS_UNKNOWN;
1363 if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
1364 return (0);
1365 sp->cinfo.c.comp_info[0].component_id = s;
1366 /* jpeg_set_colorspace() set sampling factors to 1 */
1367 if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) {
1368 sp->cinfo.c.comp_info[0].quant_tbl_no = 1;
1369 sp->cinfo.c.comp_info[0].dc_tbl_no = 1;
1370 sp->cinfo.c.comp_info[0].ac_tbl_no = 1;
1371 }
1372 }
1373 /* ensure libjpeg won't write any extraneous markers */
1374 sp->cinfo.c.write_JFIF_header = FALSE;
1375 sp->cinfo.c.write_Adobe_marker = FALSE;
1376 /* set up table handling correctly */
1377 if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
1378 return (0);
1379 if (! (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) {
1380 unsuppress_quant_table(sp, 0);
1381 unsuppress_quant_table(sp, 1);
1382 }
1383 if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF)
1384 sp->cinfo.c.optimize_coding = FALSE;
1385 else
1386 sp->cinfo.c.optimize_coding = TRUE;
1387 if (downsampled_input) {
1388 /* Need to use raw-data interface to libjpeg */
1389 sp->cinfo.c.raw_data_in = TRUE;
1390 tif->tif_encoderow = JPEGEncodeRaw;
1391 tif->tif_encodestrip = JPEGEncodeRaw;
1392 tif->tif_encodetile = JPEGEncodeRaw;
1393 } else {
1394 /* Use normal interface to libjpeg */
1395 sp->cinfo.c.raw_data_in = FALSE;
1396 tif->tif_encoderow = JPEGEncode;
1397 tif->tif_encodestrip = JPEGEncode;
1398 tif->tif_encodetile = JPEGEncode;
1399 }
1400 /* Start JPEG compressor */
1401 if (!TIFFjpeg_start_compress(sp, FALSE))
1402 return (0);
1403 /* Allocate downsampled-data buffers if needed */
1404 if (downsampled_input) {
1405 if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info,
1406 sp->cinfo.c.num_components))
1407 return (0);
1408 }
1409 sp->scancount = 0;
1410
1411 return (1);
1412 }
1413
1414 /*
1415 * Encode a chunk of pixels.
1416 * "Standard" case: incoming data is not downsampled.
1417 */
1418 static int
1419 JPEGEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
1420 {
1421 JPEGState *sp = JState(tif);
1422 tsize_t nrows;
1423 JSAMPROW bufptr[1];
1424
1425 (void) s;
1426 assert(sp != NULL);
1427 /* data is expected to be supplied in multiples of a scanline */
1428 nrows = cc / sp->bytesperline;
1429 if (cc % sp->bytesperline)
1430 TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded");
1431
1432 /* The last strip will be limited to image size */
1433 if( !isTiled(tif) && tif->tif_row+nrows > tif->tif_dir.td_imagelength )
1434 nrows = tif->tif_dir.td_imagelength - tif->tif_row;
1435
1436 while (nrows-- > 0) {
1437 bufptr[0] = (JSAMPROW) buf;
1438 if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1)
1439 return (0);
1440 if (nrows > 0)
1441 tif->tif_row++;
1442 buf += sp->bytesperline;
1443 }
1444 return (1);
1445 }
1446
1447 /*
1448 * Encode a chunk of pixels.
1449 * Incoming data is expected to be downsampled per sampling factors.
1450 */
1451 static int
1452 JPEGEncodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
1453 {
1454 JPEGState *sp = JState(tif);
1455 JSAMPLE* inptr;
1456 JSAMPLE* outptr;
1457 tsize_t nrows;
1458 JDIMENSION clumps_per_line, nclump;
1459 int clumpoffset, ci, xpos, ypos;
1460 jpeg_component_info* compptr;
1461 int samples_per_clump = sp->samplesperclump;
1462 tsize_t bytesperclumpline;
1463
1464 (void) s;
1465 assert(sp != NULL);
1466 /* data is expected to be supplied in multiples of a clumpline */
1467 /* a clumpline is equivalent to v_sampling desubsampled scanlines */
1468 /* TODO: the following calculation of bytesperclumpline, should substitute calculation of sp->bytesperline, except that it is per v_sampling lines */
1469 bytesperclumpline = (((sp->cinfo.c.image_width+sp->h_sampling-1)/sp->h_sampling)
1470 *(sp->h_sampling*sp->v_sampling+2)*sp->cinfo.c.data_precision+7)
1471 /8;
1472
1473 nrows = ( cc / bytesperclumpline ) * sp->v_sampling;
1474 if (cc % bytesperclumpline)
1475 TIFFWarningExt(tif->tif_clientdata, tif->tif_name, "fractional scanline discarded");
1476
1477 /* Cb,Cr both have sampling factors 1, so this is correct */
1478 clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
1479
1480 while (nrows > 0) {
1481 /*
1482 * Fastest way to separate the data is to make one pass
1483 * over the scanline for each row of each component.
1484 */
1485 clumpoffset = 0; /* first sample in clump */
1486 for (ci = 0, compptr = sp->cinfo.c.comp_info;
1487 ci < sp->cinfo.c.num_components;
1488 ci++, compptr++) {
1489 int hsamp = compptr->h_samp_factor;
1490 int vsamp = compptr->v_samp_factor;
1491 int padding = (int) (compptr->width_in_blocks * DCTSIZE -
1492 clumps_per_line * hsamp);
1493 for (ypos = 0; ypos < vsamp; ypos++) {
1494 inptr = ((JSAMPLE*) buf) + clumpoffset;
1495 outptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
1496 if (hsamp == 1) {
1497 /* fast path for at least Cb and Cr */
1498 for (nclump = clumps_per_line; nclump-- > 0; ) {
1499 *outptr++ = inptr[0];
1500 inptr += samples_per_clump;
1501 }
1502 } else {
1503 /* general case */
1504 for (nclump = clumps_per_line; nclump-- > 0; ) {
1505 for (xpos = 0; xpos < hsamp; xpos++)
1506 *outptr++ = inptr[xpos];
1507 inptr += samples_per_clump;
1508 }
1509 }
1510 /* pad each scanline as needed */
1511 for (xpos = 0; xpos < padding; xpos++) {
1512 *outptr = outptr[-1];
1513 outptr++;
1514 }
1515 clumpoffset += hsamp;
1516 }
1517 }
1518 sp->scancount++;
1519 if (sp->scancount >= DCTSIZE) {
1520 int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
1521 if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
1522 return (0);
1523 sp->scancount = 0;
1524 }
1525 tif->tif_row += sp->v_sampling;
1526 buf += sp->bytesperline;
1527 nrows -= sp->v_sampling;
1528 }
1529 return (1);
1530 }
1531
1532 /*
1533 * Finish up at the end of a strip or tile.
1534 */
1535 static int
1536 JPEGPostEncode(TIFF* tif)
1537 {
1538 JPEGState *sp = JState(tif);
1539
1540 if (sp->scancount > 0) {
1541 /*
1542 * Need to emit a partial bufferload of downsampled data.
1543 * Pad the data vertically.
1544 */
1545 int ci, ypos, n;
1546 jpeg_component_info* compptr;
1547
1548 for (ci = 0, compptr = sp->cinfo.c.comp_info;
1549 ci < sp->cinfo.c.num_components;
1550 ci++, compptr++) {
1551 int vsamp = compptr->v_samp_factor;
1552 tsize_t row_width = compptr->width_in_blocks * DCTSIZE
1553 * sizeof(JSAMPLE);
1554 for (ypos = sp->scancount * vsamp;
1555 ypos < DCTSIZE * vsamp; ypos++) {
1556 _TIFFmemcpy((tdata_t)sp->ds_buffer[ci][ypos],
1557 (tdata_t)sp->ds_buffer[ci][ypos-1],
1558 row_width);
1559
1560 }
1561 }
1562 n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
1563 if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
1564 return (0);
1565 }
1566
1567 return (TIFFjpeg_finish_compress(JState(tif)));
1568 }
1569
1570 static void
1571 JPEGCleanup(TIFF* tif)
1572 {
1573 JPEGState *sp = JState(tif);
1574
1575 assert(sp != 0);
1576
1577 tif->tif_tagmethods.vgetfield = sp->vgetparent;
1578 tif->tif_tagmethods.vsetfield = sp->vsetparent;
1579 tif->tif_tagmethods.printdir = sp->printdir;
1580
1581 if( sp->cinfo_initialized )
1582 TIFFjpeg_destroy(sp); /* release libjpeg resources */
1583 if (sp->jpegtables) /* tag value */
1584 _TIFFfree(sp->jpegtables);
1585 _TIFFfree(tif->tif_data); /* release local state */
1586 tif->tif_data = NULL;
1587
1588 _TIFFSetDefaultCompressionState(tif);
1589 }
1590
1591 static void
1592 JPEGResetUpsampled( TIFF* tif )
1593 {
1594 JPEGState* sp = JState(tif);
1595 TIFFDirectory* td = &tif->tif_dir;
1596
1597 /*
1598 * Mark whether returned data is up-sampled or not so TIFFStripSize
1599 * and TIFFTileSize return values that reflect the true amount of
1600 * data.
1601 */
1602 tif->tif_flags &= ~TIFF_UPSAMPLED;
1603 if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
1604 if (td->td_photometric == PHOTOMETRIC_YCBCR &&
1605 sp->jpegcolormode == JPEGCOLORMODE_RGB) {
1606 tif->tif_flags |= TIFF_UPSAMPLED;
1607 } else {
1608 #ifdef notdef
1609 if (td->td_ycbcrsubsampling[0] != 1 ||
1610 td->td_ycbcrsubsampling[1] != 1)
1611 ; /* XXX what about up-sampling? */
1612 #endif
1613 }
1614 }
1615
1616 /*
1617 * Must recalculate cached tile size in case sampling state changed.
1618 * Should we really be doing this now if image size isn't set?
1619 */
1620 if( tif->tif_tilesize > 0 )
1621 tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tsize_t) -1;
1622
1623 if(tif->tif_scanlinesize > 0 )
1624 tif->tif_scanlinesize = TIFFScanlineSize(tif);
1625 }
1626
1627 static int
1628 JPEGVSetField(TIFF* tif, ttag_t tag, va_list ap)
1629 {
1630 JPEGState* sp = JState(tif);
1631 const TIFFFieldInfo* fip;
1632 uint32 v32;
1633
1634 assert(sp != NULL);
1635
1636 switch (tag) {
1637 case TIFFTAG_JPEGTABLES:
1638 v32 = va_arg(ap, uint32);
1639 if (v32 == 0) {
1640 /* XXX */
1641 return (0);
1642 }
1643 _TIFFsetByteArray(&sp->jpegtables, va_arg(ap, void*),
1644 (long) v32);
1645 sp->jpegtables_length = v32;
1646 TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
1647 break;
1648 case TIFFTAG_JPEGQUALITY:
1649 sp->jpegquality = va_arg(ap, int);
1650 return (1); /* pseudo tag */
1651 case TIFFTAG_JPEGCOLORMODE:
1652 sp->jpegcolormode = va_arg(ap, int);
1653 JPEGResetUpsampled( tif );
1654 return (1); /* pseudo tag */
1655 case TIFFTAG_PHOTOMETRIC:
1656 {
1657 int ret_value = (*sp->vsetparent)(tif, tag, ap);
1658 JPEGResetUpsampled( tif );
1659 return ret_value;
1660 }
1661 case TIFFTAG_JPEGTABLESMODE:
1662 sp->jpegtablesmode = va_arg(ap, int);
1663 return (1); /* pseudo tag */
1664 case TIFFTAG_YCBCRSUBSAMPLING:
1665 /* mark the fact that we have a real ycbcrsubsampling! */
1666 sp->ycbcrsampling_fetched = 1;
1667 /* should we be recomputing upsampling info here? */
1668 return (*sp->vsetparent)(tif, tag, ap);
1669 case TIFFTAG_FAXRECVPARAMS:
1670 sp->recvparams = va_arg(ap, uint32);
1671 break;
1672 case TIFFTAG_FAXSUBADDRESS:
1673 _TIFFsetString(&sp->subaddress, va_arg(ap, char*));
1674 break;
1675 case TIFFTAG_FAXRECVTIME:
1676 sp->recvtime = va_arg(ap, uint32);
1677 break;
1678 case TIFFTAG_FAXDCS:
1679 _TIFFsetString(&sp->faxdcs, va_arg(ap, char*));
1680 break;
1681 default:
1682 return (*sp->vsetparent)(tif, tag, ap);
1683 }
1684
1685 if ((fip = _TIFFFieldWithTag(tif, tag))) {
1686 TIFFSetFieldBit(tif, fip->field_bit);
1687 } else {
1688 return (0);
1689 }
1690
1691 tif->tif_flags |= TIFF_DIRTYDIRECT;
1692 return (1);
1693 }
1694
1695 /*
1696 * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in
1697 * the TIFF tags, but still use non-default (2,2) values within the jpeg
1698 * data stream itself. In order for TIFF applications to work properly
1699 * - for instance to get the strip buffer size right - it is imperative
1700 * that the subsampling be available before we start reading the image
1701 * data normally. This function will attempt to load the first strip in
1702 * order to get the sampling values from the jpeg data stream. Various
1703 * hacks are various places are done to ensure this function gets called
1704 * before the td_ycbcrsubsampling values are used from the directory structure,
1705 * including calling TIFFGetField() for the YCBCRSUBSAMPLING field from
1706 * TIFFStripSize(), and the printing code in tif_print.c.
1707 *
1708 * Note that JPEGPreDeocode() will produce a fairly loud warning when the
1709 * discovered sampling does not match the default sampling (2,2) or whatever
1710 * was actually in the tiff tags.
1711 *
1712 * Problems:
1713 * o This code will cause one whole strip/tile of compressed data to be
1714 * loaded just to get the tags right, even if the imagery is never read.
1715 * It would be more efficient to just load a bit of the header, and
1716 * initialize things from that.
1717 *
1718 * See the bug in bugzilla for details:
1719 *
1720 * http://bugzilla.remotesensing.org/show_bug.cgi?id=168
1721 *
1722 * Frank Warmerdam, July 2002
1723 */
1724
1725 static void
1726 JPEGFixupTestSubsampling( TIFF * tif )
1727 {
1728 #ifdef CHECK_JPEG_YCBCR_SUBSAMPLING
1729 JPEGState *sp = JState(tif);
1730 TIFFDirectory *td = &tif->tif_dir;
1731
1732 JPEGInitializeLibJPEG( tif, 0, 0 );
1733
1734 /*
1735 * Some JPEG-in-TIFF files don't provide the ycbcrsampling tags,
1736 * and use a sampling schema other than the default 2,2. To handle
1737 * this we actually have to scan the header of a strip or tile of
1738 * jpeg data to get the sampling.
1739 */
1740 if( !sp->cinfo.comm.is_decompressor
1741 || sp->ycbcrsampling_fetched
1742 || td->td_photometric != PHOTOMETRIC_YCBCR )
1743 return;
1744
1745 sp->ycbcrsampling_fetched = 1;
1746 if( TIFFIsTiled( tif ) )
1747 {
1748 if( !TIFFFillTile( tif, 0 ) )
1749 return;
1750 }
1751 else
1752 {
1753 if( !TIFFFillStrip( tif, 0 ) )
1754 return;
1755 }
1756
1757 TIFFSetField( tif, TIFFTAG_YCBCRSUBSAMPLING,
1758 (uint16) sp->h_sampling, (uint16) sp->v_sampling );
1759
1760 /*
1761 ** We want to clear the loaded strip so the application has time
1762 ** to set JPEGCOLORMODE or other behavior modifiers. This essentially
1763 ** undoes the JPEGPreDecode triggers by TIFFFileStrip(). (#1936)
1764 */
1765 tif->tif_curstrip = -1;
1766
1767 #endif /* CHECK_JPEG_YCBCR_SUBSAMPLING */
1768 }
1769
1770 static int
1771 JPEGVGetField(TIFF* tif, ttag_t tag, va_list ap)
1772 {
1773 JPEGState* sp = JState(tif);
1774
1775 assert(sp != NULL);
1776
1777 switch (tag) {
1778 case TIFFTAG_JPEGTABLES:
1779 *va_arg(ap, uint32*) = sp->jpegtables_length;
1780 *va_arg(ap, void**) = sp->jpegtables;
1781 break;
1782 case TIFFTAG_JPEGQUALITY:
1783 *va_arg(ap, int*) = sp->jpegquality;
1784 break;
1785 case TIFFTAG_JPEGCOLORMODE:
1786 *va_arg(ap, int*) = sp->jpegcolormode;
1787 break;
1788 case TIFFTAG_JPEGTABLESMODE:
1789 *va_arg(ap, int*) = sp->jpegtablesmode;
1790 break;
1791 case TIFFTAG_YCBCRSUBSAMPLING:
1792 JPEGFixupTestSubsampling( tif );
1793 return (*sp->vgetparent)(tif, tag, ap);
1794 case TIFFTAG_FAXRECVPARAMS:
1795 *va_arg(ap, uint32*) = sp->recvparams;
1796 break;
1797 case TIFFTAG_FAXSUBADDRESS:
1798 *va_arg(ap, char**) = sp->subaddress;
1799 break;
1800 case TIFFTAG_FAXRECVTIME:
1801 *va_arg(ap, uint32*) = sp->recvtime;
1802 break;
1803 case TIFFTAG_FAXDCS:
1804 *va_arg(ap, char**) = sp->faxdcs;
1805 break;
1806 default:
1807 return (*sp->vgetparent)(tif, tag, ap);
1808 }
1809 return (1);
1810 }
1811
1812 static void
1813 JPEGPrintDir(TIFF* tif, FILE* fd, long flags)
1814 {
1815 JPEGState* sp = JState(tif);
1816
1817 assert(sp != NULL);
1818
1819 (void) flags;
1820 if (TIFFFieldSet(tif,FIELD_JPEGTABLES))
1821 fprintf(fd, " JPEG Tables: (%lu bytes)\n",
1822 (unsigned long) sp->jpegtables_length);
1823 if (TIFFFieldSet(tif,FIELD_RECVPARAMS))
1824 fprintf(fd, " Fax Receive Parameters: %08lx\n",
1825 (unsigned long) sp->recvparams);
1826 if (TIFFFieldSet(tif,FIELD_SUBADDRESS))
1827 fprintf(fd, " Fax SubAddress: %s\n", sp->subaddress);
1828 if (TIFFFieldSet(tif,FIELD_RECVTIME))
1829 fprintf(fd, " Fax Receive Time: %lu secs\n",
1830 (unsigned long) sp->recvtime);
1831 if (TIFFFieldSet(tif,FIELD_FAXDCS))
1832 fprintf(fd, " Fax DCS: %s\n", sp->faxdcs);
1833 }
1834
1835 static uint32
1836 JPEGDefaultStripSize(TIFF* tif, uint32 s)
1837 {
1838 JPEGState* sp = JState(tif);
1839 TIFFDirectory *td = &tif->tif_dir;
1840
1841 s = (*sp->defsparent)(tif, s);
1842 if (s < td->td_imagelength)
1843 s = TIFFroundup(s, td->td_ycbcrsubsampling[1] * DCTSIZE);
1844 return (s);
1845 }
1846
1847 static void
1848 JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
1849 {
1850 JPEGState* sp = JState(tif);
1851 TIFFDirectory *td = &tif->tif_dir;
1852
1853 (*sp->deftparent)(tif, tw, th);
1854 *tw = TIFFroundup(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE);
1855 *th = TIFFroundup(*th, td->td_ycbcrsubsampling[1] * DCTSIZE);
1856 }
1857
1858 /*
1859 * The JPEG library initialized used to be done in TIFFInitJPEG(), but
1860 * now that we allow a TIFF file to be opened in update mode it is necessary
1861 * to have some way of deciding whether compression or decompression is
1862 * desired other than looking at tif->tif_mode. We accomplish this by
1863 * examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry.
1864 * If so, we assume decompression is desired.
1865 *
1866 * This is tricky, because TIFFInitJPEG() is called while the directory is
1867 * being read, and generally speaking the BYTECOUNTS tag won't have been read
1868 * at that point. So we try to defer jpeg library initialization till we
1869 * do have that tag ... basically any access that might require the compressor
1870 * or decompressor that occurs after the reading of the directory.
1871 *
1872 * In an ideal world compressors or decompressors would be setup
1873 * at the point where a single tile or strip was accessed (for read or write)
1874 * so that stuff like update of missing tiles, or replacement of tiles could
1875 * be done. However, we aren't trying to crack that nut just yet ...
1876 *
1877 * NFW, Feb 3rd, 2003.
1878 */
1879
1880 static int JPEGInitializeLibJPEG( TIFF * tif, int force_encode, int force_decode )
1881 {
1882 JPEGState* sp = JState(tif);
1883 uint32 *byte_counts = NULL;
1884 int data_is_empty = TRUE;
1885 int decompress;
1886
1887
1888 if(sp->cinfo_initialized)
1889 {
1890 if( force_encode && sp->cinfo.comm.is_decompressor )
1891 TIFFjpeg_destroy( sp );
1892 else if( force_decode && !sp->cinfo.comm.is_decompressor )
1893 TIFFjpeg_destroy( sp );
1894 else
1895 return 1;
1896
1897 sp->cinfo_initialized = 0;
1898 }
1899
1900 /*
1901 * Do we have tile data already? Make sure we initialize the
1902 * the state in decompressor mode if we have tile data, even if we
1903 * are not in read-only file access mode.
1904 */
1905 if( TIFFIsTiled( tif )
1906 && TIFFGetField( tif, TIFFTAG_TILEBYTECOUNTS, &byte_counts )
1907 && byte_counts != NULL )
1908 {
1909 data_is_empty = byte_counts[0] == 0;
1910 }
1911 if( !TIFFIsTiled( tif )
1912 && TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &byte_counts)
1913 && byte_counts != NULL )
1914 {
1915 data_is_empty = byte_counts[0] == 0;
1916 }
1917
1918 if( force_decode )
1919 decompress = 1;
1920 else if( force_encode )
1921 decompress = 0;
1922 else if( tif->tif_mode == O_RDONLY )
1923 decompress = 1;
1924 else if( data_is_empty )
1925 decompress = 0;
1926 else
1927 decompress = 1;
1928
1929 /*
1930 * Initialize libjpeg.
1931 */
1932 if ( decompress ) {
1933 if (!TIFFjpeg_create_decompress(sp))
1934 return (0);
1935
1936 } else {
1937 if (!TIFFjpeg_create_compress(sp))
1938 return (0);
1939 }
1940
1941 sp->cinfo_initialized = TRUE;
1942
1943 return 1;
1944 }
1945
1946 int
1947 TIFFInitJPEG(TIFF* tif, int scheme)
1948 {
1949 JPEGState* sp;
1950
1951 assert(scheme == COMPRESSION_JPEG);
1952
1953 /*
1954 * Merge codec-specific tag information.
1955 */
1956 if (!_TIFFMergeFieldInfo(tif, jpegFieldInfo, N(jpegFieldInfo))) {
1957 TIFFErrorExt(tif->tif_clientdata,
1958 "TIFFInitJPEG",
1959 "Merging JPEG codec-specific tags failed");
1960 return 0;
1961 }
1962
1963 /*
1964 * Allocate state block so tag methods have storage to record values.
1965 */
1966 tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (JPEGState));
1967
1968 if (tif->tif_data == NULL) {
1969 TIFFErrorExt(tif->tif_clientdata,
1970 "TIFFInitJPEG", "No space for JPEG state block");
1971 return 0;
1972 }
1973 _TIFFmemset(tif->tif_data, 0, sizeof(JPEGState));
1974
1975 sp = JState(tif);
1976 sp->tif = tif; /* back link */
1977
1978 /*
1979 * Override parent get/set field methods.
1980 */
1981 sp->vgetparent = tif->tif_tagmethods.vgetfield;
1982 tif->tif_tagmethods.vgetfield = JPEGVGetField; /* hook for codec tags */
1983 sp->vsetparent = tif->tif_tagmethods.vsetfield;
1984 tif->tif_tagmethods.vsetfield = JPEGVSetField; /* hook for codec tags */
1985 sp->printdir = tif->tif_tagmethods.printdir;
1986 tif->tif_tagmethods.printdir = JPEGPrintDir; /* hook for codec tags */
1987
1988 /* Default values for codec-specific fields */
1989 sp->jpegtables = NULL;
1990 sp->jpegtables_length = 0;
1991 sp->jpegquality = 75; /* Default IJG quality */
1992 sp->jpegcolormode = JPEGCOLORMODE_RAW;
1993 sp->jpegtablesmode = JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF;
1994
1995 sp->recvparams = 0;
1996 sp->subaddress = NULL;
1997 sp->faxdcs = NULL;
1998
1999 sp->ycbcrsampling_fetched = 0;
2000
2001 /*
2002 * Install codec methods.
2003 */
2004 tif->tif_setupdecode = JPEGSetupDecode;
2005 tif->tif_predecode = JPEGPreDecode;
2006 tif->tif_decoderow = JPEGDecode;
2007 tif->tif_decodestrip = JPEGDecode;
2008 tif->tif_decodetile = JPEGDecode;
2009 tif->tif_setupencode = JPEGSetupEncode;
2010 tif->tif_preencode = JPEGPreEncode;
2011 tif->tif_postencode = JPEGPostEncode;
2012 tif->tif_encoderow = JPEGEncode;
2013 tif->tif_encodestrip = JPEGEncode;
2014 tif->tif_encodetile = JPEGEncode;
2015 tif->tif_cleanup = JPEGCleanup;
2016 sp->defsparent = tif->tif_defstripsize;
2017 tif->tif_defstripsize = JPEGDefaultStripSize;
2018 sp->deftparent = tif->tif_deftilesize;
2019 tif->tif_deftilesize = JPEGDefaultTileSize;
2020 tif->tif_flags |= TIFF_NOBITREV; /* no bit reversal, please */
2021
2022 sp->cinfo_initialized = FALSE;
2023
2024 /*
2025 ** Create a JPEGTables field if no directory has yet been created.
2026 ** We do this just to ensure that sufficient space is reserved for
2027 ** the JPEGTables field. It will be properly created the right
2028 ** size later.
2029 */
2030 if( tif->tif_diroff == 0 )
2031 {
2032 #define SIZE_OF_JPEGTABLES 2000
2033 /*
2034 The following line assumes incorrectly that all JPEG-in-TIFF files will have
2035 a JPEGTABLES tag generated and causes null-filled JPEGTABLES tags to be written
2036 when the JPEG data is placed with TIFFWriteRawStrip. The field bit should be
2037 set, anyway, later when actual JPEGTABLES header is generated, so removing it
2038 here hopefully is harmless.
2039 TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
2040 */
2041 sp->jpegtables_length = SIZE_OF_JPEGTABLES;
2042 sp->jpegtables = (void *) _TIFFmalloc(sp->jpegtables_length);
2043 _TIFFmemset(sp->jpegtables, 0, SIZE_OF_JPEGTABLES);
2044 #undef SIZE_OF_JPEGTABLES
2045 }
2046
2047 /*
2048 * Mark the TIFFTAG_YCBCRSAMPLES as present even if it is not
2049 * see: JPEGFixupTestSubsampling().
2050 */
2051 TIFFSetFieldBit( tif, FIELD_YCBCRSUBSAMPLING );
2052
2053 return 1;
2054 }
2055 #endif /* JPEG_SUPPORT */
2056
2057 /* vim: set ts=8 sts=8 sw=8 noet: */
2058
2059 /*
2060 * Local Variables:
2061 * mode: c
2062 * c-basic-offset: 8
2063 * fill-column: 78
2064 * End:
2065 */
TRUE
#define TRUE
Definition: twiddle.c:33
tsize_t
int32 tsize_t
Definition: tiffio.h:67
FIELD_FAXDCS
#define FIELD_FAXDCS
Definition: tif_fax3.c:1120
tsample_t
uint16 tsample_t
Definition: tiffio.h:63
ttag_t
uint32 ttag_t
Definition: tiffio.h:61
tiff::tif_decoderow
TIFFCodeMethod tif_decoderow
Definition: tiffiop.h:159
JPEGTABLESMODE_HUFF
#define JPEGTABLESMODE_HUFF
Definition: tiff.h:539
tiff::tif_tagmethods
TIFFTagMethods tif_tagmethods
Definition: tiffiop.h:197
tdata_t
void * tdata_t
Definition: tiffio.h:68
TIFFTAG_JPEGTABLES
#define TIFFTAG_JPEGTABLES
Definition: tiff.h:328
_TIFFsetString
void _TIFFsetString(char **cpp, char *cp)
Definition: tif_dir.c:58
BITS_IN_JSAMPLE
#define BITS_IN_JSAMPLE
Definition: jmorecfg.h:23
jpeg_read_header
jpeg_read_header(j_decompress_ptr cinfo, boolean require_image)
Definition: jdapimin.c:241
TIFF_UNDEFINED
Definition: tiff.h:145
TIFFTAG_JPEGTABLESMODE
#define TIFFTAG_JPEGTABLESMODE
Definition: tiff.h:537
jpeg_component_info::v_samp_factor
int v_samp_factor
Definition: jpeglib.h:123
TIFFTileRowSize
tsize_t TIFFTileRowSize(TIFF *tif)
Definition: tif_tile.c:174
TIFFDirectory::td_imagewidth
uint32 td_imagewidth
Definition: tif_dir.h:41
jpeg_decompress_struct::num_components
int num_components
Definition: jpeglib.h:422
jpeg_write_raw_data
jpeg_write_raw_data(j_compress_ptr cinfo, JSAMPIMAGE data, JDIMENSION num_lines)
Definition: jcapistd.c:120
TIFFInitJPEG
#define TIFFInitJPEG
Definition: tif_codec.c:49
suppress
boolean suppress
Definition: jpeglib.h:931
JSAMPLE
char JSAMPLE
Definition: jmorecfg.h:64
PHOTOMETRIC_YCBCR
#define PHOTOMETRIC_YCBCR
Definition: tiff.h:206
tiff::tif_predecode
TIFFPreMethod tif_predecode
Definition: tiffiop.h:154
TIFFClrFieldBit
#define TIFFClrFieldBit(tif, field)
Definition: tif_dir.h:174
jpeg_finish_compress
jpeg_finish_compress(j_compress_ptr cinfo)
Definition: jcapimin.c:147
TIFFWarningExt
void TIFFWarningExt(thandle_t fd, const char *module, const char *fmt,...)
Definition: tif_warning.c:63
JSAMPROW
JSAMPLE FAR * JSAMPROW
Definition: jpeglib.h:66
TIFF_ANY
#define TIFF_ANY
Definition: tiffio.h:296
tiff::tif_curstrip
tstrip_t tif_curstrip
Definition: tiffiop.h:141
TIFFDirectory::td_bitspersample
uint16 td_bitspersample
Definition: tif_dir.h:44
TIFFTAG_STRIPBYTECOUNTS
#define TIFFTAG_STRIPBYTECOUNTS
Definition: tiff.h:237
TIFF_LONG
Definition: tiff.h:142
tiff::tif_encodestrip
TIFFCodeMethod tif_encodestrip
Definition: tiffiop.h:162
TIFFStripMethod
uint32(* TIFFStripMethod)(TIFF *, uint32)
Definition: tiffiop.h:99
TIFFhowmany
#define TIFFhowmany(x, y)
Definition: tiffiop.h:239
FIELD_RECVPARAMS
#define FIELD_RECVPARAMS
Definition: tif_fax3.c:1117
max_lines
JSAMPARRAY JDIMENSION max_lines
Definition: jpeglib.h:977
jpeg_error_mgr::s
char s[JMSG_STR_PARM_MAX]
Definition: jpeglib.h:663
JCS_UNKNOWN
Definition: jpeglib.h:207
TIFF_ASCII
Definition: tiff.h:140
tiff::tif_encoderow
TIFFCodeMethod tif_encoderow
Definition: tiffiop.h:160
jpeg_destination_mgr::free_in_buffer
size_t free_in_buffer
Definition: jpeglib.h:715
TIFFScanlineSize
tsize_t TIFFScanlineSize(TIFF *tif)
Definition: tif_strip.c:227
MAX_COMPONENTS
#define MAX_COMPONENTS
Definition: jmorecfg.h:35
TIFFFillStrip
int TIFFFillStrip(TIFF *, tstrip_t)
Definition: tif_read.c:262
num_lines
JSAMPARRAY JDIMENSION num_lines
Definition: jpeglib.h:939
JQUANT_TBL::sent_table
boolean sent_table
Definition: jpeglib.h:94
tiff::tif_rawdata
tidata_t tif_rawdata
Definition: tiffiop.h:174
JQUANT_TBL
Definition: jpeglib.h:83
jpeg_error_mgr
Definition: jpeglib.h:643
tstrip_t
tstrile_t tstrip_t
Definition: tiffio.h:65
jpeg_common_struct
Definition: jpeglib.h:253
TIFFTAG_YCBCRSUBSAMPLING
#define TIFFTAG_YCBCRSUBSAMPLING
Definition: tiff.h:346
tiff::tif_clientdata
thandle_t tif_clientdata
Definition: tiffiop.h:185
TIFFTAG_REFERENCEBLACKWHITE
#define TIFFTAG_REFERENCEBLACKWHITE
Definition: tiff.h:350
tiffiop.h
require_image
boolean require_image
Definition: jpeglib.h:963
tiff::tif_name
char * tif_name
Definition: tiffiop.h:103
TIFF_DIRTYDIRECT
#define TIFF_DIRTYDIRECT
Definition: tiffiop.h:109
tiff
Definition: tiffiop.h:102
FIELD_YCBCRSUBSAMPLING
#define FIELD_YCBCRSUBSAMPLING
Definition: tif_dir.h:135
TIFFTAG_JPEGCOLORMODE
#define TIFFTAG_JPEGCOLORMODE
Definition: tiff.h:534
TIFFTAG_FAXDCS
#define TIFFTAG_FAXDCS
Definition: tiff.h:424
jpeg_start_compress
jpeg_start_compress(j_compress_ptr cinfo, boolean write_all_tables)
Definition: jcapistd.c:38
boolean
int boolean
Definition: jmorecfg.h:227
TIFFTAG_TILEBYTECOUNTS
#define TIFFTAG_TILEBYTECOUNTS
Definition: tiff.h:292
compptr
jpeg_component_info * compptr
Definition: jdct.h:102
jpeg_suppress_tables
jpeg_suppress_tables(j_compress_ptr cinfo, boolean suppress)
Definition: jcapimin.c:119
_TIFFmemcpy
void _TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c)
Definition: tif_acorn.c:485
jpeg_component_info::width_in_blocks
JDIMENSION width_in_blocks
Definition: jpeglib.h:139
JPEGCOLORMODE_RGB
#define JPEGCOLORMODE_RGB
Definition: tiff.h:536
TIFFTagMethods::printdir
TIFFPrintMethod printdir
Definition: tiffio.h:334
jpeg_create_decompress
#define jpeg_create_decompress(cinfo)
Definition: jpeglib.h:897
TIFFSetFieldBit
#define TIFFSetFieldBit(tif, field)
Definition: tif_dir.h:173
JPOOL_IMAGE
#define JPOOL_IMAGE
Definition: jpeglib.h:749
TIFFDirectory::td_ycbcrsubsampling
uint16 td_ycbcrsubsampling[2]
Definition: tif_dir.h:75
jpeg_read_raw_data
jpeg_read_raw_data(j_decompress_ptr cinfo, JSAMPIMAGE data, JDIMENSION max_lines)
Definition: jdapistd.c:185
tiff::tif_rawcp
tidata_t tif_rawcp
Definition: tiffiop.h:176
tiff::tif_mode
int tif_mode
Definition: tiffiop.h:105
tiff::tif_flags
uint32 tif_flags
Definition: tiffiop.h:106
TIFFDirectory::td_tilewidth
uint32 td_tilewidth
Definition: tif_dir.h:42
tiff::tif_decodestrip
TIFFCodeMethod tif_decodestrip
Definition: tiffiop.h:161
JPEG_HEADER_TABLES_ONLY
#define JPEG_HEADER_TABLES_ONLY
Definition: jpeglib.h:967
TIFFDirectory::td_tilelength
uint32 td_tilelength
Definition: tif_dir.h:42
JMSG_LENGTH_MAX
#define JMSG_LENGTH_MAX
Definition: jpeglib.h:652
FALSE
#define FALSE
Definition: twiddle.c:37
tiff::tif_tilesize
tsize_t tif_tilesize
Definition: tiffiop.h:150
tiff::tif_encodetile
TIFFCodeMethod tif_encodetile
Definition: tiffiop.h:164
jpeg_abort
jpeg_abort(j_common_ptr cinfo)
Definition: jcomapi.c:29
PHOTOMETRIC_PALETTE
#define PHOTOMETRIC_PALETTE
Definition: tiff.h:203
JCS_RGB
Definition: jpeglib.h:209
tiff::tif_deftilesize
TIFFTileMethod tif_deftilesize
Definition: tiffiop.h:169
tiff::tif_preencode
TIFFPreMethod tif_preencode
Definition: tiffiop.h:157
ttile_t
tstrile_t ttile_t
Definition: tiffio.h:66
uint16
unsigned short uint16
Definition: tiff.h:71
TIFFTAG_FAXRECVTIME
#define TIFFTAG_FAXRECVTIME
Definition: tiff.h:423
tiff::tif_postencode
TIFFBoolMethod tif_postencode
Definition: tiffiop.h:158
TIFFFieldInfo
Definition: tiffio.h:303
FIELD_RECVTIME
#define FIELD_RECVTIME
Definition: tif_fax3.c:1119
TIFFTagMethods::vsetfield
TIFFVSetMethod vsetfield
Definition: tiffio.h:332
TIFFDirectory::td_imagelength
uint32 td_imagelength
Definition: tif_dir.h:41
jpeg_compress_struct::dest
struct jpeg_destination_mgr * dest
Definition: jpeglib.h:272
tiff::tif_postdecode
TIFFPostMethod tif_postdecode
Definition: tiffiop.h:192
JPEGCOLORMODE_RAW
#define JPEGCOLORMODE_RAW
Definition: tiff.h:535
jpeg_write_scanlines
jpeg_write_scanlines(j_compress_ptr cinfo, JSAMPARRAY scanlines, JDIMENSION num_lines)
Definition: jcapistd.c:77
_TIFFMergeFieldInfo
int _TIFFMergeFieldInfo(TIFF *, const TIFFFieldInfo[], int)
Definition: tif_dirinfo.c:593
TIFFTAG_JPEGQUALITY
#define TIFFTAG_JPEGQUALITY
Definition: tiff.h:532
TIFFDirectory::td_rowsperstrip
uint32 td_rowsperstrip
Definition: tif_dir.h:52
JPEGTABLESMODE_QUANT
#define JPEGTABLESMODE_QUANT
Definition: tiff.h:538
_TIFFrealloc
void * _TIFFrealloc(tdata_t p, tsize_t s)
Definition: tif_acorn.c:473
WARNMS
#define WARNMS(cinfo, code)
Definition: jerror.h:238
jpeg_source_mgr
Definition: jpeglib.h:725
TIFFDirectory
Definition: tif_dir.h:36
quality
int quality
Definition: jpeglib.h:919
jpeg_destination_mgr
Definition: jpeglib.h:713
TIFFDirectory::td_planarconfig
uint16 td_planarconfig
Definition: tif_dir.h:57
TIFFErrorExt
void TIFFErrorExt(thandle_t fd, const char *module, const char *fmt,...)
Definition: tif_error.c:63
TIFFTAG_PHOTOMETRIC
#define TIFFTAG_PHOTOMETRIC
Definition: tiff.h:199
TIFFFillTile
int TIFFFillTile(TIFF *, ttile_t)
Definition: tif_read.c:497
tiff::tif_rawdatasize
tsize_t tif_rawdatasize
Definition: tiffiop.h:175
TIFFFieldSet
#define TIFFFieldSet(tif, field)
Definition: tif_dir.h:172
TIFFroundup
#define TIFFroundup(x, y)
Definition: tiffiop.h:243
jerror.h
tiff::tif_rawcc
tsize_t tif_rawcc
Definition: tiffiop.h:177
_TIFFsetByteArray
void _TIFFsetByteArray(void **vpp, void *vp, uint32 n)
Definition: tif_dir.c:56
jpeg_finish_decompress
jpeg_finish_decompress(j_decompress_ptr cinfo)
Definition: jdapimin.c:369
JSAMPIMAGE
JSAMPARRAY * JSAMPIMAGE
Definition: jpeglib.h:68
tiff::tif_decodetile
TIFFCodeMethod tif_decodetile
Definition: tiffiop.h:163
jpeg_error_mgr::i
int i[8]
Definition: jpeglib.h:662
ERREXIT1
#define ERREXIT1(cinfo, code, p1)
Definition: jerror.h:208
jpeg_compress_struct
Definition: jpeglib.h:268
COMPRESSION_JPEG
#define COMPRESSION_JPEG
Definition: tiff.h:177
TIFF_NOBITREV
#define TIFF_NOBITREV
Definition: tiffiop.h:114
jpeg_resync_to_restart
jpeg_resync_to_restart(j_decompress_ptr cinfo, int desired)
Definition: jdmarker.c:1192
PLANARCONFIG_SEPARATE
#define PLANARCONFIG_SEPARATE
Definition: tiff.h:244
tiff::tif_cleanup
TIFFVoidMethod tif_cleanup
Definition: tiffiop.h:167
_TIFFmemset
void _TIFFmemset(tdata_t p, int v, tsize_t c)
Definition: tif_acorn.c:479
FIELD_SUBADDRESS
#define FIELD_SUBADDRESS
Definition: tif_fax3.c:1118
write_all_tables
boolean write_all_tables
Definition: jpeglib.h:937
_TIFFSetDefaultCompressionState
void _TIFFSetDefaultCompressionState(TIFF *tif)
Definition: tif_compress.c:129
isTiled
#define isTiled(tif)
Definition: tiffiop.h:203
JSAMPARRAY
JSAMPROW * JSAMPARRAY
Definition: jpeglib.h:67
JHUFF_TBL::sent_table
boolean sent_table
Definition: jpeglib.h:110
scanlines
JSAMPARRAY scanlines
Definition: jpeglib.h:939
jpeg_decompress_struct::src
struct jpeg_source_mgr * src
Definition: jpeglib.h:415
_TIFFNoPostDecode
void _TIFFNoPostDecode(TIFF *tif, tidata_t buf, tsize_t cc)
Definition: tif_read.c:706
TIFFDirectory::td_samplesperpixel
uint16 td_samplesperpixel
Definition: tif_dir.h:51
jpeg_component_info
Definition: jpeglib.h:116
jpeg_read_scanlines
jpeg_read_scanlines(j_decompress_ptr cinfo, JSAMPARRAY scanlines, JDIMENSION max_lines)
Definition: jdapistd.c:152
TIFFPrintMethod
void(* TIFFPrintMethod)(TIFF *, FILE *, long)
Definition: tiffio.h:329
tidata_t
tidataval_t * tidata_t
Definition: tiffiop.h:91
_TIFFFieldWithTag
const TIFFFieldInfo * _TIFFFieldWithTag(TIFF *tif, ttag_t tag)
Definition: tif_dirinfo.c:804
TIFF_UPSAMPLED
#define TIFF_UPSAMPLED
Definition: tiffiop.h:120
tiff::tif_row
uint32 tif_row
Definition: tiffiop.h:139
jpeg_set_colorspace
jpeg_set_colorspace(j_compress_ptr cinfo, J_COLOR_SPACE colorspace)
Definition: jcparam.c:391
JPEG_EOI
#define JPEG_EOI
Definition: jpeglib.h:1046
TIFFTileSize
tsize_t TIFFTileSize(TIFF *tif)
Definition: tif_tile.c:241
TIFFTileMethod
void(* TIFFTileMethod)(TIFF *, uint32 *, uint32 *)
Definition: tiffiop.h:100
colorspace
J_COLOR_SPACE colorspace
Definition: jpeglib.h:917
tiff::tif_dir
TIFFDirectory tif_dir
Definition: tiffiop.h:133
TIFFVGetMethod
int(* TIFFVGetMethod)(TIFF *, ttag_t, va_list)
Definition: tiffio.h:328
tiff::tif_scanlinesize
tsize_t tif_scanlinesize
Definition: tiffiop.h:172
jpeg_create_compress
#define jpeg_create_compress(cinfo)
Definition: jpeglib.h:894
JCS_YCbCr
Definition: jpeglib.h:210
jpeg_decompress_struct
Definition: jpeglib.h:411
TIFFSetField
int TIFFSetField(TIFF *tif, ttag_t tag,...)
Definition: tif_dir.c:649
DCTSIZE
#define DCTSIZE
Definition: jpeglib.h:41
jpeg_component_info::h_samp_factor
int h_samp_factor
Definition: jpeglib.h:122
_TIFFFindFieldInfo
const TIFFFieldInfo * _TIFFFindFieldInfo(TIFF *tif, ttag_t tag, TIFFDataType dt)
Definition: tif_dirinfo.c:747
_TIFFmalloc
void * _TIFFmalloc(tsize_t s)
Definition: tif_acorn.c:461
data
JSAMPIMAGE data
Definition: jpeglib.h:945
jpeg_set_defaults
jpeg_set_defaults(j_compress_ptr cinfo)
Definition: jcparam.c:268
jpeg_std_error
jpeg_std_error(struct jpeg_error_mgr *err)
Definition: jerror.c:231
TIFFIsTiled
int TIFFIsTiled(TIFF *tif)
Definition: tif_open.c:539
JDIMENSION
unsigned int JDIMENSION
Definition: jmorecfg.h:171
htbl
JHUFF_TBL * htbl
Definition: jchuff.h:47
TIFFGetField
int TIFFGetField(TIFF *tif, ttag_t tag,...)
Definition: tif_dir.c:951
JOCTET
char JOCTET
Definition: jmorecfg.h:115
TIFFTAG_FAXSUBADDRESS
#define TIFFTAG_FAXSUBADDRESS
Definition: tiff.h:422
_TIFFfree
void _TIFFfree(tdata_t p)
Definition: tif_acorn.c:467
FIELD_PSEUDO
#define FIELD_PSEUDO
Definition: tif_dir.h:156
jpeg_write_tables
jpeg_write_tables(j_compress_ptr cinfo)
Definition: jcapimin.c:254
jpeg_destroy
jpeg_destroy(j_common_ptr cinfo)
Definition: jcomapi.c:69
JHUFF_TBL
Definition: jpeglib.h:100
jpeg_source_mgr::next_input_byte
const JOCTET * next_input_byte
Definition: jpeglib.h:726
tblno
boolean int tblno
Definition: jchuff.h:42
TIFFVSetMethod
int(* TIFFVSetMethod)(TIFF *, ttag_t, va_list)
Definition: tiffio.h:327
jpeg_destination_mgr::next_output_byte
JOCTET * next_output_byte
Definition: jpeglib.h:714
TIFFTagMethods::vgetfield
TIFFVGetMethod vgetfield
Definition: tiffio.h:333
J_COLOR_SPACE
J_COLOR_SPACE
Definition: jpeglib.h:206
TIFFOldScanlineSize
tsize_t TIFFOldScanlineSize(TIFF *tif)
Definition: tif_strip.c:275
tiff::tif_setupencode
TIFFBoolMethod tif_setupencode
Definition: tiffiop.h:155
tiff::tif_data
tidata_t tif_data
Definition: tiffiop.h:170
jpeg_set_quality
jpeg_set_quality(j_compress_ptr cinfo, int quality, boolean force_baseline)
Definition: jcparam.c:132
TIFFFieldInfo::field_bit
unsigned short field_bit
Definition: tiffio.h:308
tiff::tif_defstripsize
TIFFStripMethod tif_defstripsize
Definition: tiffiop.h:168
TIFFFlushData1
int TIFFFlushData1(TIFF *tif)
Definition: tif_write.c:682
jpeglib.h
force_baseline
int boolean force_baseline
Definition: jpeglib.h:919
JPEG_HEADER_OK
#define JPEG_HEADER_OK
Definition: jpeglib.h:966
PLANARCONFIG_CONTIG
#define PLANARCONFIG_CONTIG
Definition: tiff.h:243
PHOTOMETRIC_MASK
#define PHOTOMETRIC_MASK
Definition: tiff.h:204
tiff::tif_diroff
toff_t tif_diroff
Definition: tiffiop.h:127
TIFFDirectory::td_photometric
uint16 td_photometric
Definition: tif_dir.h:47
TIFFTAG_FAXRECVPARAMS
#define TIFFTAG_FAXRECVPARAMS
Definition: tiff.h:421
N
#define N(a)
Definition: tif_fax3.c:1156
tiff::tif_setupdecode
TIFFBoolMethod tif_setupdecode
Definition: tiffiop.h:153