tif_ojpeg.c
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:107k
源码类别:

打印编程

开发平台:

Visual C++

  1. /* $Id: tif_ojpeg.c,v 1.16 2006/03/01 11:09:13 dron Exp $ */
  2. #include "tiffiop.h"
  3. #ifdef OJPEG_SUPPORT
  4. /* JPEG Compression support, as per the original TIFF 6.0 specification.
  5.    WARNING: KLUDGE ALERT!  The type of JPEG encapsulation defined by the TIFF
  6.                            Version 6.0 specification is now totally obsolete and
  7.    deprecated for new applications and images.  This file is an unsupported hack
  8.    that was created solely in order to read (but NOT write!) a few old,
  9.    unconverted images still present on some users' computer systems.  The code
  10.    isn't pretty or robust, and it won't read every "old format" JPEG-in-TIFF
  11.    file (see Samuel Leffler's draft "TIFF Technical Note No. 2" for a long and
  12.    incomplete list of known problems), but it seems to work well enough in the
  13.    few cases of practical interest to the author; so, "caveat emptor"!  This
  14.    file should NEVER be enhanced to write new images using anything other than
  15.    the latest approved JPEG-in-TIFF encapsulation method, implemented by the
  16.    "tif_jpeg.c" file elsewhere in this library.
  17.    This file interfaces with Release 6B of the JPEG Library written by theu
  18.    Independent JPEG Group, which you can find on the Internet at:
  19.    ftp://ftp.uu.net:/graphics/jpeg/.
  20.    The "C" Preprocessor macros, "[CD]_LOSSLESS_SUPPORTED", are defined by your
  21.    JPEG Library Version 6B only if you have applied a (massive!) patch by Ken
  22.    Murchison of Oceana Matrix Ltd. <ken@oceana.com> to support lossless Huffman
  23.    encoding (TIFF "JPEGProc" tag value = 14).  This patch can be found on the
  24.    Internet at: ftp://ftp.oceana.com/pub/ljpeg-6b.tar.gz.
  25.    Some old files produced by the Wang Imaging application for Microsoft Windows
  26.    apparently can be decoded only with a special patch to the JPEG Library,
  27.    which defines a subroutine named "jpeg_reset_huff_decode()" in its "jdhuff.c"
  28.    module (the "jdshuff.c" module, if Ken Murchison's patch has been applied).
  29.    Unfortunately the patch differs slightly in each case, and some TIFF Library
  30.    have reported problems finding the code, so both versions appear below; you
  31.    should carefully extract and apply only the version that applies to your JPEG
  32.    Library!
  33.    Contributed by Scott Marovich <marovich@hpl.hp.com> with considerable help
  34.    from Charles Auer <Bumble731@msn.com> to unravel the mysteries of image files
  35.    created by the Wang Imaging application for Microsoft Windows.
  36. */
  37. #if 0  /* Patch for JPEG Library WITHOUT lossless Huffman coding */
  38. *** jdhuff.c.orig Mon Oct 20 17:51:10 1997
  39. --- jdhuff.c Sun Nov 11 17:33:58 2001
  40. ***************
  41. *** 648,651 ****
  42. --- 648,683 ----
  43.     for (i = 0; i < NUM_HUFF_TBLS; i++) {
  44.       entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
  45.     }
  46.   }
  47. + /*
  48. +  * BEWARE OF KLUDGE:  This subroutine is a hack for decoding illegal JPEG-in-
  49. +  *                    TIFF encapsulations produced by Microsoft's Wang Imaging
  50. +  * for Windows application with the public-domain TIFF Library.  Based upon an
  51. +  * examination of selected output files, this program apparently divides a JPEG
  52. +  * bit-stream into consecutive horizontal TIFF "strips", such that the JPEG
  53. +  * encoder's/decoder's DC coefficients for each image component are reset before
  54. +  * each "strip".  Moreover, a "strip" is not necessarily encoded in a multiple
  55. +  * of 8 bits, so one must sometimes discard 1-7 bits at the end of each "strip"
  56. +  * for alignment to the next input-Byte storage boundary.  IJG JPEG Library
  57. +  * decoder state is not normally exposed to client applications, so this sub-
  58. +  * routine provides the TIFF Library with a "hook" to make these corrections.
  59. +  * It should be called after "jpeg_start_decompress()" and before
  60. +  * "jpeg_finish_decompress()", just before decoding each "strip" using
  61. +  * "jpeg_read_raw_data()" or "jpeg_read_scanlines()".
  62. +  *
  63. +  * This kludge is not sanctioned or supported by the Independent JPEG Group, and
  64. +  * future changes to the IJG JPEG Library might invalidate it.  Do not send bug
  65. +  * reports about this code to IJG developers.  Instead, contact the author for
  66. +  * advice: Scott B. Marovich <marovich@hpl.hp.com>, Hewlett-Packard Labs, 6/01.
  67. +  */
  68. + GLOBAL(void)
  69. + jpeg_reset_huff_decode (register j_decompress_ptr cinfo)
  70. + { register huff_entropy_ptr entropy = (huff_entropy_ptr)cinfo->entropy;
  71. +   register int ci = 0;
  72. +   /* Discard encoded input bits, up to the next Byte boundary */
  73. +   entropy->bitstate.bits_left &= ~7;
  74. +   /* Re-initialize DC predictions to 0 */
  75. +   do entropy->saved.last_dc_val[ci] = 0; while (++ci < cinfo->comps_in_scan);
  76. + }
  77. #endif /* Patch for JPEG Library WITHOUT lossless Huffman coding */
  78. #if 0  /* Patch for JPEG Library WITH lossless Huffman coding */
  79. *** jdshuff.c.orig Mon Mar 11 16:44:54 2002
  80. --- jdshuff.c Mon Mar 11 16:44:54 2002
  81. ***************
  82. *** 357,360 ****
  83. --- 357,393 ----
  84.     for (i = 0; i < NUM_HUFF_TBLS; i++) {
  85.       entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
  86.     }
  87.   }
  88. + /*
  89. +  * BEWARE OF KLUDGE:  This subroutine is a hack for decoding illegal JPEG-in-
  90. +  *                    TIFF encapsulations produced by Microsoft's Wang Imaging
  91. +  * for Windows application with the public-domain TIFF Library.  Based upon an
  92. +  * examination of selected output files, this program apparently divides a JPEG
  93. +  * bit-stream into consecutive horizontal TIFF "strips", such that the JPEG
  94. +  * encoder's/decoder's DC coefficients for each image component are reset before
  95. +  * each "strip".  Moreover, a "strip" is not necessarily encoded in a multiple
  96. +  * of 8 bits, so one must sometimes discard 1-7 bits at the end of each "strip"
  97. +  * for alignment to the next input-Byte storage boundary.  IJG JPEG Library
  98. +  * decoder state is not normally exposed to client applications, so this sub-
  99. +  * routine provides the TIFF Library with a "hook" to make these corrections.
  100. +  * It should be called after "jpeg_start_decompress()" and before
  101. +  * "jpeg_finish_decompress()", just before decoding each "strip" using
  102. +  * "jpeg_read_raw_data()" or "jpeg_read_scanlines()".
  103. +  *
  104. +  * This kludge is not sanctioned or supported by the Independent JPEG Group, and
  105. +  * future changes to the IJG JPEG Library might invalidate it.  Do not send bug
  106. +  * reports about this code to IJG developers.  Instead, contact the author for
  107. +  * advice: Scott B. Marovich <marovich@hpl.hp.com>, Hewlett-Packard Labs, 6/01.
  108. +  */
  109. + GLOBAL(void)
  110. + jpeg_reset_huff_decode (register j_decompress_ptr cinfo)
  111. + { register shuff_entropy_ptr entropy = (shuff_entropy_ptr)
  112. +                                        ((j_lossy_d_ptr)cinfo->codec)->entropy_private;
  113. +   register int ci = 0;
  114. +   /* Discard encoded input bits, up to the next Byte boundary */
  115. +   entropy->bitstate.bits_left &= ~7;
  116. +   /* Re-initialize DC predictions to 0 */
  117. +   do entropy->saved.last_dc_val[ci] = 0; while (++ci < cinfo->comps_in_scan);
  118. + }
  119. #endif /* Patch for JPEG Library WITH lossless Huffman coding */
  120. #include <setjmp.h>
  121. #include <stdio.h>
  122. #ifdef FAR
  123. #undef FAR /* Undefine FAR to avoid conflict with JPEG definition */
  124. #endif
  125. #define JPEG_INTERNALS /* Include "jpegint.h" for "DSTATE_*" symbols */
  126. #define JPEG_CJPEG_DJPEG /* Include all Version 6B+ "jconfig.h" options */
  127. #undef INLINE
  128. #include "jpeglib.h"
  129. #undef JPEG_CJPEG_DJPEG
  130. #undef JPEG_INTERNALS
  131. /* Hack for files produced by Wang Imaging application on Microsoft Windows */
  132. extern void jpeg_reset_huff_decode(j_decompress_ptr);
  133. /* On some machines, it may be worthwhile to use "_setjmp()" or "sigsetjmp()"
  134.    instead of "setjmp()".  These macros make it easier:
  135. */
  136. #define SETJMP(jbuf)setjmp(jbuf)
  137. #define LONGJMP(jbuf,code)longjmp(jbuf,code)
  138. #define JMP_BUF jmp_buf
  139. #define TIFFTAG_WANG_PAGECONTROL 32934
  140. /* Bit-vector offsets for keeping track of TIFF records that we've parsed. */
  141. #define FIELD_JPEGPROC FIELD_CODEC
  142. #define FIELD_JPEGIFOFFSET (FIELD_CODEC+1)
  143. #define FIELD_JPEGIFBYTECOUNT (FIELD_CODEC+2)
  144. #define FIELD_JPEGRESTARTINTERVAL (FIELD_CODEC+3)
  145. #define FIELD_JPEGTABLES (FIELD_CODEC+4) /* New, post-6.0 JPEG-in-TIFF tag! */
  146. #define FIELD_JPEGLOSSLESSPREDICTORS (FIELD_CODEC+5)
  147. #define FIELD_JPEGPOINTTRANSFORM (FIELD_CODEC+6)
  148. #define FIELD_JPEGQTABLES (FIELD_CODEC+7)
  149. #define FIELD_JPEGDCTABLES (FIELD_CODEC+8)
  150. #define FIELD_JPEGACTABLES (FIELD_CODEC+9)
  151. #define FIELD_WANG_PAGECONTROL (FIELD_CODEC+10)
  152. #define FIELD_JPEGCOLORMODE (FIELD_CODEC+11)
  153. typedef struct jpeg_destination_mgr jpeg_destination_mgr;
  154. typedef struct jpeg_source_mgr jpeg_source_mgr;
  155. typedef struct jpeg_error_mgr jpeg_error_mgr;
  156. /* State variable for each open TIFF file that uses "libjpeg" for JPEG
  157.    decompression.  (Note:  This file should NEVER perform JPEG compression
  158.    except in the manner implemented by the "tif_jpeg.c" file, elsewhere in this
  159.    library; see comments above.)  JPEG Library internal state is recorded in a
  160.    "jpeg_{de}compress_struct", while a "jpeg_common_struct" records a few items
  161.    common to both compression and expansion.  The "cinfo" field containing JPEG
  162.    Library state MUST be the 1st member of our own state variable, so that we
  163.    can safely "cast" pointers back and forth.
  164. */
  165. typedef struct             /* This module's private, per-image state variable */
  166.   {
  167.     union         /* JPEG Library state variable; this MUST be our 1st field! */
  168.       {
  169.         struct jpeg_compress_struct c;
  170.         struct jpeg_decompress_struct d;
  171.         struct jpeg_common_struct comm;
  172.       } cinfo;
  173.     jpeg_error_mgr err;                         /* JPEG Library error manager */
  174.     JMP_BUF exit_jmpbuf;             /* ...for catching JPEG Library failures */
  175. #   ifdef never
  176.  /* (The following two fields could be a "union", but they're small enough that
  177.     it's not worth the effort.)
  178.  */
  179.     jpeg_destination_mgr dest;             /* Destination for compressed data */
  180. #   endif
  181.     jpeg_source_mgr src;                           /* Source of expanded data */
  182.     JSAMPARRAY ds_buffer[MAX_COMPONENTS]; /* ->Temporary downsampling buffers */
  183.     TIFF *tif;                        /* Reverse pointer, needed by some code */
  184.     TIFFVGetMethod vgetparent;                    /* "Super class" methods... */
  185.     TIFFVSetMethod vsetparent;
  186.     TIFFStripMethod defsparent;
  187.     TIFFTileMethod deftparent;
  188.     void *jpegtables;           /* ->"New" JPEG tables, if we synthesized any */
  189.     uint32 is_WANG,    /* <=> Wang Imaging for Microsoft Windows output file? */
  190.            jpegtables_length;   /* Length of "new" JPEG tables, if they exist */
  191.     tsize_t bytesperline;          /* No. of decompressed Bytes per scan line */
  192.     int jpegquality,                             /* Compression quality level */
  193.         jpegtablesmode,                          /* What to put in JPEGTables */
  194.         samplesperclump,
  195.         scancount;                           /* No. of scan lines accumulated */
  196.     J_COLOR_SPACE photometric;          /* IJG JPEG Library's photometry code */
  197.     unsigned char h_sampling,                          /* Luminance sampling factors */
  198.            v_sampling,
  199.            jpegcolormode;           /* Who performs RGB <-> YCbCr conversion? */
  200. /* JPEGCOLORMODE_RAW <=> TIFF Library or its client */
  201. /* JPEGCOLORMODE_RGB <=> JPEG Library               */
  202.     /* These fields are added to support TIFFGetField */
  203.     uint16 jpegproc;
  204.     uint32 jpegifoffset;
  205.     uint32 jpegifbytecount;
  206.     uint32 jpegrestartinterval;
  207.     void* jpeglosslesspredictors;
  208.     uint16 jpeglosslesspredictors_length;
  209.     void* jpegpointtransform;
  210.     uint32 jpegpointtransform_length;
  211.     void* jpegqtables;
  212.     uint32 jpegqtables_length;
  213.     void* jpegdctables;
  214.     uint32 jpegdctables_length;
  215.     void* jpegactables;
  216.     uint32 jpegactables_length;
  217.   } OJPEGState;
  218. #define OJState(tif)((OJPEGState*)(tif)->tif_data)
  219. static const TIFFFieldInfo ojpegFieldInfo[]=/* JPEG-specific TIFF-record tags */
  220.   {
  221.  /* This is the current JPEG-in-TIFF metadata-encapsulation tag, and its
  222.     treatment in this file is idiosyncratic.  It should never appear in a
  223.     "source" image conforming to the TIFF Version 6.0 specification, so we
  224.     arrange to report an error if it appears.  But in order to support possible
  225.     future conversion of "old" JPEG-in-TIFF encapsulations to "new" ones, we
  226.     might wish to synthesize an equivalent value to be returned by the TIFF
  227.     Library's "getfield" method.  So, this table tells the TIFF Library to pass
  228.     these records to us in order to filter them below.
  229.  */
  230.     {
  231.       TIFFTAG_JPEGTABLES            ,TIFF_VARIABLE2,TIFF_VARIABLE2,
  232.       TIFF_UNDEFINED,FIELD_JPEGTABLES            ,FALSE,TRUE ,"JPEGTables"
  233.     },
  234.  /* These tags are defined by the TIFF Version 6.0 specification and are now
  235.     obsolete.  This module reads them from an old "source" image, but it never
  236.     writes them to a new "destination" image.
  237.  */
  238.     {
  239.       TIFFTAG_JPEGPROC              ,1            ,1            ,
  240.       TIFF_SHORT    ,FIELD_JPEGPROC              ,FALSE,FALSE,"JPEGProc"
  241.     },
  242.     {
  243.       TIFFTAG_JPEGIFOFFSET          ,1            ,1            ,
  244.       TIFF_LONG     ,FIELD_JPEGIFOFFSET          ,FALSE,FALSE,"JPEGInterchangeFormat"
  245.     },
  246.     {
  247.       TIFFTAG_JPEGIFBYTECOUNT       ,1            ,1            ,
  248.       TIFF_LONG     ,FIELD_JPEGIFBYTECOUNT       ,FALSE,FALSE,"JPEGInterchangeFormatLength"
  249.     },
  250.     {
  251.       TIFFTAG_JPEGRESTARTINTERVAL   ,1            ,1            ,
  252.       TIFF_SHORT    ,FIELD_JPEGRESTARTINTERVAL   ,FALSE,FALSE,"JPEGRestartInterval"
  253.     },
  254.     {
  255.       TIFFTAG_JPEGLOSSLESSPREDICTORS,TIFF_VARIABLE,TIFF_VARIABLE,
  256.       TIFF_SHORT    ,FIELD_JPEGLOSSLESSPREDICTORS,FALSE,TRUE ,"JPEGLosslessPredictors"
  257.     },
  258.     {
  259.       TIFFTAG_JPEGPOINTTRANSFORM    ,TIFF_VARIABLE,TIFF_VARIABLE,
  260.       TIFF_SHORT    ,FIELD_JPEGPOINTTRANSFORM    ,FALSE,TRUE ,"JPEGPointTransforms"
  261.     },
  262.     {
  263.       TIFFTAG_JPEGQTABLES           ,TIFF_VARIABLE,TIFF_VARIABLE,
  264.       TIFF_LONG     ,FIELD_JPEGQTABLES           ,FALSE,TRUE ,"JPEGQTables"
  265.     },
  266.     {
  267.       TIFFTAG_JPEGDCTABLES          ,TIFF_VARIABLE,TIFF_VARIABLE,
  268.       TIFF_LONG     ,FIELD_JPEGDCTABLES          ,FALSE,TRUE ,"JPEGDCTables"
  269.     },
  270.     {
  271.       TIFFTAG_JPEGACTABLES          ,TIFF_VARIABLE,TIFF_VARIABLE,
  272.       TIFF_LONG     ,FIELD_JPEGACTABLES          ,FALSE,TRUE ,"JPEGACTables"
  273.     },
  274.     {
  275.       TIFFTAG_WANG_PAGECONTROL      ,TIFF_VARIABLE,1            ,
  276.       TIFF_LONG     ,FIELD_WANG_PAGECONTROL      ,FALSE,FALSE,"WANG PageControl"
  277.     },
  278.  /* This is a pseudo tag intended for internal use only by the TIFF Library and
  279.     its clients, which should never appear in an input/output image file.  It
  280.     specifies whether the TIFF Library (or its client) should do YCbCr <-> RGB
  281.     color-space conversion (JPEGCOLORMODE_RAW <=> 0) or whether we should ask
  282.     the JPEG Library to do it (JPEGCOLORMODE_RGB <=> 1).
  283.  */
  284.     {
  285.       TIFFTAG_JPEGCOLORMODE         ,0            ,0            ,
  286.       TIFF_ANY      ,FIELD_PSEUDO                ,FALSE,FALSE,"JPEGColorMode"
  287.     }
  288.   };
  289. static const char JPEGLib_name[]={"JPEG Library"},
  290.                   bad_bps[]={"%u BitsPerSample not allowed for JPEG"},
  291.                   bad_photometry[]={"PhotometricInterpretation %u not allowed for JPEG"},
  292.                   bad_subsampling[]={"invalid YCbCr subsampling factor(s)"},
  293. #                 ifdef never
  294.                   no_write_frac[]={"fractional scan line discarded"},
  295. #                 endif
  296.                   no_read_frac[]={"fractional scan line not read"},
  297.                   no_jtable_space[]={"No space for JPEGTables"};
  298. /* The following diagnostic subroutines interface with and replace default
  299.    subroutines in the JPEG Library.  Our basic strategy is to use "setjmp()"/
  300.    "longjmp()" in order to return control to the TIFF Library when the JPEG
  301.    library detects an error, and to use TIFF Library subroutines for displaying
  302.    diagnostic messages to a client application.
  303. */
  304. static void
  305. TIFFojpeg_error_exit(register j_common_ptr cinfo)
  306. {
  307.     char buffer[JMSG_LENGTH_MAX];
  308.     int code = cinfo->err->msg_code;
  309.     if (((OJPEGState *)cinfo)->is_WANG) {
  310. if (code == JERR_SOF_DUPLICATE || code == JERR_SOI_DUPLICATE)
  311.     return;     /* ignore it */
  312.     }
  313.     (*cinfo->err->format_message)(cinfo,buffer);
  314.     TIFFError(JPEGLib_name,buffer); /* Display error message */
  315.     jpeg_abort(cinfo); /* Clean up JPEG Library state */
  316.     LONGJMP(((OJPEGState *)cinfo)->exit_jmpbuf,1); /* Return to TIFF client */
  317. }
  318. static void
  319. TIFFojpeg_output_message(register j_common_ptr cinfo)
  320.   { char buffer[JMSG_LENGTH_MAX];
  321.  /* This subroutine is invoked only for warning messages, since the JPEG
  322.     Library's "error_exit" method does its own thing and "trace_level" is never
  323.     set > 0.
  324.  */
  325.     (*cinfo->err->format_message)(cinfo,buffer);
  326.     TIFFWarning(JPEGLib_name,buffer);
  327.   }
  328. /* The following subroutines, which also interface with the JPEG Library, exist
  329.    mainly in limit the side effects of "setjmp()" and convert JPEG normal/error
  330.    conditions into TIFF Library return codes.
  331. */
  332. #define CALLJPEG(sp,fail,op)(SETJMP((sp)->exit_jmpbuf)?(fail):(op))
  333. #define CALLVJPEG(sp,op)CALLJPEG(sp,0,((op),1))
  334. #ifdef never
  335. static int
  336. TIFFojpeg_create_compress(register OJPEGState *sp)
  337.   {
  338.     sp->cinfo.c.err = jpeg_std_error(&sp->err); /* Initialize error handling */
  339.     sp->err.error_exit = TIFFojpeg_error_exit;
  340.     sp->err.output_message = TIFFojpeg_output_message;
  341.     return CALLVJPEG(sp,jpeg_create_compress(&sp->cinfo.c));
  342.   }
  343. /* The following subroutines comprise a JPEG Library "destination" data manager
  344.    by directing compressed data from the JPEG Library to a TIFF Library output
  345.    buffer.
  346. */
  347. static void
  348. std_init_destination(register j_compress_ptr cinfo){} /* "Dummy" stub */
  349. static boolean
  350. std_empty_output_buffer(register j_compress_ptr cinfo)
  351.   {
  352. #   define sp ((OJPEGState *)cinfo)
  353.     register TIFF *tif = sp->tif;
  354.     tif->tif_rawcc = tif->tif_rawdatasize; /* Entire buffer has been filled */
  355.     TIFFFlushData1(tif);
  356.     sp->dest.next_output_byte = (JOCTET *)tif->tif_rawdata;
  357.     sp->dest.free_in_buffer = (size_t)tif->tif_rawdatasize;
  358.     return TRUE;
  359. #   undef sp
  360.   }
  361. static void
  362. std_term_destination(register j_compress_ptr cinfo)
  363.   {
  364. #   define sp ((OJPEGState *)cinfo)
  365.     register TIFF *tif = sp->tif;
  366.  /* NB: The TIFF Library does the final buffer flush. */
  367.     tif->tif_rawcp = (tidata_t)sp->dest.next_output_byte;
  368.     tif->tif_rawcc = tif->tif_rawdatasize - (tsize_t)sp->dest.free_in_buffer;
  369. #   undef sp
  370.   }
  371. /* Alternate destination manager to output JPEGTables field: */
  372. static void
  373. tables_init_destination(register j_compress_ptr cinfo)
  374.   {
  375. #   define sp ((OJPEGState *)cinfo)
  376.  /* The "jpegtables_length" field is the allocated buffer size while building */
  377.     sp->dest.next_output_byte = (JOCTET *)sp->jpegtables;
  378.     sp->dest.free_in_buffer = (size_t)sp->jpegtables_length;
  379. #   undef sp
  380.   }
  381. static boolean
  382. tables_empty_output_buffer(register j_compress_ptr cinfo)
  383.   { void *newbuf;
  384. #   define sp ((OJPEGState *)cinfo)
  385.  /* The entire buffer has been filled, so enlarge it by 1000 bytes. */
  386.     if (!( newbuf = _TIFFrealloc( (tdata_t)sp->jpegtables
  387.                                 , (tsize_t)(sp->jpegtables_length + 1000)
  388.                                 )
  389.          )
  390.        ) ERREXIT1(cinfo,JERR_OUT_OF_MEMORY,100);
  391.     sp->dest.next_output_byte = (JOCTET *)newbuf + sp->jpegtables_length;
  392.     sp->dest.free_in_buffer = (size_t)1000;
  393.     sp->jpegtables = newbuf;
  394.     sp->jpegtables_length += 1000;
  395.     return TRUE;
  396. #   undef sp
  397.   }
  398. static void
  399. tables_term_destination(register j_compress_ptr cinfo)
  400.   {
  401. #   define sp ((OJPEGState *)cinfo)
  402.  /* Set tables length to no. of Bytes actually emitted. */
  403.     sp->jpegtables_length -= sp->dest.free_in_buffer;
  404. #   undef sp
  405.   }
  406. /*ARGSUSED*/ static int
  407. TIFFojpeg_tables_dest(register OJPEGState *sp, TIFF *tif)
  408.   {
  409.  /* Allocate a working buffer for building tables.  The initial size is 1000
  410.     Bytes, which is usually adequate.
  411.  */
  412.     if (sp->jpegtables) _TIFFfree(sp->jpegtables);
  413.     if (!(sp->jpegtables = (void*)
  414.                            _TIFFmalloc((tsize_t)(sp->jpegtables_length = 1000))
  415.          )
  416.        )
  417.       {
  418.         sp->jpegtables_length = 0;
  419.         TIFFError("TIFFojpeg_tables_dest",no_jtable_space);
  420.         return 0;
  421.       };
  422.     sp->cinfo.c.dest = &sp->dest;
  423.     sp->dest.init_destination = tables_init_destination;
  424.     sp->dest.empty_output_buffer = tables_empty_output_buffer;
  425.     sp->dest.term_destination = tables_term_destination;
  426.     return 1;
  427.   }
  428. #else /* well, hardly ever */
  429. static int
  430. _notSupported(register TIFF *tif)
  431.   { const TIFFCodec *c = TIFFFindCODEC(tif->tif_dir.td_compression);
  432.     TIFFError(tif->tif_name,"%s compression not supported",c->name);
  433.     return 0;
  434.   }
  435. #endif /* never */
  436. /* The following subroutines comprise a JPEG Library "source" data manager by
  437.    by directing compressed data to the JPEG Library from a TIFF Library input
  438.    buffer.
  439. */
  440. static void
  441. std_init_source(register j_decompress_ptr cinfo)
  442.   {
  443. #   define sp ((OJPEGState *)cinfo)
  444.     register TIFF *tif = sp->tif;
  445.     if (sp->src.bytes_in_buffer == 0)
  446.       {
  447.         sp->src.next_input_byte = (const JOCTET *)tif->tif_rawdata;
  448.         sp->src.bytes_in_buffer = (size_t)tif->tif_rawcc;
  449.       };
  450. #   undef sp
  451.   }
  452. static boolean
  453. std_fill_input_buffer(register j_decompress_ptr cinfo)
  454.   { static const JOCTET dummy_EOI[2]={0xFF,JPEG_EOI};
  455. #   define sp ((OJPEGState *)cinfo)
  456.  /* Control should never get here, since an entire strip/tile is read into
  457.     memory before the decompressor is called; thus, data should have been
  458.     supplied by the "init_source" method.  ...But, sometimes things fail.
  459.  */
  460.     WARNMS(cinfo,JWRN_JPEG_EOF);
  461.     sp->src.next_input_byte = dummy_EOI; /* Insert a fake EOI marker */
  462.     sp->src.bytes_in_buffer = sizeof dummy_EOI;
  463.     return TRUE;
  464. #   undef sp
  465.   }
  466. static void
  467. std_skip_input_data(register j_decompress_ptr cinfo, long num_bytes)
  468.   {
  469. #   define sp ((OJPEGState *)cinfo)
  470.     if (num_bytes > 0)
  471.     {
  472.       if (num_bytes > (long)sp->src.bytes_in_buffer) /* oops: buffer overrun */
  473.         (void)std_fill_input_buffer(cinfo);
  474.       else
  475.         {
  476.           sp->src.next_input_byte += (size_t)num_bytes;
  477.           sp->src.bytes_in_buffer -= (size_t)num_bytes;
  478.         }
  479.     }
  480. #   undef sp
  481.   }
  482. /*ARGSUSED*/ static void
  483. std_term_source(register j_decompress_ptr cinfo){} /* "Dummy" stub */
  484. /* Allocate temporary I/O buffers for downsampled data, using values computed in
  485.    "jpeg_start_{de}compress()".  We use the JPEG Library's allocator so that
  486.    buffers will be released automatically when done with a strip/tile.  This is
  487.    also a handy place to compute samplesperclump, bytesperline, etc.
  488. */
  489. static int
  490. alloc_downsampled_buffers(TIFF *tif,jpeg_component_info *comp_info,
  491.                           int num_components)
  492.   { register OJPEGState *sp = OJState(tif);
  493.     sp->samplesperclump = 0;
  494.     if (num_components > 0)
  495.       { tsize_t size = sp->cinfo.comm.is_decompressor
  496. #                    ifdef D_LOSSLESS_SUPPORTED
  497.                      ? sp->cinfo.d.min_codec_data_unit
  498. #                    else
  499.                      ? DCTSIZE
  500. #                    endif
  501. #                    ifdef C_LOSSLESS_SUPPORTED
  502.                      : sp->cinfo.c.data_unit;
  503. #                    else
  504.                      : DCTSIZE;
  505. #                    endif
  506.         int ci = 0;
  507.         register jpeg_component_info *compptr = comp_info;
  508.         do
  509.           { JSAMPARRAY buf;
  510.             sp->samplesperclump +=
  511.               compptr->h_samp_factor * compptr->v_samp_factor;
  512. #           if defined(C_LOSSLESS_SUPPORTED) || defined(D_LOSSLESS_SUPPORTED)
  513.             if (!(buf = CALLJPEG(sp,0,(*sp->cinfo.comm.mem->alloc_sarray)(&sp->cinfo.comm,JPOOL_IMAGE,compptr->width_in_data_units*size,compptr->v_samp_factor*size))))
  514. #           else
  515.             if (!(buf = CALLJPEG(sp,0,(*sp->cinfo.comm.mem->alloc_sarray)(&sp->cinfo.comm,JPOOL_IMAGE,compptr->width_in_blocks*size,compptr->v_samp_factor*size))))
  516. #           endif
  517.               return 0;
  518.             sp->ds_buffer[ci] = buf;
  519.           }
  520.         while (++compptr,++ci < num_components);
  521.       };
  522.     return 1;
  523.   }
  524. #ifdef never
  525. /* JPEG Encoding begins here. */
  526. /*ARGSUSED*/ static int
  527. OJPEGEncode(register TIFF *tif,tidata_t buf,tsize_t cc,tsample_t s)
  528.   { tsize_t rows;                          /* No. of unprocessed rows in file */
  529.     register OJPEGState *sp = OJState(tif);
  530.  /* Encode a chunk of pixels, where returned data is NOT down-sampled (the
  531.     standard case).  The data is expected to be written in scan-line multiples.
  532.  */
  533.     if (cc % sp->bytesperline) TIFFWarning(tif->tif_name,no_write_frac);
  534.     if ( (cc /= bytesperline)      /* No. of complete rows in caller's buffer */
  535.        > (rows = sp->cinfo.c.image_height - sp->cinfo.c.next_scanline)
  536.        ) cc = rows;
  537.     while (--cc >= 0)
  538.       {
  539.         if (   CALLJPEG(sp,-1,jpeg_write_scanlines(&sp->cinfo.c,(JSAMPARRAY)&buf,1))
  540.             != 1
  541.            ) return 0;
  542.         ++tif->tif_row;
  543.         buf += sp->bytesperline;
  544.       };
  545.     return 1;
  546.   }
  547. /*ARGSUSED*/ static int
  548. OJPEGEncodeRaw(register TIFF *tif,tidata_t buf,tsize_t cc,tsample_t s)
  549.   { tsize_t rows;                          /* No. of unprocessed rows in file */
  550.     JDIMENSION lines_per_MCU, size;
  551.     register OJPEGState *sp = OJState(tif);
  552.  /* Encode a chunk of pixels, where returned data is down-sampled as per the
  553.     sampling factors.  The data is expected to be written in scan-line
  554.     multiples.
  555.  */
  556.     cc /= sp->bytesperline;
  557.     if (cc % sp->bytesperline) TIFFWarning(tif->tif_name,no_write_frac);
  558.     if ( (cc /= bytesperline)      /* No. of complete rows in caller's buffer */
  559.        > (rows = sp->cinfo.c.image_height - sp->cinfo.c.next_scanline)
  560.        ) cc = rows;
  561. #   ifdef C_LOSSLESS_SUPPORTED
  562.     lines_per_MCU = sp->cinfo.c.max_samp_factor*(size = sp->cinfo.d.data_unit);
  563. #   else
  564.     lines_per_MCU = sp->cinfo.c.max_samp_factor*(size = DCTSIZE);
  565. #   endif
  566.     while (--cc >= 0)
  567.       { int ci = 0, clumpoffset = 0;
  568.         register jpeg_component_info *compptr = sp->cinfo.c.comp_info;
  569.      /* The fastest way to separate the data is to make 1 pass over the scan
  570.         line for each row of each component.
  571.      */
  572.         do
  573.           { int ypos = 0;
  574.             do
  575.               { int padding;
  576.                 register JSAMPLE *inptr = (JSAMPLE*)buf + clumpoffset,
  577.                                  *outptr =
  578.                   sp->ds_buffer[ci][sp->scancount*compptr->v_samp_factor+ypos];
  579.              /* Cb,Cr both have sampling factors 1, so this is correct */
  580.                 register int clumps_per_line =
  581.                   sp->cinfo.c.comp_info[1].downsampled_width,
  582.                              xpos;
  583.                 padding = (int)
  584. #                         ifdef C_LOSSLESS_SUPPORTED
  585.                           ( compptr->width_in_data_units * size
  586. #                         else
  587.                           ( compptr->width_in_blocks * size
  588. #                         endif
  589.                           - clumps_per_line * compptr->h_samp_factor
  590.                           );
  591.                 if (compptr->h_samp_factor == 1) /* Cb & Cr fast path */
  592.                   do *outptr++ = *inptr;
  593.                   while ((inptr += sp->samplesperclump),--clumps_per_line > 0);
  594.                 else /* general case */
  595.                   do
  596.                     {
  597.                       xpos = 0;
  598.                       do *outptr++ = inptr[xpos];
  599.                       while (++xpos < compptr->h_samp_factor);
  600.                     }
  601.                   while ((inptr += sp->samplesperclump),--clumps_per_line > 0);
  602.                 xpos = 0; /* Pad each scan line as needed */
  603.                 do outptr[0] = outptr[-1]; while (++outptr,++xpos < padding);
  604.                 clumpoffset += compptr->h_samp_factor;
  605.               }
  606.             while (++ypos < compptr->v_samp_factor);
  607.           }
  608.         while (++compptr,++ci < sp->cinfo.c.num_components);
  609.         if (++sp->scancount >= size)
  610.           {
  611.             if (   CALLJPEG(sp,-1,jpeg_write_raw_data(&sp->cinfo.c,sp->ds_buffer,lines_per_MCU))
  612.                 != lines_per_MCU
  613.                ) return 0;
  614.             sp->scancount = 0;
  615.           };
  616.         ++tif->tif_row++
  617.         buf += sp->bytesperline;
  618.       };
  619.     return 1;
  620.   }
  621. static int
  622. OJPEGSetupEncode(register TIFF *tif)
  623.   { static const char module[]={"OJPEGSetupEncode"};
  624.     uint32 segment_height, segment_width;
  625.     int status = 1;                              /* Assume success by default */
  626.     register OJPEGState *sp = OJState(tif);
  627. #   define td (&tif->tif_dir)
  628.  /* Verify miscellaneous parameters.  This will need work if the TIFF Library
  629.     ever supports different depths for different components, or if the JPEG
  630.     Library ever supports run-time depth selection.  Neither seems imminent.
  631.  */
  632.     if (td->td_bitspersample != 8)
  633.       {
  634.         TIFFError(module,bad_bps,td->td_bitspersample);
  635.         status = 0;
  636.       };
  637.  /* The TIFF Version 6.0 specification and IJG JPEG Library accept different
  638.     sets of color spaces, so verify that our image belongs to the common subset
  639.     and map its photometry code, then initialize to handle subsampling and
  640.     optional JPEG Library YCbCr <-> RGB color-space conversion.
  641.  */
  642.     switch (td->td_photometric)
  643.       {
  644.         case PHOTOMETRIC_YCBCR     :
  645.        /* ISO IS 10918-1 requires that JPEG subsampling factors be 1-4, but
  646.           TIFF Version 6.0 is more restrictive: only 1, 2, and 4 are allowed.
  647.        */
  648.           if (   (   td->td_ycbcrsubsampling[0] == 1
  649.                   || td->td_ycbcrsubsampling[0] == 2
  650.                   || td->td_ycbcrsubsampling[0] == 4
  651.                  )
  652.               && (   td->td_ycbcrsubsampling[1] == 1
  653.                   || td->td_ycbcrsubsampling[1] == 2
  654.                   || td->td_ycbcrsubsampling[1] == 4
  655.                  )
  656.              )
  657.             sp->cinfo.c.raw_data_in =
  658.               ( (sp->h_sampling = td->td_ycbcrsubsampling[0]) << 3
  659.               | (sp->v_sampling = td->td_ycbcrsubsampling[1])
  660.               ) != 011;
  661.           else
  662.             {
  663.               TIFFError(module,bad_subsampling);
  664.               status = 0;
  665.             };
  666.        /* A ReferenceBlackWhite field MUST be present, since the default value
  667.           is inapproriate for YCbCr.  Fill in the proper value if the
  668.           application didn't set it.
  669.        */
  670.           if (!TIFFFieldSet(tif,FIELD_REFBLACKWHITE))
  671.             { float refbw[6];
  672.               long top = 1L << td->td_bitspersample;
  673.  
  674.               refbw[0] = 0;
  675.               refbw[1] = (float)(top-1L);
  676.               refbw[2] = (float)(top>>1);
  677.               refbw[3] = refbw[1];
  678.               refbw[4] = refbw[2];
  679.               refbw[5] = refbw[1];
  680.               TIFFSetField(tif,TIFFTAG_REFERENCEBLACKWHITE,refbw);
  681.             };
  682.           sp->cinfo.c.jpeg_color_space = JCS_YCbCr;
  683.           if (sp->jpegcolormode == JPEGCOLORMODE_RGB)
  684.             {
  685.               sp->cinfo.c.raw_data_in = FALSE;
  686.               sp->in_color_space = JCS_RGB;
  687.               break;
  688.             };
  689.           goto L2;
  690.         case PHOTOMETRIC_MINISBLACK:
  691.           sp->cinfo.c.jpeg_color_space = JCS_GRAYSCALE;
  692.           goto L1;
  693.         case PHOTOMETRIC_RGB       :
  694.           sp->cinfo.c.jpeg_color_space = JCS_RGB;
  695.           goto L1;
  696.         case PHOTOMETRIC_SEPARATED :
  697.           sp->cinfo.c.jpeg_color_space = JCS_CMYK;
  698.       L1: sp->jpegcolormode = JPEGCOLORMODE_RAW; /* No JPEG Lib. conversion */
  699.       L2: sp->cinfo.d.in_color_space = sp->cinfo.d.jpeg_color-space;
  700.           break;
  701.         default                    :
  702.           TIFFError(module,bad_photometry,td->td_photometric);
  703.           status = 0;
  704.       };
  705.     tif->tif_encoderow = tif->tif_encodestrip = tif->tif_encodetile =
  706.       sp->cinfo.c.raw_data_in ? OJPEGEncodeRaw : OJPEGEncode;
  707.     if (isTiled(tif))
  708.       { tsize_t size;
  709. #       ifdef C_LOSSLESS_SUPPORTED
  710.         if ((size = sp->v_sampling*sp->cinfo.c.data_unit) < 16) size = 16;
  711. #       else
  712.         if ((size = sp->v_sampling*DCTSIZE) < 16) size = 16;
  713. #       endif
  714.         if ((segment_height = td->td_tilelength) % size)
  715.           {
  716.             TIFFError(module,"JPEG tile height must be multiple of %d",size);
  717.             status = 0;
  718.           };
  719. #       ifdef C_LOSSLESS_SUPPORTED
  720.         if ((size = sp->h_sampling*sp->cinfo.c.data_unit) < 16) size = 16;
  721. #       else
  722.         if ((size = sp->h_sampling*DCTSIZE) < 16) size = 16;
  723. #       endif
  724.         if ((segment_width = td->td_tilewidth) % size)
  725.           {
  726.             TIFFError(module,"JPEG tile width must be multiple of %d",size);
  727.             status = 0;
  728.           };
  729.         sp->bytesperline = TIFFTileRowSize(tif);
  730.       }
  731.     else
  732.       { tsize_t size;
  733. #       ifdef C_LOSSLESS_SUPPORTED
  734.         if ((size = sp->v_sampling*sp->cinfo.c.data_unit) < 16) size = 16;
  735. #       else
  736.         if ((size = sp->v_sampling*DCTSIZE) < 16) size = 16;
  737. #       endif
  738.         if (td->td_rowsperstrip < (segment_height = td->td_imagelength))
  739.           {
  740.             if (td->td_rowsperstrip % size)
  741.               {
  742.                 TIFFError(module,"JPEG RowsPerStrip must be multiple of %d",size);
  743.                 status = 0;
  744.               };
  745.             segment_height = td->td_rowsperstrip;
  746.           };
  747.         segment_width = td->td_imagewidth;
  748.         sp->bytesperline = tif->tif_scanlinesize;
  749.       };
  750.     if (segment_width > 65535 || segment_height > 65535)
  751.       {
  752.         TIFFError(module,"Strip/tile too large for JPEG");
  753.         status = 0;
  754.       };
  755.  /* Initialize all JPEG parameters to default values.  Note that the JPEG
  756.     Library's "jpeg_set_defaults()" method needs legal values for the
  757.     "in_color_space" and "input_components" fields.
  758.  */
  759.     sp->cinfo.c.input_components = 1; /* Default for JCS_UNKNOWN */
  760.     if (!CALLVJPEG(sp,jpeg_set_defaults(&sp->cinfo.c))) status = 0;
  761.     switch (sp->jpegtablesmode & (JPEGTABLESMODE_HUFF|JPEGTABLESMODE_QUANT))
  762.       { register JHUFF_TBL *htbl;
  763.         register JQUANT_TBL *qtbl;
  764.         case 0                                       :
  765.           sp->cinfo.c.optimize_coding = TRUE;
  766.         case JPEGTABLESMODE_HUFF                     :
  767.           if (!CALLVJPEG(sp,jpeg_set_quality(&sp->cinfo.c,sp->jpegquality,FALSE)))
  768.             return 0;
  769.           if (qtbl = sp->cinfo.c.quant_tbl_ptrs[0]) qtbl->sent_table = FALSE;
  770.           if (qtbl = sp->cinfo.c.quant_tbl_ptrs[1]) qtbl->sent_table = FALSE;
  771.           goto L3;
  772.         case JPEGTABLESMODE_QUANT                    :
  773.           sp->cinfo.c.optimize_coding = TRUE;
  774.        /* We do not support application-supplied JPEG tables, so mark the field
  775.           "not present".
  776.        */
  777.       L3: TIFFClrFieldBit(tif,FIELD_JPEGTABLES);
  778.           break;
  779.         case JPEGTABLESMODE_HUFF|JPEGTABLESMODE_QUANT:
  780.           if (   !CALLVJPEG(sp,jpeg_set_quality(&sp->cinfo.c,sp->jpegquality,FALSE))
  781.               || !CALLVJPEG(sp,jpeg_suppress_tables(&sp->cinfo.c,TRUE))
  782.              )
  783.             {
  784.               status = 0;
  785.               break;
  786.             };
  787.           if (qtbl = sp->cinfo.c.quant_tbl_ptrs[0]) qtbl->sent_table = FALSE;
  788.           if (htbl = sp->cinfo.c.dc_huff_tbl_ptrs[0]) htbl->sent_table = FALSE;
  789.           if (htbl = sp->cinfo.c.ac_huff_tbl_ptrs[0]) htbl->sent_table = FALSE;
  790.           if (sp->cinfo.c.jpeg_color_space == JCS_YCbCr)
  791.             {
  792.               if (qtbl = sp->cinfo.c.quant_tbl_ptrs[1])
  793.                 qtbl->sent_table = FALSE;
  794.               if (htbl = sp->cinfo.c.dc_huff_tbl_ptrs[1])
  795.                 htbl->sent_table = FALSE;
  796.               if (htbl = sp->cinfo.c.ac_huff_tbl_ptrs[1])
  797.                 htbl->sent_table = FALSE;
  798.             };
  799.           if (   TIFFojpeg_tables_dest(sp,tif)
  800.               && CALLVJPEG(sp,jpeg_write_tables(&sp->cinfo.c))
  801.              )
  802.             {
  803.     
  804.            /* Mark the field "present".  We can't use "TIFFSetField()" because
  805.               "BEENWRITING" is already set!
  806.            */
  807.               TIFFSetFieldBit(tif,FIELD_JPEGTABLES);
  808.               tif->tif_flags |= TIFF_DIRTYDIRECT;
  809.             }
  810.           else status = 0;
  811.       };
  812.     if (   sp->cinfo.c.raw_data_in
  813.         && !alloc_downsampled_buffers(tif,sp->cinfo.c.comp_info,
  814.                                       sp->cinfo.c.num_components)
  815.        ) status = 0;
  816.     if (status == 0) return 0; /* If TIFF errors, don't bother to continue */
  817.  /* Grab parameters that are same for all strips/tiles. */
  818.     sp->dest.init_destination = std_init_destination;
  819.     sp->dest.empty_output_buffer = std_empty_output_buffer;
  820.     sp->dest.term_destination = std_term_destination;
  821.     sp->cinfo.c.dest = &sp->dest;
  822.     sp->cinfo.c.data_precision = td->td_bitspersample;
  823.     sp->cinfo.c.write_JFIF_header = /* Don't write extraneous markers */
  824.     sp->cinfo.c.write_Adobe_marker = FALSE;
  825.     sp->cinfo.c.image_width = segment_width;
  826.     sp->cinfo.c.image_height = segment_height;
  827.     sp->cinfo.c.comp_info[0].h_samp_factor =
  828.     sp->cinfo.c.comp_info[0].v_samp_factor = 1;
  829.     return CALLVJPEG(sp,jpeg_start_compress(&sp->cinfo.c,FALSE));
  830. #   undef td
  831.   }
  832. static int
  833. OJPEGPreEncode(register TIFF *tif,tsample_t s)
  834.   { register OJPEGState *sp = OJState(tif);
  835. #   define td (&tif->tif_dir)
  836.  /* If we are about to write the first row of an image plane, which should
  837.     coincide with a JPEG "scan", reset the JPEG Library's compressor.  Otherwise
  838.     let the compressor run "as is" and return a "success" status without further
  839.     ado.
  840.  */
  841.     if (     (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip)
  842.            % td->td_stripsperimage
  843.         == 0
  844.        )
  845.       {
  846.         if (   (sp->cinfo.c.comp_info[0].component_id = s) == 1)
  847.             && sp->cinfo.c.jpeg_color_space == JCS_YCbCr
  848.            )
  849.           {
  850.             sp->cinfo.c.comp_info[0].quant_tbl_no =
  851.             sp->cinfo.c.comp_info[0].dc_tbl_no =
  852.             sp->cinfo.c.comp_info[0].ac_tbl_no = 1;
  853.             sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling;
  854.             sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling;
  855.     
  856.          /* Scale expected strip/tile size to match a downsampled component. */
  857.     
  858.             sp->cinfo.c.image_width = TIFFhowmany(segment_width,sp->h_sampling);
  859.             sp->cinfo.c.image_height=TIFFhowmany(segment_height,sp->v_sampling);
  860.           };
  861.         sp->scancount = 0; /* Mark subsampling buffer(s) empty */
  862.       };
  863.     return 1;
  864. #   undef td
  865.   }
  866. static int
  867. OJPEGPostEncode(register TIFF *tif)
  868.   { register OJPEGState *sp = OJState(tif);
  869.  /* Finish up at the end of a strip or tile. */
  870.     if (sp->scancount > 0) /* emit partial buffer of down-sampled data */
  871.       { JDIMENSION n;
  872. #       ifdef C_LOSSLESS_SUPPORTED
  873.         if (   sp->scancount < sp->cinfo.c.data_unit
  874.             && sp->cinfo.c.num_components > 0
  875.            )
  876. #       else
  877.         if (sp->scancount < DCTSIZE && sp->cinfo.c.num_components > 0)
  878. #       endif
  879.           { int ci = 0,                            /* Pad the data vertically */
  880. #           ifdef C_LOSSLESS_SUPPORTED
  881.                 size = sp->cinfo.c.data_unit;
  882. #           else
  883.                 size = DCTSIZE;
  884. #           endif
  885.             register jpeg_component_info *compptr = sp->cinfo.c.comp_info;
  886.             do
  887. #              ifdef C_LOSSLESS_SUPPORTED
  888.                { tsize_t row_width = compptr->width_in_data_units
  889. #              else
  890.                  tsize_t row_width = compptr->width_in_blocks
  891. #              endif
  892.                    *size*sizeof(JSAMPLE);
  893.                  int ypos = sp->scancount*compptr->v_samp_factor;
  894.                  do _TIFFmemcpy( (tdata_t)sp->ds_buffer[ci][ypos]
  895.                                , (tdata_t)sp->ds_buffer[ci][ypos-1]
  896.                                , row_width
  897.                                );
  898.                  while (++ypos < compptr->v_samp_factor*size);
  899.                }
  900.             while (++compptr,++ci < sp->cinfo.c.num_components);
  901.           };
  902.         n = sp->cinfo.c.max_v_samp_factor*size;
  903.         if (CALLJPEG(sp,-1,jpeg_write_raw_data(&sp->cinfo.c,sp->ds_buffer,n)) != n)
  904.           return 0;
  905.       };
  906.     return CALLVJPEG(sp,jpeg_finish_compress(&sp->cinfo.c));
  907.   }
  908. #endif /* never */
  909. /* JPEG Decoding begins here. */
  910. /*ARGSUSED*/ static int
  911. OJPEGDecode(register TIFF *tif,tidata_t buf,tsize_t cc,tsample_t s)
  912.   { tsize_t bytesperline = isTiled(tif)
  913.                          ? TIFFTileRowSize(tif)
  914.                          : tif->tif_scanlinesize,
  915.             rows;                          /* No. of unprocessed rows in file */
  916.     register OJPEGState *sp = OJState(tif);
  917.  /* Decode a chunk of pixels, where the input data has not NOT been down-
  918.     sampled, or else the TIFF Library's client has used the "JPEGColorMode" TIFF
  919.     pseudo-tag to request that the JPEG Library do color-space conversion; this
  920.     is the normal case.  The data is expected to be read in scan-line multiples,
  921.     and this subroutine is called for both pixel-interleaved and separate color
  922.     planes.
  923.     WARNING:  Unlike "OJPEGDecodeRawContig()", below, the no. of Bytes in each
  924.               decoded row is calculated here as "bytesperline" instead of
  925.     using "sp->bytesperline", which might be a little smaller.  This can
  926.     occur for an old tiled image whose width isn't a multiple of 8 pixels.
  927.     That's illegal according to the TIFF Version 6 specification, but some
  928.     test files, like "zackthecat.tif", were built that way.  In those cases,
  929.     we want to embed the image's true width in our caller's buffer (which is
  930.     presumably allocated according to the expected tile width) by
  931.     effectively "padding" it with unused Bytes at the end of each row.
  932.  */
  933.     if ( (cc /= bytesperline)      /* No. of complete rows in caller's buffer */
  934.        > (rows = sp->cinfo.d.output_height - sp->cinfo.d.output_scanline)
  935.        ) cc = rows;
  936.     while (--cc >= 0)
  937.       {
  938.         if (   CALLJPEG(sp,-1,jpeg_read_scanlines(&sp->cinfo.d,(JSAMPARRAY)&buf,1))
  939.             != 1
  940.            ) return 0;
  941.         buf += bytesperline;
  942.         ++tif->tif_row;
  943.       };
  944.  /* BEWARE OF KLUDGE:  If our input file was produced by Microsoft's Wang
  945.                        Imaging for Windows application, the DC coefficients of
  946.     each JPEG image component (Y,Cb,Cr) must be reset at the end of each TIFF
  947.     "strip", and any JPEG data bits remaining in the current Byte of the
  948.     decoder's input buffer must be discarded.  To do so, we create an "ad hoc"
  949.     interface in the "jdhuff.c" module of IJG JPEG Library Version 6 (module
  950.     "jdshuff.c", if Ken Murchison's lossless-Huffman patch is applied), and we
  951.     invoke that interface here after decoding each "strip".
  952.  */
  953.     if (sp->is_WANG) jpeg_reset_huff_decode(&sp->cinfo.d);
  954.     return 1;
  955.   }
  956. /*ARGSUSED*/ static int
  957. OJPEGDecodeRawContig(register TIFF *tif,tidata_t buf,tsize_t cc,tsample_t s)
  958.   { tsize_t rows;                          /* No. of unprocessed rows in file */
  959.     JDIMENSION lines_per_MCU, size;
  960.     register OJPEGState *sp = OJState(tif);
  961.  /* Decode a chunk of pixels, where the input data has pixel-interleaved color
  962.     planes, some of which have been down-sampled, but the TIFF Library's client
  963.     has NOT used the "JPEGColorMode" TIFF pseudo-tag to request that the JPEG
  964.     Library do color-space conversion.  In other words, we must up-sample/
  965.     expand/duplicate image components according to the image's sampling factors,
  966.     without changing its color space.  The data is expected to be read in scan-
  967.     line multiples.
  968.  */
  969.     if ( (cc /= sp->bytesperline)  /* No. of complete rows in caller's buffer */
  970.        > (rows = sp->cinfo.d.output_height - sp->cinfo.d.output_scanline)
  971.        ) cc = rows;
  972.     lines_per_MCU = sp->cinfo.d.max_v_samp_factor
  973. #   ifdef D_LOSSLESS_SUPPORTED
  974.                   * (size = sp->cinfo.d.min_codec_data_unit);
  975. #   else
  976.                   * (size = DCTSIZE);
  977. #   endif
  978.     while (--cc >= 0)
  979.       { int clumpoffset, ci;
  980.         register jpeg_component_info *compptr;
  981.         if (sp->scancount >= size) /* reload downsampled-data buffers */
  982.           {
  983.             if (   CALLJPEG(sp,-1,jpeg_read_raw_data(&sp->cinfo.d,sp->ds_buffer,lines_per_MCU))
  984.                 != lines_per_MCU
  985.                ) return 0;
  986.             sp->scancount = 0;
  987.           };
  988.      /* The fastest way to separate the data is: make 1 pass over the scan
  989.         line for each row of each component.
  990.      */
  991.         clumpoffset = ci = 0;
  992.         compptr = sp->cinfo.d.comp_info;
  993.         do
  994.           { int ypos = 0;
  995.             if (compptr->h_samp_factor == 1) /* fast path */
  996.               do
  997.                 { register JSAMPLE *inptr =
  998.                     sp->ds_buffer[ci][sp->scancount*compptr->v_samp_factor+ypos],
  999.                                    *outptr = (JSAMPLE *)buf + clumpoffset;
  1000.                   register int clumps_per_line = compptr->downsampled_width;
  1001.                   do *outptr = *inptr++;
  1002.                   while ((outptr += sp->samplesperclump),--clumps_per_line > 0);
  1003.                 }
  1004.               while ( (clumpoffset += compptr->h_samp_factor)
  1005.                     , ++ypos < compptr->v_samp_factor
  1006.                     );
  1007.             else /* general case */
  1008.               do
  1009.                 { register JSAMPLE *inptr =
  1010.                     sp->ds_buffer[ci][sp->scancount*compptr->v_samp_factor+ypos],
  1011.                                    *outptr = (JSAMPLE *)buf + clumpoffset;
  1012.                   register int clumps_per_line = compptr->downsampled_width;
  1013.                   do
  1014.                     { register int xpos = 0;
  1015.                       do outptr[xpos] = *inptr++;
  1016.                       while (++xpos < compptr->h_samp_factor);
  1017.                     }
  1018.                   while ((outptr += sp->samplesperclump),--clumps_per_line > 0);
  1019.                 }
  1020.               while ( (clumpoffset += compptr->h_samp_factor)
  1021.                     , ++ypos < compptr->v_samp_factor
  1022.                     );
  1023.           }
  1024.         while (++compptr,++ci < sp->cinfo.d.num_components);
  1025.         ++sp->scancount;
  1026.         buf += sp->bytesperline;
  1027.         ++tif->tif_row;
  1028.       };
  1029.  /* BEWARE OF KLUDGE:  If our input file was produced by Microsoft's Wang
  1030.                        Imaging for Windows application, the DC coefficients of
  1031.     each JPEG image component (Y,Cb,Cr) must be reset at the end of each TIFF
  1032.     "strip", and any JPEG data bits remaining in the current Byte of the
  1033.     decoder's input buffer must be discarded.  To do so, we create an "ad hoc"
  1034.     interface in the "jdhuff.c" module of IJG JPEG Library Version 6 (module
  1035.     "jdshuff.c", if Ken Murchison's lossless-Huffman patch is applied), and we
  1036.     invoke that interface here after decoding each "strip".
  1037.  */
  1038.     if (sp->is_WANG) jpeg_reset_huff_decode(&sp->cinfo.d);
  1039.     return 1;
  1040.   }
  1041. /*ARGSUSED*/ static int
  1042. OJPEGDecodeRawSeparate(TIFF *tif,register tidata_t buf,tsize_t cc,tsample_t s)
  1043.   { tsize_t rows;                          /* No. of unprocessed rows in file */
  1044.     JDIMENSION lines_per_MCU,
  1045.                size,                                             /* ...of MCU */
  1046.                v;                   /* Component's vertical up-sampling ratio */
  1047.     register OJPEGState *sp = OJState(tif);
  1048.     register jpeg_component_info *compptr = sp->cinfo.d.comp_info + s;
  1049.  /* Decode a chunk of pixels, where the input data has separate color planes,
  1050.     some of which have been down-sampled, but the TIFF Library's client has NOT
  1051.     used the "JPEGColorMode" TIFF pseudo-tag to request that the JPEG Library
  1052.     do color-space conversion.  The data is expected to be read in scan-line
  1053.     multiples.
  1054.  */
  1055.     v = sp->cinfo.d.max_v_samp_factor/compptr->v_samp_factor;
  1056.     if ( (cc /= compptr->downsampled_width) /* No. of rows in caller's buffer */
  1057.        > (rows = (sp->cinfo.d.output_height-sp->cinfo.d.output_scanline+v-1)/v)
  1058.        ) cc = rows; /* No. of rows of "clumps" to read */
  1059.     lines_per_MCU = sp->cinfo.d.max_v_samp_factor
  1060. #   ifdef D_LOSSLESS_SUPPORTED
  1061.                   * (size = sp->cinfo.d.min_codec_data_unit);
  1062. #   else
  1063.                   * (size = DCTSIZE);
  1064. #   endif
  1065.  L: if (sp->scancount >= size) /* reload downsampled-data buffers */
  1066.       {
  1067.         if (   CALLJPEG(sp,-1,jpeg_read_raw_data(&sp->cinfo.d,sp->ds_buffer,lines_per_MCU))
  1068.             != lines_per_MCU
  1069.            ) return 0;
  1070.         sp->scancount = 0;
  1071.       };
  1072.     rows = 0;
  1073.     do
  1074.       { register JSAMPLE *inptr =
  1075.           sp->ds_buffer[s][sp->scancount*compptr->v_samp_factor + rows];
  1076.         register int clumps_per_line = compptr->downsampled_width;
  1077.         do *buf++ = *inptr++; while (--clumps_per_line > 0); /* Copy scanline */
  1078.         tif->tif_row += v;
  1079.         if (--cc <= 0) return 1; /* End of caller's buffer? */
  1080.       }
  1081.     while (++rows < compptr->v_samp_factor);
  1082.     ++sp->scancount;
  1083.     goto L;
  1084.   }
  1085. /* "OJPEGSetupDecode()" temporarily forces the JPEG Library to use the following
  1086.    subroutine as a "dummy" input reader in order to fool the library into
  1087.    thinking that it has read the image's first "Start of Scan" (SOS) marker, so
  1088.    that it initializes accordingly.
  1089. */
  1090. /*ARGSUSED*/ METHODDEF(int)
  1091. fake_SOS_marker(j_decompress_ptr cinfo){return JPEG_REACHED_SOS;}
  1092. /*ARGSUSED*/ METHODDEF(int)
  1093. suspend(j_decompress_ptr cinfo){return JPEG_SUSPENDED;}
  1094. /* The JPEG Library's "null" color-space converter actually re-packs separate
  1095.    color planes (it's native image representation) into a pixel-interleaved,
  1096.    contiguous plane.  But if our TIFF Library client is tryng to process a
  1097.    PLANARCONFIG_SEPARATE image, we don't want that; so here are modifications of
  1098.    code in the JPEG Library's "jdcolor.c" file, which simply copy Bytes to a
  1099.    color plane specified by the current JPEG "scan".
  1100. */
  1101. METHODDEF(void)
  1102. ycc_rgb_convert(register j_decompress_ptr cinfo,JSAMPIMAGE in,JDIMENSION row,
  1103.                 register JSAMPARRAY out,register int nrows)
  1104.   { typedef struct                /* "jdcolor.c" color-space conversion state */
  1105.       {
  1106.      /* WARNING:  This declaration is ugly and dangerous!  It's supposed to be
  1107.                   private to the JPEG Library's "jdcolor.c" module, but we also
  1108.         need it here.  Since the library's copy might change without notice, be
  1109.         sure to keep this one synchronized or the following code will break!
  1110.      */
  1111.         struct jpeg_color_deconverter pub; /* Public fields */
  1112.      /* Private state for YCC->RGB conversion */
  1113.         int *Cr_r_tab,   /* ->Cr to R conversion table */
  1114.             *Cb_b_tab;   /* ->Cb to B conversion table */
  1115.         INT32 *Cr_g_tab, /* ->Cr to G conversion table */
  1116.               *Cb_g_tab; /* ->Cb to G conversion table */
  1117.       } *my_cconvert_ptr;
  1118.     my_cconvert_ptr cconvert = (my_cconvert_ptr)cinfo->cconvert;
  1119.     JSAMPARRAY irow0p = in[0] + row;
  1120.     register JSAMPLE *range_limit = cinfo->sample_range_limit;
  1121.     register JSAMPROW outp, Y;
  1122.     switch (cinfo->output_scan_number - 1)
  1123.       { JSAMPARRAY irow1p, irow2p;
  1124.         register INT32 *table0, *table1;
  1125.         SHIFT_TEMPS
  1126.         case RGB_RED  : irow2p = in[2] + row;
  1127.                         table0 = (INT32 *)cconvert->Cr_r_tab;
  1128.                         while (--nrows >= 0)
  1129.                           { register JSAMPROW Cr = *irow2p++;
  1130.                              register int i = cinfo->output_width;
  1131.                              Y = *irow0p++;
  1132.                              outp = *out++;
  1133.                              while (--i >= 0)
  1134.                                *outp++ = range_limit[*Y++ + table0[*Cr++]];
  1135.                           };
  1136.                         return;
  1137.         case RGB_GREEN: irow1p = in[1] + row;
  1138.                         irow2p = in[2] + row;
  1139.                         table0 = cconvert->Cb_g_tab;
  1140.                         table1 = cconvert->Cr_g_tab;
  1141.                         while (--nrows >= 0)
  1142.                           { register JSAMPROW Cb = *irow1p++,
  1143.                                               Cr = *irow2p++;
  1144.                              register int i = cinfo->output_width;
  1145.                              Y = *irow0p++;
  1146.                              outp = *out++;
  1147.                              while (--i >= 0)
  1148.                                *outp++ =
  1149.                                  range_limit[ *Y++
  1150.                                             + RIGHT_SHIFT(table0[*Cb++]+table1[*Cr++],16)
  1151.                                             ];
  1152.                           };
  1153.                         return;
  1154.         case RGB_BLUE : irow1p = in[1] + row;
  1155.                         table0 = (INT32 *)cconvert->Cb_b_tab;
  1156.                         while (--nrows >= 0)
  1157.                           { register JSAMPROW Cb = *irow1p++;
  1158.                              register int i = cinfo->output_width;
  1159.                              Y = *irow0p++;
  1160.                              outp = *out++;
  1161.                              while (--i >= 0)
  1162.                                *outp++ = range_limit[*Y++ + table0[*Cb++]];
  1163.                           }
  1164.       }
  1165.   }
  1166. METHODDEF(void)
  1167. null_convert(register j_decompress_ptr cinfo,JSAMPIMAGE in,JDIMENSION row,
  1168.              register JSAMPARRAY out,register int nrows)
  1169.   { register JSAMPARRAY irowp = in[cinfo->output_scan_number - 1] + row;
  1170.     while (--nrows >= 0) _TIFFmemcpy(*out++,*irowp++,cinfo->output_width);
  1171.   }
  1172. static int
  1173. OJPEGSetupDecode(register TIFF *tif)
  1174.   { static char module[]={"OJPEGSetupDecode"};
  1175.     J_COLOR_SPACE jpeg_color_space,   /* Color space of JPEG-compressed image */
  1176.                   out_color_space;       /* Color space of decompressed image */
  1177.     uint32 segment_width;
  1178.     int status = 1;                              /* Assume success by default */
  1179.     boolean downsampled_output=FALSE, /* <=> Want JPEG Library's "raw" image? */
  1180.             is_JFIF;                                       /* <=> JFIF image? */
  1181.     register OJPEGState *sp = OJState(tif);
  1182. #   define td (&tif->tif_dir)
  1183.  /* Verify miscellaneous parameters.  This will need work if the TIFF Library
  1184.     ever supports different depths for different components, or if the JPEG
  1185.     Library ever supports run-time depth selection.  Neither seems imminent.
  1186.  */
  1187.     if (td->td_bitspersample != sp->cinfo.d.data_precision)
  1188.       {
  1189.         TIFFError(module,bad_bps,td->td_bitspersample);
  1190.         status = 0;
  1191.       };
  1192.  /* The TIFF Version 6.0 specification and IJG JPEG Library accept different
  1193.     sets of color spaces, so verify that our image belongs to the common subset
  1194.     and map its photometry code, then initialize to handle subsampling and
  1195.     optional JPEG Library YCbCr <-> RGB color-space conversion.
  1196.  */
  1197.     switch (td->td_photometric)
  1198.       {
  1199.         case PHOTOMETRIC_YCBCR     :
  1200.        /* ISO IS 10918-1 requires that JPEG subsampling factors be 1-4, but
  1201.           TIFF Version 6.0 is more restrictive: only 1, 2, and 4 are allowed.
  1202.        */
  1203.           if (   (   td->td_ycbcrsubsampling[0] == 1
  1204.                   || td->td_ycbcrsubsampling[0] == 2
  1205.                   || td->td_ycbcrsubsampling[0] == 4
  1206.                  )
  1207.               && (   td->td_ycbcrsubsampling[1] == 1
  1208.                   || td->td_ycbcrsubsampling[1] == 2
  1209.                   || td->td_ycbcrsubsampling[1] == 4
  1210.                  )
  1211.              )
  1212.             downsampled_output =
  1213.               (
  1214.                 (sp->h_sampling = td->td_ycbcrsubsampling[0]) << 3
  1215.               | (sp->v_sampling = td->td_ycbcrsubsampling[1])
  1216.               ) != 011;
  1217.           else
  1218.             {
  1219.               TIFFError(module,bad_subsampling);
  1220.               status = 0;
  1221.             };
  1222.           jpeg_color_space = JCS_YCbCr;
  1223.           if (sp->jpegcolormode == JPEGCOLORMODE_RGB)
  1224.             {
  1225.               downsampled_output = FALSE;
  1226.               out_color_space = JCS_RGB;
  1227.               break;
  1228.             };
  1229.           goto L2;
  1230.         case PHOTOMETRIC_MINISBLACK:
  1231.           jpeg_color_space = JCS_GRAYSCALE;
  1232.           goto L1;
  1233.         case PHOTOMETRIC_RGB       :
  1234.           jpeg_color_space = JCS_RGB;
  1235.           goto L1;
  1236.         case PHOTOMETRIC_SEPARATED :
  1237.           jpeg_color_space = JCS_CMYK;
  1238.       L1: sp->jpegcolormode = JPEGCOLORMODE_RAW; /* No JPEG Lib. conversion */
  1239.       L2: out_color_space = jpeg_color_space;
  1240.           break;
  1241.         default                    :
  1242.           TIFFError(module,bad_photometry,td->td_photometric);
  1243.           status = 0;
  1244.       };
  1245.     if (status == 0) return 0; /* If TIFF errors, don't bother to continue */
  1246.  /* Set parameters that are same for all strips/tiles. */
  1247.     sp->cinfo.d.src = &sp->src;
  1248.     sp->src.init_source = std_init_source;
  1249.     sp->src.fill_input_buffer = std_fill_input_buffer;
  1250.     sp->src.skip_input_data = std_skip_input_data;
  1251.     sp->src.resync_to_restart = jpeg_resync_to_restart;
  1252.     sp->src.term_source = std_term_source;
  1253.  /* BOGOSITY ALERT!  The Wang Imaging application for Microsoft Windows produces
  1254.                      images containing "JPEGInterchangeFormat[Length]" TIFF
  1255.     records that resemble JFIF-in-TIFF encapsulations but, in fact, violate the
  1256.     TIFF Version 6 specification in several ways; nevertheless, we try to handle
  1257.     them gracefully because there are apparently a lot of them around.  The
  1258.     purported "JFIF" data stream in one of these files vaguely resembles a JPEG
  1259.     "tables only" data stream, except that there's no trailing EOI marker.  The
  1260.     rest of the JPEG data stream lies in a discontiguous file region, identified
  1261.     by the 0th Strip offset (which is *also* illegal!), where it begins with an
  1262.     SOS marker and apparently continues to the end of the file.  There is no
  1263.     trailing EOI marker here, either.
  1264.  */
  1265.     is_JFIF = !sp->is_WANG && TIFFFieldSet(tif,FIELD_JPEGIFOFFSET);
  1266.  /* Initialize decompression parameters that won't be overridden by JPEG Library
  1267.     defaults set during the "jpeg_read_header()" call, below.
  1268.  */
  1269.     segment_width = td->td_imagewidth;
  1270.     if (isTiled(tif))
  1271.       {
  1272.         if (sp->is_WANG) /* we don't know how to handle it */
  1273.           {
  1274.             TIFFError(module,"Tiled Wang image not supported");
  1275.             return 0;
  1276.           };
  1277.      /* BOGOSITY ALERT!  "TIFFTileRowSize()" seems to work fine for modern JPEG-
  1278.                          in-TIFF encapsulations where the image width--like the
  1279.         tile width--is a multiple of 8 or 16 pixels.  But image widths and
  1280.         heights are aren't restricted to 8- or 16-bit multiples, and we need
  1281.         the exact Byte count of decompressed scan lines when we call the JPEG
  1282.         Library.  At least one old file ("zackthecat.tif") in the TIFF Library
  1283.         test suite has widths and heights slightly less than the tile sizes, and
  1284.         it apparently used the bogus computation below to determine the number
  1285.         of Bytes per scan line (was this due to an old, broken version of
  1286.         "TIFFhowmany()"?).  Before we get here, "OJPEGSetupDecode()" verified
  1287.         that our image uses 8-bit samples, so the following check appears to
  1288.         return the correct answer in all known cases tested to date.
  1289.      */
  1290.         if (is_JFIF || (segment_width & 7) == 0)
  1291.           sp->bytesperline = TIFFTileRowSize(tif); /* Normal case */
  1292.         else
  1293.           {
  1294.             /* Was the file-encoder's segment-width calculation bogus? */
  1295.             segment_width = (segment_width/sp->h_sampling + 1) * sp->h_sampling;
  1296.             sp->bytesperline = segment_width * td->td_samplesperpixel;
  1297.           }
  1298.       }
  1299.     else sp->bytesperline = TIFFVStripSize(tif,1);
  1300.  /* BEWARE OF KLUDGE:  If we have JPEG Interchange File Format (JFIF) image,
  1301.                        then we want to read "metadata" in the bit-stream's
  1302.     header and validate it against corresponding information in TIFF records.
  1303.     But if we have a *really old* JPEG file that's not JFIF, then we simply
  1304.     assign TIFF-record values to JPEG Library variables without checking.
  1305.  */
  1306.     if (is_JFIF) /* JFIF image */
  1307.       { unsigned char *end_of_data;
  1308.         int subsampling_factors;
  1309.         register unsigned char *p;
  1310.         register int i;
  1311.      /* WARNING:  Although the image file contains a JFIF bit stream, it might
  1312.                   also contain some old TIFF records causing "OJPEGVSetField()"
  1313.         to have allocated quantization or Huffman decoding tables.  But when the
  1314.         JPEG Library reads and parses the JFIF header below, it reallocate these
  1315.         tables anew without checking for "dangling" pointers, thereby causing a
  1316.         memory "leak".  We have enough information to potentially deallocate the
  1317.         old tables here, but unfortunately JPEG Library Version 6B uses a "pool"
  1318.         allocator for small objects, with no deallocation procedure; instead, it
  1319.         reclaims a whole pool when an image is closed/destroyed, so well-behaved
  1320.         TIFF client applications (i.e., those which close their JPEG images as
  1321.         soon as they're no longer needed) will waste memory for a short time but
  1322.         recover it eventually.  But ill-behaved TIFF clients (i.e., those which
  1323.         keep many JPEG images open gratuitously) can exhaust memory prematurely.
  1324.         If the JPEG Library ever implements a deallocation procedure, insert
  1325.         this clean-up code:
  1326.      */
  1327. #       ifdef someday
  1328.         if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) /* free quant. tables */
  1329.           { register int i = 0;
  1330.             do
  1331.               { register JQUANT_TBL *q;
  1332.                 if (q = sp->cinfo.d.quant_tbl_ptrs[i])
  1333.                   {
  1334.                     jpeg_free_small(&sp->cinfo.comm,q,sizeof *q);
  1335.                     sp->cinfo.d.quant_tbl_ptrs[i] = 0;
  1336.                   }
  1337.               }
  1338.             while (++i < NUM_QUANT_TBLS);
  1339.           };
  1340.         if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) /* free Huffman tables */
  1341.           { register int i = 0;
  1342.             do
  1343.               { register JHUFF_TBL *h;
  1344.                 if (h = sp->cinfo.d.dc_huff_tbl_ptrs[i])
  1345.                   {
  1346.                     jpeg_free_small(&sp->cinfo.comm,h,sizeof *h);
  1347.                     sp->cinfo.d.dc_huff_tbl_ptrs[i] = 0;
  1348.                   };
  1349.                 if (h = sp->cinfo.d.ac_huff_tbl_ptrs[i])
  1350.                   {
  1351.                     jpeg_free_small(&sp->cinfo.comm,h,sizeof *h);
  1352.                     sp->cinfo.d.ac_huff_tbl_ptrs[i] = 0;
  1353.                   }
  1354.               }
  1355.             while (++i < NUM_HUFF_TBLS);
  1356.           };
  1357. #       endif /* someday */
  1358.      /* Since we might someday wish to try rewriting "old format" JPEG-in-TIFF
  1359.         encapsulations in "new format" files, try to synthesize the value of a
  1360.         modern "JPEGTables" TIFF record by scanning the JPEG data from just past
  1361.         the "Start of Information" (SOI) marker until something other than a
  1362.         legitimate "table" marker is found, as defined in ISO IS 10918-1
  1363.         Appending B.2.4; namely:
  1364.         -- Define Quantization Table (DQT)
  1365.         -- Define Huffman Table (DHT)
  1366.         -- Define Arithmetic Coding table (DAC)
  1367.         -- Define Restart Interval (DRI)
  1368.         -- Comment (COM)
  1369.         -- Application data (APPn)
  1370.         For convenience, we also accept "Expansion" (EXP) markers, although they
  1371.         are apparently not a part of normal "table" data.
  1372.      */
  1373.         sp->jpegtables = p = (unsigned char *)sp->src.next_input_byte;
  1374.         end_of_data = p + sp->src.bytes_in_buffer;
  1375.         p += 2;
  1376.         while (p < end_of_data && p[0] == 0xFF)
  1377.           switch (p[1])
  1378.             {
  1379.               default  : goto L;
  1380.               case 0xC0: /* SOF0  */
  1381.               case 0xC1: /* SOF1  */
  1382.               case 0xC2: /* SOF2  */
  1383.               case 0xC3: /* SOF3  */
  1384.               case 0xC4: /* DHT   */
  1385.               case 0xC5: /* SOF5  */
  1386.               case 0xC6: /* SOF6  */
  1387.               case 0xC7: /* SOF7  */
  1388.               case 0xC9: /* SOF9  */
  1389.               case 0xCA: /* SOF10 */
  1390.               case 0xCB: /* SOF11 */
  1391.               case 0xCC: /* DAC   */
  1392.               case 0xCD: /* SOF13 */
  1393.               case 0xCE: /* SOF14 */
  1394.               case 0xCF: /* SOF15 */
  1395.               case 0xDB: /* DQT   */
  1396.               case 0xDD: /* DRI   */
  1397.               case 0xDF: /* EXP   */
  1398.               case 0xE0: /* APP0  */
  1399.               case 0xE1: /* APP1  */
  1400.               case 0xE2: /* APP2  */
  1401.               case 0xE3: /* APP3  */
  1402.               case 0xE4: /* APP4  */
  1403.               case 0xE5: /* APP5  */
  1404.               case 0xE6: /* APP6  */
  1405.               case 0xE7: /* APP7  */
  1406.               case 0xE8: /* APP8  */
  1407.               case 0xE9: /* APP9  */
  1408.               case 0xEA: /* APP10 */
  1409.               case 0xEB: /* APP11 */
  1410.               case 0xEC: /* APP12 */
  1411.               case 0xED: /* APP13 */
  1412.               case 0xEE: /* APP14 */
  1413.               case 0xEF: /* APP15 */
  1414.               case 0xFE: /* COM   */
  1415.                          p += (p[2] << 8 | p[3]) + 2;
  1416.             };
  1417.      L: if (p - (unsigned char *)sp->jpegtables > 2) /* fake "JPEGTables" */
  1418.           {
  1419.          /* In case our client application asks, pretend that this image file
  1420.             contains a modern "JPEGTables" TIFF record by copying to a buffer
  1421.             the initial part of the JFIF bit-stream that we just scanned, from
  1422.             the SOI marker through the "metadata" tables, then append an EOI
  1423.             marker and flag the "JPEGTables" TIFF record as "present".
  1424.          */
  1425.             sp->jpegtables_length = p - (unsigned char*)sp->jpegtables + 2;
  1426.             p = sp->jpegtables;
  1427.             if (!(sp->jpegtables = _TIFFmalloc(sp->jpegtables_length)))
  1428.               {
  1429.                 TIFFError(module,no_jtable_space);
  1430.                 return 0;
  1431.               };
  1432.             _TIFFmemcpy(sp->jpegtables,p,sp->jpegtables_length-2);
  1433.             p = (unsigned char *)sp->jpegtables + sp->jpegtables_length;
  1434.             p[-2] = 0xFF; p[-1] = JPEG_EOI; /* Append EOI marker */
  1435.             TIFFSetFieldBit(tif,FIELD_JPEGTABLES);
  1436.             tif->tif_flags |= TIFF_DIRTYDIRECT;
  1437.           }
  1438.         else sp->jpegtables = 0; /* Don't simulate "JPEGTables" */
  1439.         if (   CALLJPEG(sp,-1,jpeg_read_header(&sp->cinfo.d,TRUE))
  1440.             != JPEG_HEADER_OK
  1441.            ) return 0;
  1442.         if (   sp->cinfo.d.image_width  != segment_width
  1443.             || sp->cinfo.d.image_height != td->td_imagelength 
  1444.            )
  1445.           {
  1446.             TIFFError(module,"Improper JPEG strip/tile size");
  1447.             return 0;
  1448.           };
  1449.         if (sp->cinfo.d.num_components != td->td_samplesperpixel)
  1450.           {
  1451.             TIFFError(module,"Improper JPEG component count");
  1452.             return 0;
  1453.           };
  1454.         if (sp->cinfo.d.data_precision != td->td_bitspersample)
  1455.           {
  1456.             TIFFError(module,"Improper JPEG data precision");
  1457.             return 0;
  1458.           };
  1459.      /* Check that JPEG image components all have the same subsampling factors
  1460.         declared (or defaulted) in the TIFF file, since TIFF Version 6.0 is more
  1461.         restrictive than JPEG:  Only the 0th component may have horizontal and
  1462.         vertical subsampling factors other than <1,1>.
  1463.      */
  1464.         subsampling_factors = sp->h_sampling << 3 | sp->v_sampling;
  1465.         i = 0;
  1466.         do
  1467.           {
  1468.             if (   ( sp->cinfo.d.comp_info[i].h_samp_factor << 3
  1469.                    | sp->cinfo.d.comp_info[i].v_samp_factor
  1470.                    )
  1471.                 != subsampling_factors
  1472.                )
  1473.               {
  1474.                 TIFFError(module,"Improper JPEG subsampling factors");
  1475.                 return 0;
  1476.               };
  1477.             subsampling_factors = 011; /* Required for image components > 0 */
  1478.           }
  1479.         while (++i < sp->cinfo.d.num_components);
  1480.       }
  1481.     else /* not JFIF image */
  1482.       { int (*save)(j_decompress_ptr cinfo) = sp->cinfo.d.marker->read_markers;
  1483.         register int i;
  1484.      /* We're not assuming that this file's JPEG bit stream has any header
  1485.         "metadata", so fool the JPEG Library into thinking that we read a
  1486.         "Start of Input" (SOI) marker and a "Start of Frame" (SOFx) marker, then
  1487.         force it to read a simulated "Start of Scan" (SOS) marker when we call
  1488.         "jpeg_read_header()" below.  This should cause the JPEG Library to
  1489.         establish reasonable defaults.
  1490.      */
  1491.         sp->cinfo.d.marker->saw_SOI =       /* Pretend we saw SOI marker */
  1492.         sp->cinfo.d.marker->saw_SOF = TRUE; /* Pretend we saw SOF marker */
  1493.         sp->cinfo.d.marker->read_markers =
  1494.           sp->is_WANG ? suspend : fake_SOS_marker;
  1495.         sp->cinfo.d.global_state = DSTATE_INHEADER;
  1496.         sp->cinfo.d.Se = DCTSIZE2-1; /* Suppress JPEG Library warning */
  1497.         sp->cinfo.d.image_width  = segment_width;
  1498.         sp->cinfo.d.image_height = td->td_imagelength;
  1499.      /* The following color-space initialization, including the complicated
  1500.         "switch"-statement below, essentially duplicates the logic used by the
  1501.         JPEG Library's "jpeg_init_colorspace()" subroutine during compression.
  1502.      */
  1503.         sp->cinfo.d.num_components = td->td_samplesperpixel;
  1504.         sp->cinfo.d.comp_info = (jpeg_component_info *)
  1505.           (*sp->cinfo.d.mem->alloc_small)
  1506.             ( &sp->cinfo.comm
  1507.             , JPOOL_IMAGE
  1508.             , sp->cinfo.d.num_components * sizeof *sp->cinfo.d.comp_info
  1509.             );
  1510.         i = 0;
  1511.         do
  1512.           {
  1513.             sp->cinfo.d.comp_info[i].component_index = i;
  1514.             sp->cinfo.d.comp_info[i].component_needed = TRUE;
  1515.             sp->cinfo.d.cur_comp_info[i] = &sp->cinfo.d.comp_info[i];
  1516.           }
  1517.         while (++i < sp->cinfo.d.num_components);
  1518.         switch (jpeg_color_space)
  1519.           {
  1520.             case JCS_UNKNOWN  :
  1521.               i = 0;
  1522.               do
  1523.                 {
  1524.                   sp->cinfo.d.comp_info[i].component_id = i;
  1525.                   sp->cinfo.d.comp_info[i].h_samp_factor =
  1526.                   sp->cinfo.d.comp_info[i].v_samp_factor = 1;
  1527.                 }
  1528.               while (++i < sp->cinfo.d.num_components);
  1529.               break;
  1530.             case JCS_GRAYSCALE:
  1531.               sp->cinfo.d.comp_info[0].component_id =
  1532.               sp->cinfo.d.comp_info[0].h_samp_factor =
  1533.               sp->cinfo.d.comp_info[0].v_samp_factor = 1;
  1534.               break;
  1535.             case JCS_RGB      :
  1536.               sp->cinfo.d.comp_info[0].component_id = 'R';
  1537.               sp->cinfo.d.comp_info[1].component_id = 'G';
  1538.               sp->cinfo.d.comp_info[2].component_id = 'B';
  1539.               i = 0;
  1540.               do sp->cinfo.d.comp_info[i].h_samp_factor =
  1541.                  sp->cinfo.d.comp_info[i].v_samp_factor = 1;
  1542.               while (++i < sp->cinfo.d.num_components);
  1543.               break;
  1544.             case JCS_CMYK     :
  1545.               sp->cinfo.d.comp_info[0].component_id = 'C';
  1546.               sp->cinfo.d.comp_info[1].component_id = 'M';
  1547.               sp->cinfo.d.comp_info[2].component_id = 'Y';
  1548.               sp->cinfo.d.comp_info[3].component_id = 'K';
  1549.               i = 0;
  1550.               do sp->cinfo.d.comp_info[i].h_samp_factor =
  1551.                  sp->cinfo.d.comp_info[i].v_samp_factor = 1;
  1552.               while (++i < sp->cinfo.d.num_components);
  1553.               break;
  1554.             case JCS_YCbCr    :
  1555.               i = 0;
  1556.               do
  1557.                 {
  1558.                   sp->cinfo.d.comp_info[i].component_id = i+1;
  1559.                   sp->cinfo.d.comp_info[i].h_samp_factor =
  1560.                   sp->cinfo.d.comp_info[i].v_samp_factor = 1;
  1561.                   sp->cinfo.d.comp_info[i].quant_tbl_no =
  1562.                   sp->cinfo.d.comp_info[i].dc_tbl_no =
  1563.                   sp->cinfo.d.comp_info[i].ac_tbl_no = i > 0;
  1564.                 }
  1565.               while (++i < sp->cinfo.d.num_components);
  1566.               sp->cinfo.d.comp_info[0].h_samp_factor = sp->h_sampling;
  1567.               sp->cinfo.d.comp_info[0].v_samp_factor = sp->v_sampling;
  1568.           };
  1569.         sp->cinfo.d.comps_in_scan = td->td_planarconfig == PLANARCONFIG_CONTIG
  1570.                                   ? sp->cinfo.d.num_components
  1571.                                   : 1;
  1572.         i = CALLJPEG(sp,-1,jpeg_read_header(&sp->cinfo.d,!sp->is_WANG));
  1573.         sp->cinfo.d.marker->read_markers = save; /* Restore input method */
  1574.         if (sp->is_WANG) /* produced by Wang Imaging on Microsoft Windows */
  1575.           {
  1576.             if (i != JPEG_SUSPENDED) return 0;
  1577.          /* BOGOSITY ALERT!  Files prooduced by the Wang Imaging application for
  1578.                              Microsoft Windows are a special--and, technically
  1579.             illegal--case.  A JPEG SOS marker and rest of the data stream should
  1580.             be located at the end of the file, in a position identified by the
  1581.             0th Strip offset.
  1582.          */
  1583.             i = td->td_nstrips - 1;
  1584.             sp->src.next_input_byte = tif->tif_base + td->td_stripoffset[0];
  1585.             sp->src.bytes_in_buffer = td->td_stripoffset[i] -
  1586.               td->td_stripoffset[0] + td->td_stripbytecount[i];
  1587.             i = CALLJPEG(sp,-1,jpeg_read_header(&sp->cinfo.d,TRUE));
  1588.           };
  1589.         if (i != JPEG_HEADER_OK) return 0;
  1590.       };
  1591.  /* Some of our initialization must wait until the JPEG Library is initialized
  1592.     above, in order to override its defaults.
  1593.  */
  1594.     if (   (sp->cinfo.d.raw_data_out = downsampled_output)
  1595.         && !alloc_downsampled_buffers(tif,sp->cinfo.d.comp_info,
  1596.                                       sp->cinfo.d.num_components)
  1597.        ) return 0;
  1598.     sp->cinfo.d.jpeg_color_space = jpeg_color_space;
  1599.     sp->cinfo.d.out_color_space = out_color_space;
  1600.     sp->cinfo.d.dither_mode = JDITHER_NONE; /* Reduce image "noise" */
  1601.     sp->cinfo.d.two_pass_quantize = FALSE;
  1602.  /* If the image consists of separate, discontiguous TIFF "samples" (= color
  1603.     planes, hopefully = JPEG "scans"), then we must use the JPEG Library's
  1604.     "buffered image" mode to decompress the entire image into temporary buffers,
  1605.     because the JPEG Library must parse the entire JPEG bit-stream in order to
  1606.     be satsified that it has a complete set of color components for each pixel,
  1607.     but the TIFF Library must allow our client to extract 1 component at a time.
  1608.     Initializing the JPEG Library's "buffered image" mode is tricky:  First, we
  1609.     start its decompressor, then we tell the decompressor to "consume" (i.e.,
  1610.     buffer) the entire bit-stream.
  1611.     WARNING:  Disabling "fancy" up-sampling seems to slightly reduce "noise" for
  1612.               certain old Wang Imaging files, but it absolutely *must* be
  1613.     enabled if the image has separate color planes, since in that case, the JPEG
  1614.     Library doesn't use an "sp->cinfo.d.cconvert" structure (so de-referencing
  1615.     this pointer below will cause a fatal crash) but writing our own code to up-
  1616.     sample separate color planes is too much work for right now.  Maybe someday?
  1617.  */
  1618.     sp->cinfo.d.do_fancy_upsampling = /* Always let this default (to TRUE)? */
  1619.     sp->cinfo.d.buffered_image = td->td_planarconfig == PLANARCONFIG_SEPARATE;
  1620.     if (!CALLJPEG(sp,0,jpeg_start_decompress(&sp->cinfo.d))) return 0;
  1621.     if (sp->cinfo.d.buffered_image) /* separate color planes */
  1622.       {
  1623.         if (sp->cinfo.d.raw_data_out)
  1624.           tif->tif_decoderow = tif->tif_decodestrip = tif->tif_decodetile =
  1625.             OJPEGDecodeRawSeparate;
  1626.         else
  1627.           {
  1628.             tif->tif_decoderow = tif->tif_decodestrip = tif->tif_decodetile =
  1629.               OJPEGDecode;
  1630.          /* In JPEG Library Version 6B, color-space conversion isn't implemented
  1631.             for separate color planes, so we must do it ourself if our TIFF
  1632.             client doesn't want to:
  1633.          */
  1634.             sp->cinfo.d.cconvert->color_convert =
  1635.               sp->cinfo.d.jpeg_color_space == sp->cinfo.d.out_color_space
  1636.               ? null_convert : ycc_rgb_convert;
  1637.           };
  1638.     L3: switch (CALLJPEG(sp,0,jpeg_consume_input(&sp->cinfo.d)))
  1639.           {
  1640.             default              : goto L3;
  1641.          /* If no JPEG "End of Information" (EOI) marker is found when bit-
  1642.             stream parsing ends, check whether we have enough data to proceed
  1643.             before reporting an error.
  1644.          */
  1645.             case JPEG_SUSPENDED  : if (  sp->cinfo.d.input_scan_number
  1646.                                         *sp->cinfo.d.image_height
  1647.                                        + sp->cinfo.d.input_iMCU_row
  1648.                                         *sp->cinfo.d.max_v_samp_factor
  1649. #                                       ifdef D_LOSSLESS_SUPPORTED
  1650.                                         *sp->cinfo.d.data_units_in_MCU
  1651.                                         *sp->cinfo.d.min_codec_data_unit
  1652. #                                       else
  1653.                                         *sp->cinfo.d.blocks_in_MCU
  1654.                                         *DCTSIZE
  1655. #                                       endif
  1656.                                       < td->td_samplesperpixel
  1657.                                        *sp->cinfo.d.image_height
  1658.                                       )
  1659.                                      {
  1660.                                        TIFFError(tif->tif_name,
  1661.                                          "Premature end of JPEG bit-stream");
  1662.                                        return 0;
  1663.                                      }
  1664.             case JPEG_REACHED_EOI: ;
  1665.           }
  1666.       }
  1667.     else /* pixel-interleaved color planes */
  1668.       tif->tif_decoderow = tif->tif_decodestrip = tif->tif_decodetile =
  1669.         downsampled_output ? OJPEGDecodeRawContig : OJPEGDecode;
  1670.     return 1;
  1671. #   undef td
  1672.   }
  1673. static int
  1674. OJPEGPreDecode(register TIFF *tif,tsample_t s)
  1675.   { register OJPEGState *sp = OJState(tif);
  1676. #   define td (&tif->tif_dir)
  1677.  /* If we are about to read the first row of an image plane (hopefully, these
  1678.     are coincident with JPEG "scans"!), reset the JPEG Library's decompressor
  1679.     appropriately.  Otherwise, let the decompressor run "as is" and return a
  1680.     "success" status without further ado.
  1681.  */
  1682.     if (     (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip)
  1683.            % td->td_stripsperimage
  1684.         == 0
  1685.        )
  1686.       {
  1687.         if (   sp->cinfo.d.buffered_image
  1688.             && !CALLJPEG(sp,0,jpeg_start_output(&sp->cinfo.d,s+1))
  1689.            ) return 0;
  1690.         sp->cinfo.d.output_scanline = 0;
  1691.      /* Mark subsampling buffers "empty". */
  1692. #       ifdef D_LOSSLESS_SUPPORTED
  1693.         sp->scancount = sp->cinfo.d.min_codec_data_unit;
  1694. #       else
  1695.         sp->scancount = DCTSIZE;
  1696. #       endif
  1697.       };
  1698.     return 1;
  1699. #   undef td
  1700.   }
  1701. /*ARGSUSED*/ static void
  1702. OJPEGPostDecode(register TIFF *tif,tidata_t buf,tsize_t cc)
  1703.   { register OJPEGState *sp = OJState(tif);
  1704. #   define td (&tif->tif_dir)
  1705.  /* The JPEG Library decompressor has reached the end of a strip/tile.  If this
  1706.     is the end of a TIFF image "sample" (= JPEG "scan") in a file with separate
  1707.     components (color planes), then end the "scan".  If it ends the image's last
  1708.     sample/scan, then also stop the JPEG Library's decompressor.
  1709.  */
  1710.     if (sp->cinfo.d.output_scanline >= sp->cinfo.d.output_height)
  1711.       {
  1712.         if (sp->cinfo.d.buffered_image)
  1713.           CALLJPEG(sp,-1,jpeg_finish_output(&sp->cinfo.d)); /* End JPEG scan */
  1714.         if (   (isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip)
  1715.             >= td->td_nstrips-1
  1716.            ) CALLJPEG(sp,0,jpeg_finish_decompress(&sp->cinfo.d));
  1717.       }
  1718. #   undef td
  1719.   }
  1720. static int
  1721. OJPEGVSetField(register TIFF *tif,ttag_t tag,va_list ap)
  1722. {
  1723.     uint32 v32;
  1724.     register OJPEGState *sp = OJState(tif);
  1725. #   define td (&tif->tif_dir)
  1726.     toff_t tiffoff=0;
  1727.     uint32 bufoff=0;
  1728.     uint32 code_count=0;
  1729.     int i2=0;
  1730.     int k2=0;
  1731.     switch (tag)
  1732.       {
  1733.         default                            : return
  1734.                                                (*sp->vsetparent)(tif,tag,ap);
  1735.      /* BEWARE OF KLUDGE:  Some old-format JPEG-in-TIFF files, including those
  1736.                            produced by the Wang Imaging application for Micro-
  1737.         soft Windows, illegally omit a "ReferenceBlackWhite" TIFF tag, even
  1738.         though the TIFF specification's default is intended for the RGB color
  1739.         space and is inappropriate for the YCbCr color space ordinarily used for
  1740.         JPEG images.  Since many TIFF client applications request the value of
  1741.         this tag immediately after a TIFF image directory is parsed, and before
  1742.         any other code in this module receives control, we are forced to fix
  1743.         this problem very early in image-file processing.  Fortunately, legal
  1744.         TIFF files are supposed to store their tags in numeric order, so a
  1745.         mandatory "PhotometricInterpretation" tag should always appear before
  1746.         an optional "ReferenceBlackWhite" tag.  Hence, we slyly peek ahead when
  1747.         we discover the desired photometry, by installing modified black and
  1748.         white reference levels.
  1749.      */
  1750.         case TIFFTAG_PHOTOMETRIC           :
  1751.           if (   (v32 = (*sp->vsetparent)(tif,tag,ap))
  1752.               && td->td_photometric == PHOTOMETRIC_YCBCR
  1753.              )
  1754.   {
  1755. float *ref;
  1756. if (!TIFFGetField(tif, TIFFTAG_REFERENCEBLACKWHITE, &ref)) {
  1757. float refbw[6];
  1758. long top = 1L << td->td_bitspersample;
  1759. refbw[0] = 0;
  1760. refbw[1] = (float)(top-1L);
  1761. refbw[2] = (float)(top>>1);
  1762. refbw[3] = refbw[1];
  1763. refbw[4] = refbw[2];
  1764. refbw[5] = refbw[1];
  1765. TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refbw);
  1766. }
  1767.   }
  1768.           return v32;
  1769.      /* BEWARE OF KLUDGE:  According to Charles Auer <Bumble731@msn.com>, if our
  1770.                            input is a multi-image (multi-directory) JPEG-in-TIFF
  1771.         file is produced by the Wang Imaging application on Microsoft Windows,
  1772.         for some reason the first directory excludes the vendor-specific "WANG
  1773.         PageControl" tag (32934) that we check below, so the only other way to
  1774.         identify these directories is apparently to look for a software-
  1775.         identification tag with the substring, "Wang Labs".  Single-image files
  1776.         can apparently pass both tests, which causes no harm here, but what a
  1777.         mess this is!
  1778.      */
  1779.         case TIFFTAG_SOFTWARE              :
  1780.         {
  1781.             char *software;
  1782.             v32 = (*sp->vsetparent)(tif,tag,ap);
  1783.             if( TIFFGetField( tif, TIFFTAG_SOFTWARE, &software )
  1784.                 && strstr( software, "Wang Labs" ) )
  1785.                 sp->is_WANG = 1;
  1786.             return v32;
  1787.         }
  1788.         case TIFFTAG_JPEGPROC              :
  1789.         case TIFFTAG_JPEGIFOFFSET          :
  1790.         case TIFFTAG_JPEGIFBYTECOUNT       :
  1791.         case TIFFTAG_JPEGRESTARTINTERVAL   :
  1792.         case TIFFTAG_JPEGLOSSLESSPREDICTORS:
  1793.         case TIFFTAG_JPEGPOINTTRANSFORM    :
  1794.         case TIFFTAG_JPEGQTABLES           :
  1795.         case TIFFTAG_JPEGDCTABLES          :
  1796.         case TIFFTAG_JPEGACTABLES          :
  1797.         case TIFFTAG_WANG_PAGECONTROL      :
  1798.         case TIFFTAG_JPEGCOLORMODE         : ;
  1799.       };
  1800.     v32 = va_arg(ap,uint32); /* No. of values in this TIFF record */
  1801.     /* This switch statement is added for OJPEGVSetField */
  1802.     if(v32 !=0){
  1803.         switch(tag){
  1804.             case TIFFTAG_JPEGPROC:
  1805.                 sp->jpegproc=v32;
  1806.                 break;
  1807.             case TIFFTAG_JPEGIFOFFSET:
  1808.                 sp->jpegifoffset=v32;
  1809. break;
  1810.             case TIFFTAG_JPEGIFBYTECOUNT:
  1811. sp->jpegifbytecount=v32;
  1812. break;
  1813.             case TIFFTAG_JPEGRESTARTINTERVAL:
  1814. sp->jpegrestartinterval=v32;
  1815. break;
  1816.             case TIFFTAG_JPEGLOSSLESSPREDICTORS:
  1817. sp->jpeglosslesspredictors_length=v32;
  1818. break;
  1819.             case TIFFTAG_JPEGPOINTTRANSFORM:
  1820. sp->jpegpointtransform_length=v32;
  1821. break;
  1822.             case TIFFTAG_JPEGQTABLES:
  1823. sp->jpegqtables_length=v32;
  1824. break;
  1825.             case TIFFTAG_JPEGACTABLES:
  1826. sp->jpegactables_length=v32;
  1827. break;
  1828.             case TIFFTAG_JPEGDCTABLES:
  1829. sp->jpegdctables_length=v32;
  1830. break;
  1831.             default:
  1832. break;
  1833.         }
  1834.     }
  1835.  /* BEWARE:  The following actions apply only if we are reading a "source" TIFF
  1836.              image to be decompressed for a client application program.  If we
  1837.     ever enhance this file's CODEC to write "destination" JPEG-in-TIFF images,
  1838.     we'll need an "if"- and another "switch"-statement below, because we'll
  1839.     probably want to store these records' values in some different places.  Most
  1840.     of these need not be parsed here in order to decode JPEG bit stream, so we
  1841.     set boolean flags to note that they have been seen, but we otherwise ignore
  1842.     them.
  1843.  */
  1844.     switch (tag)
  1845.       { JHUFF_TBL **h;
  1846.      /* Validate the JPEG-process code. */
  1847.         case TIFFTAG_JPEGPROC              :
  1848.           switch (v32)
  1849.             {
  1850.               default               : TIFFError(tif->tif_name,
  1851.                                         "Unknown JPEG process");
  1852.                                       return 0;
  1853. #             ifdef C_LOSSLESS_SUPPORTED
  1854.            /* Image uses (lossy) baseline sequential coding. */
  1855.               case JPEGPROC_BASELINE: sp->cinfo.d.process = JPROC_SEQUENTIAL;
  1856.                                       sp->cinfo.d.data_unit = DCTSIZE;
  1857.                                       break;
  1858.            /* Image uses (lossless) Huffman coding. */
  1859.               case JPEGPROC_LOSSLESS: sp->cinfo.d.process = JPROC_LOSSLESS;
  1860.                                       sp->cinfo.d.data_unit = 1;
  1861. #             else /* not C_LOSSLESS_SUPPORTED */
  1862.               case JPEGPROC_LOSSLESS: TIFFError(JPEGLib_name,
  1863.                                         "Does not support lossless Huffman coding");
  1864.                                       return 0;
  1865.               case JPEGPROC_BASELINE: ;
  1866. #             endif /* C_LOSSLESS_SUPPORTED */
  1867.             };
  1868.           break;
  1869.      /* The TIFF Version 6.0 specification says that if the value of a TIFF
  1870.         "JPEGInterchangeFormat" record is 0, then we are to behave as if this
  1871.         record were absent; i.e., the data does *not* represent a JPEG Inter-
  1872.         change Format File (JFIF), so don't even set the boolean "I've been
  1873.         here" flag below.  Otherwise, the field's value represents the file
  1874.         offset of the JPEG SOI marker.
  1875.      */
  1876.         case TIFFTAG_JPEGIFOFFSET          :
  1877.           if (v32)
  1878.             {
  1879.               sp->src.next_input_byte = tif->tif_base + v32;
  1880.               break;
  1881.             };
  1882.           return 1;
  1883.         case TIFFTAG_JPEGIFBYTECOUNT       :
  1884.           sp->src.bytes_in_buffer = v32;
  1885.           break;
  1886.      /* The TIFF Version 6.0 specification says that if the JPEG "Restart"
  1887.         marker interval is 0, then the data has no "Restart" markers; i.e., we
  1888.         must behave as if this TIFF record were absent.  So, don't even set the
  1889.         boolean "I've been here" flag below.
  1890.      */
  1891.      /*
  1892.       * Instead, set the field bit so TIFFGetField can get whether or not
  1893.       * it was set.
  1894.       */
  1895.         case TIFFTAG_JPEGRESTARTINTERVAL   :
  1896.           if (v32)
  1897.               sp->cinfo.d.restart_interval = v32;
  1898.               break;
  1899.      /* The TIFF Version 6.0 specification says that this tag is supposed to be
  1900.         a vector containing a value for each image component, but for lossless
  1901.         Huffman coding (the only JPEG process defined by the specification for
  1902.         which this tag should be needed), ISO IS 10918-1 uses only a single
  1903.         value, equivalent to the "Ss" field in a JPEG bit-stream's "Start of
  1904.         Scan" (SOS) marker.  So, we extract the first vector element and ignore
  1905.         the rest.  (I hope this is correct!)
  1906.      */
  1907.         case TIFFTAG_JPEGLOSSLESSPREDICTORS:
  1908.            if (v32)
  1909.              {
  1910.                sp->cinfo.d.Ss = *va_arg(ap,uint16 *);
  1911.                sp->jpeglosslesspredictors = 
  1912.     _TIFFmalloc(sp->jpeglosslesspredictors_length
  1913. * sizeof(uint16));
  1914.                if(sp->jpeglosslesspredictors==NULL){return(0);}
  1915.                for(i2=0;i2<sp->jpeglosslesspredictors_length;i2++){
  1916.                 ((uint16*)sp->jpeglosslesspredictors)[i2] =
  1917. ((uint16*)sp->cinfo.d.Ss)[i2];
  1918.                }
  1919.                sp->jpeglosslesspredictors_length*=sizeof(uint16);
  1920.                break;
  1921.              };
  1922.            return v32;
  1923.      /* The TIFF Version 6.0 specification says that this tag is supposed to be
  1924.         a vector containing a value for each image component, but for lossless
  1925.         Huffman coding (the only JPEG process defined by the specification for
  1926.         which this tag should be needed), ISO IS 10918-1 uses only a single
  1927.         value, equivalent to the "Al" field in a JPEG bit-stream's "Start of
  1928.         Scan" (SOS) marker.  So, we extract the first vector element and ignore
  1929.         the rest.  (I hope this is correct!)
  1930.      */
  1931.         case TIFFTAG_JPEGPOINTTRANSFORM    :
  1932.            if (v32)
  1933.              {
  1934.                sp->cinfo.d.Al = *va_arg(ap,uint16 *);
  1935.                sp->jpegpointtransform =
  1936.     _TIFFmalloc(sp->jpegpointtransform_length*sizeof(uint16));
  1937.                if(sp->jpegpointtransform==NULL){return(0);}
  1938.                for(i2=0;i2<sp->jpegpointtransform_length;i2++) {
  1939.                 ((uint16*)sp->jpegpointtransform)[i2] =
  1940. ((uint16*)sp->cinfo.d.Al)[i2];
  1941.                }
  1942.                sp->jpegpointtransform_length*=sizeof(uint16);
  1943.                break;
  1944.              }
  1945.            return v32;
  1946.      /* We have a vector of offsets to quantization tables, so load 'em! */
  1947.         case TIFFTAG_JPEGQTABLES           :
  1948.           if (v32)
  1949.             { uint32 *v;
  1950.               int i;
  1951.               if (v32 > NUM_QUANT_TBLS)
  1952.                 {
  1953.                   TIFFError(tif->tif_name,"Too many quantization tables");
  1954.                   return 0;
  1955.                 };
  1956.               i = 0;
  1957.               v = va_arg(ap,uint32 *);
  1958.                 sp->jpegqtables=_TIFFmalloc(64*sp->jpegqtables_length);
  1959.                 if(sp->jpegqtables==NULL){return(0);}
  1960.                 tiffoff = TIFFSeekFile(tif, 0, SEEK_CUR);
  1961.                 bufoff=0;
  1962.                 for(i2=0;i2<sp->jpegqtables_length;i2++){
  1963.                     TIFFSeekFile(tif, v[i2], SEEK_SET);
  1964.                     TIFFReadFile(tif, &(((unsigned char*)(sp->jpegqtables))[bufoff]),
  1965.  64);
  1966.                     bufoff+=64;
  1967.                 }
  1968.                 sp->jpegqtables_length=bufoff;
  1969.                 TIFFSeekFile(tif, tiffoff, SEEK_SET);
  1970.               do /* read quantization table */
  1971.                 { register UINT8 *from = tif->tif_base + *v++;
  1972.                   register UINT16 *to;
  1973.                   register int j = DCTSIZE2;
  1974.                   if (!( sp->cinfo.d.quant_tbl_ptrs[i]
  1975.                        = CALLJPEG(sp,0,jpeg_alloc_quant_table(&sp->cinfo.comm))
  1976.                        )
  1977.                      )
  1978.                     {
  1979.                       TIFFError(JPEGLib_name,"No space for quantization table");
  1980.                       return 0;
  1981.                     };
  1982.                   to = sp->cinfo.d.quant_tbl_ptrs[i]->quantval;
  1983.                   do *to++ = *from++; while (--j > 0);
  1984.                 }
  1985.               while (++i < v32);
  1986.               sp->jpegtablesmode |= JPEGTABLESMODE_QUANT;
  1987.             };
  1988.           break;
  1989.      /* We have a vector of offsets to DC Huffman tables, so load 'em! */
  1990.         case TIFFTAG_JPEGDCTABLES          :
  1991.           h = sp->cinfo.d.dc_huff_tbl_ptrs;
  1992.           goto L;
  1993.      /* We have a vector of offsets to AC Huffman tables, so load 'em! */
  1994.         case TIFFTAG_JPEGACTABLES          :
  1995.           h = sp->cinfo.d.ac_huff_tbl_ptrs;
  1996.        L: if (v32)
  1997.             { uint32 *v;
  1998.               int i;
  1999.               if (v32 > NUM_HUFF_TBLS)
  2000.                 {
  2001.                   TIFFError(tif->tif_name,"Too many Huffman tables");
  2002.                   return 0;
  2003.                 };
  2004.               v = va_arg(ap,uint32 *);
  2005.                 if(tag == TIFFTAG_JPEGDCTABLES) {
  2006.                     sp->jpegdctables=_TIFFmalloc(272*sp->jpegdctables_length);
  2007.                     if(sp->jpegdctables==NULL){return(0);}
  2008.                     tiffoff = TIFFSeekFile(tif, 0, SEEK_CUR);
  2009.                     bufoff=0;
  2010.                     code_count=0;                
  2011.                     for(i2=0;i2<sp->jpegdctables_length;i2++){
  2012.                         TIFFSeekFile(tif, v[i2], SEEK_SET);
  2013.                         TIFFReadFile(tif,
  2014.      &(((unsigned char*)(sp->jpegdctables))[bufoff]),
  2015.      16);
  2016.                         code_count=0;
  2017.                         for(k2=0;k2<16;k2++){
  2018.                             code_count+=((unsigned char*)(sp->jpegdctables))[k2+bufoff];
  2019.                         }
  2020.                         TIFFReadFile(tif,
  2021.      &(((unsigned char*)(sp->jpegdctables))[bufoff+16]),
  2022.      code_count);
  2023.                         bufoff+=16;
  2024.                         bufoff+=code_count;
  2025.                     }
  2026.                     sp->jpegdctables_length=bufoff;
  2027.                     TIFFSeekFile(tif, tiffoff, SEEK_SET);
  2028.                 }
  2029.                 if(tag==TIFFTAG_JPEGACTABLES){
  2030.                     sp->jpegactables=_TIFFmalloc(272*sp->jpegactables_length);
  2031.                     if(sp->jpegactables==NULL){return(0);}
  2032.                     tiffoff = TIFFSeekFile(tif, 0, SEEK_CUR);
  2033.                     bufoff=0;
  2034.                     code_count=0;                
  2035.                     for(i2=0;i2<sp->jpegactables_length;i2++){
  2036.                         TIFFSeekFile(tif, v[i2], SEEK_SET);
  2037.                         TIFFReadFile(tif, &(((unsigned char*)(sp->jpegactables))[bufoff]), 16);
  2038.                         code_count=0;
  2039.                         for(k2=0;k2<16;k2++){
  2040.                             code_count+=((unsigned char*)(sp->jpegactables))[k2+bufoff];
  2041.                         }
  2042.                         TIFFReadFile(tif, &(((unsigned char*)(sp->jpegactables))[bufoff+16]), code_count);
  2043.                         bufoff+=16;
  2044.                         bufoff+=code_count;
  2045.                     }
  2046.                     sp->jpegactables_length=bufoff;
  2047.                     TIFFSeekFile(tif, tiffoff, SEEK_SET);
  2048.                 }
  2049.               i = 0;
  2050.               do /* copy each Huffman table */
  2051.                 { int size = 0;
  2052.                   register UINT8 *from = tif->tif_base + *v++, *to;
  2053.                   register int j = sizeof (*h)->bits;
  2054.                /* WARNING:  This code relies on the fact that an image file not
  2055.                             "memory mapped" was read entirely into a single
  2056.                   buffer by "TIFFInitOJPEG()", so we can do a fast memory-to-
  2057.                   memory copy here.  Each table consists of 16 Bytes, which are
  2058.                   suffixed to a 0 Byte when copied, followed by a variable
  2059.                   number of Bytes whose length is the sum of the first 16.
  2060.                */
  2061.                   if (!( *h
  2062.                        = CALLJPEG(sp,0,jpeg_alloc_huff_table(&sp->cinfo.comm))
  2063.                        )
  2064.                      )
  2065.                     {
  2066.                       TIFFError(JPEGLib_name,"No space for Huffman table");
  2067.                       return 0;
  2068.                     };
  2069.                   to = (*h++)->bits;
  2070.                   *to++ = 0;
  2071.                   while (--j > 0) size += *to++ = *from++; /* Copy 16 Bytes */
  2072.                   if (size > sizeof (*h)->huffval/sizeof *(*h)->huffval)
  2073.                     {
  2074.                       TIFFError(tif->tif_name,"Huffman table too big");
  2075.                       return 0;
  2076.                     };
  2077.                   if ((j = size) > 0) do *to++ = *from++; while (--j > 0);
  2078.                   while (++size <= sizeof (*h)->huffval/sizeof *(*h)->huffval)
  2079.                     *to++ = 0; /* Zero the rest of the table for cleanliness */
  2080.                 }
  2081.               while (++i < v32);
  2082.               sp->jpegtablesmode |= JPEGTABLESMODE_HUFF;
  2083.             };
  2084.           break;
  2085.      /* The following vendor-specific TIFF tag occurs in (highly illegal) files
  2086.         produced by the Wang Imaging application for Microsoft Windows.  These
  2087.         can apparently have several "pages", in which case this tag specifies
  2088.         the offset of a "page control" structure, which we don't currently know
  2089.         how to handle.  0 indicates a 1-page image with no "page control", which
  2090.         we make a feeble effort to handle.
  2091.      */
  2092.         case TIFFTAG_WANG_PAGECONTROL      :
  2093.           if (v32 == 0) v32 = -1;
  2094.           sp->is_WANG = v32;
  2095.           tag = TIFFTAG_JPEGPROC+FIELD_WANG_PAGECONTROL-FIELD_JPEGPROC;
  2096.           break;
  2097.      /* This pseudo tag indicates whether our caller is expected to do YCbCr <->
  2098.         RGB color-space conversion (JPEGCOLORMODE_RAW <=> 0) or whether we must
  2099.         ask the JPEG Library to do it (JPEGCOLORMODE_RGB <=> 1).
  2100.      */
  2101.         case TIFFTAG_JPEGCOLORMODE         :
  2102.           sp->jpegcolormode = v32;
  2103.        /* Mark the image to indicate whether returned data is up-sampled, so
  2104.           that "TIFF{Strip,Tile}Size()" reflect the true amount of data present.
  2105.        */
  2106.           v32 = tif->tif_flags; /* Save flags temporarily */
  2107.           tif->tif_flags &= ~TIFF_UPSAMPLED;
  2108.           if (   td->td_photometric == PHOTOMETRIC_YCBCR
  2109.               &&    (td->td_ycbcrsubsampling[0]<<3 | td->td_ycbcrsubsampling[1])
  2110.                  != 011
  2111.               && sp->jpegcolormode == JPEGCOLORMODE_RGB
  2112.              ) tif->tif_flags |= TIFF_UPSAMPLED;
  2113.        /* If the up-sampling state changed, re-calculate tile size. */
  2114.           if ((tif->tif_flags ^ v32) & TIFF_UPSAMPLED)
  2115.             {
  2116.               tif->tif_tilesize = isTiled(tif) ? TIFFTileSize(tif) : (tsize_t) -1;
  2117.               tif->tif_flags |= TIFF_DIRTYDIRECT;
  2118.             };
  2119.           return 1;
  2120.       };
  2121.     TIFFSetFieldBit(tif,tag-TIFFTAG_JPEGPROC+FIELD_JPEGPROC);
  2122.     return 1;
  2123. #   undef td
  2124.   }
  2125. static int
  2126. OJPEGVGetField(register TIFF *tif,ttag_t tag,va_list ap)
  2127.   { register OJPEGState *sp = OJState(tif);
  2128.     switch (tag)
  2129.       {
  2130.      /* If this file has managed to synthesize a set of consolidated "metadata"
  2131.         tables for the current (post-TIFF Version 6.0 specification) JPEG-in-
  2132.         TIFF encapsulation strategy, then tell our caller about them; otherwise,
  2133.         keep mum.
  2134.      */
  2135.         case TIFFTAG_JPEGTABLES            :
  2136.           if (sp->jpegtables_length) /* we have "new"-style JPEG tables */
  2137.             {
  2138.               *va_arg(ap,uint32 *) = sp->jpegtables_length;
  2139.               *va_arg(ap,char **) = sp->jpegtables;
  2140.               return 1;
  2141.             };
  2142.      /* This pseudo tag indicates whether our caller is expected to do YCbCr <->
  2143.         RGB color-space conversion (JPEGCOLORMODE_RAW <=> 0) or whether we must
  2144.         ask the JPEG Library to do it (JPEGCOLORMODE_RGB <=> 1).
  2145.      */
  2146.         case TIFFTAG_JPEGCOLORMODE         :
  2147.           *va_arg(ap,uint32 *) = sp->jpegcolormode;
  2148.           return 1;
  2149.      /* The following tags are defined by the TIFF Version 6.0 specification
  2150.         and are obsolete.  If our caller asks for information about them, do not
  2151.         return anything, even if we parsed them in an old-format "source" image.
  2152.      */
  2153.         case TIFFTAG_JPEGPROC              :
  2154. *va_arg(ap, uint16*)=sp->jpegproc;
  2155. return(1);
  2156. break;
  2157.         case TIFFTAG_JPEGIFOFFSET          :
  2158. *va_arg(ap, uint32*)=sp->jpegifoffset;
  2159. return(1);
  2160. break;
  2161.         case TIFFTAG_JPEGIFBYTECOUNT       :
  2162. *va_arg(ap, uint32*)=sp->jpegifbytecount;
  2163. return(1);
  2164. break;
  2165.         case TIFFTAG_JPEGRESTARTINTERVAL   :
  2166. *va_arg(ap, uint32*)=sp->jpegrestartinterval;
  2167. return(1);
  2168. break;
  2169.         case TIFFTAG_JPEGLOSSLESSPREDICTORS:
  2170.                 *va_arg(ap, uint32*)=sp->jpeglosslesspredictors_length;
  2171.                 *va_arg(ap, void**)=sp->jpeglosslesspredictors;
  2172.                 return(1);
  2173.                 break;
  2174.         case TIFFTAG_JPEGPOINTTRANSFORM    :
  2175.                 *va_arg(ap, uint32*)=sp->jpegpointtransform_length;
  2176.                 *va_arg(ap, void**)=sp->jpegpointtransform;
  2177.                 return(1);
  2178.                 break;
  2179.         case TIFFTAG_JPEGQTABLES           :
  2180.                 *va_arg(ap, uint32*)=sp->jpegqtables_length;
  2181.                 *va_arg(ap, void**)=sp->jpegqtables;
  2182.                 return(1);
  2183.                 break;
  2184.         case TIFFTAG_JPEGDCTABLES          :
  2185.                 *va_arg(ap, uint32*)=sp->jpegdctables_length;
  2186.                 *va_arg(ap, void**)=sp->jpegdctables;
  2187.                 return(1);
  2188.                 break;
  2189.         case TIFFTAG_JPEGACTABLES          : 
  2190.                 *va_arg(ap, uint32*)=sp->jpegactables_length;
  2191.                 *va_arg(ap, void**)=sp->jpegactables;
  2192.                 return(1);
  2193.                 break;
  2194.       };
  2195.     return (*sp->vgetparent)(tif,tag,ap);
  2196.   }
  2197. static void
  2198. OJPEGPrintDir(register TIFF *tif,FILE *fd,long flags)
  2199.   { register OJPEGState *sp = OJState(tif);
  2200.     if (   ( flags
  2201.            & (TIFFPRINT_JPEGQTABLES|TIFFPRINT_JPEGDCTABLES|TIFFPRINT_JPEGACTABLES)
  2202.            )
  2203.         && sp->jpegtables_length
  2204.        )
  2205.       fprintf(fd,"  JPEG Table Data: <present>, %lu bytesn",
  2206.         sp->jpegtables_length);
  2207.   }
  2208. static uint32
  2209. OJPEGDefaultStripSize(register TIFF *tif,register uint32 s)
  2210.   { register OJPEGState *sp = OJState(tif);
  2211. #   define td (&tif->tif_dir)
  2212.     if ((s = (*sp->defsparent)(tif,s)) < td->td_imagelength)
  2213.       { register tsize_t size = sp->cinfo.comm.is_decompressor
  2214. #                             ifdef D_LOSSLESS_SUPPORTED
  2215.                               ? sp->cinfo.d.min_codec_data_unit
  2216. #                             else
  2217.                               ? DCTSIZE
  2218. #                             endif
  2219. #                             ifdef C_LOSSLESS_SUPPORTED
  2220.                               : sp->cinfo.c.data_unit;
  2221. #                             else
  2222.                               : DCTSIZE;
  2223. #                             endif
  2224.         size = TIFFroundup(size,16);
  2225.         s = TIFFroundup(s,td->td_ycbcrsubsampling[1]*size);
  2226.       };
  2227.     return s;
  2228. #   undef td
  2229.   }
  2230. static void
  2231. OJPEGDefaultTileSize(register TIFF *tif,register uint32 *tw,register uint32 *th)
  2232.   { register OJPEGState *sp = OJState(tif);
  2233.     register tsize_t size;
  2234. #   define td (&tif->tif_dir)
  2235.     size = sp->cinfo.comm.is_decompressor
  2236. #        ifdef D_LOSSLESS_SUPPORTED
  2237.          ? sp->cinfo.d.min_codec_data_unit
  2238. #        else
  2239.          ? DCTSIZE
  2240. #        endif
  2241. #        ifdef C_LOSSLESS_SUPPORTED
  2242.          : sp->cinfo.c.data_unit;
  2243. #        else
  2244.          : DCTSIZE;
  2245. #        endif
  2246.     size = TIFFroundup(size,16);
  2247.     (*sp->deftparent)(tif,tw,th);
  2248.     *tw = TIFFroundup(*tw,td->td_ycbcrsubsampling[0]*size);
  2249.     *th = TIFFroundup(*th,td->td_ycbcrsubsampling[1]*size);
  2250. #   undef td
  2251.   }
  2252. static void
  2253. OJPEGCleanUp(register TIFF *tif)
  2254.   { register OJPEGState *sp;
  2255.     if ( (sp = OJState(tif)) )
  2256.       {
  2257.         CALLVJPEG(sp,jpeg_destroy(&sp->cinfo.comm)); /* Free JPEG Lib. vars. */
  2258.         if (sp->jpegtables) {_TIFFfree(sp->jpegtables);sp->jpegtables=0;}
  2259.         if (sp->jpeglosslesspredictors) {
  2260. _TIFFfree(sp->jpeglosslesspredictors);
  2261. sp->jpeglosslesspredictors = 0;
  2262. }
  2263.         if (sp->jpegpointtransform) {
  2264. _TIFFfree(sp->jpegpointtransform);
  2265. sp->jpegpointtransform=0;
  2266. }
  2267.         if (sp->jpegqtables) {_TIFFfree(sp->jpegqtables);sp->jpegqtables=0;}
  2268.         if (sp->jpegactables) {_TIFFfree(sp->jpegactables);sp->jpegactables=0;}
  2269.         if (sp->jpegdctables) {_TIFFfree(sp->jpegdctables);sp->jpegdctables=0;}
  2270.      /* If the image file isn't "memory mapped" and we read it all into a
  2271.         single, large memory buffer, free the buffer now.
  2272.      */
  2273.         if (!isMapped(tif) && tif->tif_base) /* free whole-file buffer */
  2274.           {
  2275.             _TIFFfree(tif->tif_base);
  2276.             tif->tif_base = 0;
  2277.             tif->tif_size = 0;
  2278.           };
  2279.         _TIFFfree(sp); /* Release local variables */
  2280.         tif->tif_data = 0;
  2281.       }
  2282.   }
  2283. int
  2284. TIFFInitOJPEG(register TIFF *tif,int scheme)
  2285.   { register OJPEGState *sp;
  2286. #   define td (&tif->tif_dir)
  2287. #   ifndef never
  2288.  /* This module supports a decompression-only CODEC, which is intended strictly
  2289.     for viewing old image files using the obsolete JPEG-in-TIFF encapsulation
  2290.     specified by the TIFF Version 6.0 specification.  It does not, and never
  2291.     should, support compression for new images.  If a client application asks us
  2292.     to, refuse and complain loudly!
  2293.  */
  2294.     if (tif->tif_mode != O_RDONLY) return _notSupported(tif);
  2295. #   endif /* never */
  2296.     if (!isMapped(tif))
  2297.       {
  2298.      /* BEWARE OF KLUDGE:  If our host operating-system doesn't let an image
  2299.                            file be "memory mapped", then we want to read the
  2300.         entire file into a single (possibly large) memory buffer as if it had
  2301.         been "memory mapped".  Although this is likely to waste space, because
  2302.         analysis of the file's content might cause parts of it to be read into
  2303.         smaller buffers duplicatively, it appears to be the lesser of several
  2304.         evils.  Very old JPEG-in-TIFF encapsulations aren't guaranteed to be
  2305.         JFIF bit streams, or to have a TIFF "JPEGTables" record or much other
  2306.         "metadata" to help us locate the decoding tables and entropy-coded data,
  2307.         so we're likely do a lot of random-access grokking around, and we must
  2308.         ultimately tell the JPEG Library to sequentially scan much of the file
  2309.         anyway.  This is all likely to be easier if we use "brute force" to
  2310.         read the entire file, once, and don't use incremental disc I/O.  If our
  2311.         client application tries to process a file so big that we can't buffer
  2312.         it entirely, then tough shit: we'll give up and exit!
  2313.      */
  2314.         if (!(tif->tif_base = _TIFFmalloc(tif->tif_size=TIFFGetFileSize(tif))))
  2315.           {
  2316.             TIFFError(tif->tif_name,"Cannot allocate file buffer");
  2317.             return 0;
  2318.           };
  2319.         if (!SeekOK(tif,0) || !ReadOK(tif,tif->tif_base,tif->tif_size))
  2320.           {
  2321.             TIFFError(tif->tif_name,"Cannot read file");
  2322.             return 0;
  2323.           }
  2324.       };
  2325.  /* Allocate storage for this module's per-file variables. */
  2326.     if (!(tif->tif_data = (tidata_t)_TIFFmalloc(sizeof *sp)))
  2327.       {
  2328.         TIFFError("TIFFInitOJPEG","No space for JPEG state block");
  2329.         return 0;
  2330.       };
  2331.     (sp = OJState(tif))->tif = tif; /* Initialize reverse pointer */
  2332.     sp->cinfo.d.err = jpeg_std_error(&sp->err); /* Initialize error handling */
  2333.     sp->err.error_exit = TIFFojpeg_error_exit;
  2334.     sp->err.output_message = TIFFojpeg_output_message;
  2335.     if (!CALLVJPEG(sp,jpeg_create_decompress(&sp->cinfo.d))) return 0;
  2336.  /* Install CODEC-specific tag information and override default TIFF Library
  2337.     "method" subroutines with our own, CODEC-specific methods.  Like all good
  2338.     members of an object-class, we save some of these subroutine pointers for
  2339.     "fall back" in case our own methods fail.
  2340.  */
  2341.     _TIFFMergeFieldInfo(tif,ojpegFieldInfo,
  2342.       sizeof ojpegFieldInfo/sizeof *ojpegFieldInfo);
  2343.     sp->defsparent = tif->tif_defstripsize;
  2344.     sp->deftparent = tif->tif_deftilesize;
  2345.     sp->vgetparent = tif->tif_tagmethods.vgetfield;
  2346.     sp->vsetparent = tif->tif_tagmethods.vsetfield;
  2347.     tif->tif_defstripsize = OJPEGDefaultStripSize;
  2348.     tif->tif_deftilesize = OJPEGDefaultTileSize;
  2349.     tif->tif_tagmethods.vgetfield = OJPEGVGetField;
  2350.     tif->tif_tagmethods.vsetfield = OJPEGVSetField;
  2351.     tif->tif_tagmethods.printdir = OJPEGPrintDir;
  2352. #   ifdef never
  2353.     tif->tif_setupencode = OJPEGSetupEncode;
  2354.     tif->tif_preencode = OJPEGPreEncode;
  2355.     tif->tif_postencode = OJPEGPostEncode;
  2356. #   else /* well, hardly ever */
  2357.     tif->tif_setupencode = tif->tif_postencode = _notSupported;
  2358.     tif->tif_preencode = (TIFFPreMethod)_notSupported;
  2359. #   endif /* never */
  2360.     tif->tif_setupdecode = OJPEGSetupDecode;
  2361.     tif->tif_predecode = OJPEGPreDecode;
  2362.     tif->tif_postdecode = OJPEGPostDecode;
  2363.     tif->tif_cleanup = OJPEGCleanUp;
  2364.  /* If the image file doesn't have "JPEGInterchangeFormat[Length]" TIFF records
  2365.     to guide us, we have few clues about where its encapsulated JPEG bit stream
  2366.     is located, so establish intelligent defaults:  If the Image File Directory
  2367.     doesn't immediately follow the TIFF header, assume that the JPEG data lies
  2368.     in between; otherwise, assume that it follows the Image File Directory.
  2369.  */
  2370.     if (tif->tif_header.tiff_diroff > sizeof tif->tif_header)
  2371.       {
  2372.         sp->src.next_input_byte = tif->tif_base + sizeof tif->tif_header;
  2373.         sp->src.bytes_in_buffer = tif->tif_header.tiff_diroff
  2374.                                 - sizeof tif->tif_header;
  2375.       }
  2376.     else /* this case is ugly! */
  2377.       { uint32 maxoffset = tif->tif_size;
  2378.         uint16 dircount;
  2379.      /* Calculate the offset to the next Image File Directory, if there is one,
  2380.         or to the end of the file, if not.  Then arrange to read the file from
  2381.         the end of the Image File Directory to that offset.
  2382.      */
  2383.         if (tif->tif_nextdiroff) maxoffset = tif->tif_nextdiroff; /* Not EOF */
  2384.         _TIFFmemcpy(&dircount,(const tdata_t)
  2385.           (sp->src.next_input_byte = tif->tif_base+tif->tif_header.tiff_diroff),
  2386.           sizeof dircount);
  2387.         if (tif->tif_flags & TIFF_SWAB) TIFFSwabShort(&dircount);
  2388.         sp->src.next_input_byte += dircount*sizeof(TIFFDirEntry)
  2389.                                 + sizeof maxoffset + sizeof dircount;
  2390.         sp->src.bytes_in_buffer = tif->tif_base - sp->src.next_input_byte
  2391.                                 + maxoffset;
  2392.       };
  2393.  /* IJG JPEG Library Version 6B can be configured for either 8- or 12-bit sample
  2394.     precision, but we assume that "old JPEG" TIFF clients only need 8 bits.
  2395.  */
  2396.     sp->cinfo.d.data_precision = 8;
  2397. #   ifdef C_LOSSLESS_SUPPORTED
  2398.  /* If the "JPEGProc" TIFF tag is missing from the Image File Dictionary, the
  2399.     JPEG Library will use its (lossy) baseline sequential process by default.
  2400.  */
  2401.     sp->cinfo.d.data_unit = DCTSIZE;
  2402. #   endif /* C_LOSSLESS_SUPPORTED */
  2403.  /* Initialize other CODEC-specific variables requiring default values. */
  2404.     tif->tif_flags |= TIFF_NOBITREV; /* No bit-reversal within data bytes */
  2405.     sp->h_sampling = sp->v_sampling = 1; /* No subsampling by default */
  2406.     sp->is_WANG = 0; /* Assume not a MS Windows Wang Imaging file by default */
  2407.     sp->jpegtables = 0; /* No "new"-style JPEG tables synthesized yet */
  2408.     sp->jpegtables_length = 0;
  2409.     sp->jpegquality = 75; /* Default IJG quality */
  2410.     sp->jpegcolormode = JPEGCOLORMODE_RAW;
  2411.     sp->jpegtablesmode = 0; /* No tables found yet */
  2412.     sp->jpeglosslesspredictors=0;
  2413.     sp->jpeglosslesspredictors_length=0;
  2414.     sp->jpegpointtransform=0;
  2415.     sp->jpegpointtransform_length=0;
  2416.     sp->jpegqtables=0;
  2417.     sp->jpegqtables_length=0;
  2418.     sp->jpegdctables=0;
  2419.     sp->jpegdctables_length=0;
  2420.     sp->jpegactables=0;
  2421.     sp->jpegactables_length=0;
  2422.     return 1;
  2423. #   undef td
  2424.   }
  2425. #endif /* OJPEG_SUPPORT */
  2426. /* vim: set ts=8 sts=8 sw=8 noet: */